diff options
author | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2014-08-08 14:30:41 +0200 |
---|---|---|
committer | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2014-08-12 13:49:54 +0200 |
commit | ab0a50979b9eb4dfa3320eff7e187e41efedf7a9 (patch) | |
tree | 498dfb8a97ff3361a9f7486863a52bb4e26bb898 /chromium/gpu/command_buffer | |
parent | 4ce69f7403811819800e7c5ae1318b2647e778d1 (diff) |
Update Chromium to beta version 37.0.2062.68
Change-Id: I188e3b5aff1bec75566014291b654eb19f5bc8ca
Reviewed-by: Andras Becsi <andras.becsi@digia.com>
Diffstat (limited to 'chromium/gpu/command_buffer')
220 files changed, 38577 insertions, 31442 deletions
diff --git a/chromium/gpu/command_buffer/OWNERS b/chromium/gpu/command_buffer/OWNERS index bb8ea76f760..cd07f4dafa3 100644 --- a/chromium/gpu/command_buffer/OWNERS +++ b/chromium/gpu/command_buffer/OWNERS @@ -2,3 +2,4 @@ piman@chromium.org jbauman@chromium.org bajones@chromium.org zmo@chromium.org +vmiura@chromium.org diff --git a/chromium/gpu/command_buffer/build_gles2_cmd_buffer.py b/chromium/gpu/command_buffer/build_gles2_cmd_buffer.py index 0f2e49a31f1..1c7b0199371 100755 --- a/chromium/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/chromium/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -11,12 +11,13 @@ import os.path import sys import re from optparse import OptionParser +from subprocess import call _SIZE_OF_UINT32 = 4 _SIZE_OF_COMMAND_HEADER = 4 _FIRST_SPECIFIC_COMMAND_ID = 256 -_LICENSE = """// Copyright (c) 2012 The Chromium Authors. All rights reserved. +_LICENSE = """// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -24,6 +25,8 @@ _LICENSE = """// Copyright (c) 2012 The Chromium Authors. All rights reserved. _DO_NOT_EDIT_WARNING = """// This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! """ @@ -53,9 +56,17 @@ _GL_TYPES = { 'GLclampf': 'float', 'GLvoid': 'void', 'GLfixed': 'int', - 'GLclampx': 'int', + 'GLclampx': 'int' +} + +_GL_TYPES_32 = { 'GLintptr': 'long int', - 'GLsizeiptr': 'long int', + 'GLsizeiptr': 'long int' +} + +_GL_TYPES_64 = { + 'GLintptr': 'long long int', + 'GLsizeiptr': 'long long int' } # Capabilites selected with glEnable @@ -67,8 +78,7 @@ _CAPABILITY_FLAGS = [ {'name': 'polygon_offset_fill'}, {'name': 'sample_alpha_to_coverage'}, {'name': 'sample_coverage'}, - {'name': 'scissor_test', - 'state_flag': 'framebuffer_state_.clear_state_dirty'}, + {'name': 'scissor_test'}, {'name': 'stencil_test', 'state_flag': 'framebuffer_state_.clear_state_dirty'}, ] @@ -98,10 +108,30 @@ _STATES = { 'func': 'ColorMask', 'enum': 'GL_COLOR_WRITEMASK', 'states': [ - {'name': 'color_mask_red', 'type': 'GLboolean', 'default': 'true'}, - {'name': 'color_mask_green', 'type': 'GLboolean', 'default': 'true'}, - {'name': 'color_mask_blue', 'type': 'GLboolean', 'default': 'true'}, - {'name': 'color_mask_alpha', 'type': 'GLboolean', 'default': 'true'}, + { + 'name': 'color_mask_red', + 'type': 'GLboolean', + 'default': 'true', + 'cached': True + }, + { + 'name': 'color_mask_green', + 'type': 'GLboolean', + 'default': 'true', + 'cached': True + }, + { + 'name': 'color_mask_blue', + 'type': 'GLboolean', + 'default': 'true', + 'cached': True + }, + { + 'name': 'color_mask_alpha', + 'type': 'GLboolean', + 'default': 'true', + 'cached': True + }, ], 'state_flag': 'framebuffer_state_.clear_state_dirty', }, @@ -251,12 +281,14 @@ _STATES = { 'type': 'GLuint', 'enum': 'GL_STENCIL_WRITEMASK', 'default': '0xFFFFFFFFU', + 'cached': True, }, { 'name': 'stencil_back_writemask', 'type': 'GLuint', 'enum': 'GL_STENCIL_BACK_WRITEMASK', 'default': '0xFFFFFFFFU', + 'cached': True, }, ], }, @@ -400,7 +432,12 @@ _STATES = { 'func': 'DepthMask', 'enum': 'GL_DEPTH_WRITEMASK', 'states': [ - {'name': 'depth_mask', 'type': 'GLboolean', 'default': 'true'}, + { + 'name': 'depth_mask', + 'type': 'GLboolean', + 'default': 'true', + 'cached': True + }, ], 'state_flag': 'framebuffer_state_.clear_state_dirty', }, @@ -470,9 +507,16 @@ _STATES = { }, } -# This is a list of enum names and their valid values. It is used to map -# GLenum arguments to a specific set of valid values. -_ENUM_LISTS = { +# Named type info object represents a named type that is used in OpenGL call +# arguments. Each named type defines a set of valid OpenGL call arguments. The +# named types are used in 'cmd_buffer_functions.txt'. +# type: The actual GL type of the named type. +# valid: The list of values that are valid for both the client and the service. +# invalid: Examples of invalid values for the type. At least these values +# should be tested to be invalid. +# is_complete: The list of valid values of type are final and will not be +# modified during runtime. +_NAMED_TYPE_INFO = { 'BlitFilter': { 'type': 'GLenum', 'valid': [ @@ -579,6 +623,7 @@ _ENUM_LISTS = { 'GL_UNPACK_FLIP_Y_CHROMIUM', 'GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM', 'GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM', + 'GL_BIND_GENERATES_RESOURCE_CHROMIUM', # we can add this because we emulate it if the driver does not support it. 'GL_VERTEX_ARRAY_BINDING_OES', 'GL_VIEWPORT', @@ -829,6 +874,7 @@ _ENUM_LISTS = { 'GL_LATENCY_QUERY_CHROMIUM', 'GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM', 'GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM', + 'GL_COMMANDS_COMPLETED_CHROMIUM', ], }, 'RenderBufferParameter': { @@ -1113,6 +1159,7 @@ _ENUM_LISTS = { }, 'TextureBorder': { 'type': 'GLint', + 'is_complete': True, 'valid': [ '0', ], @@ -1135,6 +1182,7 @@ _ENUM_LISTS = { }, 'ZeroOnly': { 'type': 'GLint', + 'is_complete': True, 'valid': [ '0', ], @@ -1144,6 +1192,7 @@ _ENUM_LISTS = { }, 'FalseOnly': { 'type': 'GLboolean', + 'is_complete': True, 'valid': [ 'false', ], @@ -1171,10 +1220,14 @@ _PEPPER_INTERFACES = [ {'name': 'ChromiumEnableFeature', 'dev': False}, {'name': 'ChromiumMapSub', 'dev': False}, {'name': 'Query', 'dev': False}, + {'name': 'DrawBuffers', 'dev': True}, ] -# This table specifies types and other special data for the commands that -# will be generated. +# A function info object specifies the type and other special data for the +# command that will be generated. A base function info object is generated by +# parsing the "cmd_buffer_functions.txt", one for each function in the +# file. These function info objects can be augmented and their values can be +# overridden by adding an object to the table below. # # Must match function names specified in "cmd_buffer_functions.txt". # @@ -1189,16 +1242,19 @@ _PEPPER_INTERFACES = [ # a NonImmediate type is a type that stays a pointer even in # and immediate version of acommand. # gen_cmd: Whether or not this function geneates a command. Default = True. -# immediate: Whether or not to generate an immediate command for the GL -# function. The default is if there is exactly 1 pointer argument -# in the GL function an immediate command is generated. -# bucket: True to generate a bucket version of the command. +# data_transfer_methods: Array of methods that are used for transfering the +# pointer data. Possible values: 'immediate', 'shm', 'bucket'. +# The default is 'immediate' if the command has one pointer +# argument, otherwise 'shm'. One command is generated for each +# transfer method. Affects only commands which are not of type +# 'HandWritten', 'GETn' or 'GLcharN'. +# Note: the command arguments that affect this are the final args, +# taking cmd_args override into consideration. # impl_func: Whether or not to generate the GLES2Implementation part of this # command. # impl_decl: Whether or not to generate the GLES2Implementation declaration # for this command. # needs_size: If true a data_size field is added to the command. -# data_type: The type of data the command uses. For PUTn or PUT types. # count: The number of units per element. For PUTn or PUT types. # unit_test: If False no service side unit test will be generated. # client_test: If False no client side unit test will be generated. @@ -1212,6 +1268,7 @@ _PEPPER_INTERFACES = [ # valid_args: A dictionary of argument indices to args to use in unit tests # when they can not be automatically determined. # pepper_interface: The pepper interface that is used for this extension +# pepper_name: The name of the function as exposed to pepper. # pepper_args: A string representing the argument list (what would appear in # C/C++ between the parentheses for the function declaration) # that the Pepper API expects for this function. Use this only if @@ -1221,6 +1278,11 @@ _PEPPER_INTERFACES = [ # first_element_only: For PUT types, True if only the first element of an # array is used and we end up calling the single value # corresponding function. eg. TexParameteriv -> TexParameteri +# extension: Function is an extension to GL and should not be exposed to +# pepper unless pepper_interface is defined. +# extension_flag: Function is an extension and should be enabled only when +# the corresponding feature info flag is enabled. Implies +# 'extension': True. _FUNCTION_INFO = { 'ActiveTexture': { @@ -1232,9 +1294,8 @@ _FUNCTION_INFO = { 'AttachShader': {'decoder_func': 'DoAttachShader'}, 'BindAttribLocation': { 'type': 'GLchar', - 'bucket': True, + 'data_transfer_methods': ['bucket'], 'needs_size': True, - 'immediate': False, }, 'BindBuffer': { 'type': 'Bind', @@ -1246,6 +1307,7 @@ _FUNCTION_INFO = { 'decoder_func': 'DoBindFramebuffer', 'gl_test_func': 'glBindFramebufferEXT', 'gen_func': 'GenFramebuffersEXT', + 'trace_level': 1, }, 'BindRenderbuffer': { 'type': 'Bind', @@ -1259,25 +1321,28 @@ _FUNCTION_INFO = { 'gen_func': 'GenTextures', # TODO(gman): remove this once client side caching works. 'client_test': False, + 'trace_level': 1, }, 'BlitFramebufferCHROMIUM': { 'decoder_func': 'DoBlitFramebufferCHROMIUM', 'unit_test': False, - 'extension': True, + 'extension_flag': 'chromium_framebuffer_multisample', 'pepper_interface': 'FramebufferBlit', + 'pepper_name': 'BlitFramebufferEXT', 'defer_reads': True, 'defer_draws': True, + 'trace_level': 1, }, 'BufferData': { 'type': 'Manual', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'client_test': False, }, 'BufferSubData': { 'type': 'Data', 'client_test': False, 'decoder_func': 'DoBufferSubData', - 'immediate': False, + 'data_transfer_methods': ['shm'], }, 'CheckFramebufferStatus': { 'type': 'Is', @@ -1289,6 +1354,7 @@ _FUNCTION_INFO = { 'Clear': { 'decoder_func': 'DoClear', 'defer_draws': True, + 'trace_level': 1, }, 'ClearColor': { 'type': 'StateSet', @@ -1311,10 +1377,22 @@ _FUNCTION_INFO = { }, 'ConsumeTextureCHROMIUM': { 'decoder_func': 'DoConsumeTextureCHROMIUM', + 'impl_func': False, 'type': 'PUT', - 'data_type': 'GLbyte', - 'count': 64, + 'count': 64, # GL_MAILBOX_SIZE_CHROMIUM + 'unit_test': False, + 'client_test': False, + 'extension': True, + 'chromium': True, + 'trace_level': 1, + }, + 'CreateAndConsumeTextureCHROMIUM': { + 'decoder_func': 'DoCreateAndConsumeTextureCHROMIUM', + 'impl_func': False, + 'type': 'HandWritten', + 'data_transfer_methods': ['immediate'], 'unit_test': False, + 'client_test': False, 'extension': True, 'chromium': True, }, @@ -1324,7 +1402,7 @@ _FUNCTION_INFO = { }, 'EnableFeatureCHROMIUM': { 'type': 'Custom', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'decoder_func': 'DoEnableFeatureCHROMIUM', 'expectation': False, 'cmd_args': 'GLuint bucket_id, GLint* result', @@ -1336,14 +1414,12 @@ _FUNCTION_INFO = { 'CompileShader': {'decoder_func': 'DoCompileShader', 'unit_test': False}, 'CompressedTexImage2D': { 'type': 'Manual', - 'immediate': False, - 'bucket': True, + 'data_transfer_methods': ['bucket', 'shm'], }, 'CompressedTexSubImage2D': { 'type': 'Data', - 'bucket': True, + 'data_transfer_methods': ['bucket', 'shm'], 'decoder_func': 'DoCompressedTexSubImage2D', - 'immediate': False, }, 'CopyTexImage2D': { 'decoder_func': 'DoCopyTexImage2D', @@ -1356,7 +1432,8 @@ _FUNCTION_INFO = { }, 'CreateImageCHROMIUM': { 'type': 'Manual', - 'cmd_args': 'GLsizei width, GLsizei height, GLenum internalformat', + 'cmd_args': + 'GLsizei width, GLsizei height, GLenum internalformat, GLenum usage', 'result': ['GLuint'], 'client_test': False, 'gen_cmd': False, @@ -1366,7 +1443,6 @@ _FUNCTION_INFO = { }, 'DestroyImageCHROMIUM': { 'type': 'Manual', - 'immediate': False, 'client_test': False, 'gen_cmd': False, 'extension': True, @@ -1480,7 +1556,7 @@ _FUNCTION_INFO = { 'decoder_func': 'DoDeleteSharedIdsCHROMIUM', 'impl_func': False, 'expectation': False, - 'immediate': False, + 'data_transfer_methods': ['shm'], 'extension': True, 'chromium': True, }, @@ -1513,6 +1589,7 @@ _FUNCTION_INFO = { 'type': 'Manual', 'cmd_args': 'GLenumDrawMode mode, GLint first, GLsizei count', 'defer_draws': True, + 'trace_level': 2, }, 'DrawElements': { 'type': 'Manual', @@ -1520,6 +1597,7 @@ _FUNCTION_INFO = { 'GLenumIndexType type, GLuint index_offset', 'client_test': False, 'defer_draws': True, + 'trace_level': 2, }, 'Enable': { 'decoder_func': 'DoEnable', @@ -1547,13 +1625,15 @@ _FUNCTION_INFO = { 'FramebufferTexture2D': { 'decoder_func': 'DoFramebufferTexture2D', 'gl_test_func': 'glFramebufferTexture2DEXT', + 'trace_level': 1, }, 'FramebufferTexture2DMultisampleEXT': { 'decoder_func': 'DoFramebufferTexture2DMultisample', 'gl_test_func': 'glFramebufferTexture2DMultisampleEXT', 'expectation': False, 'unit_test': False, - 'extension': True, + 'extension_flag': 'multisampled_render_to_texture', + 'trace_level': 1, }, 'GenerateMipmap': { 'decoder_func': 'DoGenerateMipmap', @@ -1567,7 +1647,6 @@ _FUNCTION_INFO = { }, 'GenMailboxCHROMIUM': { 'type': 'HandWritten', - 'immediate': False, 'impl_func': False, 'extension': True, 'chromium': True, @@ -1594,44 +1673,42 @@ _FUNCTION_INFO = { 'decoder_func': 'DoGenSharedIdsCHROMIUM', 'impl_func': False, 'expectation': False, - 'immediate': False, + 'data_transfer_methods': ['shm'], 'extension': True, 'chromium': True, }, 'GetActiveAttrib': { 'type': 'Custom', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'cmd_args': - 'GLidProgram program, GLuint index, uint32 name_bucket_id, ' + 'GLidProgram program, GLuint index, uint32_t name_bucket_id, ' 'void* result', 'result': [ - 'int32 success', - 'int32 size', - 'uint32 type', + 'int32_t success', + 'int32_t size', + 'uint32_t type', ], }, 'GetActiveUniform': { 'type': 'Custom', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'cmd_args': - 'GLidProgram program, GLuint index, uint32 name_bucket_id, ' + 'GLidProgram program, GLuint index, uint32_t name_bucket_id, ' 'void* result', 'result': [ - 'int32 success', - 'int32 size', - 'uint32 type', + 'int32_t success', + 'int32_t size', + 'uint32_t type', ], }, 'GetAttachedShaders': { 'type': 'Custom', - 'immediate': False, - 'cmd_args': 'GLidProgram program, void* result, uint32 result_size', + 'data_transfer_methods': ['shm'], + 'cmd_args': 'GLidProgram program, void* result, uint32_t result_size', 'result': ['SizedResult<GLuint>'], }, 'GetAttribLocation': { 'type': 'HandWritten', - 'immediate': False, - 'bucket': True, 'needs_size': True, 'cmd_args': 'GLidProgram program, const char* name, NonImmediate GLint* location', @@ -1688,7 +1765,7 @@ _FUNCTION_INFO = { }, 'GetMultipleIntegervCHROMIUM': { 'type': 'Custom', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'expectation': False, 'extension': True, 'chromium': True, @@ -1702,17 +1779,16 @@ _FUNCTION_INFO = { }, 'GetProgramInfoCHROMIUM': { 'type': 'Custom', - 'immediate': False, 'expectation': False, 'impl_func': False, 'extension': True, 'chromium': True, 'client_test': False, - 'cmd_args': 'GLidProgram program, uint32 bucket_id', + 'cmd_args': 'GLidProgram program, uint32_t bucket_id', 'result': [ - 'uint32 link_status', - 'uint32 num_attribs', - 'uint32 num_uniforms', + 'uint32_t link_status', + 'uint32_t num_attribs', + 'uint32_t num_uniforms', ], }, 'GetProgramInfoLog': { @@ -1738,15 +1814,15 @@ _FUNCTION_INFO = { }, 'GetShaderPrecisionFormat': { 'type': 'Custom', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'cmd_args': 'GLenumShaderType shadertype, GLenumShaderPrecision precisiontype, ' 'void* result', 'result': [ - 'int32 success', - 'int32 min_range', - 'int32 max_range', - 'int32 precision', + 'int32_t success', + 'int32_t min_range', + 'int32_t max_range', + 'int32_t precision', ], }, 'GetShaderSource': { @@ -1757,12 +1833,20 @@ _FUNCTION_INFO = { 'client_test': False, }, 'GetString': { - 'type': 'Custom', - 'client_test': False, - 'cmd_args': 'GLenumStringType name, uint32 bucket_id', + 'type': 'Custom', + 'client_test': False, + 'cmd_args': 'GLenumStringType name, uint32_t bucket_id', + }, + 'GetTexParameterfv': { + 'type': 'GETn', + 'decoder_func': 'DoGetTexParameterfv', + 'result': ['SizedResult<GLfloat>'] + }, + 'GetTexParameteriv': { + 'type': 'GETn', + 'decoder_func': 'DoGetTexParameteriv', + 'result': ['SizedResult<GLint>'] }, - 'GetTexParameterfv': {'type': 'GETn', 'result': ['SizedResult<GLfloat>']}, - 'GetTexParameteriv': {'type': 'GETn', 'result': ['SizedResult<GLint>']}, 'GetTranslatedShaderSourceANGLE': { 'type': 'STRn', 'get_len_func': 'DoGetShaderiv', @@ -1772,18 +1856,16 @@ _FUNCTION_INFO = { }, 'GetUniformfv': { 'type': 'Custom', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'result': ['SizedResult<GLfloat>'], }, 'GetUniformiv': { 'type': 'Custom', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'result': ['SizedResult<GLint>'], }, 'GetUniformLocation': { 'type': 'HandWritten', - 'immediate': False, - 'bucket': True, 'needs_size': True, 'cmd_args': 'GLidProgram program, const char* name, NonImmediate GLint* location', @@ -1808,7 +1890,7 @@ _FUNCTION_INFO = { }, 'GetVertexAttribPointerv': { 'type': 'Custom', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'result': ['SizedResult<GLuint>'], 'client_test': False, }, @@ -1889,12 +1971,25 @@ _FUNCTION_INFO = { }, 'ProduceTextureCHROMIUM': { 'decoder_func': 'DoProduceTextureCHROMIUM', + 'impl_func': False, 'type': 'PUT', - 'data_type': 'GLbyte', - 'count': 64, + 'count': 64, # GL_MAILBOX_SIZE_CHROMIUM 'unit_test': False, + 'client_test': False, 'extension': True, 'chromium': True, + 'trace_level': 1, + }, + 'ProduceTextureDirectCHROMIUM': { + 'decoder_func': 'DoProduceTextureDirectCHROMIUM', + 'impl_func': False, + 'type': 'PUT', + 'count': 64, # GL_MAILBOX_SIZE_CHROMIUM + 'unit_test': False, + 'client_test': False, + 'extension': True, + 'chromium': True, + 'trace_level': 1, }, 'RenderbufferStorage': { 'decoder_func': 'DoRenderbufferStorage', @@ -1908,8 +2003,9 @@ _FUNCTION_INFO = { 'gl_test_func': 'glRenderbufferStorageMultisampleCHROMIUM', 'expectation': False, 'unit_test': False, - 'extension': True, + 'extension_flag': 'chromium_framebuffer_multisample', 'pepper_interface': 'FramebufferMultisample', + 'pepper_name': 'RenderbufferStorageMultisampleEXT', }, 'RenderbufferStorageMultisampleEXT': { 'cmd_comment': @@ -1918,7 +2014,7 @@ _FUNCTION_INFO = { 'gl_test_func': 'glRenderbufferStorageMultisampleEXT', 'expectation': False, 'unit_test': False, - 'extension': True, + 'extension_flag': 'multisampled_render_to_texture', }, 'ReadPixels': { 'cmd_comment': @@ -1926,16 +2022,16 @@ _FUNCTION_INFO = { '// it is easier to specify the result going to some specific place\n' '// that exactly fits the rectangle of pixels.\n', 'type': 'Custom', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'impl_func': False, 'client_test': False, 'cmd_args': 'GLint x, GLint y, GLsizei width, GLsizei height, ' 'GLenumReadPixelFormat format, GLenumReadPixelType type, ' - 'uint32 pixels_shm_id, uint32 pixels_shm_offset, ' - 'uint32 result_shm_id, uint32 result_shm_offset, ' + 'uint32_t pixels_shm_id, uint32_t pixels_shm_offset, ' + 'uint32_t result_shm_id, uint32_t result_shm_offset, ' 'GLboolean async', - 'result': ['uint32'], + 'result': ['uint32_t'], 'defer_reads': True, }, 'RegisterSharedIdsCHROMIUM': { @@ -1943,7 +2039,7 @@ _FUNCTION_INFO = { 'decoder_func': 'DoRegisterSharedIdsCHROMIUM', 'impl_func': False, 'expectation': False, - 'immediate': False, + 'data_transfer_methods': ['shm'], 'extension': True, 'chromium': True, }, @@ -1957,8 +2053,7 @@ _FUNCTION_INFO = { }, 'ShaderSource': { 'type': 'Manual', - 'immediate': False, - 'bucket': True, + 'data_transfer_methods': ['bucket'], 'needs_size': True, 'client_test': False, 'cmd_args': @@ -1984,15 +2079,15 @@ _FUNCTION_INFO = { 'unit_test': False, 'client_test': False, 'extension': True, + 'trace_level': 1, }, 'TexImage2D': { 'type': 'Manual', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'client_test': False, }, 'TexParameterf': { 'decoder_func': 'DoTexParameterf', - 'gl_test_func': 'glTexParameteri', 'valid_args': { '2': 'GL_NEAREST' }, @@ -2005,16 +2100,14 @@ _FUNCTION_INFO = { }, 'TexParameterfv': { 'type': 'PUT', - 'data_type': 'GLfloat', 'data_value': 'GL_NEAREST', 'count': 1, 'decoder_func': 'DoTexParameterfv', - 'gl_test_func': 'glTexParameteri', + 'gl_test_func': 'glTexParameterf', 'first_element_only': True, }, 'TexParameteriv': { 'type': 'PUT', - 'data_type': 'GLint', 'data_value': 'GL_NEAREST', 'count': 1, 'decoder_func': 'DoTexParameteriv', @@ -2023,7 +2116,7 @@ _FUNCTION_INFO = { }, 'TexSubImage2D': { 'type': 'Manual', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'client_test': False, 'cmd_args': 'GLenumTextureTarget target, GLint level, ' 'GLint xoffset, GLint yoffset, ' @@ -2031,78 +2124,67 @@ _FUNCTION_INFO = { 'GLenumTextureFormat format, GLenumPixelType type, ' 'const void* pixels, GLboolean internal' }, - 'Uniform1f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 1}, + 'Uniform1f': {'type': 'PUTXn', 'count': 1}, 'Uniform1fv': { 'type': 'PUTn', - 'data_type': 'GLfloat', 'count': 1, 'decoder_func': 'DoUniform1fv', }, 'Uniform1i': {'decoder_func': 'DoUniform1i', 'unit_test': False}, 'Uniform1iv': { 'type': 'PUTn', - 'data_type': 'GLint', 'count': 1, 'decoder_func': 'DoUniform1iv', 'unit_test': False, }, - 'Uniform2i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 2}, - 'Uniform2f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 2}, + 'Uniform2i': {'type': 'PUTXn', 'count': 2}, + 'Uniform2f': {'type': 'PUTXn', 'count': 2}, 'Uniform2fv': { 'type': 'PUTn', - 'data_type': 'GLfloat', 'count': 2, 'decoder_func': 'DoUniform2fv', }, 'Uniform2iv': { 'type': 'PUTn', - 'data_type': 'GLint', 'count': 2, 'decoder_func': 'DoUniform2iv', }, - 'Uniform3i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 3}, - 'Uniform3f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 3}, + 'Uniform3i': {'type': 'PUTXn', 'count': 3}, + 'Uniform3f': {'type': 'PUTXn', 'count': 3}, 'Uniform3fv': { 'type': 'PUTn', - 'data_type': 'GLfloat', 'count': 3, 'decoder_func': 'DoUniform3fv', }, 'Uniform3iv': { 'type': 'PUTn', - 'data_type': 'GLint', 'count': 3, 'decoder_func': 'DoUniform3iv', }, - 'Uniform4i': {'type': 'PUTXn', 'data_type': 'GLint', 'count': 4}, - 'Uniform4f': {'type': 'PUTXn', 'data_type': 'GLfloat', 'count': 4}, + 'Uniform4i': {'type': 'PUTXn', 'count': 4}, + 'Uniform4f': {'type': 'PUTXn', 'count': 4}, 'Uniform4fv': { 'type': 'PUTn', - 'data_type': 'GLfloat', 'count': 4, 'decoder_func': 'DoUniform4fv', }, 'Uniform4iv': { 'type': 'PUTn', - 'data_type': 'GLint', 'count': 4, 'decoder_func': 'DoUniform4iv', }, 'UniformMatrix2fv': { 'type': 'PUTn', - 'data_type': 'GLfloat', 'count': 4, 'decoder_func': 'DoUniformMatrix2fv', }, 'UniformMatrix3fv': { 'type': 'PUTn', - 'data_type': 'GLfloat', 'count': 9, 'decoder_func': 'DoUniformMatrix3fv', }, 'UniformMatrix4fv': { 'type': 'PUTn', - 'data_type': 'GLfloat', 'count': 16, 'decoder_func': 'DoUniformMatrix4fv', }, @@ -2133,36 +2215,31 @@ _FUNCTION_INFO = { 'pepper_interface': 'ChromiumMapSub', }, 'UseProgram': { + 'type': 'Bind', 'decoder_func': 'DoUseProgram', - 'impl_func': False, - 'unit_test': False, }, 'ValidateProgram': {'decoder_func': 'DoValidateProgram'}, 'VertexAttrib1f': {'decoder_func': 'DoVertexAttrib1f'}, 'VertexAttrib1fv': { 'type': 'PUT', - 'data_type': 'GLfloat', 'count': 1, 'decoder_func': 'DoVertexAttrib1fv', }, 'VertexAttrib2f': {'decoder_func': 'DoVertexAttrib2f'}, 'VertexAttrib2fv': { 'type': 'PUT', - 'data_type': 'GLfloat', 'count': 2, 'decoder_func': 'DoVertexAttrib2fv', }, 'VertexAttrib3f': {'decoder_func': 'DoVertexAttrib3f'}, 'VertexAttrib3fv': { 'type': 'PUT', - 'data_type': 'GLfloat', 'count': 3, 'decoder_func': 'DoVertexAttrib3fv', }, 'VertexAttrib4f': {'decoder_func': 'DoVertexAttrib4f'}, 'VertexAttrib4fv': { 'type': 'PUT', - 'data_type': 'GLfloat', 'count': 4, 'decoder_func': 'DoVertexAttrib4fv', }, @@ -2190,17 +2267,15 @@ _FUNCTION_INFO = { 'GetRequestableExtensionsCHROMIUM': { 'type': 'Custom', 'impl_func': False, - 'immediate': False, - 'cmd_args': 'uint32 bucket_id', + 'cmd_args': 'uint32_t bucket_id', 'extension': True, 'chromium': True, }, 'RequestExtensionCHROMIUM': { 'type': 'Custom', 'impl_func': False, - 'immediate': False, 'client_test': False, - 'cmd_args': 'uint32 bucket_id', + 'cmd_args': 'uint32_t bucket_id', 'extension': True, 'chromium': True, }, @@ -2211,23 +2286,12 @@ _FUNCTION_INFO = { 'client_test': False, }, 'CreateStreamTextureCHROMIUM': { - 'type': 'Custom', - 'cmd_args': 'GLuint client_id, void* result', - 'result': ['GLuint'], - 'immediate': False, - 'impl_func': False, - 'expectation': False, - 'extension': True, - 'chromium': True, - 'client_test': False, - }, - 'DestroyStreamTextureCHROMIUM': { - 'type': 'Custom', + 'type': 'HandWritten', 'impl_func': False, - 'expectation': False, + 'gen_cmd': False, 'extension': True, 'chromium': True, - }, + }, 'TexImageIOSurface2DCHROMIUM': { 'decoder_func': 'DoTexImageIOSurface2DCHROMIUM', 'unit_test': False, @@ -2257,11 +2321,13 @@ _FUNCTION_INFO = { 'DrawBuffersEXT': { 'type': 'PUTn', 'decoder_func': 'DoDrawBuffersEXT', - 'data_type': 'GLenum', 'count': 1, 'client_test': False, 'unit_test': False, + # could use 'extension_flag': 'ext_draw_buffers' but currently expected to + # work without. 'extension': True, + 'pepper_interface': 'DrawBuffers', }, 'DrawElementsInstancedANGLE': { 'type': 'Manual', @@ -2304,7 +2370,7 @@ _FUNCTION_INFO = { 'BeginQueryEXT': { 'type': 'Manual', 'cmd_args': 'GLenumQueryTarget target, GLidQuery id, void* sync_data', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'gl_test_func': 'glBeginQuery', 'pepper_interface': 'Query', }, @@ -2330,10 +2396,9 @@ _FUNCTION_INFO = { 'BindUniformLocationCHROMIUM': { 'type': 'GLchar', 'extension': True, - 'bucket': True, + 'data_transfer_methods': ['bucket'], 'needs_size': True, 'gl_test_func': 'DoBindUniformLocationCHROMIUM', - 'immediate': False, }, 'InsertEventMarkerEXT': { 'type': 'GLcharN', @@ -2416,7 +2481,6 @@ _FUNCTION_INFO = { 'TraceBeginCHROMIUM': { 'type': 'Custom', 'impl_func': False, - 'immediate': False, 'client_test': False, 'cmd_args': 'GLuint bucket_id', 'extension': True, @@ -2424,7 +2488,6 @@ _FUNCTION_INFO = { }, 'TraceEndCHROMIUM': { 'impl_func': False, - 'immediate': False, 'client_test': False, 'decoder_func': 'DoTraceEndCHROMIUM', 'unit_test': False, @@ -2433,21 +2496,41 @@ _FUNCTION_INFO = { }, 'AsyncTexImage2DCHROMIUM': { 'type': 'Manual', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'client_test': False, + 'cmd_args': 'GLenumTextureTarget target, GLint level, ' + 'GLintTextureInternalFormat internalformat, ' + 'GLsizei width, GLsizei height, ' + 'GLintTextureBorder border, ' + 'GLenumTextureFormat format, GLenumPixelType type, ' + 'const void* pixels, ' + 'uint32_t async_upload_token, ' + 'void* sync_data', 'extension': True, 'chromium': True, }, 'AsyncTexSubImage2DCHROMIUM': { 'type': 'Manual', - 'immediate': False, + 'data_transfer_methods': ['shm'], 'client_test': False, + 'cmd_args': 'GLenumTextureTarget target, GLint level, ' + 'GLint xoffset, GLint yoffset, ' + 'GLsizei width, GLsizei height, ' + 'GLenumTextureFormat format, GLenumPixelType type, ' + 'const void* data, ' + 'uint32_t async_upload_token, ' + 'void* sync_data', 'extension': True, 'chromium': True, }, 'WaitAsyncTexImage2DCHROMIUM': { 'type': 'Manual', - 'immediate': False, + 'client_test': False, + 'extension': True, + 'chromium': True, + }, + 'WaitAllAsyncTexImage2DCHROMIUM': { + 'type': 'Manual', 'client_test': False, 'extension': True, 'chromium': True, @@ -2455,17 +2538,16 @@ _FUNCTION_INFO = { 'DiscardFramebufferEXT': { 'type': 'PUTn', 'count': 1, - 'data_type': 'GLenum', 'cmd_args': 'GLenum target, GLsizei count, ' 'const GLenum* attachments', 'decoder_func': 'DoDiscardFramebufferEXT', 'unit_test': False, 'client_test': False, - 'extension': True, + 'extension_flag': 'ext_discard_framebuffer', }, 'LoseContextCHROMIUM': { - 'type': 'Manual', - 'impl_func': True, + 'decoder_func': 'DoLoseContextCHROMIUM', + 'unit_test': False, 'extension': True, 'chromium': True, }, @@ -2480,6 +2562,7 @@ _FUNCTION_INFO = { 'impl_func': True, 'extension': True, 'chromium': True, + 'trace_level': 1, }, 'DiscardBackbufferCHROMIUM': { 'type': 'Custom', @@ -2487,6 +2570,14 @@ _FUNCTION_INFO = { 'extension': True, 'chromium': True, }, + 'ScheduleOverlayPlaneCHROMIUM': { + 'type': 'Custom', + 'impl_func': True, + 'unit_test': False, + 'client_test': False, + 'extension': True, + 'chromium': True, + }, } @@ -2536,6 +2627,11 @@ def ToUnderscore(input_string): words = SplitWords(input_string) return Lower(words) +def CachedStateName(item): + if item.get('cached', False): + return 'cached_' + item['name'] + return item['name'] + class CWriter(object): """Writes to a file formatting it for Google's style guidelines.""" @@ -2554,72 +2650,9 @@ class CWriter(object): lines = string.splitlines() num_lines = len(lines) for ii in range(0, num_lines): - self.__WriteLine(lines[ii], ii < (num_lines - 1) or string[-1] == '\n') - - def __FindSplit(self, string): - """Finds a place to split a string.""" - splitter = string.find('=') - if splitter >= 1 and not string[splitter + 1] == '=' and splitter < 80: - return splitter - # parts = string.split('(') - parts = re.split("(?<=[^\"])\((?!\")", string) - fptr = re.compile('\*\w*\)') - if len(parts) > 1: - splitter = len(parts[0]) - for ii in range(1, len(parts)): - # Don't split on the dot in "if (.condition)". - if (not parts[ii - 1][-3:] == "if " and - # Don't split "(.)" or "(.*fptr)". - (len(parts[ii]) > 0 and - not parts[ii][0] == ")" and not fptr.match(parts[ii])) - and splitter < 80): - return splitter - splitter += len(parts[ii]) + 1 - done = False - end = len(string) - last_splitter = -1 - while not done: - splitter = string[0:end].rfind(',') - if splitter < 0 or (splitter > 0 and string[splitter - 1] == '"'): - return last_splitter - elif splitter >= 80: - end = splitter - else: - return splitter - - def __WriteLine(self, line, ends_with_eol): - """Given a signle line, writes it to a file, splitting if it's > 80 chars""" - if len(line) >= 80: - i = self.__FindSplit(line) - if i > 0: - line1 = line[0:i + 1] - if line1[-1] == ' ': - line1 = line1[:-1] - lineend = '' - if line1[0] == '#': - lineend = ' \\' - nolint = '' - if len(line1) > 80: - nolint = ' // NOLINT' - self.__AddLine(line1 + nolint + lineend + '\n') - match = re.match("( +)", line1) - indent = "" - if match: - indent = match.group(1) - splitter = line[i] - if not splitter == ',': - indent = " " + indent - self.__WriteLine(indent + line[i + 1:].lstrip(), True) - return - nolint = '' - if len(line) > 80: - nolint = ' // NOLINT' - self.__AddLine(line + nolint) - if ends_with_eol: - self.__AddLine('\n') - - def __AddLine(self, line): - self.content.append(line) + self.content.append(lines[ii]) + if ii < (num_lines - 1) or string[-1] == '\n': + self.content.append('\n') def Close(self): """Close the file.""" @@ -2678,20 +2711,9 @@ class TypeHandler(object): if func.GetInfo('needs_size') and not func.name.endswith('Bucket'): func.AddCmdArg(DataSizeArgument('data_size')) - def AddImmediateFunction(self, generator, func): - """Adds an immediate version of a function.""" - # Generate an immediate command if there is only 1 pointer arg. - immediate = func.GetInfo('immediate') # can be True, False or None - if immediate == True or immediate == None: - if func.num_pointer_args == 1 or immediate: - generator.AddFunction(ImmediateFunction(func)) - - def AddBucketFunction(self, generator, func): - """Adds a bucket version of a function.""" - # Generate an immediate command if there is only 1 pointer arg. - bucket = func.GetInfo('bucket') # can be True, False or None - if bucket: - generator.AddFunction(BucketFunction(func)) + def NeedsDataTransferFunction(self, func): + """Overriden from TypeHandler.""" + return func.num_pointer_args >= 1 def WriteStruct(self, func, file): """Writes a structure that matches the arguments to a function.""" @@ -2702,6 +2724,7 @@ class TypeHandler(object): file.Write(" typedef %s ValueType;\n" % func.name) file.Write(" static const CommandId kCmdId = k%s;\n" % func.name) func.WriteCmdArgFlag(file) + func.WriteCmdFlag(file) file.Write("\n") result = func.GetInfo('result') if not result == None: @@ -2722,6 +2745,12 @@ class TypeHandler(object): args = func.GetCmdArgs() for arg in args: file.Write(" %s %s;\n" % (arg.cmd_type, arg.name)) + + consts = func.GetCmdConstants() + for const in consts: + file.Write(" static const %s %s = %s;\n" % + (const.cmd_type, const.name, const.GetConstantValue())) + file.Write("};\n") file.Write("\n") @@ -2774,7 +2803,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, for value, arg in enumerate(args): file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 11)) file.Write(");\n") - file.Write(" EXPECT_EQ(static_cast<uint32>(cmds::%s::kCmdId),\n" % + file.Write(" EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" % func.name) file.Write(" cmd.header.command);\n") func.type_handler.WriteCmdSizeTest(func, file) @@ -2818,8 +2847,9 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write( "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) file.Write( - " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" % + " uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" % func.name) + self.WriteHandlerExtensionCheck(func, file) self.WriteHandlerDeferReadWrite(func, file); if len(func.GetOriginalArgs()) > 0: last_arg = func.GetLastOriginalArg() @@ -2839,8 +2869,9 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write( "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) file.Write( - " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" % + " uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" % func.name) + self.WriteHandlerExtensionCheck(func, file) self.WriteHandlerDeferReadWrite(func, file); last_arg = func.GetLastOriginalArg() all_but_last_arg = func.GetOriginalArgs()[:-1] @@ -2859,8 +2890,9 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write( "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) file.Write( - " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" % + " uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" % func.name) + self.WriteHandlerExtensionCheck(func, file) self.WriteHandlerDeferReadWrite(func, file); last_arg = func.GetLastOriginalArg() all_but_last_arg = func.GetOriginalArgs()[:-1] @@ -2874,6 +2906,14 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write("}\n") file.Write("\n") + def WriteHandlerExtensionCheck(self, func, file): + if func.GetInfo('extension_flag'): + file.Write(" if (!features().%s) {\n" % func.GetInfo('extension_flag')) + file.Write(" LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, \"gl%s\"," + " \"function not available\");\n" % func.original_name) + file.Write(" return error::kNoError;") + file.Write(" }\n\n") + def WriteHandlerDeferReadWrite(self, func, file): """Writes the code to handle deferring reads or writes.""" defer_draws = func.GetInfo('defer_draws') @@ -2890,16 +2930,18 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write(" return error;\n") def WriteValidUnitTest(self, func, file, test, extra = {}): - """Writes a valid unit test.""" + """Writes a valid unit test for the service implementation.""" if func.GetInfo('expectation') == False: test = self._remove_expected_call_re.sub('', test) name = func.name - arg_strings = [] - for count, arg in enumerate(func.GetOriginalArgs()): - arg_strings.append(arg.GetValidArg(func, count, 0)) - gl_arg_strings = [] - for count, arg in enumerate(func.GetOriginalArgs()): - gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) + arg_strings = [ + arg.GetValidArg(func) \ + for arg in func.GetOriginalArgs() if not arg.IsConstant() + ] + gl_arg_strings = [ + arg.GetValidGLArg(func) \ + for arg in func.GetOriginalArgs() + ] gl_func_name = func.GetGLTestFunctionName() vars = { 'test_name': 'GLES2DecoderTest%d' % file.file_num, @@ -2916,19 +2958,26 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, file.Write(test % vars) def WriteInvalidUnitTest(self, func, file, test, extra = {}): - """Writes a invalid unit test.""" - for arg_index, arg in enumerate(func.GetOriginalArgs()): - num_invalid_values = arg.GetNumInvalidValues(func) + """Writes an invalid unit test for the service implementation.""" + for invalid_arg_index, invalid_arg in enumerate(func.GetOriginalArgs()): + # Service implementation does not test constants, as they are not part of + # the call in the service side. + if invalid_arg.IsConstant(): + continue + + num_invalid_values = invalid_arg.GetNumInvalidValues(func) for value_index in range(0, num_invalid_values): arg_strings = [] parse_result = "kNoError" gl_error = None - for count, arg in enumerate(func.GetOriginalArgs()): - if count == arg_index: + for arg in func.GetOriginalArgs(): + if arg.IsConstant(): + continue + if invalid_arg is arg: (arg_string, parse_result, gl_error) = arg.GetInvalidArg( - count, value_index) + value_index) else: - arg_string = arg.GetValidArg(func, count, 0) + arg_string = arg.GetValidArg(func) arg_strings.append(arg_string) gl_arg_strings = [] for arg in func.GetOriginalArgs(): @@ -2941,7 +2990,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, vars = { 'test_name': 'GLES2DecoderTest%d' % file.file_num , 'name': func.name, - 'arg_index': arg_index, + 'arg_index': invalid_arg_index, 'value_index': value_index, 'gl_func_name': gl_func_name, 'args': ", ".join(arg_strings), @@ -2955,8 +3004,32 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d, def WriteServiceUnitTest(self, func, file): """Writes the service unit test for a command.""" - valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { + + if func.name == 'Enable': + valid_test = """ +TEST_P(%(test_name)s, %(name)sValidArgs) { + SetupExpectationsForEnableDisable(%(gl_args)s, true); + SpecializedSetup<cmds::%(name)s, 0>(true); + cmds::%(name)s cmd; + cmd.Init(%(args)s); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} +""" + elif func.name == 'Disable': + valid_test = """ +TEST_P(%(test_name)s, %(name)sValidArgs) { + SetupExpectationsForEnableDisable(%(gl_args)s, false); + SpecializedSetup<cmds::%(name)s, 0>(true); + cmds::%(name)s cmd; + cmd.Init(%(args)s); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} +""" + else: + valid_test = """ +TEST_P(%(test_name)s, %(name)sValidArgs) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)); SpecializedSetup<cmds::%(name)s, 0>(true); cmds::%(name)s cmd; @@ -2968,7 +3041,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { self.WriteValidUnitTest(func, file, valid_test) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { +TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0); SpecializedSetup<cmds::%(name)s, 0>(false); cmds::%(name)s cmd; @@ -3076,7 +3149,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { for arg in func.GetOriginalArgs(): arg.WriteClientSideValidationCode(file, func) file.Write(" helper_->%s(%s);\n" % - (func.name, func.MakeOriginalArgString(""))) + (func.name, func.MakeHelperArgString(""))) file.Write(" CheckGLError();\n") self.WriteClientGLReturnLog(func, file) file.Write("}\n") @@ -3122,18 +3195,46 @@ TEST_F(GLES2ImplementationTest, %(name)s) { EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } """ - cmd_arg_strings = [] - for count, arg in enumerate(func.GetCmdArgs()): - cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0)) - count += 1 - gl_arg_strings = [] - for count, arg in enumerate(func.GetOriginalArgs()): - gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0)) + cmd_arg_strings = [ + arg.GetValidClientSideCmdArg(func) for arg in func.GetCmdArgs() + ] + + gl_arg_strings = [ + arg.GetValidClientSideArg(func) for arg in func.GetOriginalArgs() + ] + file.Write(code % { 'name': func.name, 'args': ", ".join(gl_arg_strings), 'cmd_args': ", ".join(cmd_arg_strings), }) + + # Test constants for invalid values, as they are not tested by the + # service. + constants = [arg for arg in func.GetOriginalArgs() if arg.IsConstant()] + if constants: + code = """ +TEST_F(GLES2ImplementationTest, %(name)sInvalidConstantArg%(invalid_index)d) { + gl_->%(name)s(%(args)s); + EXPECT_TRUE(NoCommandsWritten()); + EXPECT_EQ(%(gl_error)s, CheckError()); +} +""" + for invalid_arg in constants: + gl_arg_strings = [] + invalid = invalid_arg.GetInvalidArg(func) + for arg in func.GetOriginalArgs(): + if arg is invalid_arg: + gl_arg_strings.append(invalid[0]) + else: + gl_arg_strings.append(arg.GetValidClientSideArg(func)) + + file.Write(code % { + 'name': func.name, + 'invalid_index': func.GetOriginalArgs().index(invalid_arg), + 'args': ", ".join(gl_arg_strings), + 'gl_error': invalid[2], + }) else: if client_test != False: file.Write("// TODO: Implement unit test for %s\n" % func.name) @@ -3149,8 +3250,8 @@ TEST_F(GLES2ImplementationTest, %(name)s) { def WriteImmediateCmdComputeSize(self, func, file): """Writes the size computation code for the immediate version of a cmd.""" - file.Write(" static uint32 ComputeSize(uint32 size_in_bytes) {\n") - file.Write(" return static_cast<uint32>(\n") + file.Write(" static uint32_t ComputeSize(uint32_t size_in_bytes) {\n") + file.Write(" return static_cast<uint32_t>(\n") file.Write(" sizeof(ValueType) + // NOLINT\n") file.Write(" RoundSizeToMultipleOfEntries(size_in_bytes));\n") file.Write(" }\n") @@ -3158,7 +3259,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { def WriteImmediateCmdSetHeader(self, func, file): """Writes the SetHeader function for the immediate version of a cmd.""" - file.Write(" void SetHeader(uint32 size_in_bytes) {\n") + file.Write(" void SetHeader(uint32_t size_in_bytes) {\n") file.Write(" header.SetCmdByTotalSize<ValueType>(size_in_bytes);\n") file.Write(" }\n") file.Write("\n") @@ -3190,7 +3291,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { def WriteImmediateCmdHelper(self, func, file): """Writes the cmd helper definition for the immediate version of a cmd.""" code = """ void %(name)s(%(typed_args)s) { - const uint32 s = 0; // TODO(gman): compute correct size + const uint32_t s = 0; // TODO(gman): compute correct size gles2::cmds::%(name)s* c = GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(s); if (c) { @@ -3240,6 +3341,10 @@ class StateSetHandler(TypeHandler): if 'state_flag' in state: file.Write(" %s = true;\n" % state['state_flag']) if not func.GetInfo("no_gl"): + for ndx,item in enumerate(states): + if item.get('cached', False): + file.Write(" state_.%s = %s;\n" % + (CachedStateName(item), args[ndx].name)) file.Write(" %s(%s);\n" % (func.GetGLFunctionName(), func.MakeOriginalArgString(""))) file.Write(" }\n") @@ -3254,7 +3359,7 @@ class StateSetHandler(TypeHandler): if 'range_checks' in item: for check_ndx, range_check in enumerate(item['range_checks']): valid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidValue%(ndx)d_%(check_ndx)d) { +TEST_P(%(test_name)s, %(name)sInvalidValue%(ndx)d_%(check_ndx)d) { SpecializedSetup<cmds::%(name)s, 0>(false); cmds::%(name)s cmd; cmd.Init(%(args)s); @@ -3263,9 +3368,11 @@ TEST_F(%(test_name)s, %(name)sInvalidValue%(ndx)d_%(check_ndx)d) { } """ name = func.name - arg_strings = [] - for count, arg in enumerate(func.GetOriginalArgs()): - arg_strings.append(arg.GetValidArg(func, count, 0)) + arg_strings = [ + arg.GetValidArg(func) \ + for arg in func.GetOriginalArgs() if not arg.IsConstant() + ] + arg_strings[ndx] = range_check['test_value'] vars = { 'test_name': 'GLES2DecoderTest%d' % file.file_num, @@ -3431,7 +3538,8 @@ class CustomHandler(TypeHandler): def WriteImmediateCmdGetTotalSize(self, func, file): """Overrriden from TypeHandler.""" - file.Write(" uint32 total_size = 0; // TODO(gman): get correct size.\n") + file.Write( + " uint32_t total_size = 0; // TODO(gman): get correct size.\n") def WriteImmediateCmdInit(self, func, file): """Overrriden from TypeHandler.""" @@ -3460,9 +3568,9 @@ class CustomHandler(TypeHandler): class TodoHandler(CustomHandler): """Handle for commands that are not yet implemented.""" - def AddImmediateFunction(self, generator, func): - """Overrriden from TypeHandler.""" - pass + def NeedsDataTransferFunction(self, func): + """Overriden from TypeHandler.""" + return False def WriteImmediateFormatTest(self, func, file): """Overrriden from TypeHandler.""" @@ -3492,7 +3600,7 @@ class TodoHandler(CustomHandler): file.Write( "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) file.Write( - " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" % + " uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" % func.name) file.Write(" // TODO: for now this is a no-op\n") file.Write( @@ -3512,6 +3620,13 @@ class HandWrittenHandler(CustomHandler): CustomHandler.InitFunction(self, func) func.can_auto_generate = False + def NeedsDataTransferFunction(self, func): + """Overriden from TypeHandler.""" + # If specified explicitly, force the data transfer method. + if func.GetInfo('data_transfer_methods'): + return True + return False + def WriteStruct(self, func, file): """Overrriden from TypeHandler.""" pass @@ -3645,16 +3760,16 @@ class DataHandler(TypeHandler): if name.endswith("Immediate"): name = name[0:-9] if name == 'BufferData' or name == 'BufferSubData': - file.Write(" uint32 data_size = size;\n") + file.Write(" uint32_t data_size = size;\n") elif (name == 'CompressedTexImage2D' or name == 'CompressedTexSubImage2D'): - file.Write(" uint32 data_size = imageSize;\n") + file.Write(" uint32_t data_size = imageSize;\n") elif (name == 'CompressedTexSubImage2DBucket'): file.Write(" Bucket* bucket = GetBucket(c.bucket_id);\n") - file.Write(" uint32 data_size = bucket->size();\n") + file.Write(" uint32_t data_size = bucket->size();\n") file.Write(" GLsizei imageSize = data_size;\n") elif name == 'TexImage2D' or name == 'TexSubImage2D': - code = """ uint32 data_size; + code = """ uint32_t data_size; if (!GLES2Util::ComputeImageDataSize( width, height, format, type, unpack_alignment_, &data_size)) { return error::kOutOfBounds; @@ -3662,7 +3777,8 @@ class DataHandler(TypeHandler): """ file.Write(code) else: - file.Write("// uint32 data_size = 0; // TODO(gman): get correct size!\n") + file.Write( + "// uint32_t data_size = 0; // TODO(gman): get correct size!\n") def WriteImmediateCmdGetTotalSize(self, func, file): """Overrriden from TypeHandler.""" @@ -3726,7 +3842,7 @@ class BindHandler(TypeHandler): if len(func.GetOriginalArgs()) == 1: valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)); SpecializedSetup<cmds::%(name)s, 0>(true); cmds::%(name)s cmd; @@ -3734,8 +3850,10 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } - -TEST_F(%(test_name)s, %(name)sValidArgsNewId) { +""" + if func.GetInfo("gen_func"): + valid_test += """ +TEST_P(%(test_name)s, %(name)sValidArgsNewId) { EXPECT_CALL(*gl_, %(gl_func_name)s(kNewServiceId)); EXPECT_CALL(*gl_, %(gl_gen_func_name)s(1, _)) .WillOnce(SetArgumentPointee<1>(kNewServiceId)); @@ -3747,15 +3865,13 @@ TEST_F(%(test_name)s, %(name)sValidArgsNewId) { EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL); } """ - gen_func_names = { - } self.WriteValidUnitTest(func, file, valid_test, { 'resource_type': func.GetOriginalArgs()[0].resource_type, 'gl_gen_func_name': func.GetInfo("gen_func"), }) else: valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)); SpecializedSetup<cmds::%(name)s, 0>(true); cmds::%(name)s cmd; @@ -3763,8 +3879,10 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } - -TEST_F(%(test_name)s, %(name)sValidArgsNewId) { +""" + if func.GetInfo("gen_func"): + valid_test += """ +TEST_P(%(test_name)s, %(name)sValidArgsNewId) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(first_gl_arg)s, kNewServiceId)); EXPECT_CALL(*gl_, %(gl_gen_func_name)s(1, _)) .WillOnce(SetArgumentPointee<1>(kNewServiceId)); @@ -3776,17 +3894,15 @@ TEST_F(%(test_name)s, %(name)sValidArgsNewId) { EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL); } """ - gen_func_names = { - } self.WriteValidUnitTest(func, file, valid_test, { - 'first_arg': func.GetOriginalArgs()[0].GetValidArg(func, 0, 0), - 'first_gl_arg': func.GetOriginalArgs()[0].GetValidGLArg(func, 0, 0), + 'first_arg': func.GetOriginalArgs()[0].GetValidArg(func), + 'first_gl_arg': func.GetOriginalArgs()[0].GetValidGLArg(func), 'resource_type': func.GetOriginalArgs()[1].resource_type, 'gl_gen_func_name': func.GetInfo("gen_func"), }) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { +TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0); SpecializedSetup<cmds::%(name)s, 0>(false); cmds::%(name)s cmd; @@ -3819,7 +3935,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { SetGLError(GL_INVALID_OPERATION, "%(name)s\", \"%(id)s reserved id"); return; } - if (Bind%(type)sHelper(%(arg_string)s)) { + if (%(name)sHelper(%(arg_string)s)) { helper_->%(name)s(%(arg_string)s); } CheckGLError(); @@ -3862,13 +3978,13 @@ TEST_F(GLES2ImplementationTest, %(name)s) { EXPECT_TRUE(NoCommandsWritten()); } """ - cmd_arg_strings = [] - for count, arg in enumerate(func.GetCmdArgs()): - cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0)) - count += 1 - gl_arg_strings = [] - for count, arg in enumerate(func.GetOriginalArgs()): - gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0)) + cmd_arg_strings = [ + arg.GetValidClientSideCmdArg(func) for arg in func.GetCmdArgs() + ] + gl_arg_strings = [ + arg.GetValidClientSideArg(func) for arg in func.GetOriginalArgs() + ] + file.Write(code % { 'name': func.name, 'args': ", ".join(gl_arg_strings), @@ -3888,7 +4004,7 @@ class GENnHandler(TypeHandler): def WriteGetDataSizeCode(self, func, file): """Overrriden from TypeHandler.""" - code = """ uint32 data_size; + code = """ uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } @@ -3937,7 +4053,8 @@ class GENnHandler(TypeHandler): MakeIds(this, 0, %(args)s); %(name)sHelper(%(args)s); helper_->%(name)sImmediate(%(args)s); - helper_->CommandBufferHelper::Flush(); + if (share_group_->bind_generates_resource()) + helper_->CommandBufferHelper::Flush(); %(log_code)s CheckGLError(); } @@ -3972,7 +4089,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { def WriteServiceUnitTest(self, func, file): """Overrriden from TypeHandler.""" valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { EXPECT_CALL(*gl_, %(gl_func_name)s(1, _)) .WillOnce(SetArgumentPointee<1>(kNewServiceId)); GetSharedMemoryAs<GLuint*>()[0] = kNewClientId; @@ -3988,7 +4105,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { 'resource_name': func.GetInfo('resource_type'), }) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs) { +TEST_P(%(test_name)s, %(name)sInvalidArgs) { EXPECT_CALL(*gl_, %(gl_func_name)s(_, _)).Times(0); GetSharedMemoryAs<GLuint*>()[0] = client_%(resource_name)s_id_; SpecializedSetup<cmds::%(name)s, 0>(false); @@ -4004,7 +4121,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { def WriteImmediateServiceUnitTest(self, func, file): """Overrriden from TypeHandler.""" valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { EXPECT_CALL(*gl_, %(gl_func_name)s(1, _)) .WillOnce(SetArgumentPointee<1>(kNewServiceId)); cmds::%(name)s* cmd = GetImmediateAs<cmds::%(name)s>(); @@ -4021,7 +4138,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { 'resource_name': func.GetInfo('resource_type'), }) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs) { +TEST_P(%(test_name)s, %(name)sInvalidArgs) { EXPECT_CALL(*gl_, %(gl_func_name)s(_, _)).Times(0); cmds::%(name)s* cmd = GetImmediateAs<cmds::%(name)s>(); SpecializedSetup<cmds::%(name)s, 0>(false); @@ -4036,13 +4153,13 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { def WriteImmediateCmdComputeSize(self, func, file): """Overrriden from TypeHandler.""" - file.Write(" static uint32 ComputeDataSize(GLsizei n) {\n") + file.Write(" static uint32_t ComputeDataSize(GLsizei n) {\n") file.Write( - " return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT\n") + " return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT\n") file.Write(" }\n") file.Write("\n") - file.Write(" static uint32 ComputeSize(GLsizei n) {\n") - file.Write(" return static_cast<uint32>(\n") + file.Write(" static uint32_t ComputeSize(GLsizei n) {\n") + file.Write(" return static_cast<uint32_t>(\n") file.Write(" sizeof(ValueType) + ComputeDataSize(n)); // NOLINT\n") file.Write(" }\n") file.Write("\n") @@ -4078,7 +4195,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { last_arg.type, last_arg.name)) file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" % (copy_args, last_arg.name)) - file.Write(" const uint32 size = ComputeSize(_n);\n") + file.Write(" const uint32_t size = ComputeSize(_n);\n") file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>(" "cmd, size);\n") file.Write(" }\n") @@ -4087,7 +4204,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { def WriteImmediateCmdHelper(self, func, file): """Overrriden from TypeHandler.""" code = """ void %(name)s(%(typed_args)s) { - const uint32 size = gles2::cmds::%(name)s::ComputeSize(n); + const uint32_t size = gles2::cmds::%(name)s::ComputeSize(n); gles2::cmds::%(name)s* c = GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size); if (c) { @@ -4110,7 +4227,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { (func.name, func.name)) file.Write(" void* next_cmd = cmd.Set(\n") file.Write(" &cmd, static_cast<GLsizei>(arraysize(ids)), ids);\n") - file.Write(" EXPECT_EQ(static_cast<uint32>(cmds::%s::kCmdId),\n" % + file.Write(" EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" % func.name) file.Write(" cmd.header.command);\n") file.Write(" EXPECT_EQ(sizeof(cmd) +\n") @@ -4133,12 +4250,12 @@ class CreateHandler(TypeHandler): def InitFunction(self, func): """Overrriden from TypeHandler.""" - func.AddCmdArg(Argument("client_id", 'uint32')) + func.AddCmdArg(Argument("client_id", 'uint32_t')) def WriteServiceUnitTest(self, func, file): """Overrriden from TypeHandler.""" valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)) .WillOnce(Return(kNewServiceId)); SpecializedSetup<cmds::%(name)s, 0>(true); @@ -4157,7 +4274,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { 'resource_type': func.name[6:], }) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { +TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0); SpecializedSetup<cmds::%(name)s, 0>(false); cmds::%(name)s cmd; @@ -4171,7 +4288,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { def WriteHandlerImplementation (self, func, file): """Overrriden from TypeHandler.""" - file.Write(" uint32 client_id = c.client_id;\n") + file.Write(" uint32_t client_id = c.client_id;\n") file.Write(" if (!%sHelper(%s)) {\n" % (func.name, func.MakeCmdArgString(""))) file.Write(" return error::kInvalidArguments;\n") @@ -4237,7 +4354,7 @@ class DELnHandler(TypeHandler): def WriteGetDataSizeCode(self, func, file): """Overrriden from TypeHandler.""" - code = """ uint32 data_size; + code = """ uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } @@ -4269,7 +4386,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { def WriteServiceUnitTest(self, func, file): """Overrriden from TypeHandler.""" valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { EXPECT_CALL( *gl_, %(gl_func_name)s(1, Pointee(kService%(upper_resource_name)sId))) @@ -4289,7 +4406,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { 'upper_resource_name': func.GetInfo('resource_type'), }) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs) { +TEST_P(%(test_name)s, %(name)sInvalidArgs) { GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId; SpecializedSetup<cmds::%(name)s, 0>(false); cmds::%(name)s cmd; @@ -4302,7 +4419,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { def WriteImmediateServiceUnitTest(self, func, file): """Overrriden from TypeHandler.""" valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { EXPECT_CALL( *gl_, %(gl_func_name)s(1, Pointee(kService%(upper_resource_name)sId))) @@ -4322,7 +4439,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { 'upper_resource_name': func.GetInfo('resource_type'), }) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs) { +TEST_P(%(test_name)s, %(name)sInvalidArgs) { cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>(); SpecializedSetup<cmds::%(name)s, 0>(false); GLuint temp = kInvalidClientId; @@ -4384,13 +4501,13 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { def WriteImmediateCmdComputeSize(self, func, file): """Overrriden from TypeHandler.""" - file.Write(" static uint32 ComputeDataSize(GLsizei n) {\n") + file.Write(" static uint32_t ComputeDataSize(GLsizei n) {\n") file.Write( - " return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT\n") + " return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT\n") file.Write(" }\n") file.Write("\n") - file.Write(" static uint32 ComputeSize(GLsizei n) {\n") - file.Write(" return static_cast<uint32>(\n") + file.Write(" static uint32_t ComputeSize(GLsizei n) {\n") + file.Write(" return static_cast<uint32_t>(\n") file.Write(" sizeof(ValueType) + ComputeDataSize(n)); // NOLINT\n") file.Write(" }\n") file.Write("\n") @@ -4426,7 +4543,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { last_arg.type, last_arg.name)) file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" % (copy_args, last_arg.name)) - file.Write(" const uint32 size = ComputeSize(_n);\n") + file.Write(" const uint32_t size = ComputeSize(_n);\n") file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>(" "cmd, size);\n") file.Write(" }\n") @@ -4435,7 +4552,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { def WriteImmediateCmdHelper(self, func, file): """Overrriden from TypeHandler.""" code = """ void %(name)s(%(typed_args)s) { - const uint32 size = gles2::cmds::%(name)s::ComputeSize(n); + const uint32_t size = gles2::cmds::%(name)s::ComputeSize(n); gles2::cmds::%(name)s* c = GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size); if (c) { @@ -4458,7 +4575,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { (func.name, func.name)) file.Write(" void* next_cmd = cmd.Set(\n") file.Write(" &cmd, static_cast<GLsizei>(arraysize(ids)), ids);\n") - file.Write(" EXPECT_EQ(static_cast<uint32>(cmds::%s::kCmdId),\n" % + file.Write(" EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" % func.name) file.Write(" cmd.header.command);\n") file.Write(" EXPECT_EQ(sizeof(cmd) +\n") @@ -4479,16 +4596,16 @@ class GETnHandler(TypeHandler): def __init__(self): TypeHandler.__init__(self) - def AddImmediateFunction(self, generator, func): - """Overrriden from TypeHandler.""" - pass + def NeedsDataTransferFunction(self, func): + """Overriden from TypeHandler.""" + return False def WriteServiceImplementation(self, func, file): """Overrriden from TypeHandler.""" file.Write( "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) file.Write( - " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" % + " uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" % func.name) last_arg = func.GetLastOriginalArg() @@ -4552,7 +4669,9 @@ class GETnHandler(TypeHandler): arg_string = ( ", ".join(["%s" % arg.name for arg in all_but_last_args])) all_arg_string = ( - ", ".join(["%s" % arg.name for arg in func.GetOriginalArgs()])) + ", ".join([ + "%s" % arg.name + for arg in func.GetOriginalArgs() if not arg.IsConstant()])) self.WriteTraceEvent(func, file) code = """ if (%(func_name)sHelper(%(all_arg_string)s)) { return; @@ -4568,7 +4687,7 @@ class GETnHandler(TypeHandler): WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ - for (int32 i = 0; i < result->GetNumResults(); ++i) { + for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); @@ -4601,14 +4720,18 @@ TEST_F(GLES2ImplementationTest, %(name)s) { EXPECT_EQ(static_cast<Result::Type>(1), result); } """ - cmd_arg_strings = [] - for count, arg in enumerate(func.GetCmdArgs()[0:-2]): - cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0)) - cmd_arg_strings[0] = '123' - gl_arg_strings = [] - for count, arg in enumerate(func.GetOriginalArgs()[0:-1]): - gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0)) - gl_arg_strings[0] = '123' + first_cmd_arg = func.GetCmdArgs()[0].GetValidNonCachedClientSideCmdArg(func) + if not first_cmd_arg: + return + + first_gl_arg = func.GetCmdArgs()[0].GetValidNonCachedClientSideArg(func) + cmd_arg_strings = [first_cmd_arg] + for arg in func.GetCmdArgs()[1:-2]: + cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func)) + gl_arg_strings = [first_gl_arg] + for arg in func.GetOriginalArgs()[1:-1]: + gl_arg_strings.append(arg.GetValidClientSideArg(func)) + file.Write(code % { 'name': func.name, 'args': ", ".join(gl_arg_strings), @@ -4618,7 +4741,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { def WriteServiceUnitTest(self, func, file): """Overrriden from TypeHandler.""" valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) @@ -4639,8 +4762,8 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { """ gl_arg_strings = [] valid_pname = '' - for count, arg in enumerate(func.GetOriginalArgs()[:-1]): - arg_value = arg.GetValidGLArg(func, count, 0) + for arg in func.GetOriginalArgs()[:-1]: + arg_value = arg.GetValidGLArg(func) gl_arg_strings.append(arg_value) if arg.name == 'pname': valid_pname = arg_value @@ -4655,7 +4778,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { }) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { +TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0); SpecializedSetup<cmds::%(name)s, 0>(false); cmds::%(name)s::Result* result = @@ -4669,25 +4792,48 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { """ self.WriteInvalidUnitTest(func, file, invalid_test) +class ArrayArgTypeHandler(TypeHandler): + """Base class for type handlers that handle args that are arrays""" + + def __init__(self): + TypeHandler.__init__(self) -class PUTHandler(TypeHandler): + def GetArrayType(self, func): + """Returns the type of the element in the element array being PUT to.""" + for arg in func.GetOriginalArgs(): + if arg.IsPointer(): + element_type = arg.GetPointedType() + return element_type + + # Special case: array type handler is used for a function that is forwarded + # to the actual array type implementation + element_type = func.GetOriginalArgs()[-1].type + assert all(arg.type == element_type \ + for arg in func.GetOriginalArgs()[-self.GetArrayCount(func):]) + return element_type + + def GetArrayCount(self, func): + """Returns the count of the elements in the array being PUT to.""" + return func.GetInfo('count') + +class PUTHandler(ArrayArgTypeHandler): """Handler for glTexParameter_v, glVertexAttrib_v functions.""" def __init__(self): - TypeHandler.__init__(self) + ArrayArgTypeHandler.__init__(self) def WriteServiceUnitTest(self, func, file): """Writes the service unit test for a command.""" expected_call = "EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));" if func.GetInfo("first_element_only"): - gl_arg_strings = [] - for count, arg in enumerate(func.GetOriginalArgs()): - gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) + gl_arg_strings = [ + arg.GetValidGLArg(func) for arg in func.GetOriginalArgs() + ] gl_arg_strings[-1] = "*" + gl_arg_strings[-1] expected_call = ("EXPECT_CALL(*gl_, %%(gl_func_name)s(%s));" % ", ".join(gl_arg_strings)) valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { SpecializedSetup<cmds::%(name)s, 0>(true); cmds::%(name)s cmd; cmd.Init(%(args)s); @@ -4698,14 +4844,14 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { } """ extra = { - 'data_type': func.GetInfo('data_type'), + 'data_type': self.GetArrayType(func), 'data_value': func.GetInfo('data_value') or '0', 'expected_call': expected_call, } self.WriteValidUnitTest(func, file, valid_test, extra) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { +TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0); SpecializedSetup<cmds::%(name)s, 0>(false); cmds::%(name)s cmd; @@ -4719,7 +4865,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { def WriteImmediateServiceUnitTest(self, func, file): """Writes the service unit test for a command.""" valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>(); SpecializedSetup<cmds::%(name)s, 0>(true); %(data_type)s temp[%(data_count)s] = { %(data_value)s, }; @@ -4733,15 +4879,15 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } """ - gl_arg_strings = [] - gl_any_strings = [] - for count, arg in enumerate(func.GetOriginalArgs()[0:-1]): - gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) - gl_any_strings.append("_") + gl_arg_strings = [ + arg.GetValidGLArg(func) for arg in func.GetOriginalArgs()[0:-1] + ] + gl_any_strings = ["_"] * len(gl_arg_strings) + extra = { 'data_ref': ("*" if func.GetInfo('first_element_only') else ""), - 'data_type': func.GetInfo('data_type'), - 'data_count': func.GetInfo('count'), + 'data_type': self.GetArrayType(func), + 'data_count': self.GetArrayCount(func), 'data_value': func.GetInfo('data_value') or '0', 'gl_args': ", ".join(gl_arg_strings), 'gl_any_args': ", ".join(gl_any_strings), @@ -4749,7 +4895,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { self.WriteValidUnitTest(func, file, valid_test, extra) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { +TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>(); EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_any_args)s, _)).Times(0); SpecializedSetup<cmds::%(name)s, 0>(false); @@ -4763,19 +4909,22 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { def WriteGetDataSizeCode(self, func, file): """Overrriden from TypeHandler.""" - code = """ uint32 data_size; + code = """ uint32_t data_size; if (!ComputeDataSize(1, sizeof(%s), %d, &data_size)) { return error::kOutOfBounds; } """ - file.Write(code % (func.info.data_type, func.info.count)) - if func.is_immediate: + file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func))) + if func.IsImmediate(): file.Write(" if (data_size > immediate_data_size) {\n") file.Write(" return error::kOutOfBounds;\n") file.Write(" }\n") def WriteGLES2Implementation(self, func, file): """Overrriden from TypeHandler.""" + impl_func = func.GetInfo('impl_func') + if (impl_func != None and impl_func != True): + return; file.Write("%s GLES2Implementation::%s(%s) {\n" % (func.return_type, func.original_name, func.MakeTypedOriginalArgString(""))) @@ -4784,7 +4933,8 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { self.WriteClientGLCallLog(func, file) last_arg_name = func.GetLastOriginalArg().name values_str = ' << ", " << '.join( - ["%s[%d]" % (last_arg_name, ndx) for ndx in range(0, func.info.count)]) + ["%s[%d]" % (last_arg_name, ndx) \ + for ndx in range(0, self.GetArrayCount(func))]) file.Write(' GPU_CLIENT_LOG("values: " << %s);\n' % values_str) for arg in func.GetOriginalArgs(): arg.WriteClientSideValidationCode(file, func) @@ -4796,6 +4946,9 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { def WriteGLES2ImplementationUnitTest(self, func, file): """Writes the GLES2 Implemention unit test.""" + client_test = func.GetInfo('client_test') + if (client_test != None and client_test != True): + return; code = """ TEST_F(GLES2ImplementationTest, %(name)s) { %(type)s data[%(count)d] = {0}; @@ -4813,30 +4966,31 @@ TEST_F(GLES2ImplementationTest, %(name)s) { EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } """ - cmd_arg_strings = [] - for count, arg in enumerate(func.GetCmdArgs()[0:-2]): - cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0)) - gl_arg_strings = [] - for count, arg in enumerate(func.GetOriginalArgs()[0:-1]): - gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0)) + cmd_arg_strings = [ + arg.GetValidClientSideCmdArg(func) for arg in func.GetCmdArgs()[0:-2] + ] + gl_arg_strings = [ + arg.GetValidClientSideArg(func) for arg in func.GetOriginalArgs()[0:-1] + ] + file.Write(code % { 'name': func.name, - 'type': func.GetInfo('data_type'), - 'count': func.GetInfo('count'), + 'type': self.GetArrayType(func), + 'count': self.GetArrayCount(func), 'args': ", ".join(gl_arg_strings), 'cmd_args': ", ".join(cmd_arg_strings), }) def WriteImmediateCmdComputeSize(self, func, file): """Overrriden from TypeHandler.""" - file.Write(" static uint32 ComputeDataSize() {\n") - file.Write(" return static_cast<uint32>(\n") + file.Write(" static uint32_t ComputeDataSize() {\n") + file.Write(" return static_cast<uint32_t>(\n") file.Write(" sizeof(%s) * %d); // NOLINT\n" % - (func.info.data_type, func.info.count)) + (self.GetArrayType(func), self.GetArrayCount(func))) file.Write(" }\n") file.Write("\n") - file.Write(" static uint32 ComputeSize() {\n") - file.Write(" return static_cast<uint32>(\n") + file.Write(" static uint32_t ComputeSize() {\n") + file.Write(" return static_cast<uint32_t>(\n") file.Write( " sizeof(ValueType) + ComputeDataSize()); // NOLINT\n") file.Write(" }\n") @@ -4874,7 +5028,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { last_arg.type, last_arg.name)) file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" % (copy_args, last_arg.name)) - file.Write(" const uint32 size = ComputeSize();\n") + file.Write(" const uint32_t size = ComputeSize();\n") file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>(" "cmd, size);\n") file.Write(" }\n") @@ -4883,7 +5037,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { def WriteImmediateCmdHelper(self, func, file): """Overrriden from TypeHandler.""" code = """ void %(name)s(%(typed_args)s) { - const uint32 size = gles2::cmds::%(name)s::ComputeSize(); + const uint32_t size = gles2::cmds::%(name)s::ComputeSize(); gles2::cmds::%(name)s* c = GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size); if (c) { @@ -4902,10 +5056,10 @@ TEST_F(GLES2ImplementationTest, %(name)s) { """Overrriden from TypeHandler.""" file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name) file.Write(" const int kSomeBaseValueToTestWith = 51;\n") - file.Write(" static %s data[] = {\n" % func.info.data_type) - for v in range(0, func.info.count): + file.Write(" static %s data[] = {\n" % self.GetArrayType(func)) + for v in range(0, self.GetArrayCount(func)): file.Write(" static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" % - (func.info.data_type, v)) + (self.GetArrayType(func), v)) file.Write(" };\n") file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" % (func.name, func.name)) @@ -4916,7 +5070,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 11)) file.Write(",\n data);\n") args = func.GetCmdArgs() - file.Write(" EXPECT_EQ(static_cast<uint32>(cmds::%s::kCmdId),\n" + file.Write(" EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" % func.name) file.Write(" cmd.header.command);\n") file.Write(" EXPECT_EQ(sizeof(cmd) +\n") @@ -4933,18 +5087,18 @@ TEST_F(GLES2ImplementationTest, %(name)s) { file.Write("\n") -class PUTnHandler(TypeHandler): +class PUTnHandler(ArrayArgTypeHandler): """Handler for PUTn 'glUniform__v' type functions.""" def __init__(self): - TypeHandler.__init__(self) + ArrayArgTypeHandler.__init__(self) def WriteServiceUnitTest(self, func, file): """Overridden from TypeHandler.""" - TypeHandler.WriteServiceUnitTest(self, func, file) + ArrayArgTypeHandler.WriteServiceUnitTest(self, func, file) valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgsCountTooLarge) { +TEST_P(%(test_name)s, %(name)sValidArgsCountTooLarge) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)); SpecializedSetup<cmds::%(name)s, 0>(true); cmds::%(name)s cmd; @@ -4968,8 +5122,9 @@ TEST_F(%(test_name)s, %(name)sValidArgsCountTooLarge) { # the number of elements requested in the command. arg_strings.append("5") else: - gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) - arg_strings.append(arg.GetValidArg(func, count, 0)) + gl_arg_strings.append(arg.GetValidGLArg(func)) + if not arg.IsConstant(): + arg_strings.append(arg.GetValidArg(func)) extra = { 'gl_args': ", ".join(gl_arg_strings), 'args': ", ".join(arg_strings), @@ -4979,7 +5134,7 @@ TEST_F(%(test_name)s, %(name)sValidArgsCountTooLarge) { def WriteImmediateServiceUnitTest(self, func, file): """Overridden from TypeHandler.""" valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>(); EXPECT_CALL( *gl_, @@ -4996,13 +5151,14 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { gl_arg_strings = [] gl_any_strings = [] arg_strings = [] - for count, arg in enumerate(func.GetOriginalArgs()[0:-1]): - gl_arg_strings.append(arg.GetValidGLArg(func, count, 0)) + for arg in func.GetOriginalArgs()[0:-1]: + gl_arg_strings.append(arg.GetValidGLArg(func)) gl_any_strings.append("_") - arg_strings.append(arg.GetValidArg(func, count, 0)) + if not arg.IsConstant(): + arg_strings.append(arg.GetValidArg(func)) extra = { - 'data_type': func.GetInfo('data_type'), - 'data_count': func.GetInfo('count'), + 'data_type': self.GetArrayType(func), + 'data_count': self.GetArrayCount(func), 'args': ", ".join(arg_strings), 'gl_args': ", ".join(gl_arg_strings), 'gl_any_args': ", ".join(gl_any_strings), @@ -5010,7 +5166,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { self.WriteValidUnitTest(func, file, valid_test, extra) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { +TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>(); EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_any_args)s, _)).Times(0); SpecializedSetup<cmds::%(name)s, 0>(false); @@ -5024,13 +5180,13 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { def WriteGetDataSizeCode(self, func, file): """Overrriden from TypeHandler.""" - code = """ uint32 data_size; + code = """ uint32_t data_size; if (!ComputeDataSize(count, sizeof(%s), %d, &data_size)) { return error::kOutOfBounds; } """ - file.Write(code % (func.info.data_type, func.info.count)) - if func.is_immediate: + file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func))) + if func.IsImmediate(): file.Write(" if (data_size > immediate_data_size) {\n") file.Write(" return error::kOutOfBounds;\n") file.Write(" }\n") @@ -5049,14 +5205,14 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { """) values_str = ' << ", " << '.join( ["%s[%d + i * %d]" % ( - last_arg_name, ndx, func.info.count) for ndx in range( - 0, func.info.count)]) + last_arg_name, ndx, self.GetArrayCount(func)) for ndx in range( + 0, self.GetArrayCount(func))]) file.Write(' GPU_CLIENT_LOG(" " << i << ": " << %s);\n' % values_str) file.Write(" }\n });\n") for arg in func.GetOriginalArgs(): arg.WriteClientSideValidationCode(file, func) file.Write(" helper_->%sImmediate(%s);\n" % - (func.name, func.MakeOriginalArgString(""))) + (func.name, func.MakeInitString(""))) file.Write(" CheckGLError();\n") file.Write("}\n") file.Write("\n") @@ -5082,34 +5238,79 @@ TEST_F(GLES2ImplementationTest, %(name)s) { EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } """ - cmd_arg_strings = [] - for count, arg in enumerate(func.GetCmdArgs()[0:-2]): - cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func, count, 0)) + cmd_arg_strings = [ + arg.GetValidClientSideCmdArg(func) for arg in func.GetCmdArgs()[0:-2] + ] gl_arg_strings = [] count_param = 0 - for count, arg in enumerate(func.GetOriginalArgs()[0:-1]): - gl_arg_strings.append(arg.GetValidClientSideArg(func, count, 0)) + for arg in func.GetOriginalArgs()[0:-1]: + valid_value = arg.GetValidClientSideArg(func) + gl_arg_strings.append(valid_value) if arg.name == "count": - count_param = int(arg.GetValidClientSideArg(func, count, 0)) + count_param = int(valid_value) file.Write(code % { 'name': func.name, - 'type': func.GetInfo('data_type'), - 'count': func.GetInfo('count'), + 'type': self.GetArrayType(func), + 'count': self.GetArrayCount(func), 'args': ", ".join(gl_arg_strings), 'cmd_args': ", ".join(cmd_arg_strings), 'count_param': count_param, }) + # Test constants for invalid values, as they are not tested by the + # service. + constants = [ + arg for arg in func.GetOriginalArgs()[0:-1] if arg.IsConstant() + ] + if not constants: + return + + code = """ +TEST_F(GLES2ImplementationTest, %(name)sInvalidConstantArg%(invalid_index)d) { + %(type)s data[%(count_param)d][%(count)d] = {{0}}; + for (int ii = 0; ii < %(count_param)d; ++ii) { + for (int jj = 0; jj < %(count)d; ++jj) { + data[ii][jj] = static_cast<%(type)s>(ii * %(count)d + jj); + } + } + gl_->%(name)s(%(args)s, &data[0][0]); + EXPECT_TRUE(NoCommandsWritten()); + EXPECT_EQ(%(gl_error)s, CheckError()); +} +""" + for invalid_arg in constants: + gl_arg_strings = [] + invalid = invalid_arg.GetInvalidArg(func) + for arg in func.GetOriginalArgs()[0:-1]: + if arg is invalid_arg: + gl_arg_strings.append(invalid[0]) + else: + valid_value = arg.GetValidClientSideArg(func) + gl_arg_strings.append(valid_value) + if arg.name == "count": + count_param = int(valid_value) + + file.Write(code % { + 'name': func.name, + 'invalid_index': func.GetOriginalArgs().index(invalid_arg), + 'type': self.GetArrayType(func), + 'count': self.GetArrayCount(func), + 'args': ", ".join(gl_arg_strings), + 'gl_error': invalid[2], + 'count_param': count_param, + }) + + def WriteImmediateCmdComputeSize(self, func, file): """Overrriden from TypeHandler.""" - file.Write(" static uint32 ComputeDataSize(GLsizei count) {\n") - file.Write(" return static_cast<uint32>(\n") + file.Write(" static uint32_t ComputeDataSize(GLsizei count) {\n") + file.Write(" return static_cast<uint32_t>(\n") file.Write(" sizeof(%s) * %d * count); // NOLINT\n" % - (func.info.data_type, func.info.count)) + (self.GetArrayType(func), self.GetArrayCount(func))) file.Write(" }\n") file.Write("\n") - file.Write(" static uint32 ComputeSize(GLsizei count) {\n") - file.Write(" return static_cast<uint32>(\n") + file.Write(" static uint32_t ComputeSize(GLsizei count) {\n") + file.Write(" return static_cast<uint32_t>(\n") file.Write( " sizeof(ValueType) + ComputeDataSize(count)); // NOLINT\n") file.Write(" }\n") @@ -5147,7 +5348,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { last_arg.type, last_arg.name)) file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" % (copy_args, last_arg.name)) - file.Write(" const uint32 size = ComputeSize(_count);\n") + file.Write(" const uint32_t size = ComputeSize(_count);\n") file.Write(" return NextImmediateCmdAddressTotalSize<ValueType>(" "cmd, size);\n") file.Write(" }\n") @@ -5156,7 +5357,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) { def WriteImmediateCmdHelper(self, func, file): """Overrriden from TypeHandler.""" code = """ void %(name)s(%(typed_args)s) { - const uint32 size = gles2::cmds::%(name)s::ComputeSize(count); + const uint32_t size = gles2::cmds::%(name)s::ComputeSize(count); gles2::cmds::%(name)s* c = GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size); if (c) { @@ -5167,36 +5368,36 @@ TEST_F(GLES2ImplementationTest, %(name)s) { """ file.Write(code % { "name": func.name, - "typed_args": func.MakeTypedOriginalArgString(""), - "args": func.MakeOriginalArgString(""), + "typed_args": func.MakeTypedInitString(""), + "args": func.MakeInitString("") }) def WriteImmediateFormatTest(self, func, file): """Overrriden from TypeHandler.""" args = func.GetCmdArgs() count_param = 0 - for value, arg in enumerate(args): + for arg in args: if arg.name == "count": - count_param = int(arg.GetValidClientSideArg(func, value, 0)) + count_param = int(arg.GetValidClientSideCmdArg(func)) file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name) file.Write(" const int kSomeBaseValueToTestWith = 51;\n") - file.Write(" static %s data[] = {\n" % func.info.data_type) - for v in range(0, func.info.count * count_param): + file.Write(" static %s data[] = {\n" % self.GetArrayType(func)) + for v in range(0, self.GetArrayCount(func) * count_param): file.Write(" static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" % - (func.info.data_type, v)) + (self.GetArrayType(func), v)) file.Write(" };\n") file.Write(" cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" % (func.name, func.name)) file.Write(" const GLsizei kNumElements = %d;\n" % count_param) file.Write(" const size_t kExpectedCmdSize =\n") file.Write(" sizeof(cmd) + kNumElements * sizeof(%s) * %d;\n" % - (func.info.data_type, func.info.count)) + (self.GetArrayType(func), self.GetArrayCount(func))) file.Write(" void* next_cmd = cmd.Set(\n") file.Write(" &cmd") for value, arg in enumerate(args): file.Write(",\n static_cast<%s>(%d)" % (arg.type, value + 1)) file.Write(",\n data);\n") - file.Write(" EXPECT_EQ(static_cast<uint32>(cmds::%s::kCmdId),\n" % + file.Write(" EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" % func.name) file.Write(" cmd.header.command);\n") file.Write(" EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);\n") @@ -5211,10 +5412,10 @@ TEST_F(GLES2ImplementationTest, %(name)s) { file.Write("\n") -class PUTXnHandler(TypeHandler): +class PUTXnHandler(ArrayArgTypeHandler): """Handler for glUniform?f functions.""" def __init__(self): - TypeHandler.__init__(self) + ArrayArgTypeHandler.__init__(self) def WriteHandlerImplementation(self, func, file): """Overrriden from TypeHandler.""" @@ -5223,15 +5424,15 @@ class PUTXnHandler(TypeHandler): """ values = "" args = func.GetOriginalArgs() - count = int(func.GetInfo('count')) + count = int(self.GetArrayCount(func)) num_args = len(args) for ii in range(count): values += "%s, " % args[len(args) - count + ii].name file.Write(code % { 'name': func.name, - 'count': func.GetInfo('count'), - 'type': func.GetInfo('data_type'), + 'count': self.GetArrayCount(func), + 'type': self.GetArrayType(func), 'location': args[0].name, 'args': func.MakeOriginalArgString(""), 'values': values, @@ -5240,7 +5441,7 @@ class PUTXnHandler(TypeHandler): def WriteServiceUnitTest(self, func, file): """Overrriden from TypeHandler.""" valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { EXPECT_CALL(*gl_, %(name)sv(%(local_args)s)); SpecializedSetup<cmds::%(name)s, 0>(true); cmds::%(name)s cmd; @@ -5250,15 +5451,15 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { } """ args = func.GetOriginalArgs() - local_args = "%s, 1, _" % args[0].GetValidGLArg(func, 0, 0) + local_args = "%s, 1, _" % args[0].GetValidGLArg(func) self.WriteValidUnitTest(func, file, valid_test, { 'name': func.name, - 'count': func.GetInfo('count'), + 'count': self.GetArrayCount(func), 'local_args': local_args, }) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { +TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { EXPECT_CALL(*gl_, %(name)sv(_, _, _).Times(0); SpecializedSetup<cmds::%(name)s, 0>(false); cmds::%(name)s cmd; @@ -5268,7 +5469,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { """ self.WriteInvalidUnitTest(func, file, invalid_test, { 'name': func.GetInfo('name'), - 'count': func.GetInfo('count'), + 'count': self.GetArrayCount(func), }) @@ -5280,15 +5481,15 @@ class GLcharHandler(CustomHandler): def WriteImmediateCmdComputeSize(self, func, file): """Overrriden from TypeHandler.""" - file.Write(" static uint32 ComputeSize(uint32 data_size) {\n") - file.Write(" return static_cast<uint32>(\n") + file.Write(" static uint32_t ComputeSize(uint32_t data_size) {\n") + file.Write(" return static_cast<uint32_t>(\n") file.Write(" sizeof(ValueType) + data_size); // NOLINT\n") file.Write(" }\n") def WriteImmediateCmdSetHeader(self, func, file): """Overrriden from TypeHandler.""" code = """ - void SetHeader(uint32 data_size) { + void SetHeader(uint32_t data_size) { header.SetCmdBySize<ValueType>(data_size); } """ @@ -5302,7 +5503,7 @@ class GLcharHandler(CustomHandler): for arg in args: set_code.append(" %s = _%s;" % (arg.name, arg.name)) code = """ - void Init(%(typed_args)s, uint32 _data_size) { + void Init(%(typed_args)s, uint32_t _data_size) { SetHeader(_data_size); %(set_code)s memcpy(ImmediateDataAddress(this), _%(last_arg)s, _data_size); @@ -5310,7 +5511,7 @@ class GLcharHandler(CustomHandler): """ file.Write(code % { - "typed_args": func.MakeTypedOriginalArgString("_"), + "typed_args": func.MakeTypedArgString("_"), "set_code": "\n".join(set_code), "last_arg": last_arg.name }) @@ -5318,10 +5519,10 @@ class GLcharHandler(CustomHandler): def WriteImmediateCmdSet(self, func, file): """Overrriden from TypeHandler.""" last_arg = func.GetLastOriginalArg() - file.Write(" void* Set(void* cmd%s, uint32 _data_size) {\n" % - func.MakeTypedOriginalArgString("_", True)) + file.Write(" void* Set(void* cmd%s, uint32_t _data_size) {\n" % + func.MakeTypedCmdArgString("_", True)) file.Write(" static_cast<ValueType*>(cmd)->Init(%s, _data_size);\n" % - func.MakeOriginalArgString("_")) + func.MakeCmdArgString("_")) file.Write(" return NextImmediateCmdAddress<ValueType>(" "cmd, _data_size);\n") file.Write(" }\n") @@ -5330,7 +5531,7 @@ class GLcharHandler(CustomHandler): def WriteImmediateCmdHelper(self, func, file): """Overrriden from TypeHandler.""" code = """ void %(name)s(%(typed_args)s) { - const uint32 data_size = strlen(name); + const uint32_t data_size = strlen(name); gles2::cmds::%(name)s* c = GetImmediateCmdSpace<gles2::cmds::%(name)s>(data_size); if (c) { @@ -5365,7 +5566,7 @@ TEST_F(GLES2FormatTest, %(func_name)s) { %(init_code)s test_str, strlen(test_str)); - EXPECT_EQ(static_cast<uint32>(cmds::%(func_name)s::kCmdId), + EXPECT_EQ(static_cast<uint32_t>(cmds::%(func_name)s::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(strlen(test_str)), @@ -5374,7 +5575,7 @@ TEST_F(GLES2FormatTest, %(func_name)s) { reinterpret_cast<char*>(&cmd) + sizeof(cmd) + RoundSizeToMultipleOfEntries(strlen(test_str))); %(check_code)s - EXPECT_EQ(static_cast<uint32>(strlen(test_str)), cmd.data_size); + EXPECT_EQ(static_cast<uint32_t>(strlen(test_str)), cmd.data_size); EXPECT_EQ(0, memcmp(test_str, ImmediateDataAddress(&cmd), strlen(test_str))); CheckBytesWritten( next_cmd, @@ -5401,9 +5602,9 @@ class GLcharNHandler(CustomHandler): func.cmd_args = [] func.AddCmdArg(Argument('bucket_id', 'GLuint')) - def AddImmediateFunction(self, generator, func): - """Overrriden from TypeHandler.""" - pass + def NeedsDataTransferFunction(self, func): + """Overriden from TypeHandler.""" + return False def AddBucketFunction(self, generator, func): """Overrriden from TypeHandler.""" @@ -5412,7 +5613,7 @@ class GLcharNHandler(CustomHandler): def WriteServiceImplementation(self, func, file): """Overrriden from TypeHandler.""" file.Write("""error::Error GLES2DecoderImpl::Handle%(name)s( - uint32 immediate_data_size, const gles2::cmds::%(name)s& c) { + uint32_t immediate_data_size, const gles2::cmds::%(name)s& c) { GLuint bucket_id = static_cast<GLuint>(c.%(bucket_id)s); Bucket* bucket = GetBucket(bucket_id); if (!bucket || bucket->size() == 0) { @@ -5441,15 +5642,15 @@ class IsHandler(TypeHandler): def InitFunction(self, func): """Overrriden from TypeHandler.""" - func.AddCmdArg(Argument("result_shm_id", 'uint32')) - func.AddCmdArg(Argument("result_shm_offset", 'uint32')) + func.AddCmdArg(Argument("result_shm_id", 'uint32_t')) + func.AddCmdArg(Argument("result_shm_offset", 'uint32_t')) if func.GetInfo('result') == None: - func.AddInfo('result', ['uint32']) + func.AddInfo('result', ['uint32_t']) def WriteServiceUnitTest(self, func, file): """Overrriden from TypeHandler.""" valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)); SpecializedSetup<cmds::%(name)s, 0>(true); cmds::%(name)s cmd; @@ -5466,7 +5667,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { }) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { +TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0); SpecializedSetup<cmds::%(name)s, 0>(false); cmds::%(name)s cmd; @@ -5479,7 +5680,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) { }) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgsBadSharedMemoryId) { +TEST_P(%(test_name)s, %(name)sInvalidArgsBadSharedMemoryId) { EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0); SpecializedSetup<cmds::%(name)s, 0>(false); cmds::%(name)s cmd; @@ -5498,7 +5699,7 @@ TEST_F(%(test_name)s, %(name)sInvalidArgsBadSharedMemoryId) { file.Write( "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name) file.Write( - " uint32 immediate_data_size, const gles2::cmds::%s& c) {\n" % + " uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" % func.name) args = func.GetOriginalArgs() for arg in args: @@ -5562,14 +5763,13 @@ TEST_F(GLES2ImplementationTest, %(name)s) { cmds::%(name)s cmd; }; - typedef cmds::%(name)s::Result Result; Cmds expected; ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(cmds::%(name)s::Result)); expected.cmd.Init(1, result1.id, result1.offset); EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(result1.ptr, uint32(1))) + .WillOnce(SetMemory(result1.ptr, uint32_t(1))) .RetiresOnSaturation(); GLboolean result = gl_->%(name)s(1); @@ -5596,7 +5796,7 @@ class STRnHandler(TypeHandler): func.ClearCmdArgs() func.AddCmdArg(cmd_args[0]) # add on a bucket id. - func.AddCmdArg(Argument('bucket_id', 'uint32')) + func.AddCmdArg(Argument('bucket_id', 'uint32_t')) def WriteGLES2Implementation(self, func, file): """Overrriden from TypeHandler.""" @@ -5649,9 +5849,9 @@ class STRnHandler(TypeHandler): def WriteServiceUnitTest(self, func, file): """Overrriden from TypeHandler.""" valid_test = """ -TEST_F(%(test_name)s, %(name)sValidArgs) { +TEST_P(%(test_name)s, %(name)sValidArgs) { const char* kInfo = "hello"; - const uint32 kBucketId = 123; + const uint32_t kBucketId = 123; SpecializedSetup<cmds::%(name)s, 0>(true); %(expect_len_code)s EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)) @@ -5669,7 +5869,7 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { } """ args = func.GetOriginalArgs() - id_name = args[0].GetValidGLArg(func, 0, 0) + id_name = args[0].GetValidGLArg(func) get_len_func = func.GetInfo('get_len_func') get_len_enum = func.GetInfo('get_len_enum') sub = { @@ -5677,8 +5877,8 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { 'get_len_func': get_len_func, 'get_len_enum': get_len_enum, 'gl_args': '%s, strlen(kInfo) + 1, _, _' % - args[0].GetValidGLArg(func, 0, 0), - 'args': '%s, kBucketId' % args[0].GetValidArg(func, 0, 0), + args[0].GetValidGLArg(func), + 'args': '%s, kBucketId' % args[0].GetValidArg(func), 'expect_len_code': '', } if get_len_func and get_len_func[0:2] == 'gl': @@ -5689,8 +5889,8 @@ TEST_F(%(test_name)s, %(name)sValidArgs) { self.WriteValidUnitTest(func, file, valid_test, sub) invalid_test = """ -TEST_F(%(test_name)s, %(name)sInvalidArgs) { - const uint32 kBucketId = 123; +TEST_P(%(test_name)s, %(name)sInvalidArgs) { + const uint32_t kBucketId = 123; EXPECT_CALL(*gl_, %(gl_func_name)s(_, _, _, _)) .Times(0); cmds::%(name)s cmd; @@ -5705,27 +5905,50 @@ TEST_F(%(test_name)s, %(name)sInvalidArgs) { """Overrriden from TypeHandler.""" pass +class NamedType(object): + """A class that represents a type of an argument in a client function. + + A type of an argument that is to be passed through in the command buffer + command. Currently used only for the arguments that are specificly named in + the 'cmd_buffer_functions.txt' file, mostly enums. + """ + + def __init__(self, info): + assert not 'is_complete' in info or info['is_complete'] == True + self.info = info + self.valid = info['valid'] + if 'invalid' in info: + self.invalid = info['invalid'] + else: + self.invalid = [] + + def GetType(self): + return self.info['type'] + + def GetInvalidValues(self): + return self.invalid + + def GetValidValues(self): + return self.valid -class FunctionInfo(object): - """Holds info about a function.""" + def IsConstant(self): + if not 'is_complete' in self.info: + return False - def __init__(self, info, type_handler): - for key in info: - setattr(self, key, info[key]) - self.type_handler = type_handler - if not 'type' in info: - self.type = '' + return len(self.GetValidValues()) == 1 + def GetConstantValue(self): + return self.GetValidValues()[0] class Argument(object): """A class that represents a function argument.""" cmd_type_map_ = { - 'GLenum': 'uint32', - 'GLint': 'int32', - 'GLintptr': 'int32', - 'GLsizei': 'int32', - 'GLsizeiptr': 'int32', + 'GLenum': 'uint32_t', + 'GLint': 'int32_t', + 'GLintptr': 'int32_t', + 'GLsizei': 'int32_t', + 'GLsizeiptr': 'int32_t', 'GLfloat': 'float', 'GLclampf': 'float', } @@ -5741,47 +5964,79 @@ class Argument(object): if type in self.cmd_type_map_: self.cmd_type = self.cmd_type_map_[type] else: - self.cmd_type = 'uint32' + self.cmd_type = 'uint32_t' def IsPointer(self): """Returns true if argument is a pointer.""" return False + def IsConstant(self): + """Returns true if the argument has only one valid value.""" + return False + def AddCmdArgs(self, args): """Adds command arguments for this argument to the given list.""" - return args.append(self) + if not self.IsConstant(): + return args.append(self) def AddInitArgs(self, args): """Adds init arguments for this argument to the given list.""" - return args.append(self) + if not self.IsConstant(): + return args.append(self) - def GetValidArg(self, func, offset, index): + def GetValidArg(self, func): """Gets a valid value for this argument.""" - valid_arg = func.GetValidArg(offset) + valid_arg = func.GetValidArg(self) if valid_arg != None: return valid_arg - return str(offset + 1) - def GetValidClientSideArg(self, func, offset, index): - """Gets a valid value for this argument.""" - return str(offset + 1) + index = func.GetOriginalArgs().index(self) + return str(index + 1) - def GetValidClientSideCmdArg(self, func, offset, index): + def GetValidClientSideArg(self, func): """Gets a valid value for this argument.""" - return str(offset + 1) + valid_arg = func.GetValidArg(self) + if valid_arg != None: + return valid_arg - def GetValidGLArg(self, func, offset, index): - """Gets a valid GL value for this argument.""" - valid_arg = func.GetValidArg(offset) + index = func.GetOriginalArgs().index(self) + return str(index + 1) + + def GetValidClientSideCmdArg(self, func): + """Gets a valid value for this argument.""" + valid_arg = func.GetValidArg(self) if valid_arg != None: return valid_arg - return str(offset + 1) + try: + index = func.GetOriginalArgs().index(self) + return str(index + 1) + except ValueError: + pass + index = func.GetCmdArgs().index(self) + return str(index + 1) + + def GetValidGLArg(self, func): + """Gets a valid GL value for this argument.""" + return self.GetValidArg(func) + + def GetValidNonCachedClientSideArg(self, func): + """Returns a valid value for this argument in a GL call. + Using the value will produce a command buffer service invocation. + Returns None if there is no such value.""" + return '123' + + def GetValidNonCachedClientSideCmdArg(self, func): + """Returns a valid value for this argument in a command buffer command. + Calling the GL function with the value returned by + GetValidNonCachedClientSideArg will result in a command buffer command + that contains the value returned by this function. """ + return '123' def GetNumInvalidValues(self, func): """returns the number of invalid values to be tested.""" return 0 - def GetInvalidArg(self, offset, index): + def GetInvalidArg(self, index): """returns an invalid value and expected parse result by index.""" return ("---ERROR0---", "---ERROR2---", None) @@ -5840,19 +6095,19 @@ class BoolArgument(Argument): def __init__(self, name, type): Argument.__init__(self, name, 'GLboolean') - def GetValidArg(self, func, offset, index): + def GetValidArg(self, func): """Gets a valid value for this argument.""" return 'true' - def GetValidClientSideArg(self, func, offset, index): + def GetValidClientSideArg(self, func): """Gets a valid value for this argument.""" return 'true' - def GetValidClientSideCmdArg(self, func, offset, index): + def GetValidClientSideCmdArg(self, func): """Gets a valid value for this argument.""" return 'true' - def GetValidGLArg(self, func, offset, index): + def GetValidGLArg(self, func): """Gets a valid GL value for this argument.""" return 'true' @@ -5869,16 +6124,11 @@ class UniformLocationArgument(Argument): """ file.Write(code % (self.type, self.name, self.type, self.name)) - def GetValidArg(self, func, offset, index): - """Gets a valid value for this argument.""" - return "%d" % (offset + 1) - - class DataSizeArgument(Argument): """class for data_size which Bucket commands do not need.""" def __init__(self, name): - Argument.__init__(self, name, "uint32") + Argument.__init__(self, name, "uint32_t") def GetBucketVersion(self): return None @@ -5892,11 +6142,11 @@ class SizeArgument(Argument): def GetNumInvalidValues(self, func): """overridden from Argument.""" - if func.is_immediate: + if func.IsImmediate(): return 0 return 1 - def GetInvalidArg(self, offset, index): + def GetInvalidArg(self, index): """overridden from Argument.""" return ("-1", "kNoError", "GL_INVALID_VALUE") @@ -5925,7 +6175,7 @@ class SizeNotNegativeArgument(SizeArgument): def __init__(self, name, type, gl_type): SizeArgument.__init__(self, name, gl_type) - def GetInvalidArg(self, offset, index): + def GetInvalidArg(self, index): """overridden from SizeArgument.""" return ("-1", "kOutOfBounds", "GL_NO_ERROR") @@ -5944,11 +6194,19 @@ class EnumBaseArgument(Argument): self.gl_error = gl_error name = type[len(gl_type):] self.type_name = name - self.enum_info = _ENUM_LISTS[name] + self.named_type = NamedType(_NAMED_TYPE_INFO[name]) + + def IsConstant(self): + return self.named_type.IsConstant() + + def GetConstantValue(self): + return self.named_type.GetConstantValue() def WriteValidationCode(self, file, func): + if self.named_type.IsConstant(): + return file.Write(" if (!validators_->%s.IsValid(%s)) {\n" % - (ToUnderscore(self.type_name), self.name)) + (ToUnderscore(self.type_name), self.name)) if self.gl_error == "GL_INVALID_ENUM": file.Write( " LOCAL_SET_GL_ERROR_INVALID_ENUM(\"gl%s\", %s, \"%s\");\n" % @@ -5960,41 +6218,67 @@ class EnumBaseArgument(Argument): file.Write(" return error::kNoError;\n") file.Write(" }\n") - def GetValidArg(self, func, offset, index): - valid_arg = func.GetValidArg(offset) + def WriteClientSideValidationCode(self, file, func): + if not self.named_type.IsConstant(): + return + file.Write(" if (%s != %s) {" % (self.name, + self.GetConstantValue())) + file.Write( + " SetGLError(%s, \"gl%s\", \"%s %s\");\n" % + (self.gl_error, func.original_name, self.name, self.gl_error)) + if func.return_type == "void": + file.Write(" return;\n") + else: + file.Write(" return %s;\n" % func.GetErrorReturnString()) + file.Write(" }\n") + + def GetValidArg(self, func): + valid_arg = func.GetValidArg(self) if valid_arg != None: return valid_arg - if 'valid' in self.enum_info: - valid = self.enum_info['valid'] + valid = self.named_type.GetValidValues() + if valid: num_valid = len(valid) - if index >= num_valid: - index = num_valid - 1 - return valid[index] - return str(offset + 1) + return valid[0] + + index = func.GetOriginalArgs().index(self) + return str(index + 1) - def GetValidClientSideArg(self, func, offset, index): + def GetValidClientSideArg(self, func): """Gets a valid value for this argument.""" - return self.GetValidArg(func, offset, index) + return self.GetValidArg(func) - def GetValidClientSideCmdArg(self, func, offset, index): + def GetValidClientSideCmdArg(self, func): """Gets a valid value for this argument.""" - return self.GetValidArg(func, offset, index) + valid_arg = func.GetValidArg(self) + if valid_arg != None: + return valid_arg + + valid = self.named_type.GetValidValues() + if valid: + num_valid = len(valid) + return valid[0] - def GetValidGLArg(self, func, offset, index): + try: + index = func.GetOriginalArgs().index(self) + return str(index + 1) + except ValueError: + pass + index = func.GetCmdArgs().index(self) + return str(index + 1) + + def GetValidGLArg(self, func): """Gets a valid value for this argument.""" - return self.GetValidArg(func, offset, index) + return self.GetValidArg(func) def GetNumInvalidValues(self, func): """returns the number of invalid values to be tested.""" - if 'invalid' in self.enum_info: - invalid = self.enum_info['invalid'] - return len(invalid) - return 0 + return len(self.named_type.GetInvalidValues()) - def GetInvalidArg(self, offset, index): + def GetInvalidArg(self, index): """returns an invalid value by index.""" - if 'invalid' in self.enum_info: - invalid = self.enum_info['invalid'] + invalid = self.named_type.GetInvalidValues() + if invalid: num_invalid = len(invalid) if index >= num_invalid: index = num_invalid - 1 @@ -6049,6 +6333,14 @@ class ImmediatePointerArgument(Argument): def __init__(self, name, type): Argument.__init__(self, name, type) + def IsPointer(self): + return True + + def GetPointedType(self): + match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type) + assert match + return match.groupdict()['element_type'] + def AddCmdArgs(self, args): """Overridden from Argument.""" pass @@ -6122,11 +6414,16 @@ class PointerArgument(Argument): """Returns true if argument is a pointer.""" return True - def GetValidArg(self, func, offset, index): + def GetPointedType(self): + match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type) + assert match + return match.groupdict()['element_type'] + + def GetValidArg(self, func): """Overridden from Argument.""" return "shared_memory_id_, shared_memory_offset_" - def GetValidGLArg(self, func, offset, index): + def GetValidGLArg(self, func): """Overridden from Argument.""" return "reinterpret_cast<%s>(shared_memory_address_)" % self.type @@ -6134,7 +6431,7 @@ class PointerArgument(Argument): """Overridden from Argument.""" return 2 - def GetInvalidArg(self, offset, index): + def GetInvalidArg(self, index): """Overridden from Argument.""" if index == 0: return ("kInvalidSharedMemoryId, 0", "kOutOfBounds", None) @@ -6148,8 +6445,8 @@ class PointerArgument(Argument): def AddCmdArgs(self, args): """Overridden from Argument.""" - args.append(Argument("%s_shm_id" % self.name, 'uint32')) - args.append(Argument("%s_shm_offset" % self.name, 'uint32')) + args.append(Argument("%s_shm_id" % self.name, 'uint32_t')) + args.append(Argument("%s_shm_offset" % self.name, 'uint32_t')) def WriteGetCode(self, file): """Overridden from Argument.""" @@ -6194,7 +6491,7 @@ class InputStringBucketArgument(Argument): """An string input argument where the string is passed in a bucket.""" def __init__(self, name, type): - Argument.__init__(self, name + "_bucket_id", "uint32") + Argument.__init__(self, name + "_bucket_id", "uint32_t") def WriteGetCode(self, file): """Overridden from Argument.""" @@ -6213,10 +6510,10 @@ class InputStringBucketArgument(Argument): 'name': self.name, }) - def GetValidArg(self, func, offset, index): + def GetValidArg(self, func): return "kNameBucketId" - def GetValidGLArg(self, func, offset, index): + def GetValidGLArg(self, func): return "_" @@ -6248,10 +6545,10 @@ class ResourceIdArgument(Argument): """Overridden from Argument.""" file.Write(" %s %s = c.%s;\n" % (self.type, self.name, self.name)) - def GetValidArg(self, func, offset, index): + def GetValidArg(self, func): return "client_%s_id_" % self.resource_type.lower() - def GetValidGLArg(self, func, offset, index): + def GetValidGLArg(self, func): return "kService%sId" % self.resource_type @@ -6270,10 +6567,10 @@ class ResourceIdBindArgument(Argument): """ file.Write(code % {'type': self.type, 'name': self.name}) - def GetValidArg(self, func, offset, index): + def GetValidArg(self, func): return "client_%s_id_" % self.resource_type.lower() - def GetValidGLArg(self, func, offset, index): + def GetValidGLArg(self, func): return "kService%sId" % self.resource_type @@ -6290,17 +6587,17 @@ class ResourceIdZeroArgument(Argument): """Overridden from Argument.""" file.Write(" %s %s = c.%s;\n" % (self.type, self.name, self.name)) - def GetValidArg(self, func, offset, index): + def GetValidArg(self, func): return "client_%s_id_" % self.resource_type.lower() - def GetValidGLArg(self, func, offset, index): + def GetValidGLArg(self, func): return "kService%sId" % self.resource_type def GetNumInvalidValues(self, func): """returns the number of invalid values to be tested.""" return 1 - def GetInvalidArg(self, offset, index): + def GetInvalidArg(self, index): """returns an invalid value by index.""" return ("kInvalidClientId", "kNoError", "GL_INVALID_VALUE") @@ -6308,38 +6605,111 @@ class ResourceIdZeroArgument(Argument): class Function(object): """A class that represents a function.""" - def __init__(self, original_name, name, info, return_type, original_args, - args_for_cmds, cmd_args, init_args, num_pointer_args): + type_handlers = { + '': TypeHandler(), + 'Bind': BindHandler(), + 'Create': CreateHandler(), + 'Custom': CustomHandler(), + 'Data': DataHandler(), + 'Delete': DeleteHandler(), + 'DELn': DELnHandler(), + 'GENn': GENnHandler(), + 'GETn': GETnHandler(), + 'GLchar': GLcharHandler(), + 'GLcharN': GLcharNHandler(), + 'HandWritten': HandWrittenHandler(), + 'Is': IsHandler(), + 'Manual': ManualHandler(), + 'PUT': PUTHandler(), + 'PUTn': PUTnHandler(), + 'PUTXn': PUTXnHandler(), + 'StateSet': StateSetHandler(), + 'StateSetRGBAlpha': StateSetRGBAlphaHandler(), + 'StateSetFrontBack': StateSetFrontBackHandler(), + 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(), + 'StateSetNamedParameter': StateSetNamedParameter(), + 'STRn': STRnHandler(), + 'Todo': TodoHandler(), + } + + def __init__(self, name, info): self.name = name - self.original_name = original_name + self.original_name = info['original_name'] + + self.original_args = self.ParseArgs(info['original_args']) + + if 'cmd_args' in info: + self.args_for_cmds = self.ParseArgs(info['cmd_args']) + else: + self.args_for_cmds = self.original_args[:] + + self.return_type = info['return_type'] + if self.return_type != 'void': + self.return_arg = CreateArg(info['return_type'] + " result") + else: + self.return_arg = None + + self.num_pointer_args = sum( + [1 for arg in self.args_for_cmds if arg.IsPointer()]) self.info = info - self.type_handler = info.type_handler - self.return_type = return_type - self.original_args = original_args - self.num_pointer_args = num_pointer_args - self.can_auto_generate = num_pointer_args == 0 and return_type == "void" - self.cmd_args = cmd_args - self.init_args = init_args + self.type_handler = self.type_handlers[info['type']] + self.can_auto_generate = (self.num_pointer_args == 0 and + info['return_type'] == "void") self.InitFunction() - self.args_for_cmds = args_for_cmds - self.is_immediate = False + + def ParseArgs(self, arg_string): + """Parses a function arg string.""" + args = [] + parts = arg_string.split(',') + for arg_string in parts: + arg = CreateArg(arg_string) + if arg: + args.append(arg) + return args def IsType(self, type_name): """Returns true if function is a certain type.""" - return self.info.type == type_name + return self.info['type'] == type_name def InitFunction(self): - """Calls the init function for the type handler.""" + """Creates command args and calls the init function for the type handler. + + Creates argument lists for command buffer commands, eg. self.cmd_args and + self.init_args. + Calls the type function initialization. + Override to create different kind of command buffer command argument lists. + """ + self.cmd_args = [] + for arg in self.args_for_cmds: + arg.AddCmdArgs(self.cmd_args) + + self.init_args = [] + for arg in self.args_for_cmds: + arg.AddInitArgs(self.init_args) + + if self.return_arg: + self.init_args.append(self.return_arg) + self.type_handler.InitFunction(self) - def GetInfo(self, name): + def IsImmediate(self): + """Returns whether the function is immediate data function or not.""" + return False + + def GetInfo(self, name, default = None): """Returns a value from the function info for this function.""" - if hasattr(self.info, name): - return getattr(self.info, name) - return None + if name in self.info: + return self.info[name] + return default + + def GetValidArg(self, arg): + """Gets a valid argument value for the parameter arg from the function info + if one exists.""" + try: + index = self.GetOriginalArgs().index(arg) + except ValueError: + return None - def GetValidArg(self, index): - """Gets a valid arg from the function info if one exists.""" valid_args = self.GetInfo('valid_args') if valid_args and str(index) in valid_args: return valid_args[str(index)] @@ -6347,10 +6717,13 @@ class Function(object): def AddInfo(self, name, value): """Adds an info.""" - setattr(self.info, name, value) + self.info[name] = value + + def IsExtension(self): + return self.GetInfo('extension') or self.GetInfo('extension_flag') def IsCoreGLFunction(self): - return (not self.GetInfo('extension') and + return (not self.IsExtension() and not self.GetInfo('pepper_interface')) def InPepperInterface(self, interface): @@ -6362,6 +6735,15 @@ class Function(object): def InAnyPepperExtension(self): return self.IsCoreGLFunction() or self.GetInfo('pepper_interface') + def GetErrorReturnString(self): + if self.GetInfo("error_return"): + return self.GetInfo("error_return") + elif self.return_type == "GLboolean": + return "GL_FALSE" + elif "*" in self.return_type: + return "NULL" + return "0" + def GetGLFunctionName(self): """Gets the function to call to execute GL for this command.""" if self.GetInfo('decoder_func'): @@ -6378,6 +6760,10 @@ class Function(object): gl_func_name = self.original_name return gl_func_name + def GetDataTransferMethods(self): + return self.GetInfo('data_transfer_methods', + ['immediate' if self.num_pointer_args == 1 else 'shm']) + def AddCmdArg(self, arg): """Adds a cmd argument to this function.""" self.cmd_args.append(arg) @@ -6390,6 +6776,10 @@ class Function(object): """Clears the command args for this function.""" self.cmd_args = [] + def GetCmdConstants(self): + """Gets the constants for this function.""" + return [arg for arg in self.args_for_cmds if arg.IsConstant()] + def GetInitArgs(self): """Gets the init args for this function.""" return self.init_args @@ -6423,6 +6813,25 @@ class Function(object): ["%s%s" % (prefix, arg.name) for arg in args]) return self.__MaybePrependComma(arg_string, add_comma) + def MakeTypedHelperArgString(self, prefix, add_comma = False): + """Gets a list of typed GL arguments after removing unneeded arguments.""" + args = self.GetOriginalArgs() + arg_string = ", ".join( + ["%s %s%s" % ( + arg.type, + prefix, + arg.name, + ) for arg in args if not arg.IsConstant()]) + return self.__MaybePrependComma(arg_string, add_comma) + + def MakeHelperArgString(self, prefix, add_comma = False, separator = ", "): + """Gets a list of GL arguments after removing unneeded arguments.""" + args = self.GetOriginalArgs() + arg_string = separator.join( + ["%s%s" % (prefix, arg.name) + for arg in args if not arg.IsConstant()]) + return self.__MaybePrependComma(arg_string, add_comma) + def MakeTypedPepperArgString(self, prefix): """Gets a list of arguments as they need to be for Pepper.""" if self.GetInfo("pepper_args"): @@ -6430,6 +6839,11 @@ class Function(object): else: return self.MakeTypedOriginalArgString(prefix, False) + def GetPepperName(self): + if self.GetInfo("pepper_name"): + return self.GetInfo("pepper_name") + return self.name + def MakeTypedCmdArgString(self, prefix, add_comma = False): """Gets a typed list of arguments as they need to be for command buffers.""" args = self.GetCmdArgs() @@ -6481,15 +6895,33 @@ class Function(object): """Writes the validation code for a command.""" pass + def WriteCmdFlag(self, file): + """Writes the cmd cmd_flags constant.""" + flags = [] + # By default trace only at the highest level 3. + trace_level = int(self.GetInfo('trace_level', default = 3)) + if trace_level not in xrange(0, 4): + raise KeyError("Unhandled trace_level: %d" % trace_level) + + flags.append('CMD_FLAG_SET_TRACE_LEVEL(%d)' % trace_level) + + if len(flags) > 0: + cmd_flags = ' | '.join(flags) + else: + cmd_flags = 0 + + file.Write(" static const uint8 cmd_flags = %s;\n" % cmd_flags) + + def WriteCmdArgFlag(self, file): """Writes the cmd kArgFlags constant.""" file.Write(" static const cmd::ArgFlags kArgFlags = cmd::kFixed;\n") def WriteCmdComputeSize(self, file): """Writes the ComputeSize function for the command.""" - file.Write(" static uint32 ComputeSize() {\n") + file.Write(" static uint32_t ComputeSize() {\n") file.Write( - " return static_cast<uint32>(sizeof(ValueType)); // NOLINT\n") + " return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT\n") file.Write(" }\n") file.Write("\n") @@ -6623,36 +7055,34 @@ class ImmediateFunction(Function): """A class that represnets an immediate function command.""" def __init__(self, func): - new_args = [] - for arg in func.GetOriginalArgs(): + Function.__init__( + self, + "%sImmediate" % func.name, + func.info) + + def InitFunction(self): + # Override args in original_args and args_for_cmds with immediate versions + # of the args. + + new_original_args = [] + for arg in self.original_args: new_arg = arg.GetImmediateVersion() if new_arg: - new_args.append(new_arg) + new_original_args.append(new_arg) + self.original_args = new_original_args - cmd_args = [] new_args_for_cmds = [] - for arg in func.args_for_cmds: + for arg in self.args_for_cmds: new_arg = arg.GetImmediateVersion() if new_arg: new_args_for_cmds.append(new_arg) - new_arg.AddCmdArgs(cmd_args) - new_init_args = [] - for arg in new_args_for_cmds: - arg.AddInitArgs(new_init_args) + self.args_for_cmds = new_args_for_cmds - Function.__init__( - self, - func.original_name, - "%sImmediate" % func.name, - func.info, - func.return_type, - new_args, - new_args_for_cmds, - cmd_args, - new_init_args, - 0) - self.is_immediate = True + Function.InitFunction(self) + + def IsImmediate(self): + return True def WriteCommandDescription(self, file): """Overridden from Function""" @@ -6708,39 +7138,31 @@ class BucketFunction(Function): """A class that represnets a bucket version of a function command.""" def __init__(self, func): - new_args = [] - for arg in func.GetOriginalArgs(): + Function.__init__( + self, + "%sBucket" % func.name, + func.info) + + def InitFunction(self): + # Override args in original_args and args_for_cmds with bucket versions + # of the args. + + new_original_args = [] + for arg in self.original_args: new_arg = arg.GetBucketVersion() if new_arg: - new_args.append(new_arg) + new_original_args.append(new_arg) + self.original_args = new_original_args - cmd_args = [] new_args_for_cmds = [] - for arg in func.args_for_cmds: + for arg in self.args_for_cmds: new_arg = arg.GetBucketVersion() if new_arg: new_args_for_cmds.append(new_arg) - new_arg.AddCmdArgs(cmd_args) - new_init_args = [] - for arg in new_args_for_cmds: - arg.AddInitArgs(new_init_args) + self.args_for_cmds = new_args_for_cmds - Function.__init__( - self, - func.original_name, - "%sBucket" % func.name, - func.info, - func.return_type, - new_args, - new_args_for_cmds, - cmd_args, - new_init_args, - 0) - -# def InitFunction(self): -# """Overridden from Function""" -# pass + Function.InitFunction(self) def WriteCommandDescription(self, file): """Overridden from Function""" @@ -6814,45 +7236,9 @@ class GLGenerator(object): self.functions = [] self.verbose = verbose self.errors = 0 - self._function_info = {} - self._empty_type_handler = TypeHandler() - self._empty_function_info = FunctionInfo({}, self._empty_type_handler) self.pepper_interfaces = [] self.interface_info = {} - self._type_handlers = { - 'Bind': BindHandler(), - 'Create': CreateHandler(), - 'Custom': CustomHandler(), - 'Data': DataHandler(), - 'Delete': DeleteHandler(), - 'DELn': DELnHandler(), - 'GENn': GENnHandler(), - 'GETn': GETnHandler(), - 'GLchar': GLcharHandler(), - 'GLcharN': GLcharNHandler(), - 'HandWritten': HandWrittenHandler(), - 'Is': IsHandler(), - 'Manual': ManualHandler(), - 'PUT': PUTHandler(), - 'PUTn': PUTnHandler(), - 'PUTXn': PUTXnHandler(), - 'StateSet': StateSetHandler(), - 'StateSetRGBAlpha': StateSetRGBAlphaHandler(), - 'StateSetFrontBack': StateSetFrontBackHandler(), - 'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(), - 'StateSetNamedParameter': StateSetNamedParameter(), - 'STRn': STRnHandler(), - 'Todo': TodoHandler(), - } - - for func_name in _FUNCTION_INFO: - info = _FUNCTION_INFO[func_name] - type = '' - if 'type' in info: - type = info['type'] - self._function_info[func_name] = FunctionInfo(info, - self.GetTypeHandler(type)) for interface in _PEPPER_INTERFACES: interface = PepperInterface(interface) self.pepper_interfaces.append(interface) @@ -6862,20 +7248,17 @@ class GLGenerator(object): """Adds a function.""" self.functions.append(func) - def GetTypeHandler(self, name): - """Gets a type info for the given type.""" - if len(name): - if name in self._type_handlers: - return self._type_handlers[name] - else: - raise KeyError("no such type handler: %s" % name) - return self._empty_type_handler - def GetFunctionInfo(self, name): """Gets a type info for the given function name.""" - if name in self._function_info: - return self._function_info[name] - return self._empty_function_info + if name in _FUNCTION_INFO: + func_info = _FUNCTION_INFO[name].copy() + else: + func_info = {} + + if not 'type' in func_info: + func_info['type'] = '' + + return func_info def Log(self, msg): """Prints something if verbose is true.""" @@ -6903,25 +7286,9 @@ class GLGenerator(object): file.Write("} // namespace gpu\n") file.Write("\n") - def ParseArgs(self, arg_string): - """Parses a function arg string.""" - args = [] - num_pointer_args = 0 - parts = arg_string.split(',') - is_gl_enum = False - for arg_string in parts: - if arg_string.startswith('GLenum '): - is_gl_enum = True - arg = CreateArg(arg_string) - if arg: - args.append(arg) - if arg.IsPointer(): - num_pointer_args += 1 - return (args, num_pointer_args, is_gl_enum) - def ParseGLH(self, filename): """Parses the cmd_buffer_functions.txt file and extracts the functions""" - f = open("gpu/command_buffer/cmd_buffer_functions.txt", "r") + f = open(filename, "r") functions = f.read() f.close() for line in functions.splitlines(): @@ -6929,34 +7296,38 @@ class GLGenerator(object): if match: func_name = match.group(2)[2:] func_info = self.GetFunctionInfo(func_name) - if func_info.type != 'Noop': - return_type = match.group(1).strip() - arg_string = match.group(3) - (args, num_pointer_args, is_gl_enum) = self.ParseArgs(arg_string) - # comment in to find out which functions use bare enums. - # if is_gl_enum: - # self.Log("%s uses bare GLenum" % func_name) - args_for_cmds = args - if hasattr(func_info, 'cmd_args'): - (args_for_cmds, num_pointer_args, is_gl_enum) = ( - self.ParseArgs(getattr(func_info, 'cmd_args'))) - cmd_args = [] - for arg in args_for_cmds: - arg.AddCmdArgs(cmd_args) - init_args = [] - for arg in args_for_cmds: - arg.AddInitArgs(init_args) - return_arg = CreateArg(return_type + " result") - if return_arg: - init_args.append(return_arg) - f = Function(func_name, func_name, func_info, return_type, args, - args_for_cmds, cmd_args, init_args, num_pointer_args) - self.original_functions.append(f) - gen_cmd = f.GetInfo('gen_cmd') - if gen_cmd == True or gen_cmd == None: + if func_info['type'] == 'Noop': + continue + + parsed_func_info = { + 'original_name': func_name, + 'original_args': match.group(3), + 'return_type': match.group(1).strip(), + } + + for k in parsed_func_info.keys(): + if not k in func_info: + func_info[k] = parsed_func_info[k] + + f = Function(func_name, func_info) + self.original_functions.append(f) + + #for arg in f.GetOriginalArgs(): + # if not isinstance(arg, EnumArgument) and arg.type == 'GLenum': + # self.Log("%s uses bare GLenum %s." % (func_name, arg.name)) + + gen_cmd = f.GetInfo('gen_cmd') + if gen_cmd == True or gen_cmd == None: + if f.type_handler.NeedsDataTransferFunction(f): + methods = f.GetDataTransferMethods() + if 'immediate' in methods: + self.AddFunction(ImmediateFunction(f)) + if 'bucket' in methods: + self.AddFunction(BucketFunction(f)) + if 'shm' in methods: + self.AddFunction(f) + else: self.AddFunction(f) - f.type_handler.AddImmediateFunction(self, f) - f.type_handler.AddBucketFunction(self, f) self.Log("Auto Generated Functions : %d" % len([f for f in self.functions if f.can_auto_generate or @@ -6968,7 +7339,7 @@ class GLGenerator(object): self.Log("Non Auto Generated Functions: %d" % len(funcs)) for f in funcs: - self.Log(" %-10s %-20s gl%s" % (f.info.type, f.return_type, f.name)) + self.Log(" %-10s %-20s gl%s" % (f.info['type'], f.return_type, f.name)) def WriteCommandIds(self, filename): """Writes the command buffer format""" @@ -7051,14 +7422,45 @@ class GLGenerator(object): file.Write(" EnableFlags();\n") for capability in _CAPABILITY_FLAGS: file.Write(" bool %s;\n" % capability['name']) + file.Write(" bool cached_%s;\n" % capability['name']) file.Write("};\n\n") for state_name in sorted(_STATES.keys()): state = _STATES[state_name] for item in state['states']: file.Write("%s %s;\n" % (item['type'], item['name'])) + if item.get('cached', False): + file.Write("%s cached_%s;\n" % (item['type'], item['name'])) file.Write("\n") + file.Write(""" + inline void SetDeviceCapabilityState(GLenum cap, bool enable) { + switch (cap) { + """) + for capability in _CAPABILITY_FLAGS: + file.Write("""\ + case GL_%s: + """ % capability['name'].upper()) + file.Write("""\ + if (enable_flags.cached_%(name)s == enable && + !ignore_cached_state) + return; + enable_flags.cached_%(name)s = enable; + break; + """ % capability) + + file.Write("""\ + default: + NOTREACHED(); + return; + } + if (enable) + glEnable(cap); + else + glDisable(cap); + } + """) + file.Close() def WriteClientContextStateHeader(self, filename): @@ -7127,6 +7529,9 @@ bool %s::GetStateAs%s( code.append("%s(%s)" % (capability['name'], ('false', 'true')['default' in capability])) + code.append("cached_%s(%s)" % + (capability['name'], + ('false', 'true')['default' in capability])) file.Write("ContextState::EnableFlags::EnableFlags()\n : %s {\n}\n" % ",\n ".join(code)) file.Write("\n") @@ -7136,43 +7541,90 @@ bool %s::GetStateAs%s( state = _STATES[state_name] for item in state['states']: file.Write(" %s = %s;\n" % (item['name'], item['default'])) + if item.get('cached', False): + file.Write(" cached_%s = %s;\n" % (item['name'], item['default'])) file.Write("}\n") file.Write(""" -void ContextState::InitCapabilities() const { +void ContextState::InitCapabilities(const ContextState* prev_state) const { """) - for capability in _CAPABILITY_FLAGS: - file.Write(" EnableDisable(GL_%s, enable_flags.%s);\n" % - (capability['name'].upper(), capability['name'])) + def WriteCapabilities(test_prev): + for capability in _CAPABILITY_FLAGS: + capability_name = capability['name'] + if test_prev: + file.Write(""" if (prev_state->enable_flags.cached_%s != + enable_flags.cached_%s)\n""" % + (capability_name, capability_name)) + file.Write(" EnableDisable(GL_%s, enable_flags.cached_%s);\n" % + (capability_name.upper(), capability_name)) + + file.Write(" if (prev_state) {") + WriteCapabilities(True) + file.Write(" } else {") + WriteCapabilities(False) + file.Write(" }") + file.Write("""} -void ContextState::InitState() const { +void ContextState::InitState(const ContextState *prev_state) const { """) - # We need to sort the keys so the expectations match - for state_name in sorted(_STATES.keys()): - state = _STATES[state_name] - if state['type'] == 'FrontBack': - num_states = len(state['states']) - for ndx, group in enumerate(Grouper(num_states / 2, state['states'])): + def WriteStates(test_prev): + # We need to sort the keys so the expectations match + for state_name in sorted(_STATES.keys()): + state = _STATES[state_name] + if state['type'] == 'FrontBack': + num_states = len(state['states']) + for ndx, group in enumerate(Grouper(num_states / 2, state['states'])): + if test_prev: + file.Write(" if (") + args = [] + for place, item in enumerate(group): + item_name = CachedStateName(item) + args.append('%s' % item_name) + if test_prev: + if place > 0: + file.Write(' ||\n') + file.Write("(%s != prev_state->%s)" % (item_name, item_name)) + if test_prev: + file.Write(")\n") + file.Write( + " gl%s(%s, %s);\n" % + (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args))) + elif state['type'] == 'NamedParameter': + for item in state['states']: + item_name = CachedStateName(item) + + if 'extension_flag' in item: + file.Write(" if (feature_info_->feature_flags().%s)\n " % + item['extension_flag']) + if test_prev: + file.Write(" if (prev_state->%s != %s)\n" % + (item_name, item_name)) + file.Write(" gl%s(%s, %s);\n" % + (state['func'], item['enum'], item_name)) + else: + if test_prev: + file.Write(" if (") args = [] - for item in group: - args.append('%s' % item['name']) - file.Write( - " gl%s(%s, %s);\n" % - (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args))) - elif state['type'] == 'NamedParameter': - for item in state['states']: - if 'extension_flag' in item: - file.Write(" if (feature_info_->feature_flags().%s)\n " % - item['extension_flag']) - file.Write(" gl%s(%s, %s);\n" % - (state['func'], item['enum'], item['name'])) - else: - args = [] - for item in state['states']: - args.append('%s' % item['name']) - file.Write(" gl%s(%s);\n" % (state['func'], ", ".join(args))) + for place, item in enumerate(state['states']): + item_name = CachedStateName(item) + args.append('%s' % item_name) + if test_prev: + if place > 0: + file.Write(' ||\n') + file.Write("(%s != prev_state->%s)" % + (item_name, item_name)) + if test_prev: + file.Write(" )\n") + file.Write(" gl%s(%s);\n" % (state['func'], ", ".join(args))) + + file.Write(" if (prev_state) {") + WriteStates(True) + file.Write(" } else {") + WriteStates(False) + file.Write(" }") + file.Write("}\n") file.Write("""bool ContextState::GetEnabled(GLenum cap) const { @@ -7259,16 +7711,25 @@ bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) { for capability in _CAPABILITY_FLAGS: file.Write(" case GL_%s:\n" % capability['name'].upper()) if 'state_flag' in capability: - file.Write(""" if (state_.enable_flags.%(name)s != enabled) { - state_.enable_flags.%(name)s = enabled; - %(state_flag)s = true; - } - return false; -""" % capability) + + file.Write("""\ + state_.enable_flags.%(name)s = enabled; + if (state_.enable_flags.cached_%(name)s != enabled + || state_.ignore_cached_state) { + %(state_flag)s = true; + } + return false; + """ % capability) else: - file.Write(""" state_.enable_flags.%(name)s = enabled; - return true; -""" % capability) + file.Write("""\ + state_.enable_flags.%(name)s = enabled; + if (state_.enable_flags.cached_%(name)s != enabled + || state_.ignore_cached_state) { + state_.enable_flags.cached_%(name)s = enabled; + return true; + } + return false; + """ % capability) file.Write(""" default: NOTREACHED(); return false; @@ -7475,53 +7936,58 @@ extern const NameToFunc g_gles2_function_table[] = { def WriteServiceUtilsHeader(self, filename): """Writes the gles2 auto generated utility header.""" file = CHeaderWriter(filename) - for enum in sorted(_ENUM_LISTS.keys()): + for name in sorted(_NAMED_TYPE_INFO.keys()): + named_type = NamedType(_NAMED_TYPE_INFO[name]) + if named_type.IsConstant(): + continue file.Write("ValueValidator<%s> %s;\n" % - (_ENUM_LISTS[enum]['type'], ToUnderscore(enum))) + (named_type.GetType(), ToUnderscore(name))) file.Write("\n") file.Close() def WriteServiceUtilsImplementation(self, filename): """Writes the gles2 auto generated utility implementation.""" file = CHeaderWriter(filename) - enums = sorted(_ENUM_LISTS.keys()) - for enum in enums: - if len(_ENUM_LISTS[enum]['valid']) > 0: + names = sorted(_NAMED_TYPE_INFO.keys()) + for name in names: + named_type = NamedType(_NAMED_TYPE_INFO[name]) + if named_type.IsConstant(): + continue + if named_type.GetValidValues(): file.Write("static const %s valid_%s_table[] = {\n" % - (_ENUM_LISTS[enum]['type'], ToUnderscore(enum))) - for value in _ENUM_LISTS[enum]['valid']: + (named_type.GetType(), ToUnderscore(name))) + for value in named_type.GetValidValues(): file.Write(" %s,\n" % value) file.Write("};\n") file.Write("\n") - file.Write("Validators::Validators()\n") - pre = ': ' - post = ',' - for count, enum in enumerate(enums): - if count + 1 == len(enums): - post = ' {' - if len(_ENUM_LISTS[enum]['valid']) > 0: - code = """ %(pre)s%(name)s( - valid_%(name)s_table, arraysize(valid_%(name)s_table))%(post)s -""" + file.Write("Validators::Validators()") + pre = ' : ' + for count, name in enumerate(names): + named_type = NamedType(_NAMED_TYPE_INFO[name]) + if named_type.IsConstant(): + continue + if named_type.GetValidValues(): + code = """%(pre)s%(name)s( + valid_%(name)s_table, arraysize(valid_%(name)s_table))""" else: - code = """ %(pre)s%(name)s()%(post)s -""" + code = "%(pre)s%(name)s()" file.Write(code % { - 'name': ToUnderscore(enum), - 'pre': pre, - 'post': post, - }) - pre = ' ' + 'name': ToUnderscore(name), + 'pre': pre, + }) + pre = ',\n ' + file.Write(" {\n"); file.Write("}\n\n"); file.Close() def WriteCommonUtilsHeader(self, filename): """Writes the gles2 common utility header.""" file = CHeaderWriter(filename) - enums = sorted(_ENUM_LISTS.keys()) - for enum in enums: - if _ENUM_LISTS[enum]['type'] == 'GLenum': - file.Write("static std::string GetString%s(uint32 value);\n" % enum) + type_infos = sorted(_NAMED_TYPE_INFO.keys()) + for type_info in type_infos: + if _NAMED_TYPE_INFO[type_info]['type'] == 'GLenum': + file.Write("static std::string GetString%s(uint32_t value);\n" % + type_info) file.Write("\n") file.Close() @@ -7556,14 +8022,14 @@ const size_t GLES2Util::enum_to_string_table_len_ = """) - enums = sorted(_ENUM_LISTS.keys()) + enums = sorted(_NAMED_TYPE_INFO.keys()) for enum in enums: - if _ENUM_LISTS[enum]['type'] == 'GLenum': - file.Write("std::string GLES2Util::GetString%s(uint32 value) {\n" % + if _NAMED_TYPE_INFO[enum]['type'] == 'GLenum': + file.Write("std::string GLES2Util::GetString%s(uint32_t value) {\n" % enum) - if len(_ENUM_LISTS[enum]['valid']) > 0: + if len(_NAMED_TYPE_INFO[enum]['valid']) > 0: file.Write(" static const EnumToString string_table[] = {\n") - for value in _ENUM_LISTS[enum]['valid']: + for value in _NAMED_TYPE_INFO[enum]['valid']: file.Write(' { %s, "%s" },\n' % (value, value)) file.Write(""" }; return GLES2Util::GetQualifiedEnumString( @@ -7583,8 +8049,7 @@ const size_t GLES2Util::enum_to_string_table_len_ = """Writes the Pepper OpenGLES interface definition.""" file = CHeaderWriter( filename, - "// OpenGL ES interface.\n", - 2) + "// OpenGL ES interface.\n") file.Write("#include \"ppapi/c/pp_resource.h\"\n") if dev: @@ -7593,6 +8058,13 @@ const size_t GLES2Util::enum_to_string_table_len_ = file.Write("\n#ifndef __gl2_h_\n") for (k, v) in _GL_TYPES.iteritems(): file.Write("typedef %s %s;\n" % (v, k)) + file.Write("#ifdef _WIN64\n") + for (k, v) in _GL_TYPES_64.iteritems(): + file.Write("typedef %s %s;\n" % (v, k)) + file.Write("#else\n") + for (k, v) in _GL_TYPES_32.iteritems(): + file.Write("typedef %s %s;\n" % (v, k)) + file.Write("#endif // _WIN64\n") file.Write("#endif // __gl2_h_\n\n") for interface in self.pepper_interfaces: @@ -7614,7 +8086,8 @@ const size_t GLES2Util::enum_to_string_table_len_ = arg = context_arg + ", " + original_arg else: arg = context_arg - file.Write(" %s (*%s)(%s);\n" % (func.return_type, func.name, arg)) + file.Write(" %s (*%s)(%s);\n" % + (func.return_type, func.GetPepperName(), arg)) file.Write("};\n\n") @@ -7657,7 +8130,8 @@ const size_t GLES2Util::enum_to_string_table_len_ = arg = context_arg + ", " + original_arg else: arg = context_arg - file.Write("%s %s(%s) {\n" % (func.return_type, func.name, arg)) + file.Write("%s %s(%s) {\n" % + (func.return_type, func.GetPepperName(), arg)) file.Write(" Enter3D enter(context_id, true);\n") file.Write(" if (enter.succeeded()) {\n") @@ -7670,14 +8144,7 @@ const size_t GLES2Util::enum_to_string_table_len_ = file.Write("\n") else: file.Write(" else {\n") - error_return = "0" - if func.GetInfo("error_return"): - error_return = func.GetInfo("error_return") - elif func.return_type == "GLboolean": - error_return = "GL_FALSE" - elif "*" in func.return_type: - error_return = "NULL" - file.Write(" return %s;\n" % error_return) + file.Write(" return %s;\n" % func.GetErrorReturnString()) file.Write(" }\n") file.Write("}\n\n") @@ -7690,7 +8157,7 @@ const size_t GLES2Util::enum_to_string_table_len_ = "ppb_opengles2 = {\n" % interface.GetStructName()) file.Write(" &") file.Write(",\n &".join( - f.name for f in self.original_functions + f.GetPepperName() for f in self.original_functions if f.InPepperInterface(interface))) file.Write("\n") @@ -7722,8 +8189,8 @@ const size_t GLES2Util::enum_to_string_table_len_ = interface = self.interface_info[func.GetInfo('pepper_interface') or ''] file.Write("%s GL_APIENTRY gl%s(%s) {\n" % - (func.return_type, func.name, - func.MakeTypedOriginalArgString(""))) + (func.return_type, func.GetPepperName(), + func.MakeTypedPepperArgString(""))) return_str = "" if func.return_type == "void" else "return " interface_str = "glGet%sInterfacePPAPI()" % interface.GetName() original_arg = func.MakeOriginalArgString("") @@ -7737,29 +8204,39 @@ const size_t GLES2Util::enum_to_string_table_len_ = (interface.GetStructName(), interface_str)) file.Write(" if (ext)\n") file.Write(" %sext->%s(%s);\n" % - (return_str, func.name, arg)) + (return_str, func.GetPepperName(), arg)) if return_str: file.Write(" %s0;\n" % return_str) else: file.Write(" %s%s->%s(%s);\n" % - (return_str, interface_str, func.name, arg)) + (return_str, interface_str, func.GetPepperName(), arg)) file.Write("}\n\n") file.Close() + def WriteMojoGLCallVisitor(self, filename): + """Provides the GL implementation for mojo""" + file = CWriter(filename) + file.Write(_LICENSE) + file.Write(_DO_NOT_EDIT_WARNING) + + for func in self.original_functions: + if not func.IsCoreGLFunction(): + continue + file.Write("VISIT_GL_CALL(%s, %s, (%s), (%s))\n" % + (func.name, func.return_type, + func.MakeTypedOriginalArgString(""), + func.MakeOriginalArgString(""))) + + file.Close() + +def Format(generated_files): + for filename in generated_files: + call(["clang-format", "-i", "-style=chromium", filename]) + def main(argv): """This is the main function.""" parser = OptionParser() parser.add_option( - "-g", "--generate-implementation-templates", action="store_true", - help="generates files that are generally hand edited..") - parser.add_option( - "--alternate-mode", type="choice", - choices=("ppapi", "chrome_ppapi", "chrome_ppapi_proxy", "nacl_ppapi"), - help="generate files for other projects. \"ppapi\" will generate ppapi " - "bindings. \"chrome_ppapi\" generate chrome implementation for ppapi. " - "\"chrome_ppapi_proxy\" will generate the glue for the chrome IPC ppapi" - "proxy. \"nacl_ppapi\" will generate NaCl implementation for ppapi") - parser.add_option( "--output-dir", help="base directory for resulting files, under chrome/src. default is " "empty. Use this if you want the result stored under gen.") @@ -7770,72 +8247,107 @@ def main(argv): (options, args) = parser.parse_args(args=argv) # Add in states and capabilites to GLState + gl_state_valid = _NAMED_TYPE_INFO['GLState']['valid'] for state_name in sorted(_STATES.keys()): state = _STATES[state_name] if 'enum' in state: - _ENUM_LISTS['GLState']['valid'].append(state['enum']) + if not state['enum'] in gl_state_valid: + gl_state_valid.append(state['enum']) else: for item in state['states']: if 'extension_flag' in item: continue - _ENUM_LISTS['GLState']['valid'].append(item['enum']) + if not item['enum'] in gl_state_valid: + gl_state_valid.append(item['enum']) for capability in _CAPABILITY_FLAGS: - _ENUM_LISTS['GLState']['valid'].append("GL_%s" % capability['name'].upper()) + valid_value = "GL_%s" % capability['name'].upper() + if not valid_value in gl_state_valid: + gl_state_valid.append(valid_value) # This script lives under gpu/command_buffer, cd to base directory. os.chdir(os.path.dirname(__file__) + "/../..") gen = GLGenerator(options.verbose) - gen.ParseGLH("common/GLES2/gl2.h") + gen.ParseGLH("gpu/command_buffer/cmd_buffer_functions.txt") # Support generating files under gen/ if options.output_dir != None: os.chdir(options.output_dir) - if options.alternate_mode == "ppapi": - # To trigger this action, do "make ppapi_gles_bindings" - os.chdir("ppapi"); - gen.WritePepperGLES2Interface("c/ppb_opengles2.h", False) - gen.WritePepperGLES2Interface("c/dev/ppb_opengles2ext_dev.h", True) - gen.WriteGLES2ToPPAPIBridge("lib/gl/gles2/gles2.c") - - elif options.alternate_mode == "chrome_ppapi": - # To trigger this action, do "make ppapi_gles_implementation" - gen.WritePepperGLES2Implementation( - "ppapi/shared_impl/ppb_opengles2_shared.cc") - - else: - os.chdir("gpu/command_buffer") - gen.WriteCommandIds("common/gles2_cmd_ids_autogen.h") - gen.WriteFormat("common/gles2_cmd_format_autogen.h") - gen.WriteFormatTest("common/gles2_cmd_format_test_autogen.h") - gen.WriteGLES2InterfaceHeader("client/gles2_interface_autogen.h") - gen.WriteGLES2InterfaceStub("client/gles2_interface_stub_autogen.h") - gen.WriteGLES2InterfaceStubImpl( - "client/gles2_interface_stub_impl_autogen.h") - gen.WriteGLES2ImplementationHeader("client/gles2_implementation_autogen.h") - gen.WriteGLES2Implementation("client/gles2_implementation_impl_autogen.h") - gen.WriteGLES2ImplementationUnitTests( - "client/gles2_implementation_unittest_autogen.h") - gen.WriteGLES2TraceImplementationHeader( - "client/gles2_trace_implementation_autogen.h") - gen.WriteGLES2TraceImplementation( - "client/gles2_trace_implementation_impl_autogen.h") - gen.WriteGLES2CLibImplementation("client/gles2_c_lib_autogen.h") - gen.WriteCmdHelperHeader("client/gles2_cmd_helper_autogen.h") - gen.WriteServiceImplementation("service/gles2_cmd_decoder_autogen.h") - gen.WriteServiceContextStateHeader("service/context_state_autogen.h") - gen.WriteServiceContextStateImpl("service/context_state_impl_autogen.h") - gen.WriteClientContextStateHeader("client/client_context_state_autogen.h") - gen.WriteClientContextStateImpl( - "client/client_context_state_impl_autogen.h") - gen.WriteServiceUnitTests("service/gles2_cmd_decoder_unittest_%d_autogen.h") - gen.WriteServiceUtilsHeader("service/gles2_cmd_validation_autogen.h") - gen.WriteServiceUtilsImplementation( - "service/gles2_cmd_validation_implementation_autogen.h") - gen.WriteCommonUtilsHeader("common/gles2_cmd_utils_autogen.h") - gen.WriteCommonUtilsImpl("common/gles2_cmd_utils_implementation_autogen.h") - gen.WriteGLES2Header("../GLES2/gl2chromium_autogen.h") + gen.WritePepperGLES2Interface("ppapi/c/ppb_opengles2.h", False) + gen.WritePepperGLES2Interface("ppapi/c/dev/ppb_opengles2ext_dev.h", True) + gen.WriteGLES2ToPPAPIBridge("ppapi/lib/gl/gles2/gles2.c") + gen.WritePepperGLES2Implementation( + "ppapi/shared_impl/ppb_opengles2_shared.cc") + os.chdir("gpu/command_buffer") + gen.WriteCommandIds("common/gles2_cmd_ids_autogen.h") + gen.WriteFormat("common/gles2_cmd_format_autogen.h") + gen.WriteFormatTest("common/gles2_cmd_format_test_autogen.h") + gen.WriteGLES2InterfaceHeader("client/gles2_interface_autogen.h") + gen.WriteGLES2InterfaceStub("client/gles2_interface_stub_autogen.h") + gen.WriteGLES2InterfaceStubImpl( + "client/gles2_interface_stub_impl_autogen.h") + gen.WriteGLES2ImplementationHeader("client/gles2_implementation_autogen.h") + gen.WriteGLES2Implementation("client/gles2_implementation_impl_autogen.h") + gen.WriteGLES2ImplementationUnitTests( + "client/gles2_implementation_unittest_autogen.h") + gen.WriteGLES2TraceImplementationHeader( + "client/gles2_trace_implementation_autogen.h") + gen.WriteGLES2TraceImplementation( + "client/gles2_trace_implementation_impl_autogen.h") + gen.WriteGLES2CLibImplementation("client/gles2_c_lib_autogen.h") + gen.WriteCmdHelperHeader("client/gles2_cmd_helper_autogen.h") + gen.WriteServiceImplementation("service/gles2_cmd_decoder_autogen.h") + gen.WriteServiceContextStateHeader("service/context_state_autogen.h") + gen.WriteServiceContextStateImpl("service/context_state_impl_autogen.h") + gen.WriteClientContextStateHeader("client/client_context_state_autogen.h") + gen.WriteClientContextStateImpl( + "client/client_context_state_impl_autogen.h") + gen.WriteServiceUnitTests("service/gles2_cmd_decoder_unittest_%d_autogen.h") + gen.WriteServiceUtilsHeader("service/gles2_cmd_validation_autogen.h") + gen.WriteServiceUtilsImplementation( + "service/gles2_cmd_validation_implementation_autogen.h") + gen.WriteCommonUtilsHeader("common/gles2_cmd_utils_autogen.h") + gen.WriteCommonUtilsImpl("common/gles2_cmd_utils_implementation_autogen.h") + gen.WriteGLES2Header("../GLES2/gl2chromium_autogen.h") + gen.WriteMojoGLCallVisitor( + "../../mojo/public/c/gles2/gles2_call_visitor_autogen.h") + + Format([ + "common/gles2_cmd_format_autogen.h", + "common/gles2_cmd_format_test_autogen.h", + "common/gles2_cmd_ids_autogen.h", + "common/gles2_cmd_utils_autogen.h", + "common/gles2_cmd_utils_implementation_autogen.h", + "client/client_context_state_autogen.h", + "client/client_context_state_impl_autogen.h", + "client/gles2_cmd_helper_autogen.h", + "client/gles2_c_lib_autogen.h", + "client/gles2_implementation_autogen.h", + "client/gles2_implementation_impl_autogen.h", + "client/gles2_implementation_unittest_autogen.h", + "client/gles2_interface_autogen.h", + "client/gles2_interface_stub_autogen.h", + "client/gles2_interface_stub_impl_autogen.h", + "client/gles2_trace_implementation_autogen.h", + "client/gles2_trace_implementation_impl_autogen.h", + "service/context_state_autogen.h", + "service/context_state_impl_autogen.h", + "service/gles2_cmd_decoder_autogen.h", + "service/gles2_cmd_decoder_unittest_0_autogen.h", + "service/gles2_cmd_decoder_unittest_1_autogen.h", + "service/gles2_cmd_decoder_unittest_2_autogen.h", + "service/gles2_cmd_decoder_unittest_3_autogen.h", + "service/gles2_cmd_validation_autogen.h", + "service/gles2_cmd_validation_implementation_autogen.h"]) + os.chdir("../..") + Format([ + "gpu/GLES2/gl2chromium_autogen.h", + "mojo/public/c/gles2/gles2_call_visitor_autogen.h", + "ppapi/c/dev/ppb_opengles2ext_dev.h", + "ppapi/c/ppb_opengles2.h", + "ppapi/lib/gl/gles2/gles2.c", + "ppapi/shared_impl/ppb_opengles2_shared.cc"]) if gen.errors > 0: print "%d errors" % gen.errors diff --git a/chromium/gpu/command_buffer/client/BUILD.gn b/chromium/gpu/command_buffer/client/BUILD.gn new file mode 100644 index 00000000000..91dcddbc9e6 --- /dev/null +++ b/chromium/gpu/command_buffer/client/BUILD.gn @@ -0,0 +1,165 @@ +# Copyright (c) 2013 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("client") { + sources = [ + "cmd_buffer_helper.cc", + "cmd_buffer_helper.h", + "fenced_allocator.cc", + "fenced_allocator.h", + "gpu_control.h", + "mapped_memory.cc", + "mapped_memory.h", + "ring_buffer.cc", + "ring_buffer.h", + "transfer_buffer.cc", + "transfer_buffer.h", + ] + + if (is_win) { + # TODO(jschuh): crbug.com/167187 fix size_t to int truncations. + cflags = [ "/wd4267" ] # size_t to int truncation. + } + + all_dependent_configs = [ "//third_party/khronos:khronos_headers" ] + + deps = [ + "//gpu/command_buffer/common", + ] +} + +source_set("gles2_cmd_helper") { + sources = [ + "gles2_cmd_helper.cc", + "gles2_cmd_helper.h", + "gles2_cmd_helper_autogen.h", + ] + + if (is_win) { + # TODO(jschuh): crbug.com/167187 fix size_t to int truncations. + cflags = [ "/wd4267" ] # size_t to int truncation. + } + + deps = [ ":client" ] +} + +gles2_c_lib_source_files = [ + "gles2_c_lib.cc", + "gles2_c_lib_autogen.h", + "gles2_c_lib_export.h", + "gles2_lib.h", + "gles2_lib.cc", +] + +gles2_implementation_source_files = [ + "buffer_tracker.cc", + "buffer_tracker.h", + "client_context_state.h", + "client_context_state.cc", + "client_context_state_autogen.h", + "client_context_state_impl_autogen.h", + "gles2_impl_export.h", + "gles2_implementation_autogen.h", + "gles2_implementation.cc", + "gles2_implementation.h", + "gles2_implementation_impl_autogen.h", + "gles2_interface.h", + "gles2_trace_implementation_autogen.h", + "gles2_trace_implementation.cc", + "gles2_trace_implementation.h", + "gles2_trace_implementation_impl_autogen.h", + "gpu_memory_buffer_factory.h", + "gpu_memory_buffer_tracker.cc", + "gpu_memory_buffer_tracker.h", + "program_info_manager.cc", + "program_info_manager.h", + "query_tracker.cc", + "query_tracker.h", + "share_group.cc", + "share_group.h", + "vertex_array_object_manager.cc", + "vertex_array_object_manager.h", +] + +# Library emulates GLES2 using command_buffers. +component("gles2_implementation") { + sources = gles2_implementation_source_files + + defines = [ "GLES2_IMPL_IMPLEMENTATION" ] + all_dependent_configs = [ "//third_party/khronos:khronos_headers" ] + + if (is_win) { + # TODO(jschuh): crbug.com/167187 fix size_t to int truncations. + cflags = [ "/wd4267" ] # size_t to int truncation. + } + + deps = [ + ":gles2_cmd_helper", + "//base", + "//gpu/command_buffer/common", + "//ui/gfx/geometry", + "//ui/gl", + ] +} + +# Library emulates GLES2 using command_buffers. +component("gles2_implementation_client_side_arrays") { + sources = gles2_implementation_source_files + + defines = [ + "GLES2_IMPL_IMPLEMENTATION", + "GLES2_SUPPORT_CLIENT_SIDE_ARRAYS=1", + ] + all_dependent_configs = [ "//third_party/khronos:khronos_headers" ] + + if (is_win) { + # TODO(jschuh): crbug.com/167187 fix size_t to int truncations. + cflags = [ "/wd4267" ] # size_t to int truncation. + } + + deps = [ + ":gles2_cmd_helper", + "//base", + "//gpu/command_buffer/common", + "//ui/gfx/geometry", + "//ui/gl", + ] +} + +component("gl_in_process_context") { + sources = [ + "gl_in_process_context.h", + "gl_in_process_context.cc", + "gl_in_process_context_export.h", + ] + + defines = [ "GL_IN_PROCESS_CONTEXT_IMPLEMENTATION" ] + + deps = [ + ":gles2_implementation", + "//gpu", + "//base", + "//base/third_party/dynamic_annotations", + "//ui/gfx/geometry", + "//ui/gl", + ] +} + +component("gles2_c_lib") { + sources = gles2_c_lib_source_files + defines = [ "GLES2_C_LIB_IMPLEMENTATION" ] + + if (is_win) { + # TODO(jschuh): crbug.com/167187 fix size_t to int truncations. + cflags = [ "/wd4267" ] # size_t to int truncation. + } + + deps = [ + ":client", + "//base", + "//base/third_party/dynamic_annotations", + "//gpu/command_buffer/common", + ] +} + diff --git a/chromium/gpu/command_buffer/client/buffer_tracker.cc b/chromium/gpu/command_buffer/client/buffer_tracker.cc index 18cedb975d0..5887e52a71c 100644 --- a/chromium/gpu/command_buffer/client/buffer_tracker.cc +++ b/chromium/gpu/command_buffer/client/buffer_tracker.cc @@ -60,8 +60,30 @@ void BufferTracker::FreePendingToken(Buffer* buffer, int32 token) { buffer->shm_id_ = 0; buffer->shm_offset_ = 0; buffer->address_ = NULL; + buffer->last_usage_token_ = 0; + buffer->last_async_upload_token_ = 0; } +void BufferTracker::Unmanage(Buffer* buffer) { + buffer->size_ = 0; + buffer->shm_id_ = 0; + buffer->shm_offset_ = 0; + buffer->address_ = NULL; + buffer->last_usage_token_ = 0; + buffer->last_async_upload_token_ = 0; +} + +void BufferTracker::Free(Buffer* buffer) { + if (buffer->address_) + mapped_memory_->Free(buffer->address_); + + buffer->size_ = 0; + buffer->shm_id_ = 0; + buffer->shm_offset_ = 0; + buffer->address_ = NULL; + buffer->last_usage_token_ = 0; + buffer->last_async_upload_token_ = 0; +} } // namespace gles2 } // namespace gpu diff --git a/chromium/gpu/command_buffer/client/buffer_tracker.h b/chromium/gpu/command_buffer/client/buffer_tracker.h index 3e50364317d..33bd94b0456 100644 --- a/chromium/gpu/command_buffer/client/buffer_tracker.h +++ b/chromium/gpu/command_buffer/client/buffer_tracker.h @@ -35,7 +35,8 @@ class GLES2_IMPL_EXPORT BufferTracker { shm_offset_(shm_offset), address_(address), mapped_(false), - transfer_ready_token_(0) { + last_usage_token_(0), + last_async_upload_token_(0) { } GLenum id() const { @@ -66,12 +67,20 @@ class GLES2_IMPL_EXPORT BufferTracker { return mapped_; } - void set_transfer_ready_token(int token) { - transfer_ready_token_ = token; + void set_last_usage_token(int token) { + last_usage_token_ = token; } - uint32 transfer_ready_token() const { - return transfer_ready_token_; + int last_usage_token() const { + return last_usage_token_; + } + + void set_last_async_upload_token(uint32 async_token) { + last_async_upload_token_ = async_token; + } + + GLuint last_async_upload_token() const { + return last_async_upload_token_; } private: @@ -84,7 +93,8 @@ class GLES2_IMPL_EXPORT BufferTracker { uint32 shm_offset_; void* address_; bool mapped_; - int32 transfer_ready_token_; + int32 last_usage_token_; + GLuint last_async_upload_token_; }; BufferTracker(MappedMemoryManager* manager); @@ -96,7 +106,9 @@ class GLES2_IMPL_EXPORT BufferTracker { // Frees the block of memory associated with buffer, pending the passage // of a token. - void FreePendingToken(Buffer*, int32 token); + void FreePendingToken(Buffer* buffer, int32 token); + void Unmanage(Buffer* buffer); + void Free(Buffer* buffer); private: typedef base::hash_map<GLuint, Buffer*> BufferMap; diff --git a/chromium/gpu/command_buffer/client/buffer_tracker_unittest.cc b/chromium/gpu/command_buffer/client/buffer_tracker_unittest.cc index 51f4f944e1e..f6174c0802b 100644 --- a/chromium/gpu/command_buffer/client/buffer_tracker_unittest.cc +++ b/chromium/gpu/command_buffer/client/buffer_tracker_unittest.cc @@ -25,10 +25,11 @@ class MockClientCommandBufferImpl : public MockClientCommandBuffer { context_lost_(false) {} virtual ~MockClientCommandBufferImpl() {} - virtual Buffer CreateTransferBuffer(size_t size, int32* id) OVERRIDE { + virtual scoped_refptr<gpu::Buffer> CreateTransferBuffer(size_t size, + int32* id) OVERRIDE { if (context_lost_) { *id = -1; - return gpu::Buffer(); + return NULL; } return MockClientCommandBuffer::CreateTransferBuffer(size, id); } @@ -41,6 +42,11 @@ class MockClientCommandBufferImpl : public MockClientCommandBuffer { bool context_lost_; }; +namespace { +void EmptyPoll() { +} +} + class BufferTrackerTest : public testing::Test { protected: static const int32 kNumCommandEntries = 400; @@ -52,7 +58,7 @@ class BufferTrackerTest : public testing::Test { helper_.reset(new GLES2CmdHelper(command_buffer_.get())); helper_->Initialize(kCommandBufferSizeBytes); mapped_memory_.reset(new MappedMemoryManager( - helper_.get(), MappedMemoryManager::kNoLimit)); + helper_.get(), base::Bind(&EmptyPoll), MappedMemoryManager::kNoLimit)); buffer_tracker_.reset(new BufferTracker(mapped_memory_.get())); } @@ -126,5 +132,22 @@ TEST_F(BufferTrackerTest, LostContext) { buffer_tracker_->RemoveBuffer(kId); } +TEST_F(BufferTrackerTest, Unmanage) { + const GLuint kId = 123; + const GLsizeiptr size = 64; + + BufferTracker::Buffer* buffer = buffer_tracker_->CreateBuffer(kId, size); + ASSERT_TRUE(buffer != NULL); + EXPECT_EQ(mapped_memory_->bytes_in_use(), static_cast<size_t>(size)); + + void* mem = buffer->address(); + buffer_tracker_->Unmanage(buffer); + buffer_tracker_->RemoveBuffer(kId); + EXPECT_EQ(mapped_memory_->bytes_in_use(), static_cast<size_t>(size)); + + mapped_memory_->Free(mem); + EXPECT_EQ(mapped_memory_->bytes_in_use(), static_cast<size_t>(0)); +} + } // namespace gles2 } // namespace gpu diff --git a/chromium/gpu/command_buffer/client/client_context_state_autogen.h b/chromium/gpu/command_buffer/client/client_context_state_autogen.h index 1714b2b5ce9..72a4f72ed03 100644 --- a/chromium/gpu/command_buffer/client/client_context_state_autogen.h +++ b/chromium/gpu/command_buffer/client/client_context_state_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // It is included by client_context_state.h @@ -24,4 +26,3 @@ struct EnableFlags { }; #endif // GPU_COMMAND_BUFFER_CLIENT_CLIENT_CONTEXT_STATE_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/client/client_context_state_impl_autogen.h b/chromium/gpu/command_buffer/client/client_context_state_impl_autogen.h index 150816d04e3..cff14f7a82c 100644 --- a/chromium/gpu/command_buffer/client/client_context_state_impl_autogen.h +++ b/chromium/gpu/command_buffer/client/client_context_state_impl_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // It is included by client_context_state.cc @@ -22,71 +24,70 @@ ClientContextState::EnableFlags::EnableFlags() stencil_test(false) { } - -bool ClientContextState::SetCapabilityState( - GLenum cap, bool enabled, bool* changed) { +bool ClientContextState::SetCapabilityState(GLenum cap, + bool enabled, + bool* changed) { *changed = false; switch (cap) { case GL_BLEND: if (enable_flags.blend != enabled) { - *changed = true; - enable_flags.blend = enabled; + *changed = true; + enable_flags.blend = enabled; } return true; case GL_CULL_FACE: if (enable_flags.cull_face != enabled) { - *changed = true; - enable_flags.cull_face = enabled; + *changed = true; + enable_flags.cull_face = enabled; } return true; case GL_DEPTH_TEST: if (enable_flags.depth_test != enabled) { - *changed = true; - enable_flags.depth_test = enabled; + *changed = true; + enable_flags.depth_test = enabled; } return true; case GL_DITHER: if (enable_flags.dither != enabled) { - *changed = true; - enable_flags.dither = enabled; + *changed = true; + enable_flags.dither = enabled; } return true; case GL_POLYGON_OFFSET_FILL: if (enable_flags.polygon_offset_fill != enabled) { - *changed = true; - enable_flags.polygon_offset_fill = enabled; + *changed = true; + enable_flags.polygon_offset_fill = enabled; } return true; case GL_SAMPLE_ALPHA_TO_COVERAGE: if (enable_flags.sample_alpha_to_coverage != enabled) { - *changed = true; - enable_flags.sample_alpha_to_coverage = enabled; + *changed = true; + enable_flags.sample_alpha_to_coverage = enabled; } return true; case GL_SAMPLE_COVERAGE: if (enable_flags.sample_coverage != enabled) { - *changed = true; - enable_flags.sample_coverage = enabled; + *changed = true; + enable_flags.sample_coverage = enabled; } return true; case GL_SCISSOR_TEST: if (enable_flags.scissor_test != enabled) { - *changed = true; - enable_flags.scissor_test = enabled; + *changed = true; + enable_flags.scissor_test = enabled; } return true; case GL_STENCIL_TEST: if (enable_flags.stencil_test != enabled) { - *changed = true; - enable_flags.stencil_test = enabled; + *changed = true; + enable_flags.stencil_test = enabled; } return true; default: return false; } } -bool ClientContextState::GetEnabled( - GLenum cap, bool* enabled) const { +bool ClientContextState::GetEnabled(GLenum cap, bool* enabled) const { switch (cap) { case GL_BLEND: *enabled = enable_flags.blend; @@ -120,4 +121,3 @@ bool ClientContextState::GetEnabled( } } #endif // GPU_COMMAND_BUFFER_CLIENT_CLIENT_CONTEXT_STATE_IMPL_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/client/client_test_helper.cc b/chromium/gpu/command_buffer/client/client_test_helper.cc index db191ce5eba..8c633efebe1 100644 --- a/chromium/gpu/command_buffer/client/client_test_helper.cc +++ b/chromium/gpu/command_buffer/client/client_test_helper.cc @@ -15,6 +15,9 @@ using ::testing::Invoke; namespace gpu { +MockCommandBufferBase::MockCommandBufferBase() { +} + MockCommandBufferBase::~MockCommandBufferBase() { } @@ -22,10 +25,6 @@ bool MockCommandBufferBase::Initialize() { return true; } -CommandBuffer::State MockCommandBufferBase::GetState() { - return state_; -} - CommandBuffer::State MockCommandBufferBase::GetLastState() { return state_; } @@ -38,39 +37,42 @@ void MockCommandBufferBase::SetGetOffset(int32 get_offset) { state_.get_offset = get_offset; } -CommandBuffer::State MockCommandBufferBase::FlushSync( - int32 put_offset, int32 last_known_get) { - state_.put_offset = put_offset; - state_.get_offset = put_offset; +void MockCommandBufferBase::WaitForTokenInRange(int32 start, int32 end) {} + +void MockCommandBufferBase::WaitForGetOffsetInRange(int32 start, int32 end) { + state_.get_offset = state_.put_offset; OnFlush(); - return state_; } void MockCommandBufferBase::SetGetBuffer(int transfer_buffer_id) { ring_buffer_buffer_ = GetTransferBuffer(transfer_buffer_id); - ring_buffer_ = static_cast<CommandBufferEntry*>(ring_buffer_buffer_.ptr); - state_.num_entries = ring_buffer_buffer_.size / sizeof(ring_buffer_[0]); + ring_buffer_ = + static_cast<CommandBufferEntry*>(ring_buffer_buffer_->memory()); + state_.num_entries = ring_buffer_buffer_->size() / sizeof(ring_buffer_[0]); state_.token = 10000; // All token checks in the tests should pass. } // Get's the Id of the next transfer buffer that will be returned // by CreateTransferBuffer. This is useful for testing expected ids. int32 MockCommandBufferBase::GetNextFreeTransferBufferId() { - for (size_t ii = 0; ii < arraysize(transfer_buffers_); ++ii) { - if (!transfer_buffers_[ii].get()) { + for (size_t ii = 0; ii < arraysize(transfer_buffer_buffers_); ++ii) { + if (!transfer_buffer_buffers_[ii].get()) { return kTransferBufferBaseId + ii; } } return -1; } -Buffer MockCommandBufferBase::CreateTransferBuffer(size_t size, int32* id) { +scoped_refptr<gpu::Buffer> MockCommandBufferBase::CreateTransferBuffer( + size_t size, + int32* id) { *id = GetNextFreeTransferBufferId(); if (*id >= 0) { int32 ndx = *id - kTransferBufferBaseId; - transfer_buffers_[ndx].reset(new int8[size]); - transfer_buffer_buffers_[ndx].ptr = transfer_buffers_[ndx].get(); - transfer_buffer_buffers_[ndx].size = size; + scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); + shared_memory->CreateAndMapAnonymous(size); + transfer_buffer_buffers_[ndx] = + MakeBufferFromSharedMemory(shared_memory.Pass(), size); } return GetTransferBuffer(*id); } @@ -79,11 +81,10 @@ void MockCommandBufferBase::DestroyTransferBufferHelper(int32 id) { DCHECK_GE(id, kTransferBufferBaseId); DCHECK_LT(id, kTransferBufferBaseId + kMaxTransferBuffers); id -= kTransferBufferBaseId; - transfer_buffers_[id].reset(); - transfer_buffer_buffers_[id] = Buffer(); + transfer_buffer_buffers_[id] = NULL; } -Buffer MockCommandBufferBase::GetTransferBuffer(int32 id) { +scoped_refptr<Buffer> MockCommandBufferBase::GetTransferBuffer(int32 id) { DCHECK_GE(id, kTransferBufferBaseId); DCHECK_LT(id, kTransferBufferBaseId + kMaxTransferBuffers); return transfer_buffer_buffers_[id - kTransferBufferBaseId]; diff --git a/chromium/gpu/command_buffer/client/client_test_helper.h b/chromium/gpu/command_buffer/client/client_test_helper.h index e071f5a7482..f2c2e6b7ce5 100644 --- a/chromium/gpu/command_buffer/client/client_test_helper.h +++ b/chromium/gpu/command_buffer/client/client_test_helper.h @@ -9,10 +9,10 @@ #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" +#include "gpu/command_buffer/client/gpu_control.h" #include "gpu/command_buffer/common/cmd_buffer_common.h" -#include "gpu/command_buffer/common/command_buffer.h" -#include "gpu/command_buffer/common/gpu_control.h" #include "gpu/command_buffer/common/gpu_memory_allocation.h" +#include "gpu/command_buffer/service/command_buffer_service.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -20,23 +20,24 @@ namespace gpu { class CommandBufferHelper; -class MockCommandBufferBase : public CommandBuffer { +class MockCommandBufferBase : public CommandBufferServiceBase { public: static const int32 kTransferBufferBaseId = 0x123; static const int32 kMaxTransferBuffers = 6; - MockCommandBufferBase() { } + MockCommandBufferBase(); virtual ~MockCommandBufferBase(); virtual bool Initialize() OVERRIDE; - virtual State GetState() OVERRIDE; virtual State GetLastState() OVERRIDE; virtual int32 GetLastToken() OVERRIDE; - virtual State FlushSync(int32 put_offset, int32 last_known_get) OVERRIDE; + virtual void WaitForTokenInRange(int32 start, int32 end) OVERRIDE; + virtual void WaitForGetOffsetInRange(int32 start, int32 end) OVERRIDE; virtual void SetGetBuffer(int transfer_buffer_id) OVERRIDE; virtual void SetGetOffset(int32 get_offset) OVERRIDE; - virtual Buffer CreateTransferBuffer(size_t size, int32* id) OVERRIDE; - virtual Buffer GetTransferBuffer(int32 id) OVERRIDE; + virtual scoped_refptr<gpu::Buffer> CreateTransferBuffer(size_t size, + int32* id) OVERRIDE; + virtual scoped_refptr<gpu::Buffer> GetTransferBuffer(int32 id) OVERRIDE; virtual void SetToken(int32 token) OVERRIDE; virtual void SetParseError(error::Error error) OVERRIDE; virtual void SetContextLostReason(error::ContextLostReason reason) OVERRIDE; @@ -51,10 +52,9 @@ class MockCommandBufferBase : public CommandBuffer { virtual void OnFlush() = 0; private: - scoped_ptr<int8[]> transfer_buffers_[kMaxTransferBuffers]; - Buffer transfer_buffer_buffers_[kMaxTransferBuffers]; + scoped_refptr<Buffer> transfer_buffer_buffers_[kMaxTransferBuffers]; CommandBufferEntry* ring_buffer_; - Buffer ring_buffer_buffer_; + scoped_refptr<Buffer> ring_buffer_buffer_; State state_; }; @@ -88,14 +88,13 @@ class MockClientGpuControl : public GpuControl { virtual ~MockClientGpuControl(); MOCK_METHOD0(GetCapabilities, Capabilities()); - MOCK_METHOD4(CreateGpuMemoryBuffer, + MOCK_METHOD5(CreateGpuMemoryBuffer, gfx::GpuMemoryBuffer*(size_t width, size_t height, unsigned internalformat, + unsigned usage, int32* id)); MOCK_METHOD1(DestroyGpuMemoryBuffer, void(int32 id)); - MOCK_METHOD2(GenerateMailboxNames, bool(unsigned num, - std::vector<gpu::Mailbox>* names)); MOCK_METHOD0(InsertSyncPoint, uint32()); MOCK_METHOD2(SignalSyncPoint, void(uint32 id, const base::Closure& callback)); @@ -103,8 +102,7 @@ class MockClientGpuControl : public GpuControl { MOCK_METHOD2(SignalQuery, void(uint32 query, const base::Closure& callback)); MOCK_METHOD1(SetSurfaceVisible, void(bool visible)); - MOCK_METHOD1(SendManagedMemoryStats, - void(const ManagedMemoryStats& stats)); + MOCK_METHOD1(CreateStreamTexture, uint32(uint32)); private: DISALLOW_COPY_AND_ASSIGN(MockClientGpuControl); diff --git a/chromium/gpu/command_buffer/client/cmd_buffer_helper.cc b/chromium/gpu/command_buffer/client/cmd_buffer_helper.cc index 11219ede664..b50527a8dce 100644 --- a/chromium/gpu/command_buffer/client/cmd_buffer_helper.cc +++ b/chromium/gpu/command_buffer/client/cmd_buffer_helper.cc @@ -12,30 +12,29 @@ namespace gpu { -const int kCommandsPerFlushCheck = 100; - -#if !defined(OS_ANDROID) -const double kFlushDelay = 1.0 / (5.0 * 60.0); -#endif - CommandBufferHelper::CommandBufferHelper(CommandBuffer* command_buffer) : command_buffer_(command_buffer), ring_buffer_id_(-1), ring_buffer_size_(0), entries_(NULL), total_entry_count_(0), + immediate_entry_count_(0), token_(0), put_(0), last_put_sent_(0), +#if defined(CMD_HELPER_PERIODIC_FLUSH_CHECK) commands_issued_(0), +#endif usable_(true), context_lost_(false), flush_automatically_(true), - last_flush_time_(0) { + last_flush_time_(0), + flush_generation_(0) { } void CommandBufferHelper::SetAutomaticFlushes(bool enabled) { flush_automatically_ = enabled; + CalcImmediateEntries(0); } bool CommandBufferHelper::IsContextLost() { @@ -45,6 +44,47 @@ bool CommandBufferHelper::IsContextLost() { return context_lost_; } +void CommandBufferHelper::CalcImmediateEntries(int waiting_count) { + DCHECK_GE(waiting_count, 0); + + // Check if usable & allocated. + if (!usable() || !HaveRingBuffer()) { + immediate_entry_count_ = 0; + return; + } + + // Get maximum safe contiguous entries. + const int32 curr_get = get_offset(); + if (curr_get > put_) { + immediate_entry_count_ = curr_get - put_ - 1; + } else { + immediate_entry_count_ = + total_entry_count_ - put_ - (curr_get == 0 ? 1 : 0); + } + + // Limit entry count to force early flushing. + if (flush_automatically_) { + int32 limit = + total_entry_count_ / + ((curr_get == last_put_sent_) ? kAutoFlushSmall : kAutoFlushBig); + + int32 pending = + (put_ + total_entry_count_ - last_put_sent_) % total_entry_count_; + + if (pending > 0 && pending >= limit) { + // Time to force flush. + immediate_entry_count_ = 0; + } else { + // Limit remaining entries, but not lower than waiting_count entries to + // prevent deadlock when command size is greater than the flush limit. + limit -= pending; + limit = limit < waiting_count ? waiting_count : limit; + immediate_entry_count_ = + immediate_entry_count_ > limit ? limit : immediate_entry_count_; + } + } +} + bool CommandBufferHelper::AllocateRingBuffer() { if (!usable()) { return false; @@ -55,7 +95,8 @@ bool CommandBufferHelper::AllocateRingBuffer() { } int32 id = -1; - Buffer buffer = command_buffer_->CreateTransferBuffer(ring_buffer_size_, &id); + scoped_refptr<Buffer> buffer = + command_buffer_->CreateTransferBuffer(ring_buffer_size_, &id); if (id < 0) { ClearUsable(); return false; @@ -64,20 +105,12 @@ bool CommandBufferHelper::AllocateRingBuffer() { ring_buffer_ = buffer; ring_buffer_id_ = id; command_buffer_->SetGetBuffer(id); - - // TODO(gman): Do we really need to call GetState here? We know get & put = 0 - // Also do we need to check state.num_entries? - CommandBuffer::State state = command_buffer_->GetState(); - entries_ = static_cast<CommandBufferEntry*>(ring_buffer_.ptr); - int32 num_ring_buffer_entries = - ring_buffer_size_ / sizeof(CommandBufferEntry); - if (num_ring_buffer_entries > state.num_entries) { - ClearUsable(); - return false; - } - - total_entry_count_ = num_ring_buffer_entries; - put_ = state.put_offset; + entries_ = static_cast<CommandBufferEntry*>(ring_buffer_->memory()); + total_entry_count_ = ring_buffer_size_ / sizeof(CommandBufferEntry); + // Call to SetGetBuffer(id) above resets get and put offsets to 0. + // No need to query it through IPC. + put_ = 0; + CalcImmediateEntries(0); return true; } @@ -85,6 +118,7 @@ void CommandBufferHelper::FreeResources() { if (HaveRingBuffer()) { command_buffer_->DestroyTransferBuffer(ring_buffer_id_); ring_buffer_id_ = -1; + CalcImmediateEntries(0); } } @@ -103,24 +137,36 @@ CommandBufferHelper::~CommandBufferHelper() { FreeResources(); } -bool CommandBufferHelper::FlushSync() { +bool CommandBufferHelper::WaitForGetOffsetInRange(int32 start, int32 end) { if (!usable()) { return false; } - last_flush_time_ = clock(); - last_put_sent_ = put_; - CommandBuffer::State state = command_buffer_->FlushSync(put_, get_offset()); - return state.error == error::kNoError; + command_buffer_->WaitForGetOffsetInRange(start, end); + return command_buffer_->GetLastError() == gpu::error::kNoError; } void CommandBufferHelper::Flush() { + // Wrap put_ before flush. + if (put_ == total_entry_count_) + put_ = 0; + if (usable() && last_put_sent_ != put_) { last_flush_time_ = clock(); last_put_sent_ = put_; command_buffer_->Flush(put_); + ++flush_generation_; + CalcImmediateEntries(0); } } +#if defined(CMD_HELPER_PERIODIC_FLUSH_CHECK) +void CommandBufferHelper::PeriodicFlushCheck() { + clock_t current_time = clock(); + if (current_time - last_flush_time_ > kPeriodicFlushDelay * CLOCKS_PER_SEC) + Flush(); +} +#endif + // Calls Flush() and then waits until the buffer is empty. Break early if the // error is set. bool CommandBufferHelper::Finish() { @@ -133,12 +179,12 @@ bool CommandBufferHelper::Finish() { return true; } DCHECK(HaveRingBuffer()); - do { - // Do not loop forever if the flush fails, meaning the command buffer reader - // has shutdown. - if (!FlushSync()) - return false; - } while (put_ != get_offset()); + Flush(); + if (!WaitForGetOffsetInRange(put_, put_)) + return false; + DCHECK_EQ(get_offset(), put_); + + CalcImmediateEntries(0); return true; } @@ -179,16 +225,10 @@ void CommandBufferHelper::WaitForToken(int32 token) { if (token < 0) return; if (token > token_) return; // we wrapped - while (last_token_read() < token) { - if (get_offset() == put_) { - LOG(FATAL) << "Empty command buffer while waiting on a token."; - return; - } - // Do not loop forever if the flush fails, meaning the command buffer reader - // has shutdown. - if (!FlushSync()) - return; - } + if (last_token_read() >= token) + return; + Flush(); + command_buffer_->WaitForTokenInRange(token, token_); } // Waits for available entries, basically waiting until get >= put + count + 1. @@ -209,14 +249,15 @@ void CommandBufferHelper::WaitForAvailableEntries(int32 count) { // but we need to make sure get wraps first, actually that get is 1 or // more (since put will wrap to 0 after we add the noops). DCHECK_LE(1, put_); - if (get_offset() > put_ || get_offset() == 0) { + int32 curr_get = get_offset(); + if (curr_get > put_ || curr_get == 0) { TRACE_EVENT0("gpu", "CommandBufferHelper::WaitForAvailableEntries"); - while (get_offset() > put_ || get_offset() == 0) { - // Do not loop forever if the flush fails, meaning the command buffer - // reader has shutdown. - if (!FlushSync()) - return; - } + Flush(); + if (!WaitForGetOffsetInRange(1, put_)) + return; + curr_get = get_offset(); + DCHECK_LE(curr_get, put_); + DCHECK_NE(0, curr_get); } // Insert Noops to fill out the buffer. int32 num_entries = total_entry_count_ - put_; @@ -228,52 +269,23 @@ void CommandBufferHelper::WaitForAvailableEntries(int32 count) { } put_ = 0; } - if (AvailableEntries() < count) { - TRACE_EVENT0("gpu", "CommandBufferHelper::WaitForAvailableEntries1"); - while (AvailableEntries() < count) { - // Do not loop forever if the flush fails, meaning the command buffer - // reader has shutdown. - if (!FlushSync()) + + // Try to get 'count' entries without flushing. + CalcImmediateEntries(count); + if (immediate_entry_count_ < count) { + // Try again with a shallow Flush(). + Flush(); + CalcImmediateEntries(count); + if (immediate_entry_count_ < count) { + // Buffer is full. Need to wait for entries. + TRACE_EVENT0("gpu", "CommandBufferHelper::WaitForAvailableEntries1"); + if (!WaitForGetOffsetInRange(put_ + count + 1, put_)) return; + CalcImmediateEntries(count); + DCHECK_GE(immediate_entry_count_, count); } } - // Force a flush if the buffer is getting half full, or even earlier if the - // reader is known to be idle. - int32 pending = - (put_ + total_entry_count_ - last_put_sent_) % total_entry_count_; - int32 limit = total_entry_count_ / - ((get_offset() == last_put_sent_) ? 16 : 2); - if (pending > limit) { - Flush(); - } else if (flush_automatically_ && - (commands_issued_ % kCommandsPerFlushCheck == 0)) { -#if !defined(OS_ANDROID) - // Allow this command buffer to be pre-empted by another if a "reasonable" - // amount of work has been done. On highend machines, this reduces the - // latency of GPU commands. However, on Android, this can cause the - // kernel to thrash between generating GPU commands and executing them. - clock_t current_time = clock(); - if (current_time - last_flush_time_ > kFlushDelay * CLOCKS_PER_SEC) - Flush(); -#endif - } } -CommandBufferEntry* CommandBufferHelper::GetSpace(uint32 entries) { - AllocateRingBuffer(); - if (!usable()) { - return NULL; - } - DCHECK(HaveRingBuffer()); - ++commands_issued_; - WaitForAvailableEntries(entries); - CommandBufferEntry* space = &entries_[put_]; - put_ += entries; - DCHECK_LE(put_, total_entry_count_); - if (put_ == total_entry_count_) { - put_ = 0; - } - return space; -} } // namespace gpu diff --git a/chromium/gpu/command_buffer/client/cmd_buffer_helper.h b/chromium/gpu/command_buffer/client/cmd_buffer_helper.h index a50dc7bfe4e..86d3c3bf6c1 100644 --- a/chromium/gpu/command_buffer/client/cmd_buffer_helper.h +++ b/chromium/gpu/command_buffer/client/cmd_buffer_helper.h @@ -17,6 +17,15 @@ namespace gpu { +#if !defined(OS_ANDROID) +#define CMD_HELPER_PERIODIC_FLUSH_CHECK +const int kCommandsPerFlushCheck = 100; +const float kPeriodicFlushDelay = 1.0f / (5.0f * 60.0f); +#endif + +const int kAutoFlushSmall = 16; // 1/16 of the buffer +const int kAutoFlushBig = 2; // 1/2 of the buffer + // Command buffer helper class. This class simplifies ring buffer management: // it will allocate the buffer, give it to the buffer interface, and let the // user add commands to it, while taking care of the synchronization (put and @@ -55,14 +64,6 @@ class GPU_EXPORT CommandBufferHelper { // returns, the command buffer service is aware of all pending commands. void Flush(); - // Flushes the commands, setting the put pointer to let the buffer interface - // know that new commands have been added. After a flush returns, the command - // buffer service is aware of all pending commands and it is guaranteed to - // have made some progress in processing them. Returns whether the flush was - // successful. The flush will fail if the command buffer service has - // disconnected. - bool FlushSync(); - // Waits until all the commands have been executed. Returns whether it // was successful. The function will fail if the command buffer service has // disconnected. @@ -83,6 +84,15 @@ class GPU_EXPORT CommandBufferHelper { // shutdown. int32 InsertToken(); + // Returns true if the token has passed. + // Parameters: + // the value of the token to check whether it has passed + bool HasTokenPassed(int32 token) const { + if (token > token_) + return true; // we wrapped + return last_token_read() >= token; + } + // Waits until the token of a particular value has passed through the command // stream (i.e. commands inserted before that token have been executed). // NOTE: This will call Flush if it needs to block. @@ -92,34 +102,78 @@ class GPU_EXPORT CommandBufferHelper { // Called prior to each command being issued. Waits for a certain amount of // space to be available. Returns address of space. - CommandBufferEntry* GetSpace(uint32 entries); + void* GetSpace(int32 entries) { +#if defined(CMD_HELPER_PERIODIC_FLUSH_CHECK) + // Allow this command buffer to be pre-empted by another if a "reasonable" + // amount of work has been done. On highend machines, this reduces the + // latency of GPU commands. However, on Android, this can cause the + // kernel to thrash between generating GPU commands and executing them. + ++commands_issued_; + if (flush_automatically_ && + (commands_issued_ % kCommandsPerFlushCheck == 0)) { + PeriodicFlushCheck(); + } +#endif + + // Test for immediate entries. + if (entries > immediate_entry_count_) { + WaitForAvailableEntries(entries); + if (entries > immediate_entry_count_) + return NULL; + } + + DCHECK_LE(entries, immediate_entry_count_); + + // Allocate space and advance put_. + CommandBufferEntry* space = &entries_[put_]; + put_ += entries; + immediate_entry_count_ -= entries; + + DCHECK_LE(put_, total_entry_count_); + return space; + } + + template <typename T> + void ForceNullCheck(T* data) { +#if defined(OS_WIN) && defined(ARCH_CPU_64_BITS) + // 64-bit MSVC's alias analysis was determining that the command buffer + // entry couldn't be NULL, so it optimized out the NULL check. + // Dereferencing the same datatype through a volatile pointer seems to + // prevent that from happening. http://crbug.com/361936 + if (data) + static_cast<volatile T*>(data)->header; +#endif + } // Typed version of GetSpace. Gets enough room for the given type and returns // a reference to it. template <typename T> T* GetCmdSpace() { COMPILE_ASSERT(T::kArgFlags == cmd::kFixed, Cmd_kArgFlags_not_kFixed); - uint32 space_needed = ComputeNumEntries(sizeof(T)); - void* data = GetSpace(space_needed); - return reinterpret_cast<T*>(data); + int32 space_needed = ComputeNumEntries(sizeof(T)); + T* data = static_cast<T*>(GetSpace(space_needed)); + ForceNullCheck(data); + return data; } // Typed version of GetSpace for immediate commands. template <typename T> T* GetImmediateCmdSpace(size_t data_space) { COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); - uint32 space_needed = ComputeNumEntries(sizeof(T) + data_space); - void* data = GetSpace(space_needed); - return reinterpret_cast<T*>(data); + int32 space_needed = ComputeNumEntries(sizeof(T) + data_space); + T* data = static_cast<T*>(GetSpace(space_needed)); + ForceNullCheck(data); + return data; } // Typed version of GetSpace for immediate commands. template <typename T> T* GetImmediateCmdSpaceTotalSize(size_t total_space) { COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); - uint32 space_needed = ComputeNumEntries(total_space); - void* data = GetSpace(space_needed); - return reinterpret_cast<T*>(data); + int32 space_needed = ComputeNumEntries(total_space); + T* data = static_cast<T*>(GetSpace(space_needed)); + ForceNullCheck(data); + return data; } int32 last_token_read() const { @@ -214,9 +268,9 @@ class GPU_EXPORT CommandBufferHelper { return command_buffer_; } - Buffer get_ring_buffer() const { - return ring_buffer_; - } + scoped_refptr<Buffer> get_ring_buffer() const { return ring_buffer_; } + + uint32 flush_generation() const { return flush_generation_; } void FreeRingBuffer(); @@ -230,30 +284,43 @@ class GPU_EXPORT CommandBufferHelper { void ClearUsable() { usable_ = false; + CalcImmediateEntries(0); } private: - // Waits until get changes, updating the value of get_. - void WaitForGetChange(); - // Returns the number of available entries (they may not be contiguous). int32 AvailableEntries() { return (get_offset() - put_ - 1 + total_entry_count_) % total_entry_count_; } + void CalcImmediateEntries(int waiting_count); bool AllocateRingBuffer(); void FreeResources(); + // Waits for the get offset to be in a specific range, inclusive. Returns + // false if there was an error. + bool WaitForGetOffsetInRange(int32 start, int32 end); + +#if defined(CMD_HELPER_PERIODIC_FLUSH_CHECK) + // Calls Flush if automatic flush conditions are met. + void PeriodicFlushCheck(); +#endif + CommandBuffer* command_buffer_; int32 ring_buffer_id_; int32 ring_buffer_size_; - Buffer ring_buffer_; + scoped_refptr<gpu::Buffer> ring_buffer_; CommandBufferEntry* entries_; int32 total_entry_count_; // the total number of entries + int32 immediate_entry_count_; int32 token_; int32 put_; int32 last_put_sent_; + +#if defined(CMD_HELPER_PERIODIC_FLUSH_CHECK) int commands_issued_; +#endif + bool usable_; bool context_lost_; bool flush_automatically_; @@ -261,6 +328,10 @@ class GPU_EXPORT CommandBufferHelper { // Using C runtime instead of base because this file cannot depend on base. clock_t last_flush_time_; + // Incremented every time the helper flushes the command buffer. + // Can be used to track when prior commands have been flushed. + uint32 flush_generation_; + friend class CommandBufferHelperTest; DISALLOW_COPY_AND_ASSIGN(CommandBufferHelper); }; diff --git a/chromium/gpu/command_buffer/client/cmd_buffer_helper_test.cc b/chromium/gpu/command_buffer/client/cmd_buffer_helper_test.cc index bd0e86e3f45..c2d1361555a 100644 --- a/chromium/gpu/command_buffer/client/cmd_buffer_helper_test.cc +++ b/chromium/gpu/command_buffer/client/cmd_buffer_helper_test.cc @@ -4,8 +4,11 @@ // Tests for the Command Buffer Helper. +#include <list> + #include "base/bind.h" #include "base/bind_helpers.h" +#include "base/memory/linked_ptr.h" #include "base/message_loop/message_loop.h" #include "gpu/command_buffer/client/cmd_buffer_helper.h" #include "gpu/command_buffer/service/command_buffer_service.h" @@ -28,11 +31,54 @@ using testing::DoAll; using testing::Invoke; using testing::_; -const int32 kTotalNumCommandEntries = 10; +const int32 kTotalNumCommandEntries = 32; const int32 kCommandBufferSizeBytes = kTotalNumCommandEntries * sizeof(CommandBufferEntry); const int32 kUnusedCommandId = 5; // we use 0 and 2 currently. +// Override CommandBufferService::Flush() to lock flushing and simulate +// the buffer becoming full in asynchronous mode. +class CommandBufferServiceLocked : public CommandBufferService { + public: + explicit CommandBufferServiceLocked( + TransferBufferManagerInterface* transfer_buffer_manager) + : CommandBufferService(transfer_buffer_manager), + flush_locked_(false), + last_flush_(-1), + flush_count_(0) {} + virtual ~CommandBufferServiceLocked() {} + + virtual void Flush(int32 put_offset) OVERRIDE { + flush_count_++; + if (!flush_locked_) { + last_flush_ = -1; + CommandBufferService::Flush(put_offset); + } else { + last_flush_ = put_offset; + } + } + + void LockFlush() { flush_locked_ = true; } + + void UnlockFlush() { flush_locked_ = false; } + + int FlushCount() { return flush_count_; } + + virtual void WaitForGetOffsetInRange(int32 start, int32 end) OVERRIDE { + if (last_flush_ != -1) { + CommandBufferService::Flush(last_flush_); + last_flush_ = -1; + } + CommandBufferService::WaitForGetOffsetInRange(start, end); + } + + private: + bool flush_locked_; + int last_flush_; + int flush_count_; + DISALLOW_COPY_AND_ASSIGN(CommandBufferServiceLocked); +}; + // Test fixture for CommandBufferHelper test - Creates a CommandBufferHelper, // using a CommandBufferEngine with a mock AsyncAPIInterface for its interface // (calling it directly, not through the RPC mechanism). @@ -51,7 +97,7 @@ class CommandBufferHelperTest : public testing::Test { EXPECT_TRUE(manager->Initialize()); } command_buffer_.reset( - new CommandBufferService(transfer_buffer_manager_.get())); + new CommandBufferServiceLocked(transfer_buffer_manager_.get())); EXPECT_TRUE(command_buffer_->Initialize()); gpu_scheduler_.reset(new GpuScheduler( @@ -65,17 +111,22 @@ class CommandBufferHelperTest : public testing::Test { helper_.reset(new CommandBufferHelper(command_buffer_.get())); helper_->Initialize(kCommandBufferSizeBytes); + + test_command_next_id_ = kUnusedCommandId; } virtual void TearDown() { // If the GpuScheduler posts any tasks, this forces them to run. base::MessageLoop::current()->RunUntilIdle(); + test_command_args_.clear(); } const CommandParser* GetParser() const { return gpu_scheduler_->parser(); } + int32 ImmediateEntryCount() const { return helper_->immediate_entry_count_; } + // Adds a command to the buffer through the helper, while adding it as an // expected call on the API mock. void AddCommandWithExpect(error::Error _return, @@ -85,7 +136,8 @@ class CommandBufferHelperTest : public testing::Test { CommandHeader header; header.size = arg_count + 1; header.command = command; - CommandBufferEntry* cmds = helper_->GetSpace(arg_count + 1); + CommandBufferEntry* cmds = + static_cast<CommandBufferEntry*>(helper_->GetSpace(arg_count + 1)); CommandBufferOffset put = 0; cmds[put++].value_header = header; for (int ii = 0; ii < arg_count; ++ii) { @@ -98,6 +150,68 @@ class CommandBufferHelperTest : public testing::Test { .WillOnce(Return(_return)); } + void AddUniqueCommandWithExpect(error::Error _return, int cmd_size) { + EXPECT_GE(cmd_size, 1); + EXPECT_LT(cmd_size, kTotalNumCommandEntries); + int arg_count = cmd_size - 1; + + // Allocate array for args. + linked_ptr<std::vector<CommandBufferEntry> > args_ptr( + new std::vector<CommandBufferEntry>(arg_count ? arg_count : 1)); + + for (int32 ii = 0; ii < arg_count; ++ii) { + (*args_ptr)[ii].value_uint32 = 0xF00DF00D + ii; + } + + // Add command and save args in test_command_args_ until the test completes. + AddCommandWithExpect( + _return, test_command_next_id_++, arg_count, &(*args_ptr)[0]); + test_command_args_.insert(test_command_args_.end(), args_ptr); + } + + void TestCommandWrappingFull(int32 cmd_size, int32 start_commands) { + const int32 num_args = cmd_size - 1; + EXPECT_EQ(kTotalNumCommandEntries % cmd_size, 0); + + std::vector<CommandBufferEntry> args(num_args); + for (int32 ii = 0; ii < num_args; ++ii) { + args[ii].value_uint32 = ii + 1; + } + + // Initially insert commands up to start_commands and Finish(). + for (int32 ii = 0; ii < start_commands; ++ii) { + AddCommandWithExpect( + error::kNoError, ii + kUnusedCommandId, num_args, &args[0]); + } + helper_->Finish(); + + EXPECT_EQ(GetParser()->put(), + (start_commands * cmd_size) % kTotalNumCommandEntries); + EXPECT_EQ(GetParser()->get(), + (start_commands * cmd_size) % kTotalNumCommandEntries); + + // Lock flushing to force the buffer to get full. + command_buffer_->LockFlush(); + + // Add enough commands to over fill the buffer. + for (int32 ii = 0; ii < kTotalNumCommandEntries / cmd_size + 2; ++ii) { + AddCommandWithExpect(error::kNoError, + start_commands + ii + kUnusedCommandId, + num_args, + &args[0]); + } + + // Flush all commands. + command_buffer_->UnlockFlush(); + helper_->Finish(); + + // Check that the commands did happen. + Mock::VerifyAndClearExpectations(api_mock_.get()); + + // Check the error status. + EXPECT_EQ(error::kNoError, GetError()); + } + // Checks that the buffer from put to put+size is free in the parser. void CheckFreeSpace(CommandBufferOffset put, unsigned int size) { CommandBufferOffset parser_put = GetParser()->put(); @@ -122,15 +236,21 @@ class CommandBufferHelperTest : public testing::Test { } int32 GetGetOffset() { - return command_buffer_->GetState().get_offset; + return command_buffer_->GetLastState().get_offset; } int32 GetPutOffset() { - return command_buffer_->GetState().put_offset; + return command_buffer_->GetLastState().put_offset; } + int32 GetHelperGetOffset() { return helper_->get_offset(); } + + int32 GetHelperPutOffset() { return helper_->put_; } + + uint32 GetHelperFlushGeneration() { return helper_->flush_generation(); } + error::Error GetError() { - return command_buffer_->GetState().error; + return command_buffer_->GetLastState().error; } CommandBufferOffset get_helper_put() { return helper_->put_; } @@ -141,12 +261,176 @@ class CommandBufferHelperTest : public testing::Test { base::MessageLoop message_loop_; scoped_ptr<AsyncAPIMock> api_mock_; scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; - scoped_ptr<CommandBufferService> command_buffer_; + scoped_ptr<CommandBufferServiceLocked> command_buffer_; scoped_ptr<GpuScheduler> gpu_scheduler_; scoped_ptr<CommandBufferHelper> helper_; + std::list<linked_ptr<std::vector<CommandBufferEntry> > > test_command_args_; + unsigned int test_command_next_id_; Sequence sequence_; }; +// Checks immediate_entry_count_ changes based on 'usable' state. +TEST_F(CommandBufferHelperTest, TestCalcImmediateEntriesNotUsable) { + // Auto flushing mode is tested separately. + helper_->SetAutomaticFlushes(false); + EXPECT_EQ(helper_->usable(), true); + EXPECT_EQ(ImmediateEntryCount(), kTotalNumCommandEntries - 1); + helper_->ClearUsable(); + EXPECT_EQ(ImmediateEntryCount(), 0); +} + +// Checks immediate_entry_count_ changes based on RingBuffer state. +TEST_F(CommandBufferHelperTest, TestCalcImmediateEntriesNoRingBuffer) { + helper_->SetAutomaticFlushes(false); + EXPECT_EQ(ImmediateEntryCount(), kTotalNumCommandEntries - 1); + helper_->FreeRingBuffer(); + EXPECT_EQ(ImmediateEntryCount(), 0); +} + +// Checks immediate_entry_count_ calc when Put >= Get and Get == 0. +TEST_F(CommandBufferHelperTest, TestCalcImmediateEntriesGetAtZero) { + // No internal auto flushing. + helper_->SetAutomaticFlushes(false); + command_buffer_->LockFlush(); + + // Start at Get = Put = 0. + EXPECT_EQ(GetHelperPutOffset(), 0); + EXPECT_EQ(GetHelperGetOffset(), 0); + + // Immediate count should be 1 less than the end of the buffer. + EXPECT_EQ(ImmediateEntryCount(), kTotalNumCommandEntries - 1); + AddUniqueCommandWithExpect(error::kNoError, 2); + EXPECT_EQ(ImmediateEntryCount(), kTotalNumCommandEntries - 3); + + helper_->Finish(); + + // Check that the commands did happen. + Mock::VerifyAndClearExpectations(api_mock_.get()); + + // Check the error status. + EXPECT_EQ(error::kNoError, GetError()); +} + +// Checks immediate_entry_count_ calc when Put >= Get and Get > 0. +TEST_F(CommandBufferHelperTest, TestCalcImmediateEntriesGetInMiddle) { + // No internal auto flushing. + helper_->SetAutomaticFlushes(false); + command_buffer_->LockFlush(); + + // Move to Get = Put = 2. + AddUniqueCommandWithExpect(error::kNoError, 2); + helper_->Finish(); + EXPECT_EQ(GetHelperPutOffset(), 2); + EXPECT_EQ(GetHelperGetOffset(), 2); + + // Immediate count should be up to the end of the buffer. + EXPECT_EQ(ImmediateEntryCount(), kTotalNumCommandEntries - 2); + AddUniqueCommandWithExpect(error::kNoError, 2); + EXPECT_EQ(ImmediateEntryCount(), kTotalNumCommandEntries - 4); + + helper_->Finish(); + + // Check that the commands did happen. + Mock::VerifyAndClearExpectations(api_mock_.get()); + + // Check the error status. + EXPECT_EQ(error::kNoError, GetError()); +} + +// Checks immediate_entry_count_ calc when Put < Get. +TEST_F(CommandBufferHelperTest, TestCalcImmediateEntriesGetBeforePut) { + // Move to Get = kTotalNumCommandEntries / 4, Put = 0. + const int kInitGetOffset = kTotalNumCommandEntries / 4; + helper_->SetAutomaticFlushes(false); + command_buffer_->LockFlush(); + AddUniqueCommandWithExpect(error::kNoError, kInitGetOffset); + helper_->Finish(); + AddUniqueCommandWithExpect(error::kNoError, + kTotalNumCommandEntries - kInitGetOffset); + + // Flush instead of Finish will let Put wrap without the command buffer + // immediately processing the data between Get and Put. + helper_->Flush(); + + EXPECT_EQ(GetHelperGetOffset(), kInitGetOffset); + EXPECT_EQ(GetHelperPutOffset(), 0); + + // Immediate count should be up to Get - 1. + EXPECT_EQ(ImmediateEntryCount(), kInitGetOffset - 1); + AddUniqueCommandWithExpect(error::kNoError, 2); + EXPECT_EQ(ImmediateEntryCount(), kInitGetOffset - 3); + + helper_->Finish(); + // Check that the commands did happen. + Mock::VerifyAndClearExpectations(api_mock_.get()); + + // Check the error status. + EXPECT_EQ(error::kNoError, GetError()); +} + +// Checks immediate_entry_count_ calc when automatic flushing is enabled. +TEST_F(CommandBufferHelperTest, TestCalcImmediateEntriesAutoFlushing) { + command_buffer_->LockFlush(); + + // Start at Get = Put = 0. + EXPECT_EQ(GetHelperPutOffset(), 0); + EXPECT_EQ(GetHelperGetOffset(), 0); + + // Without auto flushes, up to kTotalNumCommandEntries - 1 is available. + helper_->SetAutomaticFlushes(false); + EXPECT_EQ(ImmediateEntryCount(), kTotalNumCommandEntries - 1); + + // With auto flushes, and Get == Last Put, + // up to kTotalNumCommandEntries / kAutoFlushSmall is available. + helper_->SetAutomaticFlushes(true); + EXPECT_EQ(ImmediateEntryCount(), kTotalNumCommandEntries / kAutoFlushSmall); + + // With auto flushes, and Get != Last Put, + // up to kTotalNumCommandEntries / kAutoFlushBig is available. + AddUniqueCommandWithExpect(error::kNoError, 2); + helper_->Flush(); + EXPECT_EQ(ImmediateEntryCount(), kTotalNumCommandEntries / kAutoFlushBig); + + helper_->Finish(); + // Check that the commands did happen. + Mock::VerifyAndClearExpectations(api_mock_.get()); + + // Check the error status. + EXPECT_EQ(error::kNoError, GetError()); +} + +// Checks immediate_entry_count_ calc when automatic flushing is enabled, and +// we allocate commands over the immediate_entry_count_ size. +TEST_F(CommandBufferHelperTest, TestCalcImmediateEntriesOverFlushLimit) { + // Lock internal flushing. + command_buffer_->LockFlush(); + + // Start at Get = Put = 0. + EXPECT_EQ(GetHelperPutOffset(), 0); + EXPECT_EQ(GetHelperGetOffset(), 0); + + // Pre-check ImmediateEntryCount is limited with automatic flushing enabled. + helper_->SetAutomaticFlushes(true); + EXPECT_EQ(ImmediateEntryCount(), kTotalNumCommandEntries / kAutoFlushSmall); + + // Add a command larger than ImmediateEntryCount(). + AddUniqueCommandWithExpect(error::kNoError, ImmediateEntryCount() + 1); + + // ImmediateEntryCount() should now be 0, to force a flush check on the next + // command. + EXPECT_EQ(ImmediateEntryCount(), 0); + + // Add a command when ImmediateEntryCount() == 0. + AddUniqueCommandWithExpect(error::kNoError, ImmediateEntryCount() + 1); + + helper_->Finish(); + // Check that the commands did happen. + Mock::VerifyAndClearExpectations(api_mock_.get()); + + // Check the error status. + EXPECT_EQ(error::kNoError, GetError()); +} + // Checks that commands in the buffer are properly executed, and that the // status/error stay valid. TEST_F(CommandBufferHelperTest, TestCommandProcessing) { @@ -184,12 +468,16 @@ TEST_F(CommandBufferHelperTest, TestCommandProcessing) { // Checks that commands in the buffer are properly executed when wrapping the // buffer, and that the status/error stay valid. TEST_F(CommandBufferHelperTest, TestCommandWrapping) { - // Add 5 commands of size 3 through the helper to make sure we do wrap. + // Add num_commands * commands of size 3 through the helper to make sure we + // do wrap. kTotalNumCommandEntries must not be a multiple of 3. + COMPILE_ASSERT(kTotalNumCommandEntries % 3 != 0, + Is_multiple_of_num_command_entries); + const int kNumCommands = (kTotalNumCommandEntries / 3) * 2; CommandBufferEntry args1[2]; args1[0].value_uint32 = 5; args1[1].value_float = 4.f; - for (unsigned int i = 0; i < 5; ++i) { + for (int i = 0; i < kNumCommands; ++i) { AddCommandWithExpect(error::kNoError, kUnusedCommandId + i, 2, args1); } @@ -204,13 +492,13 @@ TEST_F(CommandBufferHelperTest, TestCommandWrapping) { // Checks the case where the command inserted exactly matches the space left in // the command buffer. TEST_F(CommandBufferHelperTest, TestCommandWrappingExactMultiple) { - const int32 kCommandSize = 5; + const int32 kCommandSize = kTotalNumCommandEntries / 2; const size_t kNumArgs = kCommandSize - 1; COMPILE_ASSERT(kTotalNumCommandEntries % kCommandSize == 0, Not_multiple_of_num_command_entries); CommandBufferEntry args1[kNumArgs]; for (size_t ii = 0; ii < kNumArgs; ++ii) { - args1[0].value_uint32 = ii + 1; + args1[ii].value_uint32 = ii + 1; } for (unsigned int i = 0; i < 5; ++i) { @@ -226,6 +514,22 @@ TEST_F(CommandBufferHelperTest, TestCommandWrappingExactMultiple) { EXPECT_EQ(error::kNoError, GetError()); } +// Checks exact wrapping condition with Get = 0. +TEST_F(CommandBufferHelperTest, TestCommandWrappingFullAtStart) { + TestCommandWrappingFull(2, 0); +} + +// Checks exact wrapping condition with 0 < Get < kTotalNumCommandEntries. +TEST_F(CommandBufferHelperTest, TestCommandWrappingFullInMiddle) { + TestCommandWrappingFull(2, 1); +} + +// Checks exact wrapping condition with Get = kTotalNumCommandEntries. +// Get should wrap back to 0, but making sure. +TEST_F(CommandBufferHelperTest, TestCommandWrappingFullAtEnd) { + TestCommandWrappingFull(2, kTotalNumCommandEntries / 2); +} + // Checks that asking for available entries work, and that the parser // effectively won't use that space. TEST_F(CommandBufferHelperTest, TestAvailableEntries) { @@ -287,6 +591,46 @@ TEST_F(CommandBufferHelperTest, TestToken) { EXPECT_EQ(error::kNoError, GetError()); } +// Checks WaitForToken doesn't Flush if token is already read. +TEST_F(CommandBufferHelperTest, TestWaitForTokenFlush) { + CommandBufferEntry args[2]; + args[0].value_uint32 = 3; + args[1].value_float = 4.f; + + // Add a first command. + AddCommandWithExpect(error::kNoError, kUnusedCommandId + 3, 2, args); + int32 token = helper_->InsertToken(); + + EXPECT_CALL(*api_mock_.get(), DoCommand(cmd::kSetToken, 1, _)) + .WillOnce(DoAll(Invoke(api_mock_.get(), &AsyncAPIMock::SetToken), + Return(error::kNoError))); + + int flush_count = command_buffer_->FlushCount(); + + // Test that waiting for pending token causes a Flush. + helper_->WaitForToken(token); + EXPECT_EQ(command_buffer_->FlushCount(), flush_count + 1); + + // Test that we don't Flush repeatedly. + helper_->WaitForToken(token); + EXPECT_EQ(command_buffer_->FlushCount(), flush_count + 1); + + // Add another command. + AddCommandWithExpect(error::kNoError, kUnusedCommandId + 4, 2, args); + + // Test that we don't Flush repeatedly even if commands are pending. + helper_->WaitForToken(token); + EXPECT_EQ(command_buffer_->FlushCount(), flush_count + 1); + + helper_->Finish(); + + // Check that the commands did happen. + Mock::VerifyAndClearExpectations(api_mock_.get()); + + // Check the error status. + EXPECT_EQ(error::kNoError, GetError()); +} + TEST_F(CommandBufferHelperTest, FreeRingBuffer) { EXPECT_TRUE(helper_->HaveRingBuffer()); @@ -330,4 +674,38 @@ TEST_F(CommandBufferHelperTest, IsContextLost) { EXPECT_TRUE(helper_->IsContextLost()); } +// Checks helper's 'flush generation' updates. +TEST_F(CommandBufferHelperTest, TestFlushGeneration) { + // Explicit flushing only. + helper_->SetAutomaticFlushes(false); + + // Generation should change after Flush() but not before. + uint32 gen1, gen2, gen3; + + gen1 = GetHelperFlushGeneration(); + AddUniqueCommandWithExpect(error::kNoError, 2); + gen2 = GetHelperFlushGeneration(); + helper_->Flush(); + gen3 = GetHelperFlushGeneration(); + EXPECT_EQ(gen2, gen1); + EXPECT_NE(gen3, gen2); + + // Generation should change after Finish() but not before. + gen1 = GetHelperFlushGeneration(); + AddUniqueCommandWithExpect(error::kNoError, 2); + gen2 = GetHelperFlushGeneration(); + helper_->Finish(); + gen3 = GetHelperFlushGeneration(); + EXPECT_EQ(gen2, gen1); + EXPECT_NE(gen3, gen2); + + helper_->Finish(); + + // Check that the commands did happen. + Mock::VerifyAndClearExpectations(api_mock_.get()); + + // Check the error status. + EXPECT_EQ(error::kNoError, GetError()); +} + } // namespace gpu diff --git a/chromium/gpu/command_buffer/client/context_support.h b/chromium/gpu/command_buffer/client/context_support.h index 6a8972081ca..cba31aa856c 100644 --- a/chromium/gpu/command_buffer/client/context_support.h +++ b/chromium/gpu/command_buffer/client/context_support.h @@ -6,10 +6,10 @@ #define GPU_COMMAND_BUFFER_CLIENT_CONTEXT_SUPPORT_H_ #include "base/callback.h" +#include "ui/gfx/overlay_transform.h" #include "ui/gfx/rect.h" namespace gpu { -struct ManagedMemoryStats; class ContextSupport { public: @@ -25,14 +25,21 @@ class ContextSupport { // Clients aren't expected to draw to an invisible surface. virtual void SetSurfaceVisible(bool visible) = 0; - virtual void SendManagedMemoryStats(const ManagedMemoryStats& stats) = 0; - virtual void Swap() = 0; - virtual void PartialSwapBuffers(gfx::Rect sub_buffer) = 0; + virtual void PartialSwapBuffers(const gfx::Rect& sub_buffer) = 0; virtual void SetSwapBuffersCompleteCallback( const base::Closure& callback) = 0; + // Schedule a texture to be presented as an overlay synchronously with the + // primary surface during the next buffer swap. + // This method is not stateful and needs to be re-scheduled every frame. + virtual void ScheduleOverlayPlane(int plane_z_order, + gfx::OverlayTransform plane_transform, + unsigned overlay_texture_id, + const gfx::Rect& display_bounds, + const gfx::RectF& uv_rect) = 0; + protected: ContextSupport() {} virtual ~ContextSupport() {} diff --git a/chromium/gpu/command_buffer/client/fenced_allocator.cc b/chromium/gpu/command_buffer/client/fenced_allocator.cc index 0e90bf385b4..80038571be9 100644 --- a/chromium/gpu/command_buffer/client/fenced_allocator.cc +++ b/chromium/gpu/command_buffer/client/fenced_allocator.cc @@ -34,8 +34,10 @@ const FencedAllocator::Offset FencedAllocator::kInvalidOffset; #endif FencedAllocator::FencedAllocator(unsigned int size, - CommandBufferHelper *helper) + CommandBufferHelper* helper, + const base::Closure& poll_callback) : helper_(helper), + poll_callback_(poll_callback), bytes_in_use_(0) { Block block = { FREE, 0, RoundDown(size), kUnusedToken }; blocks_.push_back(block); @@ -48,9 +50,9 @@ FencedAllocator::~FencedAllocator() { i = WaitForTokenAndFreeBlock(i); } } - // These checks are not valid if the service has crashed or lost the context. - // DCHECK_EQ(blocks_.size(), 1u); - // DCHECK_EQ(blocks_[0].state, FREE); + + DCHECK_EQ(blocks_.size(), 1u); + DCHECK_EQ(blocks_[0].state, FREE); } // Looks for a non-allocated block that is big enough. Search in the FREE @@ -203,10 +205,13 @@ FencedAllocator::BlockIndex FencedAllocator::WaitForTokenAndFreeBlock( // Frees any blocks pending a token for which the token has been read. void FencedAllocator::FreeUnused() { - int32 last_token_read = helper_->last_token_read(); + // Free any potential blocks that has its lifetime handled outside. + poll_callback_.Run(); + for (unsigned int i = 0; i < blocks_.size();) { Block& block = blocks_[i]; - if (block.state == FREE_PENDING_TOKEN && block.token <= last_token_read) { + if (block.state == FREE_PENDING_TOKEN && + helper_->HasTokenPassed(block.token)) { block.state = FREE; i = CollapseFreeBlock(i); } else { diff --git a/chromium/gpu/command_buffer/client/fenced_allocator.h b/chromium/gpu/command_buffer/client/fenced_allocator.h index bb5c55170ab..8e222e135bf 100644 --- a/chromium/gpu/command_buffer/client/fenced_allocator.h +++ b/chromium/gpu/command_buffer/client/fenced_allocator.h @@ -7,10 +7,13 @@ #ifndef GPU_COMMAND_BUFFER_CLIENT_FENCED_ALLOCATOR_H_ #define GPU_COMMAND_BUFFER_CLIENT_FENCED_ALLOCATOR_H_ +#include <stdint.h> + #include <vector> +#include "base/bind.h" #include "base/logging.h" -#include "gpu/command_buffer/common/types.h" +#include "base/macros.h" #include "gpu/gpu_export.h" namespace gpu { @@ -35,7 +38,8 @@ class GPU_EXPORT FencedAllocator { // Creates a FencedAllocator. Note that the size of the buffer is passed, but // not its base address: everything is handled as offsets into the buffer. FencedAllocator(unsigned int size, - CommandBufferHelper *helper); + CommandBufferHelper *helper, + const base::Closure& poll_callback); ~FencedAllocator(); @@ -99,7 +103,7 @@ class GPU_EXPORT FencedAllocator { State state; Offset offset; unsigned int size; - int32 token; // token to wait for in the FREE_PENDING_TOKEN case. + int32_t token; // token to wait for in the FREE_PENDING_TOKEN case. }; // Comparison functor for memory block sorting. @@ -113,7 +117,7 @@ class GPU_EXPORT FencedAllocator { typedef std::vector<Block> Container; typedef unsigned int BlockIndex; - static const int32 kUnusedToken = 0; + static const int32_t kUnusedToken = 0; // Gets the index of a memory block, given its offset. BlockIndex GetBlockByOffset(Offset offset); @@ -136,6 +140,7 @@ class GPU_EXPORT FencedAllocator { Offset AllocInBlock(BlockIndex index, unsigned int size); CommandBufferHelper *helper_; + base::Closure poll_callback_; Container blocks_; size_t bytes_in_use_; @@ -148,8 +153,9 @@ class FencedAllocatorWrapper { public: FencedAllocatorWrapper(unsigned int size, CommandBufferHelper* helper, + const base::Closure& poll_callback, void* base) - : allocator_(size, helper), + : allocator_(size, helper, poll_callback), base_(base) { } // Allocates a block of memory. If the buffer is out of directly available diff --git a/chromium/gpu/command_buffer/client/fenced_allocator_test.cc b/chromium/gpu/command_buffer/client/fenced_allocator_test.cc index cc99ed36522..7ac35d4435e 100644 --- a/chromium/gpu/command_buffer/client/fenced_allocator_test.cc +++ b/chromium/gpu/command_buffer/client/fenced_allocator_test.cc @@ -29,6 +29,7 @@ using testing::Truly; using testing::Sequence; using testing::DoAll; using testing::Invoke; +using testing::InvokeWithoutArgs; using testing::_; class BaseFencedAllocatorTest : public testing::Test { @@ -70,7 +71,7 @@ class BaseFencedAllocatorTest : public testing::Test { } int32 GetToken() { - return command_buffer_->GetState().token; + return command_buffer_->GetLastState().token; } #if defined(OS_MACOSX) @@ -88,6 +89,11 @@ class BaseFencedAllocatorTest : public testing::Test { const unsigned int BaseFencedAllocatorTest::kBufferSize; #endif +namespace { +void EmptyPoll() { +} +} + // Test fixture for FencedAllocator test - Creates a FencedAllocator, using a // CommandBufferHelper with a mock AsyncAPIInterface for its interface (calling // it directly, not through the RPC mechanism), making sure Noops are ignored @@ -96,7 +102,9 @@ class FencedAllocatorTest : public BaseFencedAllocatorTest { protected: virtual void SetUp() { BaseFencedAllocatorTest::SetUp(); - allocator_.reset(new FencedAllocator(kBufferSize, helper_.get())); + allocator_.reset(new FencedAllocator(kBufferSize, + helper_.get(), + base::Bind(&EmptyPoll))); } virtual void TearDown() { @@ -391,6 +399,63 @@ TEST_F(FencedAllocatorTest, TestGetLargestFreeOrPendingSize) { EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeSize()); } +class FencedAllocatorPollTest : public BaseFencedAllocatorTest { + public: + static const unsigned int kAllocSize = 128; + + MOCK_METHOD0(MockedPoll, void()); + + protected: + virtual void TearDown() { + // If the GpuScheduler posts any tasks, this forces them to run. + base::MessageLoop::current()->RunUntilIdle(); + + BaseFencedAllocatorTest::TearDown(); + } +}; + +TEST_F(FencedAllocatorPollTest, TestPoll) { + scoped_ptr<FencedAllocator> allocator( + new FencedAllocator(kBufferSize, + helper_.get(), + base::Bind(&FencedAllocatorPollTest::MockedPoll, + base::Unretained(this)))); + + FencedAllocator::Offset mem1 = allocator->Alloc(kAllocSize); + FencedAllocator::Offset mem2 = allocator->Alloc(kAllocSize); + EXPECT_NE(mem1, FencedAllocator::kInvalidOffset); + EXPECT_NE(mem2, FencedAllocator::kInvalidOffset); + EXPECT_TRUE(allocator->CheckConsistency()); + EXPECT_EQ(allocator->bytes_in_use(), kAllocSize * 2); + + // Check that no-op Poll doesn't affect the state. + EXPECT_CALL(*this, MockedPoll()).RetiresOnSaturation(); + allocator->FreeUnused(); + EXPECT_TRUE(allocator->CheckConsistency()); + EXPECT_EQ(allocator->bytes_in_use(), kAllocSize * 2); + + // Check that freeing in Poll works. + base::Closure free_mem1_closure = + base::Bind(&FencedAllocator::Free, + base::Unretained(allocator.get()), + mem1); + EXPECT_CALL(*this, MockedPoll()) + .WillOnce(InvokeWithoutArgs(&free_mem1_closure, &base::Closure::Run)) + .RetiresOnSaturation(); + allocator->FreeUnused(); + EXPECT_TRUE(allocator->CheckConsistency()); + EXPECT_EQ(allocator->bytes_in_use(), kAllocSize * 1); + + // Check that freeing still works. + EXPECT_CALL(*this, MockedPoll()).RetiresOnSaturation(); + allocator->Free(mem2); + allocator->FreeUnused(); + EXPECT_TRUE(allocator->CheckConsistency()); + EXPECT_EQ(allocator->bytes_in_use(), 0u); + + allocator.reset(); +} + // Test fixture for FencedAllocatorWrapper test - Creates a // FencedAllocatorWrapper, using a CommandBufferHelper with a mock // AsyncAPIInterface for its interface (calling it directly, not through the @@ -406,7 +471,9 @@ class FencedAllocatorWrapperTest : public BaseFencedAllocatorTest { // something. buffer_.reset(static_cast<char*>(base::AlignedAlloc( kBufferSize, kAllocAlignment))); - allocator_.reset(new FencedAllocatorWrapper(kBufferSize, helper_.get(), + allocator_.reset(new FencedAllocatorWrapper(kBufferSize, + helper_.get(), + base::Bind(&EmptyPoll), buffer_.get())); } @@ -420,7 +487,7 @@ class FencedAllocatorWrapperTest : public BaseFencedAllocatorTest { } scoped_ptr<FencedAllocatorWrapper> allocator_; - scoped_ptr_malloc<char, base::ScopedPtrAlignedFree> buffer_; + scoped_ptr<char, base::AlignedFreeDeleter> buffer_; }; // Checks basic alloc and free. diff --git a/chromium/gpu/command_buffer/client/gl_in_process_context.cc b/chromium/gpu/command_buffer/client/gl_in_process_context.cc index 1bd4c625457..33d41563dea 100644 --- a/chromium/gpu/command_buffer/client/gl_in_process_context.cc +++ b/chromium/gpu/command_buffer/client/gl_in_process_context.cc @@ -26,7 +26,6 @@ #include "gpu/command_buffer/client/transfer_buffer.h" #include "gpu/command_buffer/common/command_buffer.h" #include "gpu/command_buffer/common/constants.h" -#include "gpu/command_buffer/service/in_process_command_buffer.h" #include "ui/gfx/size.h" #include "ui/gl/gl_image.h" @@ -52,13 +51,16 @@ class GLInProcessContextImpl explicit GLInProcessContextImpl(); virtual ~GLInProcessContextImpl(); - bool Initialize(scoped_refptr<gfx::GLSurface> surface, - bool is_offscreen, - bool share_resources, - gfx::AcceleratedWidget window, - const gfx::Size& size, - const GLInProcessContextAttribs& attribs, - gfx::GpuPreference gpu_preference); + bool Initialize( + scoped_refptr<gfx::GLSurface> surface, + bool is_offscreen, + bool use_global_share_group, + GLInProcessContext* share_context, + gfx::AcceleratedWidget window, + const gfx::Size& size, + const GLInProcessContextAttribs& attribs, + gfx::GpuPreference gpu_preference, + const scoped_refptr<InProcessCommandBuffer::Service>& service); // GLInProcessContext implementation: virtual void SetContextLostCallback(const base::Closure& callback) OVERRIDE; @@ -79,7 +81,6 @@ class GLInProcessContextImpl scoped_ptr<gles2::GLES2Implementation> gles2_implementation_; scoped_ptr<InProcessCommandBuffer> command_buffer_; - unsigned int share_group_id_; bool context_lost_; base::Closure context_lost_callback_; @@ -92,7 +93,7 @@ base::LazyInstance<std::set<GLInProcessContextImpl*> > g_all_shared_contexts = LAZY_INSTANCE_INITIALIZER; GLInProcessContextImpl::GLInProcessContextImpl() - : share_group_id_(0), context_lost_(false) {} + : context_lost_(false) {} GLInProcessContextImpl::~GLInProcessContextImpl() { { @@ -121,11 +122,14 @@ void GLInProcessContextImpl::OnContextLost() { bool GLInProcessContextImpl::Initialize( scoped_refptr<gfx::GLSurface> surface, bool is_offscreen, - bool share_resources, + bool use_global_share_group, + GLInProcessContext* share_context, gfx::AcceleratedWidget window, const gfx::Size& size, const GLInProcessContextAttribs& attribs, - gfx::GpuPreference gpu_preference) { + gfx::GpuPreference gpu_preference, + const scoped_refptr<InProcessCommandBuffer::Service>& service) { + DCHECK(!use_global_share_group || !share_context); DCHECK(size.width() >= 0 && size.height() >= 0); // Changes to these values should also be copied to @@ -143,6 +147,7 @@ bool GLInProcessContextImpl::Initialize( // Chromium-specific attributes const int32 FAIL_IF_MAJOR_PERF_CAVEAT = 0x10002; + const int32 LOSE_CONTEXT_WHEN_OUT_OF_MEMORY = 0x10003; std::vector<int32> attrib_vector; if (attribs.alpha_size >= 0) { @@ -181,15 +186,20 @@ bool GLInProcessContextImpl::Initialize( attrib_vector.push_back(FAIL_IF_MAJOR_PERF_CAVEAT); attrib_vector.push_back(attribs.fail_if_major_perf_caveat); } + if (attribs.lose_context_when_out_of_memory > 0) { + attrib_vector.push_back(LOSE_CONTEXT_WHEN_OUT_OF_MEMORY); + attrib_vector.push_back(attribs.lose_context_when_out_of_memory); + } attrib_vector.push_back(NONE); base::Closure wrapped_callback = base::Bind(&GLInProcessContextImpl::OnContextLost, AsWeakPtr()); - command_buffer_.reset(new InProcessCommandBuffer()); + command_buffer_.reset(new InProcessCommandBuffer(service)); scoped_ptr<base::AutoLock> scoped_shared_context_lock; scoped_refptr<gles2::ShareGroup> share_group; - if (share_resources) { + InProcessCommandBuffer* share_command_buffer = NULL; + if (use_global_share_group) { scoped_shared_context_lock.reset( new base::AutoLock(g_all_shared_contexts_lock.Get())); for (std::set<GLInProcessContextImpl*>::const_iterator it = @@ -199,24 +209,29 @@ bool GLInProcessContextImpl::Initialize( const GLInProcessContextImpl* context = *it; if (!context->context_lost_) { share_group = context->gles2_implementation_->share_group(); + share_command_buffer = context->command_buffer_.get(); DCHECK(share_group); - share_group_id_ = context->share_group_id_; + DCHECK(share_command_buffer); break; } - share_group_id_ = std::max(share_group_id_, context->share_group_id_); } - if (!share_group && !++share_group_id_) - ++share_group_id_; + } else if (share_context) { + GLInProcessContextImpl* impl = + static_cast<GLInProcessContextImpl*>(share_context); + share_group = impl->gles2_implementation_->share_group(); + share_command_buffer = impl->command_buffer_.get(); + DCHECK(share_group); + DCHECK(share_command_buffer); } + if (!command_buffer_->Initialize(surface, is_offscreen, - share_resources, window, size, attrib_vector, gpu_preference, wrapped_callback, - share_group_id_)) { + share_command_buffer)) { LOG(ERROR) << "Failed to initialize InProcessCommmandBuffer"; return false; } @@ -233,7 +248,6 @@ bool GLInProcessContextImpl::Initialize( transfer_buffer_.reset(new TransferBuffer(gles2_helper_.get())); bool bind_generates_resources = false; - bool free_everything_when_invisible = false; // Create the object exposing the OpenGL API. gles2_implementation_.reset(new gles2::GLES2Implementation( @@ -241,10 +255,10 @@ bool GLInProcessContextImpl::Initialize( share_group, transfer_buffer_.get(), bind_generates_resources, - free_everything_when_invisible, + attribs.lose_context_when_out_of_memory > 0, command_buffer_.get())); - if (share_resources) { + if (use_global_share_group) { g_all_shared_contexts.Get().insert(this); scoped_shared_context_lock.reset(); } @@ -294,7 +308,9 @@ GLInProcessContextAttribs::GLInProcessContextAttribs() depth_size(-1), stencil_size(-1), samples(-1), - sample_buffers(-1) {} + sample_buffers(-1), + fail_if_major_perf_caveat(-1), + lose_context_when_out_of_memory(-1) {} // static GLInProcessContext* GLInProcessContext::CreateContext( @@ -310,31 +326,44 @@ GLInProcessContext* GLInProcessContext::CreateContext( NULL /* surface */, is_offscreen, share_resources, + NULL, window, size, attribs, - gpu_preference)) + gpu_preference, + scoped_refptr<InProcessCommandBuffer::Service>())) return NULL; return context.release(); } -// static -GLInProcessContext* GLInProcessContext::CreateWithSurface( +GLInProcessContext* GLInProcessContext::Create( + scoped_refptr<gpu::InProcessCommandBuffer::Service> service, scoped_refptr<gfx::GLSurface> surface, - bool share_resources, + bool is_offscreen, + gfx::AcceleratedWidget window, + const gfx::Size& size, + GLInProcessContext* share_context, + bool use_global_share_group, const GLInProcessContextAttribs& attribs, gfx::GpuPreference gpu_preference) { - scoped_ptr<GLInProcessContextImpl> context( - new GLInProcessContextImpl()); - if (!context->Initialize( - surface, - surface->IsOffscreen(), - share_resources, - gfx::kNullAcceleratedWidget, - surface->GetSize(), - attribs, - gpu_preference)) + DCHECK(!use_global_share_group || !share_context); + if (surface.get()) { + DCHECK_EQ(surface->IsOffscreen(), is_offscreen); + DCHECK(surface->GetSize() == size); + DCHECK_EQ(gfx::kNullAcceleratedWidget, window); + } + + scoped_ptr<GLInProcessContextImpl> context(new GLInProcessContextImpl()); + if (!context->Initialize(surface, + is_offscreen, + use_global_share_group, + share_context, + gfx::kNullAcceleratedWidget, + size, + attribs, + gpu_preference, + service)) return NULL; return context.release(); diff --git a/chromium/gpu/command_buffer/client/gl_in_process_context.h b/chromium/gpu/command_buffer/client/gl_in_process_context.h index 6d96f131554..c1478b11135 100644 --- a/chromium/gpu/command_buffer/client/gl_in_process_context.h +++ b/chromium/gpu/command_buffer/client/gl_in_process_context.h @@ -7,7 +7,8 @@ #include "base/callback.h" #include "base/compiler_specific.h" -#include "gles2_impl_export.h" +#include "gl_in_process_context_export.h" +#include "gpu/command_buffer/service/in_process_command_buffer.h" #include "ui/gfx/native_widget_types.h" #include "ui/gl/gl_surface.h" #include "ui/gl/gpu_preference.h" @@ -29,7 +30,7 @@ class GLES2Implementation; } // The default uninitialized value is -1. -struct GLES2_IMPL_EXPORT GLInProcessContextAttribs { +struct GL_IN_PROCESS_CONTEXT_EXPORT GLInProcessContextAttribs { GLInProcessContextAttribs(); int32 alpha_size; @@ -41,15 +42,17 @@ struct GLES2_IMPL_EXPORT GLInProcessContextAttribs { int32 samples; int32 sample_buffers; int32 fail_if_major_perf_caveat; + int32 lose_context_when_out_of_memory; }; -class GLES2_IMPL_EXPORT GLInProcessContext { +class GL_IN_PROCESS_CONTEXT_EXPORT GLInProcessContext { public: virtual ~GLInProcessContext() {} // Create a GLInProcessContext, if |is_offscreen| is true, renders to an // offscreen context. |attrib_list| must be NULL or a NONE-terminated list // of attribute/value pairs. + // TODO(boliu): Fix all callsites to use Create and remove this. static GLInProcessContext* CreateContext( bool is_offscreen, gfx::AcceleratedWidget window, @@ -58,13 +61,21 @@ class GLES2_IMPL_EXPORT GLInProcessContext { const GLInProcessContextAttribs& attribs, gfx::GpuPreference gpu_preference); - // Create context with the provided GLSurface. All other arguments match - // CreateContext factory above. Can only be called if the command buffer - // service runs on the same thread as this client because GLSurface is not - // thread safe. - static GLInProcessContext* CreateWithSurface( + // If |surface| is not NULL, then it must match |is_offscreen| and |size|, + // |window| must be gfx::kNullAcceleratedWidget, and the command buffer + // service must run on the same thread as this client because GLSurface is + // not thread safe. If |surface| is NULL, then the other parameters are used + // to correctly create a surface. + // Only one of |share_context| and |use_global_share_group| can be used at + // the same time. + static GLInProcessContext* Create( + scoped_refptr<gpu::InProcessCommandBuffer::Service> service, scoped_refptr<gfx::GLSurface> surface, - bool share_resources, + bool is_offscreen, + gfx::AcceleratedWidget window, + const gfx::Size& size, + GLInProcessContext* share_context, + bool use_global_share_group, const GLInProcessContextAttribs& attribs, gfx::GpuPreference gpu_preference); diff --git a/chromium/gpu/command_buffer/client/gl_in_process_context_export.h b/chromium/gpu/command_buffer/client/gl_in_process_context_export.h new file mode 100644 index 00000000000..36c4a34df9d --- /dev/null +++ b/chromium/gpu/command_buffer/client/gl_in_process_context_export.h @@ -0,0 +1,29 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GL_IN_PROCESS_CONTEXT_EXPORT_H_ +#define GL_IN_PROCESS_CONTEXT_EXPORT_H_ + +#if defined(COMPONENT_BUILD) +#if defined(WIN32) + +#if defined(GL_IN_PROCESS_CONTEXT_IMPLEMENTATION) +#define GL_IN_PROCESS_CONTEXT_EXPORT __declspec(dllexport) +#else +#define GL_IN_PROCESS_CONTEXT_EXPORT __declspec(dllimport) +#endif // defined(GL_IN_PROCESS_CONTEXT_IMPLEMENTATION) + +#else // defined(WIN32) +#if defined(GL_IN_PROCESS_CONTEXT_IMPLEMENTATION) +#define GL_IN_PROCESS_CONTEXT_EXPORT __attribute__((visibility("default"))) +#else +#define GL_IN_PROCESS_CONTEXT_EXPORT +#endif +#endif + +#else // defined(COMPONENT_BUILD) +#define GL_IN_PROCESS_CONTEXT_EXPORT +#endif + +#endif // GL_IN_PROCESS_CONTEXT_EXPORT_H_ diff --git a/chromium/gpu/command_buffer/client/gles2_c_lib_autogen.h b/chromium/gpu/command_buffer/client/gles2_c_lib_autogen.h index f2eb83746e7..f59157d14e2 100644 --- a/chromium/gpu/command_buffer/client/gles2_c_lib_autogen.h +++ b/chromium/gpu/command_buffer/client/gles2_c_lib_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // These functions emulate GLES2 over command buffers. @@ -31,8 +33,10 @@ void GLES2BindRenderbuffer(GLenum target, GLuint renderbuffer) { void GLES2BindTexture(GLenum target, GLuint texture) { gles2::GetGLContext()->BindTexture(target, texture); } -void GLES2BlendColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { +void GLES2BlendColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) { gles2::GetGLContext()->BlendColor(red, green, blue, alpha); } void GLES2BlendEquation(GLenum mode) { @@ -44,16 +48,22 @@ void GLES2BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) { void GLES2BlendFunc(GLenum sfactor, GLenum dfactor) { gles2::GetGLContext()->BlendFunc(sfactor, dfactor); } -void GLES2BlendFuncSeparate( - GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { +void GLES2BlendFuncSeparate(GLenum srcRGB, + GLenum dstRGB, + GLenum srcAlpha, + GLenum dstAlpha) { gles2::GetGLContext()->BlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); } -void GLES2BufferData( - GLenum target, GLsizeiptr size, const void* data, GLenum usage) { +void GLES2BufferData(GLenum target, + GLsizeiptr size, + const void* data, + GLenum usage) { gles2::GetGLContext()->BufferData(target, size, data, usage); } -void GLES2BufferSubData( - GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { +void GLES2BufferSubData(GLenum target, + GLintptr offset, + GLsizeiptr size, + const void* data) { gles2::GetGLContext()->BufferSubData(target, offset, size, data); } GLenum GLES2CheckFramebufferStatus(GLenum target) { @@ -62,8 +72,10 @@ GLenum GLES2CheckFramebufferStatus(GLenum target) { void GLES2Clear(GLbitfield mask) { gles2::GetGLContext()->Clear(mask); } -void GLES2ClearColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { +void GLES2ClearColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) { gles2::GetGLContext()->ClearColor(red, green, blue, alpha); } void GLES2ClearDepthf(GLclampf depth) { @@ -72,34 +84,57 @@ void GLES2ClearDepthf(GLclampf depth) { void GLES2ClearStencil(GLint s) { gles2::GetGLContext()->ClearStencil(s); } -void GLES2ColorMask( - GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { +void GLES2ColorMask(GLboolean red, + GLboolean green, + GLboolean blue, + GLboolean alpha) { gles2::GetGLContext()->ColorMask(red, green, blue, alpha); } void GLES2CompileShader(GLuint shader) { gles2::GetGLContext()->CompileShader(shader); } -void GLES2CompressedTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLsizei width, - GLsizei height, GLint border, GLsizei imageSize, const void* data) { +void GLES2CompressedTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLsizei imageSize, + const void* data) { gles2::GetGLContext()->CompressedTexImage2D( target, level, internalformat, width, height, border, imageSize, data); } -void GLES2CompressedTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLsizei imageSize, const void* data) { +void GLES2CompressedTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLsizei imageSize, + const void* data) { gles2::GetGLContext()->CompressedTexSubImage2D( target, level, xoffset, yoffset, width, height, format, imageSize, data); } -void GLES2CopyTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, - GLsizei width, GLsizei height, GLint border) { +void GLES2CopyTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLint border) { gles2::GetGLContext()->CopyTexImage2D( target, level, internalformat, x, y, width, height, border); } -void GLES2CopyTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, - GLsizei width, GLsizei height) { +void GLES2CopyTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLint x, + GLint y, + GLsizei width, + GLsizei height) { gles2::GetGLContext()->CopyTexSubImage2D( target, level, xoffset, yoffset, x, y, width, height); } @@ -151,8 +186,10 @@ void GLES2DisableVertexAttribArray(GLuint index) { void GLES2DrawArrays(GLenum mode, GLint first, GLsizei count) { gles2::GetGLContext()->DrawArrays(mode, first, count); } -void GLES2DrawElements( - GLenum mode, GLsizei count, GLenum type, const void* indices) { +void GLES2DrawElements(GLenum mode, + GLsizei count, + GLenum type, + const void* indices) { gles2::GetGLContext()->DrawElements(mode, count, type, indices); } void GLES2Enable(GLenum cap) { @@ -167,15 +204,18 @@ void GLES2Finish() { void GLES2Flush() { gles2::GetGLContext()->Flush(); } -void GLES2FramebufferRenderbuffer( - GLenum target, GLenum attachment, GLenum renderbuffertarget, - GLuint renderbuffer) { +void GLES2FramebufferRenderbuffer(GLenum target, + GLenum attachment, + GLenum renderbuffertarget, + GLuint renderbuffer) { gles2::GetGLContext()->FramebufferRenderbuffer( target, attachment, renderbuffertarget, renderbuffer); } -void GLES2FramebufferTexture2D( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level) { +void GLES2FramebufferTexture2D(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level) { gles2::GetGLContext()->FramebufferTexture2D( target, attachment, textarget, texture, level); } @@ -197,20 +237,30 @@ void GLES2GenRenderbuffers(GLsizei n, GLuint* renderbuffers) { void GLES2GenTextures(GLsizei n, GLuint* textures) { gles2::GetGLContext()->GenTextures(n, textures); } -void GLES2GetActiveAttrib( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) { +void GLES2GetActiveAttrib(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) { gles2::GetGLContext()->GetActiveAttrib( program, index, bufsize, length, size, type, name); } -void GLES2GetActiveUniform( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) { +void GLES2GetActiveUniform(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) { gles2::GetGLContext()->GetActiveUniform( program, index, bufsize, length, size, type, name); } -void GLES2GetAttachedShaders( - GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) { +void GLES2GetAttachedShaders(GLuint program, + GLsizei maxcount, + GLsizei* count, + GLuint* shaders) { gles2::GetGLContext()->GetAttachedShaders(program, maxcount, count, shaders); } GLint GLES2GetAttribLocation(GLuint program, const char* name) { @@ -228,8 +278,10 @@ GLenum GLES2GetError() { void GLES2GetFloatv(GLenum pname, GLfloat* params) { gles2::GetGLContext()->GetFloatv(pname, params); } -void GLES2GetFramebufferAttachmentParameteriv( - GLenum target, GLenum attachment, GLenum pname, GLint* params) { +void GLES2GetFramebufferAttachmentParameteriv(GLenum target, + GLenum attachment, + GLenum pname, + GLint* params) { gles2::GetGLContext()->GetFramebufferAttachmentParameteriv( target, attachment, pname, params); } @@ -239,28 +291,37 @@ void GLES2GetIntegerv(GLenum pname, GLint* params) { void GLES2GetProgramiv(GLuint program, GLenum pname, GLint* params) { gles2::GetGLContext()->GetProgramiv(program, pname, params); } -void GLES2GetProgramInfoLog( - GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) { +void GLES2GetProgramInfoLog(GLuint program, + GLsizei bufsize, + GLsizei* length, + char* infolog) { gles2::GetGLContext()->GetProgramInfoLog(program, bufsize, length, infolog); } -void GLES2GetRenderbufferParameteriv( - GLenum target, GLenum pname, GLint* params) { +void GLES2GetRenderbufferParameteriv(GLenum target, + GLenum pname, + GLint* params) { gles2::GetGLContext()->GetRenderbufferParameteriv(target, pname, params); } void GLES2GetShaderiv(GLuint shader, GLenum pname, GLint* params) { gles2::GetGLContext()->GetShaderiv(shader, pname, params); } -void GLES2GetShaderInfoLog( - GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) { +void GLES2GetShaderInfoLog(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* infolog) { gles2::GetGLContext()->GetShaderInfoLog(shader, bufsize, length, infolog); } -void GLES2GetShaderPrecisionFormat( - GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { +void GLES2GetShaderPrecisionFormat(GLenum shadertype, + GLenum precisiontype, + GLint* range, + GLint* precision) { gles2::GetGLContext()->GetShaderPrecisionFormat( shadertype, precisiontype, range, precision); } -void GLES2GetShaderSource( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) { +void GLES2GetShaderSource(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) { gles2::GetGLContext()->GetShaderSource(shader, bufsize, length, source); } const GLubyte* GLES2GetString(GLenum name) { @@ -326,16 +387,22 @@ void GLES2PixelStorei(GLenum pname, GLint param) { void GLES2PolygonOffset(GLfloat factor, GLfloat units) { gles2::GetGLContext()->PolygonOffset(factor, units); } -void GLES2ReadPixels( - GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, - void* pixels) { +void GLES2ReadPixels(GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + void* pixels) { gles2::GetGLContext()->ReadPixels(x, y, width, height, format, type, pixels); } void GLES2ReleaseShaderCompiler() { gles2::GetGLContext()->ReleaseShaderCompiler(); } -void GLES2RenderbufferStorage( - GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { +void GLES2RenderbufferStorage(GLenum target, + GLenum internalformat, + GLsizei width, + GLsizei height) { gles2::GetGLContext()->RenderbufferStorage( target, internalformat, width, height); } @@ -345,15 +412,17 @@ void GLES2SampleCoverage(GLclampf value, GLboolean invert) { void GLES2Scissor(GLint x, GLint y, GLsizei width, GLsizei height) { gles2::GetGLContext()->Scissor(x, y, width, height); } -void GLES2ShaderBinary( - GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, - GLsizei length) { - gles2::GetGLContext()->ShaderBinary( - n, shaders, binaryformat, binary, length); -} -void GLES2ShaderSource( - GLuint shader, GLsizei count, const GLchar* const* str, - const GLint* length) { +void GLES2ShaderBinary(GLsizei n, + const GLuint* shaders, + GLenum binaryformat, + const void* binary, + GLsizei length) { + gles2::GetGLContext()->ShaderBinary(n, shaders, binaryformat, binary, length); +} +void GLES2ShaderSource(GLuint shader, + GLsizei count, + const GLchar* const* str, + const GLint* length) { gles2::GetGLContext()->ShaderSource(shader, count, str, length); } void GLES2ShallowFinishCHROMIUM() { @@ -365,8 +434,10 @@ void GLES2ShallowFlushCHROMIUM() { void GLES2StencilFunc(GLenum func, GLint ref, GLuint mask) { gles2::GetGLContext()->StencilFunc(func, ref, mask); } -void GLES2StencilFuncSeparate( - GLenum face, GLenum func, GLint ref, GLuint mask) { +void GLES2StencilFuncSeparate(GLenum face, + GLenum func, + GLint ref, + GLuint mask) { gles2::GetGLContext()->StencilFuncSeparate(face, func, ref, mask); } void GLES2StencilMask(GLuint mask) { @@ -378,17 +449,30 @@ void GLES2StencilMaskSeparate(GLenum face, GLuint mask) { void GLES2StencilOp(GLenum fail, GLenum zfail, GLenum zpass) { gles2::GetGLContext()->StencilOp(fail, zfail, zpass); } -void GLES2StencilOpSeparate( - GLenum face, GLenum fail, GLenum zfail, GLenum zpass) { +void GLES2StencilOpSeparate(GLenum face, + GLenum fail, + GLenum zfail, + GLenum zpass) { gles2::GetGLContext()->StencilOpSeparate(face, fail, zfail, zpass); } -void GLES2TexImage2D( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) { - gles2::GetGLContext()->TexImage2D( - target, level, internalformat, width, height, border, format, type, - pixels); +void GLES2TexImage2D(GLenum target, + GLint level, + GLint internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) { + gles2::GetGLContext()->TexImage2D(target, + level, + internalformat, + width, + height, + border, + format, + type, + pixels); } void GLES2TexParameterf(GLenum target, GLenum pname, GLfloat param) { gles2::GetGLContext()->TexParameterf(target, pname, param); @@ -402,9 +486,15 @@ void GLES2TexParameteri(GLenum target, GLenum pname, GLint param) { void GLES2TexParameteriv(GLenum target, GLenum pname, const GLint* params) { gles2::GetGLContext()->TexParameteriv(target, pname, params); } -void GLES2TexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* pixels) { +void GLES2TexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* pixels) { gles2::GetGLContext()->TexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, pixels); } @@ -444,8 +534,11 @@ void GLES2Uniform3i(GLint location, GLint x, GLint y, GLint z) { void GLES2Uniform3iv(GLint location, GLsizei count, const GLint* v) { gles2::GetGLContext()->Uniform3iv(location, count, v); } -void GLES2Uniform4f( - GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { +void GLES2Uniform4f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) { gles2::GetGLContext()->Uniform4f(location, x, y, z, w); } void GLES2Uniform4fv(GLint location, GLsizei count, const GLfloat* v) { @@ -457,16 +550,22 @@ void GLES2Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) { void GLES2Uniform4iv(GLint location, GLsizei count, const GLint* v) { gles2::GetGLContext()->Uniform4iv(location, count, v); } -void GLES2UniformMatrix2fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { +void GLES2UniformMatrix2fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) { gles2::GetGLContext()->UniformMatrix2fv(location, count, transpose, value); } -void GLES2UniformMatrix3fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { +void GLES2UniformMatrix3fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) { gles2::GetGLContext()->UniformMatrix3fv(location, count, transpose, value); } -void GLES2UniformMatrix4fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { +void GLES2UniformMatrix4fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) { gles2::GetGLContext()->UniformMatrix4fv(location, count, transpose, value); } void GLES2UseProgram(GLuint program) { @@ -493,49 +592,71 @@ void GLES2VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) { void GLES2VertexAttrib3fv(GLuint indx, const GLfloat* values) { gles2::GetGLContext()->VertexAttrib3fv(indx, values); } -void GLES2VertexAttrib4f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { +void GLES2VertexAttrib4f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) { gles2::GetGLContext()->VertexAttrib4f(indx, x, y, z, w); } void GLES2VertexAttrib4fv(GLuint indx, const GLfloat* values) { gles2::GetGLContext()->VertexAttrib4fv(indx, values); } -void GLES2VertexAttribPointer( - GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, - const void* ptr) { +void GLES2VertexAttribPointer(GLuint indx, + GLint size, + GLenum type, + GLboolean normalized, + GLsizei stride, + const void* ptr) { gles2::GetGLContext()->VertexAttribPointer( indx, size, type, normalized, stride, ptr); } void GLES2Viewport(GLint x, GLint y, GLsizei width, GLsizei height) { gles2::GetGLContext()->Viewport(x, y, width, height); } -void GLES2BlitFramebufferCHROMIUM( - GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, - GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { +void GLES2BlitFramebufferCHROMIUM(GLint srcX0, + GLint srcY0, + GLint srcX1, + GLint srcY1, + GLint dstX0, + GLint dstY0, + GLint dstX1, + GLint dstY1, + GLbitfield mask, + GLenum filter) { gles2::GetGLContext()->BlitFramebufferCHROMIUM( srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } -void GLES2RenderbufferStorageMultisampleCHROMIUM( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) { +void GLES2RenderbufferStorageMultisampleCHROMIUM(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) { gles2::GetGLContext()->RenderbufferStorageMultisampleCHROMIUM( target, samples, internalformat, width, height); } -void GLES2RenderbufferStorageMultisampleEXT( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) { +void GLES2RenderbufferStorageMultisampleEXT(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) { gles2::GetGLContext()->RenderbufferStorageMultisampleEXT( target, samples, internalformat, width, height); } -void GLES2FramebufferTexture2DMultisampleEXT( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level, GLsizei samples) { +void GLES2FramebufferTexture2DMultisampleEXT(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level, + GLsizei samples) { gles2::GetGLContext()->FramebufferTexture2DMultisampleEXT( target, attachment, textarget, texture, level, samples); } -void GLES2TexStorage2DEXT( - GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, - GLsizei height) { +void GLES2TexStorage2DEXT(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height) { gles2::GetGLContext()->TexStorage2DEXT( target, levels, internalFormat, width, height); } @@ -584,21 +705,27 @@ void GLES2BindVertexArrayOES(GLuint array) { void GLES2SwapBuffers() { gles2::GetGLContext()->SwapBuffers(); } -GLuint GLES2GetMaxValueInBufferCHROMIUM( - GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) { +GLuint GLES2GetMaxValueInBufferCHROMIUM(GLuint buffer_id, + GLsizei count, + GLenum type, + GLuint offset) { return gles2::GetGLContext()->GetMaxValueInBufferCHROMIUM( buffer_id, count, type, offset); } -void GLES2GenSharedIdsCHROMIUM( - GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) { +void GLES2GenSharedIdsCHROMIUM(GLuint namespace_id, + GLuint id_offset, + GLsizei n, + GLuint* ids) { gles2::GetGLContext()->GenSharedIdsCHROMIUM(namespace_id, id_offset, n, ids); } -void GLES2DeleteSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) { +void GLES2DeleteSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) { gles2::GetGLContext()->DeleteSharedIdsCHROMIUM(namespace_id, n, ids); } -void GLES2RegisterSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) { +void GLES2RegisterSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) { gles2::GetGLContext()->RegisterSharedIdsCHROMIUM(namespace_id, n, ids); } GLboolean GLES2EnableFeatureCHROMIUM(const char* feature) { @@ -610,23 +737,31 @@ void* GLES2MapBufferCHROMIUM(GLuint target, GLenum access) { GLboolean GLES2UnmapBufferCHROMIUM(GLuint target) { return gles2::GetGLContext()->UnmapBufferCHROMIUM(target); } -void* GLES2MapImageCHROMIUM(GLuint image_id, GLenum access) { - return gles2::GetGLContext()->MapImageCHROMIUM(image_id, access); +void* GLES2MapImageCHROMIUM(GLuint image_id) { + return gles2::GetGLContext()->MapImageCHROMIUM(image_id); } void GLES2UnmapImageCHROMIUM(GLuint image_id) { gles2::GetGLContext()->UnmapImageCHROMIUM(image_id); } -void* GLES2MapBufferSubDataCHROMIUM( - GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) { +void* GLES2MapBufferSubDataCHROMIUM(GLuint target, + GLintptr offset, + GLsizeiptr size, + GLenum access) { return gles2::GetGLContext()->MapBufferSubDataCHROMIUM( target, offset, size, access); } void GLES2UnmapBufferSubDataCHROMIUM(const void* mem) { gles2::GetGLContext()->UnmapBufferSubDataCHROMIUM(mem); } -void* GLES2MapTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, GLenum access) { +void* GLES2MapTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + GLenum access) { return gles2::GetGLContext()->MapTexSubImage2DCHROMIUM( target, level, xoffset, yoffset, width, height, format, type, access); } @@ -645,61 +780,76 @@ void GLES2RequestExtensionCHROMIUM(const char* extension) { void GLES2RateLimitOffscreenContextCHROMIUM() { gles2::GetGLContext()->RateLimitOffscreenContextCHROMIUM(); } -void GLES2GetMultipleIntegervCHROMIUM( - const GLenum* pnames, GLuint count, GLint* results, GLsizeiptr size) { +void GLES2GetMultipleIntegervCHROMIUM(const GLenum* pnames, + GLuint count, + GLint* results, + GLsizeiptr size) { gles2::GetGLContext()->GetMultipleIntegervCHROMIUM( pnames, count, results, size); } -void GLES2GetProgramInfoCHROMIUM( - GLuint program, GLsizei bufsize, GLsizei* size, void* info) { +void GLES2GetProgramInfoCHROMIUM(GLuint program, + GLsizei bufsize, + GLsizei* size, + void* info) { gles2::GetGLContext()->GetProgramInfoCHROMIUM(program, bufsize, size, info); } GLuint GLES2CreateStreamTextureCHROMIUM(GLuint texture) { return gles2::GetGLContext()->CreateStreamTextureCHROMIUM(texture); } -void GLES2DestroyStreamTextureCHROMIUM(GLuint texture) { - gles2::GetGLContext()->DestroyStreamTextureCHROMIUM(texture); -} -GLuint GLES2CreateImageCHROMIUM( - GLsizei width, GLsizei height, GLenum internalformat) { +GLuint GLES2CreateImageCHROMIUM(GLsizei width, + GLsizei height, + GLenum internalformat, + GLenum usage) { return gles2::GetGLContext()->CreateImageCHROMIUM( - width, height, internalformat); + width, height, internalformat, usage); } void GLES2DestroyImageCHROMIUM(GLuint image_id) { gles2::GetGLContext()->DestroyImageCHROMIUM(image_id); } -void GLES2GetImageParameterivCHROMIUM( - GLuint image_id, GLenum pname, GLint* params) { +void GLES2GetImageParameterivCHROMIUM(GLuint image_id, + GLenum pname, + GLint* params) { gles2::GetGLContext()->GetImageParameterivCHROMIUM(image_id, pname, params); } -void GLES2GetTranslatedShaderSourceANGLE( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) { +void GLES2GetTranslatedShaderSourceANGLE(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) { gles2::GetGLContext()->GetTranslatedShaderSourceANGLE( shader, bufsize, length, source); } void GLES2PostSubBufferCHROMIUM(GLint x, GLint y, GLint width, GLint height) { gles2::GetGLContext()->PostSubBufferCHROMIUM(x, y, width, height); } -void GLES2TexImageIOSurface2DCHROMIUM( - GLenum target, GLsizei width, GLsizei height, GLuint ioSurfaceId, - GLuint plane) { +void GLES2TexImageIOSurface2DCHROMIUM(GLenum target, + GLsizei width, + GLsizei height, + GLuint ioSurfaceId, + GLuint plane) { gles2::GetGLContext()->TexImageIOSurface2DCHROMIUM( target, width, height, ioSurfaceId, plane); } -void GLES2CopyTextureCHROMIUM( - GLenum target, GLenum source_id, GLenum dest_id, GLint level, - GLint internalformat, GLenum dest_type) { +void GLES2CopyTextureCHROMIUM(GLenum target, + GLenum source_id, + GLenum dest_id, + GLint level, + GLint internalformat, + GLenum dest_type) { gles2::GetGLContext()->CopyTextureCHROMIUM( target, source_id, dest_id, level, internalformat, dest_type); } -void GLES2DrawArraysInstancedANGLE( - GLenum mode, GLint first, GLsizei count, GLsizei primcount) { +void GLES2DrawArraysInstancedANGLE(GLenum mode, + GLint first, + GLsizei count, + GLsizei primcount) { gles2::GetGLContext()->DrawArraysInstancedANGLE( mode, first, count, primcount); } -void GLES2DrawElementsInstancedANGLE( - GLenum mode, GLsizei count, GLenum type, const void* indices, - GLsizei primcount) { +void GLES2DrawElementsInstancedANGLE(GLenum mode, + GLsizei count, + GLenum type, + const void* indices, + GLsizei primcount) { gles2::GetGLContext()->DrawElementsInstancedANGLE( mode, count, type, indices, primcount); } @@ -712,11 +862,22 @@ void GLES2GenMailboxCHROMIUM(GLbyte* mailbox) { void GLES2ProduceTextureCHROMIUM(GLenum target, const GLbyte* mailbox) { gles2::GetGLContext()->ProduceTextureCHROMIUM(target, mailbox); } +void GLES2ProduceTextureDirectCHROMIUM(GLuint texture, + GLenum target, + const GLbyte* mailbox) { + gles2::GetGLContext()->ProduceTextureDirectCHROMIUM(texture, target, mailbox); +} void GLES2ConsumeTextureCHROMIUM(GLenum target, const GLbyte* mailbox) { gles2::GetGLContext()->ConsumeTextureCHROMIUM(target, mailbox); } -void GLES2BindUniformLocationCHROMIUM( - GLuint program, GLint location, const char* name) { +GLuint GLES2CreateAndConsumeTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) { + return gles2::GetGLContext()->CreateAndConsumeTextureCHROMIUM(target, + mailbox); +} +void GLES2BindUniformLocationCHROMIUM(GLuint program, + GLint location, + const char* name) { gles2::GetGLContext()->BindUniformLocationCHROMIUM(program, location, name); } void GLES2BindTexImage2DCHROMIUM(GLenum target, GLint imageId) { @@ -731,25 +892,46 @@ void GLES2TraceBeginCHROMIUM(const char* name) { void GLES2TraceEndCHROMIUM() { gles2::GetGLContext()->TraceEndCHROMIUM(); } -void GLES2AsyncTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* data) { +void GLES2AsyncTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* data) { gles2::GetGLContext()->AsyncTexSubImage2DCHROMIUM( target, level, xoffset, yoffset, width, height, format, type, data); } -void GLES2AsyncTexImage2DCHROMIUM( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) { - gles2::GetGLContext()->AsyncTexImage2DCHROMIUM( - target, level, internalformat, width, height, border, format, type, - pixels); +void GLES2AsyncTexImage2DCHROMIUM(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) { + gles2::GetGLContext()->AsyncTexImage2DCHROMIUM(target, + level, + internalformat, + width, + height, + border, + format, + type, + pixels); } void GLES2WaitAsyncTexImage2DCHROMIUM(GLenum target) { gles2::GetGLContext()->WaitAsyncTexImage2DCHROMIUM(target); } -void GLES2DiscardFramebufferEXT( - GLenum target, GLsizei count, const GLenum* attachments) { +void GLES2WaitAllAsyncTexImage2DCHROMIUM() { + gles2::GetGLContext()->WaitAllAsyncTexImage2DCHROMIUM(); +} +void GLES2DiscardFramebufferEXT(GLenum target, + GLsizei count, + const GLenum* attachments) { gles2::GetGLContext()->DiscardFramebufferEXT(target, count, attachments); } void GLES2LoseContextCHROMIUM(GLenum current, GLenum other) { @@ -767,368 +949,813 @@ void GLES2DrawBuffersEXT(GLsizei count, const GLenum* bufs) { void GLES2DiscardBackbufferCHROMIUM() { gles2::GetGLContext()->DiscardBackbufferCHROMIUM(); } +void GLES2ScheduleOverlayPlaneCHROMIUM(GLint plane_z_order, + GLenum plane_transform, + GLuint overlay_texture_id, + GLint bounds_x, + GLint bounds_y, + GLint bounds_width, + GLint bounds_height, + GLfloat uv_x, + GLfloat uv_y, + GLfloat uv_width, + GLfloat uv_height) { + gles2::GetGLContext()->ScheduleOverlayPlaneCHROMIUM(plane_z_order, + plane_transform, + overlay_texture_id, + bounds_x, + bounds_y, + bounds_width, + bounds_height, + uv_x, + uv_y, + uv_width, + uv_height); +} namespace gles2 { extern const NameToFunc g_gles2_function_table[] = { - { "glActiveTexture", reinterpret_cast<GLES2FunctionPointer>( - glActiveTexture), }, - { "glAttachShader", reinterpret_cast<GLES2FunctionPointer>( - glAttachShader), }, - { "glBindAttribLocation", reinterpret_cast<GLES2FunctionPointer>( - glBindAttribLocation), }, - { "glBindBuffer", reinterpret_cast<GLES2FunctionPointer>(glBindBuffer), }, - { "glBindFramebuffer", reinterpret_cast<GLES2FunctionPointer>( - glBindFramebuffer), }, - { "glBindRenderbuffer", reinterpret_cast<GLES2FunctionPointer>( - glBindRenderbuffer), }, - { "glBindTexture", reinterpret_cast<GLES2FunctionPointer>(glBindTexture), }, - { "glBlendColor", reinterpret_cast<GLES2FunctionPointer>(glBlendColor), }, - { "glBlendEquation", reinterpret_cast<GLES2FunctionPointer>( - glBlendEquation), }, - { "glBlendEquationSeparate", reinterpret_cast<GLES2FunctionPointer>( - glBlendEquationSeparate), }, - { "glBlendFunc", reinterpret_cast<GLES2FunctionPointer>(glBlendFunc), }, - { "glBlendFuncSeparate", reinterpret_cast<GLES2FunctionPointer>( - glBlendFuncSeparate), }, - { "glBufferData", reinterpret_cast<GLES2FunctionPointer>(glBufferData), }, - { "glBufferSubData", reinterpret_cast<GLES2FunctionPointer>( - glBufferSubData), }, - { "glCheckFramebufferStatus", reinterpret_cast<GLES2FunctionPointer>( - glCheckFramebufferStatus), }, - { "glClear", reinterpret_cast<GLES2FunctionPointer>(glClear), }, - { "glClearColor", reinterpret_cast<GLES2FunctionPointer>(glClearColor), }, - { "glClearDepthf", reinterpret_cast<GLES2FunctionPointer>(glClearDepthf), }, - { "glClearStencil", reinterpret_cast<GLES2FunctionPointer>( - glClearStencil), }, - { "glColorMask", reinterpret_cast<GLES2FunctionPointer>(glColorMask), }, - { "glCompileShader", reinterpret_cast<GLES2FunctionPointer>( - glCompileShader), }, - { "glCompressedTexImage2D", reinterpret_cast<GLES2FunctionPointer>( - glCompressedTexImage2D), }, - { "glCompressedTexSubImage2D", reinterpret_cast<GLES2FunctionPointer>( - glCompressedTexSubImage2D), }, - { "glCopyTexImage2D", reinterpret_cast<GLES2FunctionPointer>( - glCopyTexImage2D), }, - { "glCopyTexSubImage2D", reinterpret_cast<GLES2FunctionPointer>( - glCopyTexSubImage2D), }, - { "glCreateProgram", reinterpret_cast<GLES2FunctionPointer>( - glCreateProgram), }, - { "glCreateShader", reinterpret_cast<GLES2FunctionPointer>( - glCreateShader), }, - { "glCullFace", reinterpret_cast<GLES2FunctionPointer>(glCullFace), }, - { "glDeleteBuffers", reinterpret_cast<GLES2FunctionPointer>( - glDeleteBuffers), }, - { "glDeleteFramebuffers", reinterpret_cast<GLES2FunctionPointer>( - glDeleteFramebuffers), }, - { "glDeleteProgram", reinterpret_cast<GLES2FunctionPointer>( - glDeleteProgram), }, - { "glDeleteRenderbuffers", reinterpret_cast<GLES2FunctionPointer>( - glDeleteRenderbuffers), }, - { "glDeleteShader", reinterpret_cast<GLES2FunctionPointer>( - glDeleteShader), }, - { "glDeleteTextures", reinterpret_cast<GLES2FunctionPointer>( - glDeleteTextures), }, - { "glDepthFunc", reinterpret_cast<GLES2FunctionPointer>(glDepthFunc), }, - { "glDepthMask", reinterpret_cast<GLES2FunctionPointer>(glDepthMask), }, - { "glDepthRangef", reinterpret_cast<GLES2FunctionPointer>(glDepthRangef), }, - { "glDetachShader", reinterpret_cast<GLES2FunctionPointer>( - glDetachShader), }, - { "glDisable", reinterpret_cast<GLES2FunctionPointer>(glDisable), }, - { "glDisableVertexAttribArray", reinterpret_cast<GLES2FunctionPointer>( - glDisableVertexAttribArray), }, - { "glDrawArrays", reinterpret_cast<GLES2FunctionPointer>(glDrawArrays), }, - { "glDrawElements", reinterpret_cast<GLES2FunctionPointer>( - glDrawElements), }, - { "glEnable", reinterpret_cast<GLES2FunctionPointer>(glEnable), }, - { "glEnableVertexAttribArray", reinterpret_cast<GLES2FunctionPointer>( - glEnableVertexAttribArray), }, - { "glFinish", reinterpret_cast<GLES2FunctionPointer>(glFinish), }, - { "glFlush", reinterpret_cast<GLES2FunctionPointer>(glFlush), }, - { "glFramebufferRenderbuffer", reinterpret_cast<GLES2FunctionPointer>( - glFramebufferRenderbuffer), }, - { "glFramebufferTexture2D", reinterpret_cast<GLES2FunctionPointer>( - glFramebufferTexture2D), }, - { "glFrontFace", reinterpret_cast<GLES2FunctionPointer>(glFrontFace), }, - { "glGenBuffers", reinterpret_cast<GLES2FunctionPointer>(glGenBuffers), }, - { "glGenerateMipmap", reinterpret_cast<GLES2FunctionPointer>( - glGenerateMipmap), }, - { "glGenFramebuffers", reinterpret_cast<GLES2FunctionPointer>( - glGenFramebuffers), }, - { "glGenRenderbuffers", reinterpret_cast<GLES2FunctionPointer>( - glGenRenderbuffers), }, - { "glGenTextures", reinterpret_cast<GLES2FunctionPointer>(glGenTextures), }, - { "glGetActiveAttrib", reinterpret_cast<GLES2FunctionPointer>( - glGetActiveAttrib), }, - { "glGetActiveUniform", reinterpret_cast<GLES2FunctionPointer>( - glGetActiveUniform), }, - { "glGetAttachedShaders", reinterpret_cast<GLES2FunctionPointer>( - glGetAttachedShaders), }, - { "glGetAttribLocation", reinterpret_cast<GLES2FunctionPointer>( - glGetAttribLocation), }, - { "glGetBooleanv", reinterpret_cast<GLES2FunctionPointer>(glGetBooleanv), }, - { "glGetBufferParameteriv", reinterpret_cast<GLES2FunctionPointer>( - glGetBufferParameteriv), }, - { "glGetError", reinterpret_cast<GLES2FunctionPointer>(glGetError), }, - { "glGetFloatv", reinterpret_cast<GLES2FunctionPointer>(glGetFloatv), }, - { "glGetFramebufferAttachmentParameteriv", reinterpret_cast<GLES2FunctionPointer>(glGetFramebufferAttachmentParameteriv), }, // NOLINT - { "glGetIntegerv", reinterpret_cast<GLES2FunctionPointer>(glGetIntegerv), }, - { "glGetProgramiv", reinterpret_cast<GLES2FunctionPointer>( - glGetProgramiv), }, - { "glGetProgramInfoLog", reinterpret_cast<GLES2FunctionPointer>( - glGetProgramInfoLog), }, - { "glGetRenderbufferParameteriv", reinterpret_cast<GLES2FunctionPointer>( - glGetRenderbufferParameteriv), }, - { "glGetShaderiv", reinterpret_cast<GLES2FunctionPointer>(glGetShaderiv), }, - { "glGetShaderInfoLog", reinterpret_cast<GLES2FunctionPointer>( - glGetShaderInfoLog), }, - { "glGetShaderPrecisionFormat", reinterpret_cast<GLES2FunctionPointer>( - glGetShaderPrecisionFormat), }, - { "glGetShaderSource", reinterpret_cast<GLES2FunctionPointer>( - glGetShaderSource), }, - { "glGetString", reinterpret_cast<GLES2FunctionPointer>(glGetString), }, - { "glGetTexParameterfv", reinterpret_cast<GLES2FunctionPointer>( - glGetTexParameterfv), }, - { "glGetTexParameteriv", reinterpret_cast<GLES2FunctionPointer>( - glGetTexParameteriv), }, - { "glGetUniformfv", reinterpret_cast<GLES2FunctionPointer>( - glGetUniformfv), }, - { "glGetUniformiv", reinterpret_cast<GLES2FunctionPointer>( - glGetUniformiv), }, - { "glGetUniformLocation", reinterpret_cast<GLES2FunctionPointer>( - glGetUniformLocation), }, - { "glGetVertexAttribfv", reinterpret_cast<GLES2FunctionPointer>( - glGetVertexAttribfv), }, - { "glGetVertexAttribiv", reinterpret_cast<GLES2FunctionPointer>( - glGetVertexAttribiv), }, - { "glGetVertexAttribPointerv", reinterpret_cast<GLES2FunctionPointer>( - glGetVertexAttribPointerv), }, - { "glHint", reinterpret_cast<GLES2FunctionPointer>(glHint), }, - { "glIsBuffer", reinterpret_cast<GLES2FunctionPointer>(glIsBuffer), }, - { "glIsEnabled", reinterpret_cast<GLES2FunctionPointer>(glIsEnabled), }, - { "glIsFramebuffer", reinterpret_cast<GLES2FunctionPointer>( - glIsFramebuffer), }, - { "glIsProgram", reinterpret_cast<GLES2FunctionPointer>(glIsProgram), }, - { "glIsRenderbuffer", reinterpret_cast<GLES2FunctionPointer>( - glIsRenderbuffer), }, - { "glIsShader", reinterpret_cast<GLES2FunctionPointer>(glIsShader), }, - { "glIsTexture", reinterpret_cast<GLES2FunctionPointer>(glIsTexture), }, - { "glLineWidth", reinterpret_cast<GLES2FunctionPointer>(glLineWidth), }, - { "glLinkProgram", reinterpret_cast<GLES2FunctionPointer>(glLinkProgram), }, - { "glPixelStorei", reinterpret_cast<GLES2FunctionPointer>(glPixelStorei), }, - { "glPolygonOffset", reinterpret_cast<GLES2FunctionPointer>( - glPolygonOffset), }, - { "glReadPixels", reinterpret_cast<GLES2FunctionPointer>(glReadPixels), }, - { "glReleaseShaderCompiler", reinterpret_cast<GLES2FunctionPointer>( - glReleaseShaderCompiler), }, - { "glRenderbufferStorage", reinterpret_cast<GLES2FunctionPointer>( - glRenderbufferStorage), }, - { "glSampleCoverage", reinterpret_cast<GLES2FunctionPointer>( - glSampleCoverage), }, - { "glScissor", reinterpret_cast<GLES2FunctionPointer>(glScissor), }, - { "glShaderBinary", reinterpret_cast<GLES2FunctionPointer>( - glShaderBinary), }, - { "glShaderSource", reinterpret_cast<GLES2FunctionPointer>( - glShaderSource), }, - { "glShallowFinishCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glShallowFinishCHROMIUM), }, - { "glShallowFlushCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glShallowFlushCHROMIUM), }, - { "glStencilFunc", reinterpret_cast<GLES2FunctionPointer>(glStencilFunc), }, - { "glStencilFuncSeparate", reinterpret_cast<GLES2FunctionPointer>( - glStencilFuncSeparate), }, - { "glStencilMask", reinterpret_cast<GLES2FunctionPointer>(glStencilMask), }, - { "glStencilMaskSeparate", reinterpret_cast<GLES2FunctionPointer>( - glStencilMaskSeparate), }, - { "glStencilOp", reinterpret_cast<GLES2FunctionPointer>(glStencilOp), }, - { "glStencilOpSeparate", reinterpret_cast<GLES2FunctionPointer>( - glStencilOpSeparate), }, - { "glTexImage2D", reinterpret_cast<GLES2FunctionPointer>(glTexImage2D), }, - { "glTexParameterf", reinterpret_cast<GLES2FunctionPointer>( - glTexParameterf), }, - { "glTexParameterfv", reinterpret_cast<GLES2FunctionPointer>( - glTexParameterfv), }, - { "glTexParameteri", reinterpret_cast<GLES2FunctionPointer>( - glTexParameteri), }, - { "glTexParameteriv", reinterpret_cast<GLES2FunctionPointer>( - glTexParameteriv), }, - { "glTexSubImage2D", reinterpret_cast<GLES2FunctionPointer>( - glTexSubImage2D), }, - { "glUniform1f", reinterpret_cast<GLES2FunctionPointer>(glUniform1f), }, - { "glUniform1fv", reinterpret_cast<GLES2FunctionPointer>(glUniform1fv), }, - { "glUniform1i", reinterpret_cast<GLES2FunctionPointer>(glUniform1i), }, - { "glUniform1iv", reinterpret_cast<GLES2FunctionPointer>(glUniform1iv), }, - { "glUniform2f", reinterpret_cast<GLES2FunctionPointer>(glUniform2f), }, - { "glUniform2fv", reinterpret_cast<GLES2FunctionPointer>(glUniform2fv), }, - { "glUniform2i", reinterpret_cast<GLES2FunctionPointer>(glUniform2i), }, - { "glUniform2iv", reinterpret_cast<GLES2FunctionPointer>(glUniform2iv), }, - { "glUniform3f", reinterpret_cast<GLES2FunctionPointer>(glUniform3f), }, - { "glUniform3fv", reinterpret_cast<GLES2FunctionPointer>(glUniform3fv), }, - { "glUniform3i", reinterpret_cast<GLES2FunctionPointer>(glUniform3i), }, - { "glUniform3iv", reinterpret_cast<GLES2FunctionPointer>(glUniform3iv), }, - { "glUniform4f", reinterpret_cast<GLES2FunctionPointer>(glUniform4f), }, - { "glUniform4fv", reinterpret_cast<GLES2FunctionPointer>(glUniform4fv), }, - { "glUniform4i", reinterpret_cast<GLES2FunctionPointer>(glUniform4i), }, - { "glUniform4iv", reinterpret_cast<GLES2FunctionPointer>(glUniform4iv), }, - { "glUniformMatrix2fv", reinterpret_cast<GLES2FunctionPointer>( - glUniformMatrix2fv), }, - { "glUniformMatrix3fv", reinterpret_cast<GLES2FunctionPointer>( - glUniformMatrix3fv), }, - { "glUniformMatrix4fv", reinterpret_cast<GLES2FunctionPointer>( - glUniformMatrix4fv), }, - { "glUseProgram", reinterpret_cast<GLES2FunctionPointer>(glUseProgram), }, - { "glValidateProgram", reinterpret_cast<GLES2FunctionPointer>( - glValidateProgram), }, - { "glVertexAttrib1f", reinterpret_cast<GLES2FunctionPointer>( - glVertexAttrib1f), }, - { "glVertexAttrib1fv", reinterpret_cast<GLES2FunctionPointer>( - glVertexAttrib1fv), }, - { "glVertexAttrib2f", reinterpret_cast<GLES2FunctionPointer>( - glVertexAttrib2f), }, - { "glVertexAttrib2fv", reinterpret_cast<GLES2FunctionPointer>( - glVertexAttrib2fv), }, - { "glVertexAttrib3f", reinterpret_cast<GLES2FunctionPointer>( - glVertexAttrib3f), }, - { "glVertexAttrib3fv", reinterpret_cast<GLES2FunctionPointer>( - glVertexAttrib3fv), }, - { "glVertexAttrib4f", reinterpret_cast<GLES2FunctionPointer>( - glVertexAttrib4f), }, - { "glVertexAttrib4fv", reinterpret_cast<GLES2FunctionPointer>( - glVertexAttrib4fv), }, - { "glVertexAttribPointer", reinterpret_cast<GLES2FunctionPointer>( - glVertexAttribPointer), }, - { "glViewport", reinterpret_cast<GLES2FunctionPointer>(glViewport), }, - { "glBlitFramebufferCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glBlitFramebufferCHROMIUM), }, - { "glRenderbufferStorageMultisampleCHROMIUM", reinterpret_cast<GLES2FunctionPointer>(glRenderbufferStorageMultisampleCHROMIUM), }, // NOLINT - { "glRenderbufferStorageMultisampleEXT", reinterpret_cast<GLES2FunctionPointer>(glRenderbufferStorageMultisampleEXT), }, // NOLINT - { "glFramebufferTexture2DMultisampleEXT", reinterpret_cast<GLES2FunctionPointer>(glFramebufferTexture2DMultisampleEXT), }, // NOLINT - { "glTexStorage2DEXT", reinterpret_cast<GLES2FunctionPointer>( - glTexStorage2DEXT), }, - { "glGenQueriesEXT", reinterpret_cast<GLES2FunctionPointer>( - glGenQueriesEXT), }, - { "glDeleteQueriesEXT", reinterpret_cast<GLES2FunctionPointer>( - glDeleteQueriesEXT), }, - { "glIsQueryEXT", reinterpret_cast<GLES2FunctionPointer>(glIsQueryEXT), }, - { "glBeginQueryEXT", reinterpret_cast<GLES2FunctionPointer>( - glBeginQueryEXT), }, - { "glEndQueryEXT", reinterpret_cast<GLES2FunctionPointer>(glEndQueryEXT), }, - { "glGetQueryivEXT", reinterpret_cast<GLES2FunctionPointer>( - glGetQueryivEXT), }, - { "glGetQueryObjectuivEXT", reinterpret_cast<GLES2FunctionPointer>( - glGetQueryObjectuivEXT), }, - { "glInsertEventMarkerEXT", reinterpret_cast<GLES2FunctionPointer>( - glInsertEventMarkerEXT), }, - { "glPushGroupMarkerEXT", reinterpret_cast<GLES2FunctionPointer>( - glPushGroupMarkerEXT), }, - { "glPopGroupMarkerEXT", reinterpret_cast<GLES2FunctionPointer>( - glPopGroupMarkerEXT), }, - { "glGenVertexArraysOES", reinterpret_cast<GLES2FunctionPointer>( - glGenVertexArraysOES), }, - { "glDeleteVertexArraysOES", reinterpret_cast<GLES2FunctionPointer>( - glDeleteVertexArraysOES), }, - { "glIsVertexArrayOES", reinterpret_cast<GLES2FunctionPointer>( - glIsVertexArrayOES), }, - { "glBindVertexArrayOES", reinterpret_cast<GLES2FunctionPointer>( - glBindVertexArrayOES), }, - { "glSwapBuffers", reinterpret_cast<GLES2FunctionPointer>(glSwapBuffers), }, - { "glGetMaxValueInBufferCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glGetMaxValueInBufferCHROMIUM), }, - { "glGenSharedIdsCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glGenSharedIdsCHROMIUM), }, - { "glDeleteSharedIdsCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glDeleteSharedIdsCHROMIUM), }, - { "glRegisterSharedIdsCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glRegisterSharedIdsCHROMIUM), }, - { "glEnableFeatureCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glEnableFeatureCHROMIUM), }, - { "glMapBufferCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glMapBufferCHROMIUM), }, - { "glUnmapBufferCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glUnmapBufferCHROMIUM), }, - { "glMapImageCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glMapImageCHROMIUM), }, - { "glUnmapImageCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glUnmapImageCHROMIUM), }, - { "glMapBufferSubDataCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glMapBufferSubDataCHROMIUM), }, - { "glUnmapBufferSubDataCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glUnmapBufferSubDataCHROMIUM), }, - { "glMapTexSubImage2DCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glMapTexSubImage2DCHROMIUM), }, - { "glUnmapTexSubImage2DCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glUnmapTexSubImage2DCHROMIUM), }, - { "glResizeCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glResizeCHROMIUM), }, - { "glGetRequestableExtensionsCHROMIUM", reinterpret_cast<GLES2FunctionPointer>(glGetRequestableExtensionsCHROMIUM), }, // NOLINT - { "glRequestExtensionCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glRequestExtensionCHROMIUM), }, - { "glRateLimitOffscreenContextCHROMIUM", reinterpret_cast<GLES2FunctionPointer>(glRateLimitOffscreenContextCHROMIUM), }, // NOLINT - { "glGetMultipleIntegervCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glGetMultipleIntegervCHROMIUM), }, - { "glGetProgramInfoCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glGetProgramInfoCHROMIUM), }, - { "glCreateStreamTextureCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glCreateStreamTextureCHROMIUM), }, - { "glDestroyStreamTextureCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glDestroyStreamTextureCHROMIUM), }, - { "glCreateImageCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glCreateImageCHROMIUM), }, - { "glDestroyImageCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glDestroyImageCHROMIUM), }, - { "glGetImageParameterivCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glGetImageParameterivCHROMIUM), }, - { "glGetTranslatedShaderSourceANGLE", reinterpret_cast<GLES2FunctionPointer>( - glGetTranslatedShaderSourceANGLE), }, - { "glPostSubBufferCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glPostSubBufferCHROMIUM), }, - { "glTexImageIOSurface2DCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glTexImageIOSurface2DCHROMIUM), }, - { "glCopyTextureCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glCopyTextureCHROMIUM), }, - { "glDrawArraysInstancedANGLE", reinterpret_cast<GLES2FunctionPointer>( - glDrawArraysInstancedANGLE), }, - { "glDrawElementsInstancedANGLE", reinterpret_cast<GLES2FunctionPointer>( - glDrawElementsInstancedANGLE), }, - { "glVertexAttribDivisorANGLE", reinterpret_cast<GLES2FunctionPointer>( - glVertexAttribDivisorANGLE), }, - { "glGenMailboxCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glGenMailboxCHROMIUM), }, - { "glProduceTextureCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glProduceTextureCHROMIUM), }, - { "glConsumeTextureCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glConsumeTextureCHROMIUM), }, - { "glBindUniformLocationCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glBindUniformLocationCHROMIUM), }, - { "glBindTexImage2DCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glBindTexImage2DCHROMIUM), }, - { "glReleaseTexImage2DCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glReleaseTexImage2DCHROMIUM), }, - { "glTraceBeginCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glTraceBeginCHROMIUM), }, - { "glTraceEndCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glTraceEndCHROMIUM), }, - { "glAsyncTexSubImage2DCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glAsyncTexSubImage2DCHROMIUM), }, - { "glAsyncTexImage2DCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glAsyncTexImage2DCHROMIUM), }, - { "glWaitAsyncTexImage2DCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glWaitAsyncTexImage2DCHROMIUM), }, - { "glDiscardFramebufferEXT", reinterpret_cast<GLES2FunctionPointer>( - glDiscardFramebufferEXT), }, - { "glLoseContextCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glLoseContextCHROMIUM), }, - { "glInsertSyncPointCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glInsertSyncPointCHROMIUM), }, - { "glWaitSyncPointCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glWaitSyncPointCHROMIUM), }, - { "glDrawBuffersEXT", reinterpret_cast<GLES2FunctionPointer>( - glDrawBuffersEXT), }, - { "glDiscardBackbufferCHROMIUM", reinterpret_cast<GLES2FunctionPointer>( - glDiscardBackbufferCHROMIUM), }, - { NULL, NULL, }, + { + "glActiveTexture", reinterpret_cast<GLES2FunctionPointer>(glActiveTexture), + }, + { + "glAttachShader", reinterpret_cast<GLES2FunctionPointer>(glAttachShader), + }, + { + "glBindAttribLocation", + reinterpret_cast<GLES2FunctionPointer>(glBindAttribLocation), + }, + { + "glBindBuffer", reinterpret_cast<GLES2FunctionPointer>(glBindBuffer), + }, + { + "glBindFramebuffer", + reinterpret_cast<GLES2FunctionPointer>(glBindFramebuffer), + }, + { + "glBindRenderbuffer", + reinterpret_cast<GLES2FunctionPointer>(glBindRenderbuffer), + }, + { + "glBindTexture", reinterpret_cast<GLES2FunctionPointer>(glBindTexture), + }, + { + "glBlendColor", reinterpret_cast<GLES2FunctionPointer>(glBlendColor), + }, + { + "glBlendEquation", reinterpret_cast<GLES2FunctionPointer>(glBlendEquation), + }, + { + "glBlendEquationSeparate", + reinterpret_cast<GLES2FunctionPointer>(glBlendEquationSeparate), + }, + { + "glBlendFunc", reinterpret_cast<GLES2FunctionPointer>(glBlendFunc), + }, + { + "glBlendFuncSeparate", + reinterpret_cast<GLES2FunctionPointer>(glBlendFuncSeparate), + }, + { + "glBufferData", reinterpret_cast<GLES2FunctionPointer>(glBufferData), + }, + { + "glBufferSubData", reinterpret_cast<GLES2FunctionPointer>(glBufferSubData), + }, + { + "glCheckFramebufferStatus", + reinterpret_cast<GLES2FunctionPointer>(glCheckFramebufferStatus), + }, + { + "glClear", reinterpret_cast<GLES2FunctionPointer>(glClear), + }, + { + "glClearColor", reinterpret_cast<GLES2FunctionPointer>(glClearColor), + }, + { + "glClearDepthf", reinterpret_cast<GLES2FunctionPointer>(glClearDepthf), + }, + { + "glClearStencil", reinterpret_cast<GLES2FunctionPointer>(glClearStencil), + }, + { + "glColorMask", reinterpret_cast<GLES2FunctionPointer>(glColorMask), + }, + { + "glCompileShader", reinterpret_cast<GLES2FunctionPointer>(glCompileShader), + }, + { + "glCompressedTexImage2D", + reinterpret_cast<GLES2FunctionPointer>(glCompressedTexImage2D), + }, + { + "glCompressedTexSubImage2D", + reinterpret_cast<GLES2FunctionPointer>(glCompressedTexSubImage2D), + }, + { + "glCopyTexImage2D", + reinterpret_cast<GLES2FunctionPointer>(glCopyTexImage2D), + }, + { + "glCopyTexSubImage2D", + reinterpret_cast<GLES2FunctionPointer>(glCopyTexSubImage2D), + }, + { + "glCreateProgram", reinterpret_cast<GLES2FunctionPointer>(glCreateProgram), + }, + { + "glCreateShader", reinterpret_cast<GLES2FunctionPointer>(glCreateShader), + }, + { + "glCullFace", reinterpret_cast<GLES2FunctionPointer>(glCullFace), + }, + { + "glDeleteBuffers", reinterpret_cast<GLES2FunctionPointer>(glDeleteBuffers), + }, + { + "glDeleteFramebuffers", + reinterpret_cast<GLES2FunctionPointer>(glDeleteFramebuffers), + }, + { + "glDeleteProgram", reinterpret_cast<GLES2FunctionPointer>(glDeleteProgram), + }, + { + "glDeleteRenderbuffers", + reinterpret_cast<GLES2FunctionPointer>(glDeleteRenderbuffers), + }, + { + "glDeleteShader", reinterpret_cast<GLES2FunctionPointer>(glDeleteShader), + }, + { + "glDeleteTextures", + reinterpret_cast<GLES2FunctionPointer>(glDeleteTextures), + }, + { + "glDepthFunc", reinterpret_cast<GLES2FunctionPointer>(glDepthFunc), + }, + { + "glDepthMask", reinterpret_cast<GLES2FunctionPointer>(glDepthMask), + }, + { + "glDepthRangef", reinterpret_cast<GLES2FunctionPointer>(glDepthRangef), + }, + { + "glDetachShader", reinterpret_cast<GLES2FunctionPointer>(glDetachShader), + }, + { + "glDisable", reinterpret_cast<GLES2FunctionPointer>(glDisable), + }, + { + "glDisableVertexAttribArray", + reinterpret_cast<GLES2FunctionPointer>(glDisableVertexAttribArray), + }, + { + "glDrawArrays", reinterpret_cast<GLES2FunctionPointer>(glDrawArrays), + }, + { + "glDrawElements", reinterpret_cast<GLES2FunctionPointer>(glDrawElements), + }, + { + "glEnable", reinterpret_cast<GLES2FunctionPointer>(glEnable), + }, + { + "glEnableVertexAttribArray", + reinterpret_cast<GLES2FunctionPointer>(glEnableVertexAttribArray), + }, + { + "glFinish", reinterpret_cast<GLES2FunctionPointer>(glFinish), + }, + { + "glFlush", reinterpret_cast<GLES2FunctionPointer>(glFlush), + }, + { + "glFramebufferRenderbuffer", + reinterpret_cast<GLES2FunctionPointer>(glFramebufferRenderbuffer), + }, + { + "glFramebufferTexture2D", + reinterpret_cast<GLES2FunctionPointer>(glFramebufferTexture2D), + }, + { + "glFrontFace", reinterpret_cast<GLES2FunctionPointer>(glFrontFace), + }, + { + "glGenBuffers", reinterpret_cast<GLES2FunctionPointer>(glGenBuffers), + }, + { + "glGenerateMipmap", + reinterpret_cast<GLES2FunctionPointer>(glGenerateMipmap), + }, + { + "glGenFramebuffers", + reinterpret_cast<GLES2FunctionPointer>(glGenFramebuffers), + }, + { + "glGenRenderbuffers", + reinterpret_cast<GLES2FunctionPointer>(glGenRenderbuffers), + }, + { + "glGenTextures", reinterpret_cast<GLES2FunctionPointer>(glGenTextures), + }, + { + "glGetActiveAttrib", + reinterpret_cast<GLES2FunctionPointer>(glGetActiveAttrib), + }, + { + "glGetActiveUniform", + reinterpret_cast<GLES2FunctionPointer>(glGetActiveUniform), + }, + { + "glGetAttachedShaders", + reinterpret_cast<GLES2FunctionPointer>(glGetAttachedShaders), + }, + { + "glGetAttribLocation", + reinterpret_cast<GLES2FunctionPointer>(glGetAttribLocation), + }, + { + "glGetBooleanv", reinterpret_cast<GLES2FunctionPointer>(glGetBooleanv), + }, + { + "glGetBufferParameteriv", + reinterpret_cast<GLES2FunctionPointer>(glGetBufferParameteriv), + }, + { + "glGetError", reinterpret_cast<GLES2FunctionPointer>(glGetError), + }, + { + "glGetFloatv", reinterpret_cast<GLES2FunctionPointer>(glGetFloatv), + }, + { + "glGetFramebufferAttachmentParameteriv", + reinterpret_cast<GLES2FunctionPointer>( + glGetFramebufferAttachmentParameteriv), + }, + { + "glGetIntegerv", reinterpret_cast<GLES2FunctionPointer>(glGetIntegerv), + }, + { + "glGetProgramiv", reinterpret_cast<GLES2FunctionPointer>(glGetProgramiv), + }, + { + "glGetProgramInfoLog", + reinterpret_cast<GLES2FunctionPointer>(glGetProgramInfoLog), + }, + { + "glGetRenderbufferParameteriv", + reinterpret_cast<GLES2FunctionPointer>(glGetRenderbufferParameteriv), + }, + { + "glGetShaderiv", reinterpret_cast<GLES2FunctionPointer>(glGetShaderiv), + }, + { + "glGetShaderInfoLog", + reinterpret_cast<GLES2FunctionPointer>(glGetShaderInfoLog), + }, + { + "glGetShaderPrecisionFormat", + reinterpret_cast<GLES2FunctionPointer>(glGetShaderPrecisionFormat), + }, + { + "glGetShaderSource", + reinterpret_cast<GLES2FunctionPointer>(glGetShaderSource), + }, + { + "glGetString", reinterpret_cast<GLES2FunctionPointer>(glGetString), + }, + { + "glGetTexParameterfv", + reinterpret_cast<GLES2FunctionPointer>(glGetTexParameterfv), + }, + { + "glGetTexParameteriv", + reinterpret_cast<GLES2FunctionPointer>(glGetTexParameteriv), + }, + { + "glGetUniformfv", reinterpret_cast<GLES2FunctionPointer>(glGetUniformfv), + }, + { + "glGetUniformiv", reinterpret_cast<GLES2FunctionPointer>(glGetUniformiv), + }, + { + "glGetUniformLocation", + reinterpret_cast<GLES2FunctionPointer>(glGetUniformLocation), + }, + { + "glGetVertexAttribfv", + reinterpret_cast<GLES2FunctionPointer>(glGetVertexAttribfv), + }, + { + "glGetVertexAttribiv", + reinterpret_cast<GLES2FunctionPointer>(glGetVertexAttribiv), + }, + { + "glGetVertexAttribPointerv", + reinterpret_cast<GLES2FunctionPointer>(glGetVertexAttribPointerv), + }, + { + "glHint", reinterpret_cast<GLES2FunctionPointer>(glHint), + }, + { + "glIsBuffer", reinterpret_cast<GLES2FunctionPointer>(glIsBuffer), + }, + { + "glIsEnabled", reinterpret_cast<GLES2FunctionPointer>(glIsEnabled), + }, + { + "glIsFramebuffer", reinterpret_cast<GLES2FunctionPointer>(glIsFramebuffer), + }, + { + "glIsProgram", reinterpret_cast<GLES2FunctionPointer>(glIsProgram), + }, + { + "glIsRenderbuffer", + reinterpret_cast<GLES2FunctionPointer>(glIsRenderbuffer), + }, + { + "glIsShader", reinterpret_cast<GLES2FunctionPointer>(glIsShader), + }, + { + "glIsTexture", reinterpret_cast<GLES2FunctionPointer>(glIsTexture), + }, + { + "glLineWidth", reinterpret_cast<GLES2FunctionPointer>(glLineWidth), + }, + { + "glLinkProgram", reinterpret_cast<GLES2FunctionPointer>(glLinkProgram), + }, + { + "glPixelStorei", reinterpret_cast<GLES2FunctionPointer>(glPixelStorei), + }, + { + "glPolygonOffset", reinterpret_cast<GLES2FunctionPointer>(glPolygonOffset), + }, + { + "glReadPixels", reinterpret_cast<GLES2FunctionPointer>(glReadPixels), + }, + { + "glReleaseShaderCompiler", + reinterpret_cast<GLES2FunctionPointer>(glReleaseShaderCompiler), + }, + { + "glRenderbufferStorage", + reinterpret_cast<GLES2FunctionPointer>(glRenderbufferStorage), + }, + { + "glSampleCoverage", + reinterpret_cast<GLES2FunctionPointer>(glSampleCoverage), + }, + { + "glScissor", reinterpret_cast<GLES2FunctionPointer>(glScissor), + }, + { + "glShaderBinary", reinterpret_cast<GLES2FunctionPointer>(glShaderBinary), + }, + { + "glShaderSource", reinterpret_cast<GLES2FunctionPointer>(glShaderSource), + }, + { + "glShallowFinishCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glShallowFinishCHROMIUM), + }, + { + "glShallowFlushCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glShallowFlushCHROMIUM), + }, + { + "glStencilFunc", reinterpret_cast<GLES2FunctionPointer>(glStencilFunc), + }, + { + "glStencilFuncSeparate", + reinterpret_cast<GLES2FunctionPointer>(glStencilFuncSeparate), + }, + { + "glStencilMask", reinterpret_cast<GLES2FunctionPointer>(glStencilMask), + }, + { + "glStencilMaskSeparate", + reinterpret_cast<GLES2FunctionPointer>(glStencilMaskSeparate), + }, + { + "glStencilOp", reinterpret_cast<GLES2FunctionPointer>(glStencilOp), + }, + { + "glStencilOpSeparate", + reinterpret_cast<GLES2FunctionPointer>(glStencilOpSeparate), + }, + { + "glTexImage2D", reinterpret_cast<GLES2FunctionPointer>(glTexImage2D), + }, + { + "glTexParameterf", reinterpret_cast<GLES2FunctionPointer>(glTexParameterf), + }, + { + "glTexParameterfv", + reinterpret_cast<GLES2FunctionPointer>(glTexParameterfv), + }, + { + "glTexParameteri", reinterpret_cast<GLES2FunctionPointer>(glTexParameteri), + }, + { + "glTexParameteriv", + reinterpret_cast<GLES2FunctionPointer>(glTexParameteriv), + }, + { + "glTexSubImage2D", reinterpret_cast<GLES2FunctionPointer>(glTexSubImage2D), + }, + { + "glUniform1f", reinterpret_cast<GLES2FunctionPointer>(glUniform1f), + }, + { + "glUniform1fv", reinterpret_cast<GLES2FunctionPointer>(glUniform1fv), + }, + { + "glUniform1i", reinterpret_cast<GLES2FunctionPointer>(glUniform1i), + }, + { + "glUniform1iv", reinterpret_cast<GLES2FunctionPointer>(glUniform1iv), + }, + { + "glUniform2f", reinterpret_cast<GLES2FunctionPointer>(glUniform2f), + }, + { + "glUniform2fv", reinterpret_cast<GLES2FunctionPointer>(glUniform2fv), + }, + { + "glUniform2i", reinterpret_cast<GLES2FunctionPointer>(glUniform2i), + }, + { + "glUniform2iv", reinterpret_cast<GLES2FunctionPointer>(glUniform2iv), + }, + { + "glUniform3f", reinterpret_cast<GLES2FunctionPointer>(glUniform3f), + }, + { + "glUniform3fv", reinterpret_cast<GLES2FunctionPointer>(glUniform3fv), + }, + { + "glUniform3i", reinterpret_cast<GLES2FunctionPointer>(glUniform3i), + }, + { + "glUniform3iv", reinterpret_cast<GLES2FunctionPointer>(glUniform3iv), + }, + { + "glUniform4f", reinterpret_cast<GLES2FunctionPointer>(glUniform4f), + }, + { + "glUniform4fv", reinterpret_cast<GLES2FunctionPointer>(glUniform4fv), + }, + { + "glUniform4i", reinterpret_cast<GLES2FunctionPointer>(glUniform4i), + }, + { + "glUniform4iv", reinterpret_cast<GLES2FunctionPointer>(glUniform4iv), + }, + { + "glUniformMatrix2fv", + reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix2fv), + }, + { + "glUniformMatrix3fv", + reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix3fv), + }, + { + "glUniformMatrix4fv", + reinterpret_cast<GLES2FunctionPointer>(glUniformMatrix4fv), + }, + { + "glUseProgram", reinterpret_cast<GLES2FunctionPointer>(glUseProgram), + }, + { + "glValidateProgram", + reinterpret_cast<GLES2FunctionPointer>(glValidateProgram), + }, + { + "glVertexAttrib1f", + reinterpret_cast<GLES2FunctionPointer>(glVertexAttrib1f), + }, + { + "glVertexAttrib1fv", + reinterpret_cast<GLES2FunctionPointer>(glVertexAttrib1fv), + }, + { + "glVertexAttrib2f", + reinterpret_cast<GLES2FunctionPointer>(glVertexAttrib2f), + }, + { + "glVertexAttrib2fv", + reinterpret_cast<GLES2FunctionPointer>(glVertexAttrib2fv), + }, + { + "glVertexAttrib3f", + reinterpret_cast<GLES2FunctionPointer>(glVertexAttrib3f), + }, + { + "glVertexAttrib3fv", + reinterpret_cast<GLES2FunctionPointer>(glVertexAttrib3fv), + }, + { + "glVertexAttrib4f", + reinterpret_cast<GLES2FunctionPointer>(glVertexAttrib4f), + }, + { + "glVertexAttrib4fv", + reinterpret_cast<GLES2FunctionPointer>(glVertexAttrib4fv), + }, + { + "glVertexAttribPointer", + reinterpret_cast<GLES2FunctionPointer>(glVertexAttribPointer), + }, + { + "glViewport", reinterpret_cast<GLES2FunctionPointer>(glViewport), + }, + { + "glBlitFramebufferCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glBlitFramebufferCHROMIUM), + }, + { + "glRenderbufferStorageMultisampleCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>( + glRenderbufferStorageMultisampleCHROMIUM), + }, + { + "glRenderbufferStorageMultisampleEXT", + reinterpret_cast<GLES2FunctionPointer>( + glRenderbufferStorageMultisampleEXT), + }, + { + "glFramebufferTexture2DMultisampleEXT", + reinterpret_cast<GLES2FunctionPointer>( + glFramebufferTexture2DMultisampleEXT), + }, + { + "glTexStorage2DEXT", + reinterpret_cast<GLES2FunctionPointer>(glTexStorage2DEXT), + }, + { + "glGenQueriesEXT", reinterpret_cast<GLES2FunctionPointer>(glGenQueriesEXT), + }, + { + "glDeleteQueriesEXT", + reinterpret_cast<GLES2FunctionPointer>(glDeleteQueriesEXT), + }, + { + "glIsQueryEXT", reinterpret_cast<GLES2FunctionPointer>(glIsQueryEXT), + }, + { + "glBeginQueryEXT", reinterpret_cast<GLES2FunctionPointer>(glBeginQueryEXT), + }, + { + "glEndQueryEXT", reinterpret_cast<GLES2FunctionPointer>(glEndQueryEXT), + }, + { + "glGetQueryivEXT", reinterpret_cast<GLES2FunctionPointer>(glGetQueryivEXT), + }, + { + "glGetQueryObjectuivEXT", + reinterpret_cast<GLES2FunctionPointer>(glGetQueryObjectuivEXT), + }, + { + "glInsertEventMarkerEXT", + reinterpret_cast<GLES2FunctionPointer>(glInsertEventMarkerEXT), + }, + { + "glPushGroupMarkerEXT", + reinterpret_cast<GLES2FunctionPointer>(glPushGroupMarkerEXT), + }, + { + "glPopGroupMarkerEXT", + reinterpret_cast<GLES2FunctionPointer>(glPopGroupMarkerEXT), + }, + { + "glGenVertexArraysOES", + reinterpret_cast<GLES2FunctionPointer>(glGenVertexArraysOES), + }, + { + "glDeleteVertexArraysOES", + reinterpret_cast<GLES2FunctionPointer>(glDeleteVertexArraysOES), + }, + { + "glIsVertexArrayOES", + reinterpret_cast<GLES2FunctionPointer>(glIsVertexArrayOES), + }, + { + "glBindVertexArrayOES", + reinterpret_cast<GLES2FunctionPointer>(glBindVertexArrayOES), + }, + { + "glSwapBuffers", reinterpret_cast<GLES2FunctionPointer>(glSwapBuffers), + }, + { + "glGetMaxValueInBufferCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glGetMaxValueInBufferCHROMIUM), + }, + { + "glGenSharedIdsCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glGenSharedIdsCHROMIUM), + }, + { + "glDeleteSharedIdsCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glDeleteSharedIdsCHROMIUM), + }, + { + "glRegisterSharedIdsCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glRegisterSharedIdsCHROMIUM), + }, + { + "glEnableFeatureCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glEnableFeatureCHROMIUM), + }, + { + "glMapBufferCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glMapBufferCHROMIUM), + }, + { + "glUnmapBufferCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glUnmapBufferCHROMIUM), + }, + { + "glMapImageCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glMapImageCHROMIUM), + }, + { + "glUnmapImageCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glUnmapImageCHROMIUM), + }, + { + "glMapBufferSubDataCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glMapBufferSubDataCHROMIUM), + }, + { + "glUnmapBufferSubDataCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glUnmapBufferSubDataCHROMIUM), + }, + { + "glMapTexSubImage2DCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glMapTexSubImage2DCHROMIUM), + }, + { + "glUnmapTexSubImage2DCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glUnmapTexSubImage2DCHROMIUM), + }, + { + "glResizeCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glResizeCHROMIUM), + }, + { + "glGetRequestableExtensionsCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glGetRequestableExtensionsCHROMIUM), + }, + { + "glRequestExtensionCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glRequestExtensionCHROMIUM), + }, + { + "glRateLimitOffscreenContextCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>( + glRateLimitOffscreenContextCHROMIUM), + }, + { + "glGetMultipleIntegervCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glGetMultipleIntegervCHROMIUM), + }, + { + "glGetProgramInfoCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glGetProgramInfoCHROMIUM), + }, + { + "glCreateStreamTextureCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glCreateStreamTextureCHROMIUM), + }, + { + "glCreateImageCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glCreateImageCHROMIUM), + }, + { + "glDestroyImageCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glDestroyImageCHROMIUM), + }, + { + "glGetImageParameterivCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glGetImageParameterivCHROMIUM), + }, + { + "glGetTranslatedShaderSourceANGLE", + reinterpret_cast<GLES2FunctionPointer>(glGetTranslatedShaderSourceANGLE), + }, + { + "glPostSubBufferCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glPostSubBufferCHROMIUM), + }, + { + "glTexImageIOSurface2DCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glTexImageIOSurface2DCHROMIUM), + }, + { + "glCopyTextureCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glCopyTextureCHROMIUM), + }, + { + "glDrawArraysInstancedANGLE", + reinterpret_cast<GLES2FunctionPointer>(glDrawArraysInstancedANGLE), + }, + { + "glDrawElementsInstancedANGLE", + reinterpret_cast<GLES2FunctionPointer>(glDrawElementsInstancedANGLE), + }, + { + "glVertexAttribDivisorANGLE", + reinterpret_cast<GLES2FunctionPointer>(glVertexAttribDivisorANGLE), + }, + { + "glGenMailboxCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glGenMailboxCHROMIUM), + }, + { + "glProduceTextureCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glProduceTextureCHROMIUM), + }, + { + "glProduceTextureDirectCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glProduceTextureDirectCHROMIUM), + }, + { + "glConsumeTextureCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glConsumeTextureCHROMIUM), + }, + { + "glCreateAndConsumeTextureCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glCreateAndConsumeTextureCHROMIUM), + }, + { + "glBindUniformLocationCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glBindUniformLocationCHROMIUM), + }, + { + "glBindTexImage2DCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glBindTexImage2DCHROMIUM), + }, + { + "glReleaseTexImage2DCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glReleaseTexImage2DCHROMIUM), + }, + { + "glTraceBeginCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glTraceBeginCHROMIUM), + }, + { + "glTraceEndCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glTraceEndCHROMIUM), + }, + { + "glAsyncTexSubImage2DCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glAsyncTexSubImage2DCHROMIUM), + }, + { + "glAsyncTexImage2DCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glAsyncTexImage2DCHROMIUM), + }, + { + "glWaitAsyncTexImage2DCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glWaitAsyncTexImage2DCHROMIUM), + }, + { + "glWaitAllAsyncTexImage2DCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glWaitAllAsyncTexImage2DCHROMIUM), + }, + { + "glDiscardFramebufferEXT", + reinterpret_cast<GLES2FunctionPointer>(glDiscardFramebufferEXT), + }, + { + "glLoseContextCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glLoseContextCHROMIUM), + }, + { + "glInsertSyncPointCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glInsertSyncPointCHROMIUM), + }, + { + "glWaitSyncPointCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glWaitSyncPointCHROMIUM), + }, + { + "glDrawBuffersEXT", + reinterpret_cast<GLES2FunctionPointer>(glDrawBuffersEXT), + }, + { + "glDiscardBackbufferCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glDiscardBackbufferCHROMIUM), + }, + { + "glScheduleOverlayPlaneCHROMIUM", + reinterpret_cast<GLES2FunctionPointer>(glScheduleOverlayPlaneCHROMIUM), + }, + { + NULL, NULL, + }, }; } // namespace gles2 #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_C_LIB_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/client/gles2_cmd_helper.h b/chromium/gpu/command_buffer/client/gles2_cmd_helper.h index 72fae315b34..0726fbb4d4c 100644 --- a/chromium/gpu/command_buffer/client/gles2_cmd_helper.h +++ b/chromium/gpu/command_buffer/client/gles2_cmd_helper.h @@ -25,48 +25,36 @@ class GPU_EXPORT GLES2CmdHelper : public CommandBufferHelper { // Helpers that could not be auto-generated. // TODO(gman): Auto generate these. - void GetAttribLocation( - GLuint program, uint32 name_shm_id, uint32 name_shm_offset, - uint32 location_shm_id, uint32 location_shm_offset, uint32 data_size) { - gles2::cmds::GetAttribLocation* c = - GetCmdSpace<gles2::cmds::GetAttribLocation>(); - if (c) { - c->Init( - program, name_shm_id, name_shm_offset, location_shm_id, - location_shm_offset, data_size); - } - } - - void GetAttribLocationBucket( GLuint program, uint32 name_bucket_id, uint32 location_shm_id, uint32 location_shm_offset) { - gles2::cmds::GetAttribLocationBucket* c = - GetCmdSpace<gles2::cmds::GetAttribLocationBucket>(); + gles2::cmds::GetAttribLocation* c = + GetCmdSpace<gles2::cmds::GetAttribLocation>(); if (c) { c->Init(program, name_bucket_id, location_shm_id, location_shm_offset); } } void GetUniformLocation( - GLuint program, uint32 name_shm_id, uint32 name_shm_offset, - uint32 location_shm_id, uint32 location_shm_offset, uint32 data_size) { + GLuint program, uint32 name_bucket_id, + uint32 location_shm_id, uint32 location_shm_offset) { gles2::cmds::GetUniformLocation* c = GetCmdSpace<gles2::cmds::GetUniformLocation>(); if (c) { - c->Init( - program, name_shm_id, name_shm_offset, location_shm_id, - location_shm_offset, data_size); + c->Init(program, name_bucket_id, location_shm_id, location_shm_offset); } } - void GetUniformLocationBucket( - GLuint program, uint32 name_bucket_id, - uint32 location_shm_id, uint32 location_shm_offset) { - gles2::cmds::GetUniformLocationBucket* c = - GetCmdSpace<gles2::cmds::GetUniformLocationBucket>(); + void CreateAndConsumeTextureCHROMIUMImmediate(GLenum target, + uint32_t client_id, + const GLbyte* _mailbox) { + const uint32_t size = + gles2::cmds::CreateAndConsumeTextureCHROMIUMImmediate::ComputeSize(); + gles2::cmds::CreateAndConsumeTextureCHROMIUMImmediate* c = + GetImmediateCmdSpaceTotalSize< + gles2::cmds::CreateAndConsumeTextureCHROMIUMImmediate>(size); if (c) { - c->Init(program, name_bucket_id, location_shm_id, location_shm_offset); + c->Init(target, client_id, _mailbox); } } diff --git a/chromium/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/chromium/gpu/command_buffer/client/gles2_cmd_helper_autogen.h index 76a9f4a1267..49d03362a31 100644 --- a/chromium/gpu/command_buffer/client/gles2_cmd_helper_autogen.h +++ b/chromium/gpu/command_buffer/client/gles2_cmd_helper_autogen.h @@ -1,2026 +1,1925 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! #ifndef GPU_COMMAND_BUFFER_CLIENT_GLES2_CMD_HELPER_AUTOGEN_H_ #define GPU_COMMAND_BUFFER_CLIENT_GLES2_CMD_HELPER_AUTOGEN_H_ - void ActiveTexture(GLenum texture) { - gles2::cmds::ActiveTexture* c = GetCmdSpace<gles2::cmds::ActiveTexture>(); - if (c) { - c->Init(texture); - } +void ActiveTexture(GLenum texture) { + gles2::cmds::ActiveTexture* c = GetCmdSpace<gles2::cmds::ActiveTexture>(); + if (c) { + c->Init(texture); } +} - void AttachShader(GLuint program, GLuint shader) { - gles2::cmds::AttachShader* c = GetCmdSpace<gles2::cmds::AttachShader>(); - if (c) { - c->Init(program, shader); - } - } - - void BindAttribLocation( - GLuint program, GLuint index, uint32 name_shm_id, uint32 name_shm_offset, - uint32 data_size) { - gles2::cmds::BindAttribLocation* c = - GetCmdSpace<gles2::cmds::BindAttribLocation>(); - if (c) { - c->Init(program, index, name_shm_id, name_shm_offset, data_size); - } - } - - void BindAttribLocationBucket( - GLuint program, GLuint index, uint32 name_bucket_id) { - gles2::cmds::BindAttribLocationBucket* c = - GetCmdSpace<gles2::cmds::BindAttribLocationBucket>(); - if (c) { - c->Init(program, index, name_bucket_id); - } - } - - void BindBuffer(GLenum target, GLuint buffer) { - gles2::cmds::BindBuffer* c = GetCmdSpace<gles2::cmds::BindBuffer>(); - if (c) { - c->Init(target, buffer); - } - } - - void BindFramebuffer(GLenum target, GLuint framebuffer) { - gles2::cmds::BindFramebuffer* c = - GetCmdSpace<gles2::cmds::BindFramebuffer>(); - if (c) { - c->Init(target, framebuffer); - } - } - - void BindRenderbuffer(GLenum target, GLuint renderbuffer) { - gles2::cmds::BindRenderbuffer* c = - GetCmdSpace<gles2::cmds::BindRenderbuffer>(); - if (c) { - c->Init(target, renderbuffer); - } - } - - void BindTexture(GLenum target, GLuint texture) { - gles2::cmds::BindTexture* c = GetCmdSpace<gles2::cmds::BindTexture>(); - if (c) { - c->Init(target, texture); - } - } - - void BlendColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { - gles2::cmds::BlendColor* c = GetCmdSpace<gles2::cmds::BlendColor>(); - if (c) { - c->Init(red, green, blue, alpha); - } - } - - void BlendEquation(GLenum mode) { - gles2::cmds::BlendEquation* c = GetCmdSpace<gles2::cmds::BlendEquation>(); - if (c) { - c->Init(mode); - } - } - - void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) { - gles2::cmds::BlendEquationSeparate* c = - GetCmdSpace<gles2::cmds::BlendEquationSeparate>(); - if (c) { - c->Init(modeRGB, modeAlpha); - } - } - - void BlendFunc(GLenum sfactor, GLenum dfactor) { - gles2::cmds::BlendFunc* c = GetCmdSpace<gles2::cmds::BlendFunc>(); - if (c) { - c->Init(sfactor, dfactor); - } - } - - void BlendFuncSeparate( - GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { - gles2::cmds::BlendFuncSeparate* c = - GetCmdSpace<gles2::cmds::BlendFuncSeparate>(); - if (c) { - c->Init(srcRGB, dstRGB, srcAlpha, dstAlpha); - } - } - - void BufferData( - GLenum target, GLsizeiptr size, uint32 data_shm_id, - uint32 data_shm_offset, GLenum usage) { - gles2::cmds::BufferData* c = GetCmdSpace<gles2::cmds::BufferData>(); - if (c) { - c->Init(target, size, data_shm_id, data_shm_offset, usage); - } - } - - void BufferSubData( - GLenum target, GLintptr offset, GLsizeiptr size, uint32 data_shm_id, - uint32 data_shm_offset) { - gles2::cmds::BufferSubData* c = GetCmdSpace<gles2::cmds::BufferSubData>(); - if (c) { - c->Init(target, offset, size, data_shm_id, data_shm_offset); - } - } - - void CheckFramebufferStatus( - GLenum target, uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::CheckFramebufferStatus* c = - GetCmdSpace<gles2::cmds::CheckFramebufferStatus>(); - if (c) { - c->Init(target, result_shm_id, result_shm_offset); - } - } - - void Clear(GLbitfield mask) { - gles2::cmds::Clear* c = GetCmdSpace<gles2::cmds::Clear>(); - if (c) { - c->Init(mask); - } - } - - void ClearColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { - gles2::cmds::ClearColor* c = GetCmdSpace<gles2::cmds::ClearColor>(); - if (c) { - c->Init(red, green, blue, alpha); - } - } - - void ClearDepthf(GLclampf depth) { - gles2::cmds::ClearDepthf* c = GetCmdSpace<gles2::cmds::ClearDepthf>(); - if (c) { - c->Init(depth); - } - } - - void ClearStencil(GLint s) { - gles2::cmds::ClearStencil* c = GetCmdSpace<gles2::cmds::ClearStencil>(); - if (c) { - c->Init(s); - } - } - - void ColorMask( - GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { - gles2::cmds::ColorMask* c = GetCmdSpace<gles2::cmds::ColorMask>(); - if (c) { - c->Init(red, green, blue, alpha); - } - } - - void CompileShader(GLuint shader) { - gles2::cmds::CompileShader* c = GetCmdSpace<gles2::cmds::CompileShader>(); - if (c) { - c->Init(shader); - } - } - - void CompressedTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLsizei width, - GLsizei height, GLint border, GLsizei imageSize, uint32 data_shm_id, - uint32 data_shm_offset) { - gles2::cmds::CompressedTexImage2D* c = - GetCmdSpace<gles2::cmds::CompressedTexImage2D>(); - if (c) { - c->Init( - target, level, internalformat, width, height, border, imageSize, - data_shm_id, data_shm_offset); - } - } - - void CompressedTexImage2DBucket( - GLenum target, GLint level, GLenum internalformat, GLsizei width, - GLsizei height, GLint border, GLuint bucket_id) { - gles2::cmds::CompressedTexImage2DBucket* c = - GetCmdSpace<gles2::cmds::CompressedTexImage2DBucket>(); - if (c) { - c->Init(target, level, internalformat, width, height, border, bucket_id); - } - } - - void CompressedTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLsizei imageSize, uint32 data_shm_id, - uint32 data_shm_offset) { - gles2::cmds::CompressedTexSubImage2D* c = - GetCmdSpace<gles2::cmds::CompressedTexSubImage2D>(); - if (c) { - c->Init( - target, level, xoffset, yoffset, width, height, format, imageSize, - data_shm_id, data_shm_offset); - } - } - - void CompressedTexSubImage2DBucket( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLuint bucket_id) { - gles2::cmds::CompressedTexSubImage2DBucket* c = - GetCmdSpace<gles2::cmds::CompressedTexSubImage2DBucket>(); - if (c) { - c->Init( - target, level, xoffset, yoffset, width, height, format, bucket_id); - } - } - - void CopyTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, - GLsizei width, GLsizei height, GLint border) { - gles2::cmds::CopyTexImage2D* c = - GetCmdSpace<gles2::cmds::CopyTexImage2D>(); - if (c) { - c->Init(target, level, internalformat, x, y, width, height, border); - } - } - - void CopyTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, - GLint y, GLsizei width, GLsizei height) { - gles2::cmds::CopyTexSubImage2D* c = - GetCmdSpace<gles2::cmds::CopyTexSubImage2D>(); - if (c) { - c->Init(target, level, xoffset, yoffset, x, y, width, height); - } - } - - void CreateProgram(uint32 client_id) { - gles2::cmds::CreateProgram* c = GetCmdSpace<gles2::cmds::CreateProgram>(); - if (c) { - c->Init(client_id); - } - } - - void CreateShader(GLenum type, uint32 client_id) { - gles2::cmds::CreateShader* c = GetCmdSpace<gles2::cmds::CreateShader>(); - if (c) { - c->Init(type, client_id); - } - } - - void CullFace(GLenum mode) { - gles2::cmds::CullFace* c = GetCmdSpace<gles2::cmds::CullFace>(); - if (c) { - c->Init(mode); - } - } - - void DeleteBuffers( - GLsizei n, uint32 buffers_shm_id, uint32 buffers_shm_offset) { - gles2::cmds::DeleteBuffers* c = GetCmdSpace<gles2::cmds::DeleteBuffers>(); - if (c) { - c->Init(n, buffers_shm_id, buffers_shm_offset); - } - } - - void DeleteBuffersImmediate(GLsizei n, const GLuint* buffers) { - const uint32 size = gles2::cmds::DeleteBuffersImmediate::ComputeSize(n); - gles2::cmds::DeleteBuffersImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::DeleteBuffersImmediate>( - size); - if (c) { - c->Init(n, buffers); - } - } - - void DeleteFramebuffers( - GLsizei n, uint32 framebuffers_shm_id, uint32 framebuffers_shm_offset) { - gles2::cmds::DeleteFramebuffers* c = - GetCmdSpace<gles2::cmds::DeleteFramebuffers>(); - if (c) { - c->Init(n, framebuffers_shm_id, framebuffers_shm_offset); - } - } - - void DeleteFramebuffersImmediate(GLsizei n, const GLuint* framebuffers) { - const uint32 size = - gles2::cmds::DeleteFramebuffersImmediate::ComputeSize(n); - gles2::cmds::DeleteFramebuffersImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::DeleteFramebuffersImmediate>( - size); - if (c) { - c->Init(n, framebuffers); - } - } - - void DeleteProgram(GLuint program) { - gles2::cmds::DeleteProgram* c = GetCmdSpace<gles2::cmds::DeleteProgram>(); - if (c) { - c->Init(program); - } - } - - void DeleteRenderbuffers( - GLsizei n, uint32 renderbuffers_shm_id, - uint32 renderbuffers_shm_offset) { - gles2::cmds::DeleteRenderbuffers* c = - GetCmdSpace<gles2::cmds::DeleteRenderbuffers>(); - if (c) { - c->Init(n, renderbuffers_shm_id, renderbuffers_shm_offset); - } - } - - void DeleteRenderbuffersImmediate(GLsizei n, const GLuint* renderbuffers) { - const uint32 size = - gles2::cmds::DeleteRenderbuffersImmediate::ComputeSize(n); - gles2::cmds::DeleteRenderbuffersImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::DeleteRenderbuffersImmediate>(size); // NOLINT - if (c) { - c->Init(n, renderbuffers); - } - } - - void DeleteShader(GLuint shader) { - gles2::cmds::DeleteShader* c = GetCmdSpace<gles2::cmds::DeleteShader>(); - if (c) { - c->Init(shader); - } - } - - void DeleteTextures( - GLsizei n, uint32 textures_shm_id, uint32 textures_shm_offset) { - gles2::cmds::DeleteTextures* c = - GetCmdSpace<gles2::cmds::DeleteTextures>(); - if (c) { - c->Init(n, textures_shm_id, textures_shm_offset); - } - } - - void DeleteTexturesImmediate(GLsizei n, const GLuint* textures) { - const uint32 size = gles2::cmds::DeleteTexturesImmediate::ComputeSize(n); - gles2::cmds::DeleteTexturesImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::DeleteTexturesImmediate>( - size); - if (c) { - c->Init(n, textures); - } - } - - void DepthFunc(GLenum func) { - gles2::cmds::DepthFunc* c = GetCmdSpace<gles2::cmds::DepthFunc>(); - if (c) { - c->Init(func); - } - } - - void DepthMask(GLboolean flag) { - gles2::cmds::DepthMask* c = GetCmdSpace<gles2::cmds::DepthMask>(); - if (c) { - c->Init(flag); - } - } - - void DepthRangef(GLclampf zNear, GLclampf zFar) { - gles2::cmds::DepthRangef* c = GetCmdSpace<gles2::cmds::DepthRangef>(); - if (c) { - c->Init(zNear, zFar); - } - } - - void DetachShader(GLuint program, GLuint shader) { - gles2::cmds::DetachShader* c = GetCmdSpace<gles2::cmds::DetachShader>(); - if (c) { - c->Init(program, shader); - } - } - - void Disable(GLenum cap) { - gles2::cmds::Disable* c = GetCmdSpace<gles2::cmds::Disable>(); - if (c) { - c->Init(cap); - } - } - - void DisableVertexAttribArray(GLuint index) { - gles2::cmds::DisableVertexAttribArray* c = - GetCmdSpace<gles2::cmds::DisableVertexAttribArray>(); - if (c) { - c->Init(index); - } - } - - void DrawArrays(GLenum mode, GLint first, GLsizei count) { - gles2::cmds::DrawArrays* c = GetCmdSpace<gles2::cmds::DrawArrays>(); - if (c) { - c->Init(mode, first, count); - } - } - - void DrawElements( - GLenum mode, GLsizei count, GLenum type, GLuint index_offset) { - gles2::cmds::DrawElements* c = GetCmdSpace<gles2::cmds::DrawElements>(); - if (c) { - c->Init(mode, count, type, index_offset); - } - } - - void Enable(GLenum cap) { - gles2::cmds::Enable* c = GetCmdSpace<gles2::cmds::Enable>(); - if (c) { - c->Init(cap); - } - } - - void EnableVertexAttribArray(GLuint index) { - gles2::cmds::EnableVertexAttribArray* c = - GetCmdSpace<gles2::cmds::EnableVertexAttribArray>(); - if (c) { - c->Init(index); - } - } - - void Finish() { - gles2::cmds::Finish* c = GetCmdSpace<gles2::cmds::Finish>(); - if (c) { - c->Init(); - } - } - - void Flush() { - gles2::cmds::Flush* c = GetCmdSpace<gles2::cmds::Flush>(); - if (c) { - c->Init(); - } - } - - void FramebufferRenderbuffer( - GLenum target, GLenum attachment, GLenum renderbuffertarget, - GLuint renderbuffer) { - gles2::cmds::FramebufferRenderbuffer* c = - GetCmdSpace<gles2::cmds::FramebufferRenderbuffer>(); - if (c) { - c->Init(target, attachment, renderbuffertarget, renderbuffer); - } - } - - void FramebufferTexture2D( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level) { - gles2::cmds::FramebufferTexture2D* c = - GetCmdSpace<gles2::cmds::FramebufferTexture2D>(); - if (c) { - c->Init(target, attachment, textarget, texture, level); - } - } - - void FrontFace(GLenum mode) { - gles2::cmds::FrontFace* c = GetCmdSpace<gles2::cmds::FrontFace>(); - if (c) { - c->Init(mode); - } - } - - void GenBuffers( - GLsizei n, uint32 buffers_shm_id, uint32 buffers_shm_offset) { - gles2::cmds::GenBuffers* c = GetCmdSpace<gles2::cmds::GenBuffers>(); - if (c) { - c->Init(n, buffers_shm_id, buffers_shm_offset); - } - } - - void GenBuffersImmediate(GLsizei n, GLuint* buffers) { - const uint32 size = gles2::cmds::GenBuffersImmediate::ComputeSize(n); - gles2::cmds::GenBuffersImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::GenBuffersImmediate>(size); - if (c) { - c->Init(n, buffers); - } - } - - void GenerateMipmap(GLenum target) { - gles2::cmds::GenerateMipmap* c = - GetCmdSpace<gles2::cmds::GenerateMipmap>(); - if (c) { - c->Init(target); - } - } - - void GenFramebuffers( - GLsizei n, uint32 framebuffers_shm_id, uint32 framebuffers_shm_offset) { - gles2::cmds::GenFramebuffers* c = - GetCmdSpace<gles2::cmds::GenFramebuffers>(); - if (c) { - c->Init(n, framebuffers_shm_id, framebuffers_shm_offset); - } - } - - void GenFramebuffersImmediate(GLsizei n, GLuint* framebuffers) { - const uint32 size = gles2::cmds::GenFramebuffersImmediate::ComputeSize(n); - gles2::cmds::GenFramebuffersImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::GenFramebuffersImmediate>( - size); - if (c) { - c->Init(n, framebuffers); - } - } - - void GenRenderbuffers( - GLsizei n, uint32 renderbuffers_shm_id, - uint32 renderbuffers_shm_offset) { - gles2::cmds::GenRenderbuffers* c = - GetCmdSpace<gles2::cmds::GenRenderbuffers>(); - if (c) { - c->Init(n, renderbuffers_shm_id, renderbuffers_shm_offset); - } - } - - void GenRenderbuffersImmediate(GLsizei n, GLuint* renderbuffers) { - const uint32 size = gles2::cmds::GenRenderbuffersImmediate::ComputeSize(n); - gles2::cmds::GenRenderbuffersImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::GenRenderbuffersImmediate>( - size); - if (c) { - c->Init(n, renderbuffers); - } - } - - void GenTextures( - GLsizei n, uint32 textures_shm_id, uint32 textures_shm_offset) { - gles2::cmds::GenTextures* c = GetCmdSpace<gles2::cmds::GenTextures>(); - if (c) { - c->Init(n, textures_shm_id, textures_shm_offset); - } - } - - void GenTexturesImmediate(GLsizei n, GLuint* textures) { - const uint32 size = gles2::cmds::GenTexturesImmediate::ComputeSize(n); - gles2::cmds::GenTexturesImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::GenTexturesImmediate>(size); - if (c) { - c->Init(n, textures); - } - } - - void GetActiveAttrib( - GLuint program, GLuint index, uint32 name_bucket_id, uint32 result_shm_id, - uint32 result_shm_offset) { - gles2::cmds::GetActiveAttrib* c = - GetCmdSpace<gles2::cmds::GetActiveAttrib>(); - if (c) { - c->Init( - program, index, name_bucket_id, result_shm_id, result_shm_offset); - } - } - - void GetActiveUniform( - GLuint program, GLuint index, uint32 name_bucket_id, uint32 result_shm_id, - uint32 result_shm_offset) { - gles2::cmds::GetActiveUniform* c = - GetCmdSpace<gles2::cmds::GetActiveUniform>(); - if (c) { - c->Init( - program, index, name_bucket_id, result_shm_id, result_shm_offset); - } - } - - void GetAttachedShaders( - GLuint program, uint32 result_shm_id, uint32 result_shm_offset, - uint32 result_size) { - gles2::cmds::GetAttachedShaders* c = - GetCmdSpace<gles2::cmds::GetAttachedShaders>(); - if (c) { - c->Init(program, result_shm_id, result_shm_offset, result_size); - } - } - - void GetBooleanv( - GLenum pname, uint32 params_shm_id, uint32 params_shm_offset) { - gles2::cmds::GetBooleanv* c = GetCmdSpace<gles2::cmds::GetBooleanv>(); - if (c) { - c->Init(pname, params_shm_id, params_shm_offset); - } - } - - void GetBufferParameteriv( - GLenum target, GLenum pname, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::GetBufferParameteriv* c = - GetCmdSpace<gles2::cmds::GetBufferParameteriv>(); - if (c) { - c->Init(target, pname, params_shm_id, params_shm_offset); - } - } - - void GetError(uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::GetError* c = GetCmdSpace<gles2::cmds::GetError>(); - if (c) { - c->Init(result_shm_id, result_shm_offset); - } - } - - void GetFloatv( - GLenum pname, uint32 params_shm_id, uint32 params_shm_offset) { - gles2::cmds::GetFloatv* c = GetCmdSpace<gles2::cmds::GetFloatv>(); - if (c) { - c->Init(pname, params_shm_id, params_shm_offset); - } - } - - void GetFramebufferAttachmentParameteriv( - GLenum target, GLenum attachment, GLenum pname, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::GetFramebufferAttachmentParameteriv* c = - GetCmdSpace<gles2::cmds::GetFramebufferAttachmentParameteriv>(); - if (c) { - c->Init(target, attachment, pname, params_shm_id, params_shm_offset); - } - } - - void GetIntegerv( - GLenum pname, uint32 params_shm_id, uint32 params_shm_offset) { - gles2::cmds::GetIntegerv* c = GetCmdSpace<gles2::cmds::GetIntegerv>(); - if (c) { - c->Init(pname, params_shm_id, params_shm_offset); - } - } - - void GetProgramiv( - GLuint program, GLenum pname, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::GetProgramiv* c = GetCmdSpace<gles2::cmds::GetProgramiv>(); - if (c) { - c->Init(program, pname, params_shm_id, params_shm_offset); - } - } - - void GetProgramInfoLog(GLuint program, uint32 bucket_id) { - gles2::cmds::GetProgramInfoLog* c = - GetCmdSpace<gles2::cmds::GetProgramInfoLog>(); - if (c) { - c->Init(program, bucket_id); - } - } - - void GetRenderbufferParameteriv( - GLenum target, GLenum pname, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::GetRenderbufferParameteriv* c = - GetCmdSpace<gles2::cmds::GetRenderbufferParameteriv>(); - if (c) { - c->Init(target, pname, params_shm_id, params_shm_offset); - } - } - - void GetShaderiv( - GLuint shader, GLenum pname, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::GetShaderiv* c = GetCmdSpace<gles2::cmds::GetShaderiv>(); - if (c) { - c->Init(shader, pname, params_shm_id, params_shm_offset); - } - } - - void GetShaderInfoLog(GLuint shader, uint32 bucket_id) { - gles2::cmds::GetShaderInfoLog* c = - GetCmdSpace<gles2::cmds::GetShaderInfoLog>(); - if (c) { - c->Init(shader, bucket_id); - } - } - - void GetShaderPrecisionFormat( - GLenum shadertype, GLenum precisiontype, uint32 result_shm_id, - uint32 result_shm_offset) { - gles2::cmds::GetShaderPrecisionFormat* c = - GetCmdSpace<gles2::cmds::GetShaderPrecisionFormat>(); - if (c) { - c->Init(shadertype, precisiontype, result_shm_id, result_shm_offset); - } - } - - void GetShaderSource(GLuint shader, uint32 bucket_id) { - gles2::cmds::GetShaderSource* c = - GetCmdSpace<gles2::cmds::GetShaderSource>(); - if (c) { - c->Init(shader, bucket_id); - } - } - - void GetString(GLenum name, uint32 bucket_id) { - gles2::cmds::GetString* c = GetCmdSpace<gles2::cmds::GetString>(); - if (c) { - c->Init(name, bucket_id); - } - } - - void GetTexParameterfv( - GLenum target, GLenum pname, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::GetTexParameterfv* c = - GetCmdSpace<gles2::cmds::GetTexParameterfv>(); - if (c) { - c->Init(target, pname, params_shm_id, params_shm_offset); - } - } - - void GetTexParameteriv( - GLenum target, GLenum pname, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::GetTexParameteriv* c = - GetCmdSpace<gles2::cmds::GetTexParameteriv>(); - if (c) { - c->Init(target, pname, params_shm_id, params_shm_offset); - } - } - - void GetUniformfv( - GLuint program, GLint location, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::GetUniformfv* c = GetCmdSpace<gles2::cmds::GetUniformfv>(); - if (c) { - c->Init(program, location, params_shm_id, params_shm_offset); - } - } - - void GetUniformiv( - GLuint program, GLint location, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::GetUniformiv* c = GetCmdSpace<gles2::cmds::GetUniformiv>(); - if (c) { - c->Init(program, location, params_shm_id, params_shm_offset); - } - } - - void GetVertexAttribfv( - GLuint index, GLenum pname, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::GetVertexAttribfv* c = - GetCmdSpace<gles2::cmds::GetVertexAttribfv>(); - if (c) { - c->Init(index, pname, params_shm_id, params_shm_offset); - } - } - - void GetVertexAttribiv( - GLuint index, GLenum pname, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::GetVertexAttribiv* c = - GetCmdSpace<gles2::cmds::GetVertexAttribiv>(); - if (c) { - c->Init(index, pname, params_shm_id, params_shm_offset); - } - } - - void GetVertexAttribPointerv( - GLuint index, GLenum pname, uint32 pointer_shm_id, - uint32 pointer_shm_offset) { - gles2::cmds::GetVertexAttribPointerv* c = - GetCmdSpace<gles2::cmds::GetVertexAttribPointerv>(); - if (c) { - c->Init(index, pname, pointer_shm_id, pointer_shm_offset); - } - } - - void Hint(GLenum target, GLenum mode) { - gles2::cmds::Hint* c = GetCmdSpace<gles2::cmds::Hint>(); - if (c) { - c->Init(target, mode); - } - } - - void IsBuffer( - GLuint buffer, uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::IsBuffer* c = GetCmdSpace<gles2::cmds::IsBuffer>(); - if (c) { - c->Init(buffer, result_shm_id, result_shm_offset); - } - } - - void IsEnabled(GLenum cap, uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::IsEnabled* c = GetCmdSpace<gles2::cmds::IsEnabled>(); - if (c) { - c->Init(cap, result_shm_id, result_shm_offset); - } - } - - void IsFramebuffer( - GLuint framebuffer, uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::IsFramebuffer* c = GetCmdSpace<gles2::cmds::IsFramebuffer>(); - if (c) { - c->Init(framebuffer, result_shm_id, result_shm_offset); - } - } - - void IsProgram( - GLuint program, uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::IsProgram* c = GetCmdSpace<gles2::cmds::IsProgram>(); - if (c) { - c->Init(program, result_shm_id, result_shm_offset); - } - } - - void IsRenderbuffer( - GLuint renderbuffer, uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::IsRenderbuffer* c = - GetCmdSpace<gles2::cmds::IsRenderbuffer>(); - if (c) { - c->Init(renderbuffer, result_shm_id, result_shm_offset); - } - } - - void IsShader( - GLuint shader, uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::IsShader* c = GetCmdSpace<gles2::cmds::IsShader>(); - if (c) { - c->Init(shader, result_shm_id, result_shm_offset); - } - } - - void IsTexture( - GLuint texture, uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::IsTexture* c = GetCmdSpace<gles2::cmds::IsTexture>(); - if (c) { - c->Init(texture, result_shm_id, result_shm_offset); - } - } - - void LineWidth(GLfloat width) { - gles2::cmds::LineWidth* c = GetCmdSpace<gles2::cmds::LineWidth>(); - if (c) { - c->Init(width); - } - } - - void LinkProgram(GLuint program) { - gles2::cmds::LinkProgram* c = GetCmdSpace<gles2::cmds::LinkProgram>(); - if (c) { - c->Init(program); - } - } - - void PixelStorei(GLenum pname, GLint param) { - gles2::cmds::PixelStorei* c = GetCmdSpace<gles2::cmds::PixelStorei>(); - if (c) { - c->Init(pname, param); - } - } - - void PolygonOffset(GLfloat factor, GLfloat units) { - gles2::cmds::PolygonOffset* c = GetCmdSpace<gles2::cmds::PolygonOffset>(); - if (c) { - c->Init(factor, units); - } - } - - void ReadPixels( - GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, - GLenum type, uint32 pixels_shm_id, uint32 pixels_shm_offset, - uint32 result_shm_id, uint32 result_shm_offset, GLboolean async) { - gles2::cmds::ReadPixels* c = GetCmdSpace<gles2::cmds::ReadPixels>(); - if (c) { - c->Init( - x, y, width, height, format, type, pixels_shm_id, pixels_shm_offset, - result_shm_id, result_shm_offset, async); - } - } - - void ReleaseShaderCompiler() { - gles2::cmds::ReleaseShaderCompiler* c = - GetCmdSpace<gles2::cmds::ReleaseShaderCompiler>(); - if (c) { - c->Init(); - } - } - - void RenderbufferStorage( - GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { - gles2::cmds::RenderbufferStorage* c = - GetCmdSpace<gles2::cmds::RenderbufferStorage>(); - if (c) { - c->Init(target, internalformat, width, height); - } - } - - void SampleCoverage(GLclampf value, GLboolean invert) { - gles2::cmds::SampleCoverage* c = - GetCmdSpace<gles2::cmds::SampleCoverage>(); - if (c) { - c->Init(value, invert); - } - } - - void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) { - gles2::cmds::Scissor* c = GetCmdSpace<gles2::cmds::Scissor>(); - if (c) { - c->Init(x, y, width, height); - } - } - - void ShaderBinary( - GLsizei n, uint32 shaders_shm_id, uint32 shaders_shm_offset, - GLenum binaryformat, uint32 binary_shm_id, uint32 binary_shm_offset, - GLsizei length) { - gles2::cmds::ShaderBinary* c = GetCmdSpace<gles2::cmds::ShaderBinary>(); - if (c) { - c->Init( - n, shaders_shm_id, shaders_shm_offset, binaryformat, binary_shm_id, - binary_shm_offset, length); - } - } - - void ShaderSource( - GLuint shader, uint32 data_shm_id, uint32 data_shm_offset, - uint32 data_size) { - gles2::cmds::ShaderSource* c = GetCmdSpace<gles2::cmds::ShaderSource>(); - if (c) { - c->Init(shader, data_shm_id, data_shm_offset, data_size); - } - } - - void ShaderSourceBucket(GLuint shader, uint32 data_bucket_id) { - gles2::cmds::ShaderSourceBucket* c = - GetCmdSpace<gles2::cmds::ShaderSourceBucket>(); - if (c) { - c->Init(shader, data_bucket_id); - } - } - - void StencilFunc(GLenum func, GLint ref, GLuint mask) { - gles2::cmds::StencilFunc* c = GetCmdSpace<gles2::cmds::StencilFunc>(); - if (c) { - c->Init(func, ref, mask); - } - } - - void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) { - gles2::cmds::StencilFuncSeparate* c = - GetCmdSpace<gles2::cmds::StencilFuncSeparate>(); - if (c) { - c->Init(face, func, ref, mask); - } - } - - void StencilMask(GLuint mask) { - gles2::cmds::StencilMask* c = GetCmdSpace<gles2::cmds::StencilMask>(); - if (c) { - c->Init(mask); - } - } - - void StencilMaskSeparate(GLenum face, GLuint mask) { - gles2::cmds::StencilMaskSeparate* c = - GetCmdSpace<gles2::cmds::StencilMaskSeparate>(); - if (c) { - c->Init(face, mask); - } - } - - void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) { - gles2::cmds::StencilOp* c = GetCmdSpace<gles2::cmds::StencilOp>(); - if (c) { - c->Init(fail, zfail, zpass); - } - } - - void StencilOpSeparate( - GLenum face, GLenum fail, GLenum zfail, GLenum zpass) { - gles2::cmds::StencilOpSeparate* c = - GetCmdSpace<gles2::cmds::StencilOpSeparate>(); - if (c) { - c->Init(face, fail, zfail, zpass); - } - } - - void TexImage2D( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - uint32 pixels_shm_id, uint32 pixels_shm_offset) { - gles2::cmds::TexImage2D* c = GetCmdSpace<gles2::cmds::TexImage2D>(); - if (c) { - c->Init( - target, level, internalformat, width, height, border, format, type, - pixels_shm_id, pixels_shm_offset); - } - } - - void TexParameterf(GLenum target, GLenum pname, GLfloat param) { - gles2::cmds::TexParameterf* c = GetCmdSpace<gles2::cmds::TexParameterf>(); - if (c) { - c->Init(target, pname, param); - } - } - - void TexParameterfv( - GLenum target, GLenum pname, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::TexParameterfv* c = - GetCmdSpace<gles2::cmds::TexParameterfv>(); - if (c) { - c->Init(target, pname, params_shm_id, params_shm_offset); - } - } - - void TexParameterfvImmediate( - GLenum target, GLenum pname, const GLfloat* params) { - const uint32 size = gles2::cmds::TexParameterfvImmediate::ComputeSize(); - gles2::cmds::TexParameterfvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::TexParameterfvImmediate>( - size); - if (c) { - c->Init(target, pname, params); - } - } +void AttachShader(GLuint program, GLuint shader) { + gles2::cmds::AttachShader* c = GetCmdSpace<gles2::cmds::AttachShader>(); + if (c) { + c->Init(program, shader); + } +} - void TexParameteri(GLenum target, GLenum pname, GLint param) { - gles2::cmds::TexParameteri* c = GetCmdSpace<gles2::cmds::TexParameteri>(); - if (c) { - c->Init(target, pname, param); - } - } +void BindAttribLocationBucket(GLuint program, + GLuint index, + uint32_t name_bucket_id) { + gles2::cmds::BindAttribLocationBucket* c = + GetCmdSpace<gles2::cmds::BindAttribLocationBucket>(); + if (c) { + c->Init(program, index, name_bucket_id); + } +} + +void BindBuffer(GLenum target, GLuint buffer) { + gles2::cmds::BindBuffer* c = GetCmdSpace<gles2::cmds::BindBuffer>(); + if (c) { + c->Init(target, buffer); + } +} + +void BindFramebuffer(GLenum target, GLuint framebuffer) { + gles2::cmds::BindFramebuffer* c = GetCmdSpace<gles2::cmds::BindFramebuffer>(); + if (c) { + c->Init(target, framebuffer); + } +} - void TexParameteriv( - GLenum target, GLenum pname, uint32 params_shm_id, - uint32 params_shm_offset) { - gles2::cmds::TexParameteriv* c = - GetCmdSpace<gles2::cmds::TexParameteriv>(); - if (c) { - c->Init(target, pname, params_shm_id, params_shm_offset); - } +void BindRenderbuffer(GLenum target, GLuint renderbuffer) { + gles2::cmds::BindRenderbuffer* c = + GetCmdSpace<gles2::cmds::BindRenderbuffer>(); + if (c) { + c->Init(target, renderbuffer); } +} - void TexParameterivImmediate( - GLenum target, GLenum pname, const GLint* params) { - const uint32 size = gles2::cmds::TexParameterivImmediate::ComputeSize(); - gles2::cmds::TexParameterivImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::TexParameterivImmediate>( - size); - if (c) { - c->Init(target, pname, params); - } +void BindTexture(GLenum target, GLuint texture) { + gles2::cmds::BindTexture* c = GetCmdSpace<gles2::cmds::BindTexture>(); + if (c) { + c->Init(target, texture); } +} - void TexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, uint32 pixels_shm_id, - uint32 pixels_shm_offset, GLboolean internal) { - gles2::cmds::TexSubImage2D* c = GetCmdSpace<gles2::cmds::TexSubImage2D>(); - if (c) { - c->Init( - target, level, xoffset, yoffset, width, height, format, type, - pixels_shm_id, pixels_shm_offset, internal); - } - } - - void Uniform1f(GLint location, GLfloat x) { - gles2::cmds::Uniform1f* c = GetCmdSpace<gles2::cmds::Uniform1f>(); - if (c) { - c->Init(location, x); - } - } - - void Uniform1fv( - GLint location, GLsizei count, uint32 v_shm_id, uint32 v_shm_offset) { - gles2::cmds::Uniform1fv* c = GetCmdSpace<gles2::cmds::Uniform1fv>(); - if (c) { - c->Init(location, count, v_shm_id, v_shm_offset); - } - } - - void Uniform1fvImmediate(GLint location, GLsizei count, const GLfloat* v) { - const uint32 size = gles2::cmds::Uniform1fvImmediate::ComputeSize(count); - gles2::cmds::Uniform1fvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform1fvImmediate>(size); - if (c) { - c->Init(location, count, v); - } - } - - void Uniform1i(GLint location, GLint x) { - gles2::cmds::Uniform1i* c = GetCmdSpace<gles2::cmds::Uniform1i>(); - if (c) { - c->Init(location, x); - } +void BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { + gles2::cmds::BlendColor* c = GetCmdSpace<gles2::cmds::BlendColor>(); + if (c) { + c->Init(red, green, blue, alpha); } - - void Uniform1iv( - GLint location, GLsizei count, uint32 v_shm_id, uint32 v_shm_offset) { - gles2::cmds::Uniform1iv* c = GetCmdSpace<gles2::cmds::Uniform1iv>(); - if (c) { - c->Init(location, count, v_shm_id, v_shm_offset); - } +} + +void BlendEquation(GLenum mode) { + gles2::cmds::BlendEquation* c = GetCmdSpace<gles2::cmds::BlendEquation>(); + if (c) { + c->Init(mode); } - - void Uniform1ivImmediate(GLint location, GLsizei count, const GLint* v) { - const uint32 size = gles2::cmds::Uniform1ivImmediate::ComputeSize(count); - gles2::cmds::Uniform1ivImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform1ivImmediate>(size); - if (c) { - c->Init(location, count, v); - } - } - - void Uniform2f(GLint location, GLfloat x, GLfloat y) { - gles2::cmds::Uniform2f* c = GetCmdSpace<gles2::cmds::Uniform2f>(); - if (c) { - c->Init(location, x, y); - } +} + +void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) { + gles2::cmds::BlendEquationSeparate* c = + GetCmdSpace<gles2::cmds::BlendEquationSeparate>(); + if (c) { + c->Init(modeRGB, modeAlpha); } - - void Uniform2fv( - GLint location, GLsizei count, uint32 v_shm_id, uint32 v_shm_offset) { - gles2::cmds::Uniform2fv* c = GetCmdSpace<gles2::cmds::Uniform2fv>(); - if (c) { - c->Init(location, count, v_shm_id, v_shm_offset); - } - } - - void Uniform2fvImmediate(GLint location, GLsizei count, const GLfloat* v) { - const uint32 size = gles2::cmds::Uniform2fvImmediate::ComputeSize(count); - gles2::cmds::Uniform2fvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform2fvImmediate>(size); - if (c) { - c->Init(location, count, v); - } - } - - void Uniform2i(GLint location, GLint x, GLint y) { - gles2::cmds::Uniform2i* c = GetCmdSpace<gles2::cmds::Uniform2i>(); - if (c) { - c->Init(location, x, y); - } - } - - void Uniform2iv( - GLint location, GLsizei count, uint32 v_shm_id, uint32 v_shm_offset) { - gles2::cmds::Uniform2iv* c = GetCmdSpace<gles2::cmds::Uniform2iv>(); - if (c) { - c->Init(location, count, v_shm_id, v_shm_offset); - } +} + +void BlendFunc(GLenum sfactor, GLenum dfactor) { + gles2::cmds::BlendFunc* c = GetCmdSpace<gles2::cmds::BlendFunc>(); + if (c) { + c->Init(sfactor, dfactor); + } +} + +void BlendFuncSeparate(GLenum srcRGB, + GLenum dstRGB, + GLenum srcAlpha, + GLenum dstAlpha) { + gles2::cmds::BlendFuncSeparate* c = + GetCmdSpace<gles2::cmds::BlendFuncSeparate>(); + if (c) { + c->Init(srcRGB, dstRGB, srcAlpha, dstAlpha); + } +} + +void BufferData(GLenum target, + GLsizeiptr size, + uint32_t data_shm_id, + uint32_t data_shm_offset, + GLenum usage) { + gles2::cmds::BufferData* c = GetCmdSpace<gles2::cmds::BufferData>(); + if (c) { + c->Init(target, size, data_shm_id, data_shm_offset, usage); + } +} + +void BufferSubData(GLenum target, + GLintptr offset, + GLsizeiptr size, + uint32_t data_shm_id, + uint32_t data_shm_offset) { + gles2::cmds::BufferSubData* c = GetCmdSpace<gles2::cmds::BufferSubData>(); + if (c) { + c->Init(target, offset, size, data_shm_id, data_shm_offset); + } +} + +void CheckFramebufferStatus(GLenum target, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::CheckFramebufferStatus* c = + GetCmdSpace<gles2::cmds::CheckFramebufferStatus>(); + if (c) { + c->Init(target, result_shm_id, result_shm_offset); + } +} + +void Clear(GLbitfield mask) { + gles2::cmds::Clear* c = GetCmdSpace<gles2::cmds::Clear>(); + if (c) { + c->Init(mask); + } +} + +void ClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { + gles2::cmds::ClearColor* c = GetCmdSpace<gles2::cmds::ClearColor>(); + if (c) { + c->Init(red, green, blue, alpha); + } +} + +void ClearDepthf(GLclampf depth) { + gles2::cmds::ClearDepthf* c = GetCmdSpace<gles2::cmds::ClearDepthf>(); + if (c) { + c->Init(depth); + } +} + +void ClearStencil(GLint s) { + gles2::cmds::ClearStencil* c = GetCmdSpace<gles2::cmds::ClearStencil>(); + if (c) { + c->Init(s); + } +} + +void ColorMask(GLboolean red, + GLboolean green, + GLboolean blue, + GLboolean alpha) { + gles2::cmds::ColorMask* c = GetCmdSpace<gles2::cmds::ColorMask>(); + if (c) { + c->Init(red, green, blue, alpha); + } +} + +void CompileShader(GLuint shader) { + gles2::cmds::CompileShader* c = GetCmdSpace<gles2::cmds::CompileShader>(); + if (c) { + c->Init(shader); + } +} + +void CompressedTexImage2DBucket(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLuint bucket_id) { + gles2::cmds::CompressedTexImage2DBucket* c = + GetCmdSpace<gles2::cmds::CompressedTexImage2DBucket>(); + if (c) { + c->Init(target, level, internalformat, width, height, bucket_id); + } +} + +void CompressedTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLsizei imageSize, + uint32_t data_shm_id, + uint32_t data_shm_offset) { + gles2::cmds::CompressedTexImage2D* c = + GetCmdSpace<gles2::cmds::CompressedTexImage2D>(); + if (c) { + c->Init(target, + level, + internalformat, + width, + height, + imageSize, + data_shm_id, + data_shm_offset); + } +} + +void CompressedTexSubImage2DBucket(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLuint bucket_id) { + gles2::cmds::CompressedTexSubImage2DBucket* c = + GetCmdSpace<gles2::cmds::CompressedTexSubImage2DBucket>(); + if (c) { + c->Init(target, level, xoffset, yoffset, width, height, format, bucket_id); + } +} + +void CompressedTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLsizei imageSize, + uint32_t data_shm_id, + uint32_t data_shm_offset) { + gles2::cmds::CompressedTexSubImage2D* c = + GetCmdSpace<gles2::cmds::CompressedTexSubImage2D>(); + if (c) { + c->Init(target, + level, + xoffset, + yoffset, + width, + height, + format, + imageSize, + data_shm_id, + data_shm_offset); + } +} + +void CopyTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLint x, + GLint y, + GLsizei width, + GLsizei height) { + gles2::cmds::CopyTexImage2D* c = GetCmdSpace<gles2::cmds::CopyTexImage2D>(); + if (c) { + c->Init(target, level, internalformat, x, y, width, height); + } +} + +void CopyTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLint x, + GLint y, + GLsizei width, + GLsizei height) { + gles2::cmds::CopyTexSubImage2D* c = + GetCmdSpace<gles2::cmds::CopyTexSubImage2D>(); + if (c) { + c->Init(target, level, xoffset, yoffset, x, y, width, height); + } +} + +void CreateProgram(uint32_t client_id) { + gles2::cmds::CreateProgram* c = GetCmdSpace<gles2::cmds::CreateProgram>(); + if (c) { + c->Init(client_id); + } +} + +void CreateShader(GLenum type, uint32_t client_id) { + gles2::cmds::CreateShader* c = GetCmdSpace<gles2::cmds::CreateShader>(); + if (c) { + c->Init(type, client_id); + } +} + +void CullFace(GLenum mode) { + gles2::cmds::CullFace* c = GetCmdSpace<gles2::cmds::CullFace>(); + if (c) { + c->Init(mode); + } +} + +void DeleteBuffersImmediate(GLsizei n, const GLuint* buffers) { + const uint32_t size = gles2::cmds::DeleteBuffersImmediate::ComputeSize(n); + gles2::cmds::DeleteBuffersImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::DeleteBuffersImmediate>(size); + if (c) { + c->Init(n, buffers); + } +} + +void DeleteFramebuffersImmediate(GLsizei n, const GLuint* framebuffers) { + const uint32_t size = + gles2::cmds::DeleteFramebuffersImmediate::ComputeSize(n); + gles2::cmds::DeleteFramebuffersImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::DeleteFramebuffersImmediate>( + size); + if (c) { + c->Init(n, framebuffers); + } +} + +void DeleteProgram(GLuint program) { + gles2::cmds::DeleteProgram* c = GetCmdSpace<gles2::cmds::DeleteProgram>(); + if (c) { + c->Init(program); + } +} + +void DeleteRenderbuffersImmediate(GLsizei n, const GLuint* renderbuffers) { + const uint32_t size = + gles2::cmds::DeleteRenderbuffersImmediate::ComputeSize(n); + gles2::cmds::DeleteRenderbuffersImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::DeleteRenderbuffersImmediate>( + size); + if (c) { + c->Init(n, renderbuffers); + } +} + +void DeleteShader(GLuint shader) { + gles2::cmds::DeleteShader* c = GetCmdSpace<gles2::cmds::DeleteShader>(); + if (c) { + c->Init(shader); + } +} + +void DeleteTexturesImmediate(GLsizei n, const GLuint* textures) { + const uint32_t size = gles2::cmds::DeleteTexturesImmediate::ComputeSize(n); + gles2::cmds::DeleteTexturesImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::DeleteTexturesImmediate>(size); + if (c) { + c->Init(n, textures); + } +} + +void DepthFunc(GLenum func) { + gles2::cmds::DepthFunc* c = GetCmdSpace<gles2::cmds::DepthFunc>(); + if (c) { + c->Init(func); + } +} + +void DepthMask(GLboolean flag) { + gles2::cmds::DepthMask* c = GetCmdSpace<gles2::cmds::DepthMask>(); + if (c) { + c->Init(flag); + } +} + +void DepthRangef(GLclampf zNear, GLclampf zFar) { + gles2::cmds::DepthRangef* c = GetCmdSpace<gles2::cmds::DepthRangef>(); + if (c) { + c->Init(zNear, zFar); } +} - void Uniform2ivImmediate(GLint location, GLsizei count, const GLint* v) { - const uint32 size = gles2::cmds::Uniform2ivImmediate::ComputeSize(count); - gles2::cmds::Uniform2ivImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform2ivImmediate>(size); - if (c) { - c->Init(location, count, v); - } - } +void DetachShader(GLuint program, GLuint shader) { + gles2::cmds::DetachShader* c = GetCmdSpace<gles2::cmds::DetachShader>(); + if (c) { + c->Init(program, shader); + } +} - void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) { - gles2::cmds::Uniform3f* c = GetCmdSpace<gles2::cmds::Uniform3f>(); - if (c) { - c->Init(location, x, y, z); - } - } +void Disable(GLenum cap) { + gles2::cmds::Disable* c = GetCmdSpace<gles2::cmds::Disable>(); + if (c) { + c->Init(cap); + } +} - void Uniform3fv( - GLint location, GLsizei count, uint32 v_shm_id, uint32 v_shm_offset) { - gles2::cmds::Uniform3fv* c = GetCmdSpace<gles2::cmds::Uniform3fv>(); - if (c) { - c->Init(location, count, v_shm_id, v_shm_offset); - } - } - - void Uniform3fvImmediate(GLint location, GLsizei count, const GLfloat* v) { - const uint32 size = gles2::cmds::Uniform3fvImmediate::ComputeSize(count); - gles2::cmds::Uniform3fvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform3fvImmediate>(size); - if (c) { - c->Init(location, count, v); - } - } - - void Uniform3i(GLint location, GLint x, GLint y, GLint z) { - gles2::cmds::Uniform3i* c = GetCmdSpace<gles2::cmds::Uniform3i>(); - if (c) { - c->Init(location, x, y, z); - } - } - - void Uniform3iv( - GLint location, GLsizei count, uint32 v_shm_id, uint32 v_shm_offset) { - gles2::cmds::Uniform3iv* c = GetCmdSpace<gles2::cmds::Uniform3iv>(); - if (c) { - c->Init(location, count, v_shm_id, v_shm_offset); - } - } - - void Uniform3ivImmediate(GLint location, GLsizei count, const GLint* v) { - const uint32 size = gles2::cmds::Uniform3ivImmediate::ComputeSize(count); - gles2::cmds::Uniform3ivImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform3ivImmediate>(size); - if (c) { - c->Init(location, count, v); - } - } - - void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { - gles2::cmds::Uniform4f* c = GetCmdSpace<gles2::cmds::Uniform4f>(); - if (c) { - c->Init(location, x, y, z, w); - } - } - - void Uniform4fv( - GLint location, GLsizei count, uint32 v_shm_id, uint32 v_shm_offset) { - gles2::cmds::Uniform4fv* c = GetCmdSpace<gles2::cmds::Uniform4fv>(); - if (c) { - c->Init(location, count, v_shm_id, v_shm_offset); - } - } - - void Uniform4fvImmediate(GLint location, GLsizei count, const GLfloat* v) { - const uint32 size = gles2::cmds::Uniform4fvImmediate::ComputeSize(count); - gles2::cmds::Uniform4fvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform4fvImmediate>(size); - if (c) { - c->Init(location, count, v); - } - } - - void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) { - gles2::cmds::Uniform4i* c = GetCmdSpace<gles2::cmds::Uniform4i>(); - if (c) { - c->Init(location, x, y, z, w); - } - } - - void Uniform4iv( - GLint location, GLsizei count, uint32 v_shm_id, uint32 v_shm_offset) { - gles2::cmds::Uniform4iv* c = GetCmdSpace<gles2::cmds::Uniform4iv>(); - if (c) { - c->Init(location, count, v_shm_id, v_shm_offset); - } - } - - void Uniform4ivImmediate(GLint location, GLsizei count, const GLint* v) { - const uint32 size = gles2::cmds::Uniform4ivImmediate::ComputeSize(count); - gles2::cmds::Uniform4ivImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform4ivImmediate>(size); - if (c) { - c->Init(location, count, v); - } - } - - void UniformMatrix2fv( - GLint location, GLsizei count, GLboolean transpose, uint32 value_shm_id, - uint32 value_shm_offset) { - gles2::cmds::UniformMatrix2fv* c = - GetCmdSpace<gles2::cmds::UniformMatrix2fv>(); - if (c) { - c->Init(location, count, transpose, value_shm_id, value_shm_offset); - } - } - - void UniformMatrix2fvImmediate( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) { - const uint32 size = - gles2::cmds::UniformMatrix2fvImmediate::ComputeSize(count); - gles2::cmds::UniformMatrix2fvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix2fvImmediate>( - size); - if (c) { - c->Init(location, count, transpose, value); - } - } - - void UniformMatrix3fv( - GLint location, GLsizei count, GLboolean transpose, uint32 value_shm_id, - uint32 value_shm_offset) { - gles2::cmds::UniformMatrix3fv* c = - GetCmdSpace<gles2::cmds::UniformMatrix3fv>(); - if (c) { - c->Init(location, count, transpose, value_shm_id, value_shm_offset); - } - } - - void UniformMatrix3fvImmediate( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) { - const uint32 size = - gles2::cmds::UniformMatrix3fvImmediate::ComputeSize(count); - gles2::cmds::UniformMatrix3fvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix3fvImmediate>( +void DisableVertexAttribArray(GLuint index) { + gles2::cmds::DisableVertexAttribArray* c = + GetCmdSpace<gles2::cmds::DisableVertexAttribArray>(); + if (c) { + c->Init(index); + } +} + +void DrawArrays(GLenum mode, GLint first, GLsizei count) { + gles2::cmds::DrawArrays* c = GetCmdSpace<gles2::cmds::DrawArrays>(); + if (c) { + c->Init(mode, first, count); + } +} + +void DrawElements(GLenum mode, + GLsizei count, + GLenum type, + GLuint index_offset) { + gles2::cmds::DrawElements* c = GetCmdSpace<gles2::cmds::DrawElements>(); + if (c) { + c->Init(mode, count, type, index_offset); + } +} + +void Enable(GLenum cap) { + gles2::cmds::Enable* c = GetCmdSpace<gles2::cmds::Enable>(); + if (c) { + c->Init(cap); + } +} + +void EnableVertexAttribArray(GLuint index) { + gles2::cmds::EnableVertexAttribArray* c = + GetCmdSpace<gles2::cmds::EnableVertexAttribArray>(); + if (c) { + c->Init(index); + } +} + +void Finish() { + gles2::cmds::Finish* c = GetCmdSpace<gles2::cmds::Finish>(); + if (c) { + c->Init(); + } +} + +void Flush() { + gles2::cmds::Flush* c = GetCmdSpace<gles2::cmds::Flush>(); + if (c) { + c->Init(); + } +} + +void FramebufferRenderbuffer(GLenum target, + GLenum attachment, + GLenum renderbuffertarget, + GLuint renderbuffer) { + gles2::cmds::FramebufferRenderbuffer* c = + GetCmdSpace<gles2::cmds::FramebufferRenderbuffer>(); + if (c) { + c->Init(target, attachment, renderbuffertarget, renderbuffer); + } +} + +void FramebufferTexture2D(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture) { + gles2::cmds::FramebufferTexture2D* c = + GetCmdSpace<gles2::cmds::FramebufferTexture2D>(); + if (c) { + c->Init(target, attachment, textarget, texture); + } +} + +void FrontFace(GLenum mode) { + gles2::cmds::FrontFace* c = GetCmdSpace<gles2::cmds::FrontFace>(); + if (c) { + c->Init(mode); + } +} + +void GenBuffersImmediate(GLsizei n, GLuint* buffers) { + const uint32_t size = gles2::cmds::GenBuffersImmediate::ComputeSize(n); + gles2::cmds::GenBuffersImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::GenBuffersImmediate>(size); + if (c) { + c->Init(n, buffers); + } +} + +void GenerateMipmap(GLenum target) { + gles2::cmds::GenerateMipmap* c = GetCmdSpace<gles2::cmds::GenerateMipmap>(); + if (c) { + c->Init(target); + } +} + +void GenFramebuffersImmediate(GLsizei n, GLuint* framebuffers) { + const uint32_t size = gles2::cmds::GenFramebuffersImmediate::ComputeSize(n); + gles2::cmds::GenFramebuffersImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::GenFramebuffersImmediate>( + size); + if (c) { + c->Init(n, framebuffers); + } +} + +void GenRenderbuffersImmediate(GLsizei n, GLuint* renderbuffers) { + const uint32_t size = gles2::cmds::GenRenderbuffersImmediate::ComputeSize(n); + gles2::cmds::GenRenderbuffersImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::GenRenderbuffersImmediate>( + size); + if (c) { + c->Init(n, renderbuffers); + } +} + +void GenTexturesImmediate(GLsizei n, GLuint* textures) { + const uint32_t size = gles2::cmds::GenTexturesImmediate::ComputeSize(n); + gles2::cmds::GenTexturesImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::GenTexturesImmediate>(size); + if (c) { + c->Init(n, textures); + } +} + +void GetActiveAttrib(GLuint program, + GLuint index, + uint32_t name_bucket_id, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::GetActiveAttrib* c = GetCmdSpace<gles2::cmds::GetActiveAttrib>(); + if (c) { + c->Init(program, index, name_bucket_id, result_shm_id, result_shm_offset); + } +} + +void GetActiveUniform(GLuint program, + GLuint index, + uint32_t name_bucket_id, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::GetActiveUniform* c = + GetCmdSpace<gles2::cmds::GetActiveUniform>(); + if (c) { + c->Init(program, index, name_bucket_id, result_shm_id, result_shm_offset); + } +} + +void GetAttachedShaders(GLuint program, + uint32_t result_shm_id, + uint32_t result_shm_offset, + uint32_t result_size) { + gles2::cmds::GetAttachedShaders* c = + GetCmdSpace<gles2::cmds::GetAttachedShaders>(); + if (c) { + c->Init(program, result_shm_id, result_shm_offset, result_size); + } +} + +void GetBooleanv(GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetBooleanv* c = GetCmdSpace<gles2::cmds::GetBooleanv>(); + if (c) { + c->Init(pname, params_shm_id, params_shm_offset); + } +} + +void GetBufferParameteriv(GLenum target, + GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetBufferParameteriv* c = + GetCmdSpace<gles2::cmds::GetBufferParameteriv>(); + if (c) { + c->Init(target, pname, params_shm_id, params_shm_offset); + } +} + +void GetError(uint32_t result_shm_id, uint32_t result_shm_offset) { + gles2::cmds::GetError* c = GetCmdSpace<gles2::cmds::GetError>(); + if (c) { + c->Init(result_shm_id, result_shm_offset); + } +} + +void GetFloatv(GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetFloatv* c = GetCmdSpace<gles2::cmds::GetFloatv>(); + if (c) { + c->Init(pname, params_shm_id, params_shm_offset); + } +} + +void GetFramebufferAttachmentParameteriv(GLenum target, + GLenum attachment, + GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetFramebufferAttachmentParameteriv* c = + GetCmdSpace<gles2::cmds::GetFramebufferAttachmentParameteriv>(); + if (c) { + c->Init(target, attachment, pname, params_shm_id, params_shm_offset); + } +} + +void GetIntegerv(GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetIntegerv* c = GetCmdSpace<gles2::cmds::GetIntegerv>(); + if (c) { + c->Init(pname, params_shm_id, params_shm_offset); + } +} + +void GetProgramiv(GLuint program, + GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetProgramiv* c = GetCmdSpace<gles2::cmds::GetProgramiv>(); + if (c) { + c->Init(program, pname, params_shm_id, params_shm_offset); + } +} + +void GetProgramInfoLog(GLuint program, uint32_t bucket_id) { + gles2::cmds::GetProgramInfoLog* c = + GetCmdSpace<gles2::cmds::GetProgramInfoLog>(); + if (c) { + c->Init(program, bucket_id); + } +} + +void GetRenderbufferParameteriv(GLenum target, + GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetRenderbufferParameteriv* c = + GetCmdSpace<gles2::cmds::GetRenderbufferParameteriv>(); + if (c) { + c->Init(target, pname, params_shm_id, params_shm_offset); + } +} + +void GetShaderiv(GLuint shader, + GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetShaderiv* c = GetCmdSpace<gles2::cmds::GetShaderiv>(); + if (c) { + c->Init(shader, pname, params_shm_id, params_shm_offset); + } +} + +void GetShaderInfoLog(GLuint shader, uint32_t bucket_id) { + gles2::cmds::GetShaderInfoLog* c = + GetCmdSpace<gles2::cmds::GetShaderInfoLog>(); + if (c) { + c->Init(shader, bucket_id); + } +} + +void GetShaderPrecisionFormat(GLenum shadertype, + GLenum precisiontype, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::GetShaderPrecisionFormat* c = + GetCmdSpace<gles2::cmds::GetShaderPrecisionFormat>(); + if (c) { + c->Init(shadertype, precisiontype, result_shm_id, result_shm_offset); + } +} + +void GetShaderSource(GLuint shader, uint32_t bucket_id) { + gles2::cmds::GetShaderSource* c = GetCmdSpace<gles2::cmds::GetShaderSource>(); + if (c) { + c->Init(shader, bucket_id); + } +} + +void GetString(GLenum name, uint32_t bucket_id) { + gles2::cmds::GetString* c = GetCmdSpace<gles2::cmds::GetString>(); + if (c) { + c->Init(name, bucket_id); + } +} + +void GetTexParameterfv(GLenum target, + GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetTexParameterfv* c = + GetCmdSpace<gles2::cmds::GetTexParameterfv>(); + if (c) { + c->Init(target, pname, params_shm_id, params_shm_offset); + } +} + +void GetTexParameteriv(GLenum target, + GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetTexParameteriv* c = + GetCmdSpace<gles2::cmds::GetTexParameteriv>(); + if (c) { + c->Init(target, pname, params_shm_id, params_shm_offset); + } +} + +void GetUniformfv(GLuint program, + GLint location, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetUniformfv* c = GetCmdSpace<gles2::cmds::GetUniformfv>(); + if (c) { + c->Init(program, location, params_shm_id, params_shm_offset); + } +} + +void GetUniformiv(GLuint program, + GLint location, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetUniformiv* c = GetCmdSpace<gles2::cmds::GetUniformiv>(); + if (c) { + c->Init(program, location, params_shm_id, params_shm_offset); + } +} + +void GetVertexAttribfv(GLuint index, + GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetVertexAttribfv* c = + GetCmdSpace<gles2::cmds::GetVertexAttribfv>(); + if (c) { + c->Init(index, pname, params_shm_id, params_shm_offset); + } +} + +void GetVertexAttribiv(GLuint index, + GLenum pname, + uint32_t params_shm_id, + uint32_t params_shm_offset) { + gles2::cmds::GetVertexAttribiv* c = + GetCmdSpace<gles2::cmds::GetVertexAttribiv>(); + if (c) { + c->Init(index, pname, params_shm_id, params_shm_offset); + } +} + +void GetVertexAttribPointerv(GLuint index, + GLenum pname, + uint32_t pointer_shm_id, + uint32_t pointer_shm_offset) { + gles2::cmds::GetVertexAttribPointerv* c = + GetCmdSpace<gles2::cmds::GetVertexAttribPointerv>(); + if (c) { + c->Init(index, pname, pointer_shm_id, pointer_shm_offset); + } +} + +void Hint(GLenum target, GLenum mode) { + gles2::cmds::Hint* c = GetCmdSpace<gles2::cmds::Hint>(); + if (c) { + c->Init(target, mode); + } +} + +void IsBuffer(GLuint buffer, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::IsBuffer* c = GetCmdSpace<gles2::cmds::IsBuffer>(); + if (c) { + c->Init(buffer, result_shm_id, result_shm_offset); + } +} + +void IsEnabled(GLenum cap, uint32_t result_shm_id, uint32_t result_shm_offset) { + gles2::cmds::IsEnabled* c = GetCmdSpace<gles2::cmds::IsEnabled>(); + if (c) { + c->Init(cap, result_shm_id, result_shm_offset); + } +} + +void IsFramebuffer(GLuint framebuffer, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::IsFramebuffer* c = GetCmdSpace<gles2::cmds::IsFramebuffer>(); + if (c) { + c->Init(framebuffer, result_shm_id, result_shm_offset); + } +} + +void IsProgram(GLuint program, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::IsProgram* c = GetCmdSpace<gles2::cmds::IsProgram>(); + if (c) { + c->Init(program, result_shm_id, result_shm_offset); + } +} + +void IsRenderbuffer(GLuint renderbuffer, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::IsRenderbuffer* c = GetCmdSpace<gles2::cmds::IsRenderbuffer>(); + if (c) { + c->Init(renderbuffer, result_shm_id, result_shm_offset); + } +} + +void IsShader(GLuint shader, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::IsShader* c = GetCmdSpace<gles2::cmds::IsShader>(); + if (c) { + c->Init(shader, result_shm_id, result_shm_offset); + } +} + +void IsTexture(GLuint texture, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::IsTexture* c = GetCmdSpace<gles2::cmds::IsTexture>(); + if (c) { + c->Init(texture, result_shm_id, result_shm_offset); + } +} + +void LineWidth(GLfloat width) { + gles2::cmds::LineWidth* c = GetCmdSpace<gles2::cmds::LineWidth>(); + if (c) { + c->Init(width); + } +} + +void LinkProgram(GLuint program) { + gles2::cmds::LinkProgram* c = GetCmdSpace<gles2::cmds::LinkProgram>(); + if (c) { + c->Init(program); + } +} + +void PixelStorei(GLenum pname, GLint param) { + gles2::cmds::PixelStorei* c = GetCmdSpace<gles2::cmds::PixelStorei>(); + if (c) { + c->Init(pname, param); + } +} + +void PolygonOffset(GLfloat factor, GLfloat units) { + gles2::cmds::PolygonOffset* c = GetCmdSpace<gles2::cmds::PolygonOffset>(); + if (c) { + c->Init(factor, units); + } +} + +void ReadPixels(GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + uint32_t pixels_shm_id, + uint32_t pixels_shm_offset, + uint32_t result_shm_id, + uint32_t result_shm_offset, + GLboolean async) { + gles2::cmds::ReadPixels* c = GetCmdSpace<gles2::cmds::ReadPixels>(); + if (c) { + c->Init(x, + y, + width, + height, + format, + type, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + async); + } +} + +void ReleaseShaderCompiler() { + gles2::cmds::ReleaseShaderCompiler* c = + GetCmdSpace<gles2::cmds::ReleaseShaderCompiler>(); + if (c) { + c->Init(); + } +} + +void RenderbufferStorage(GLenum target, + GLenum internalformat, + GLsizei width, + GLsizei height) { + gles2::cmds::RenderbufferStorage* c = + GetCmdSpace<gles2::cmds::RenderbufferStorage>(); + if (c) { + c->Init(target, internalformat, width, height); + } +} + +void SampleCoverage(GLclampf value, GLboolean invert) { + gles2::cmds::SampleCoverage* c = GetCmdSpace<gles2::cmds::SampleCoverage>(); + if (c) { + c->Init(value, invert); + } +} + +void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) { + gles2::cmds::Scissor* c = GetCmdSpace<gles2::cmds::Scissor>(); + if (c) { + c->Init(x, y, width, height); + } +} + +void ShaderBinary(GLsizei n, + uint32_t shaders_shm_id, + uint32_t shaders_shm_offset, + GLenum binaryformat, + uint32_t binary_shm_id, + uint32_t binary_shm_offset, + GLsizei length) { + gles2::cmds::ShaderBinary* c = GetCmdSpace<gles2::cmds::ShaderBinary>(); + if (c) { + c->Init(n, + shaders_shm_id, + shaders_shm_offset, + binaryformat, + binary_shm_id, + binary_shm_offset, + length); + } +} + +void ShaderSourceBucket(GLuint shader, uint32_t data_bucket_id) { + gles2::cmds::ShaderSourceBucket* c = + GetCmdSpace<gles2::cmds::ShaderSourceBucket>(); + if (c) { + c->Init(shader, data_bucket_id); + } +} + +void StencilFunc(GLenum func, GLint ref, GLuint mask) { + gles2::cmds::StencilFunc* c = GetCmdSpace<gles2::cmds::StencilFunc>(); + if (c) { + c->Init(func, ref, mask); + } +} + +void StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) { + gles2::cmds::StencilFuncSeparate* c = + GetCmdSpace<gles2::cmds::StencilFuncSeparate>(); + if (c) { + c->Init(face, func, ref, mask); + } +} + +void StencilMask(GLuint mask) { + gles2::cmds::StencilMask* c = GetCmdSpace<gles2::cmds::StencilMask>(); + if (c) { + c->Init(mask); + } +} + +void StencilMaskSeparate(GLenum face, GLuint mask) { + gles2::cmds::StencilMaskSeparate* c = + GetCmdSpace<gles2::cmds::StencilMaskSeparate>(); + if (c) { + c->Init(face, mask); + } +} + +void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) { + gles2::cmds::StencilOp* c = GetCmdSpace<gles2::cmds::StencilOp>(); + if (c) { + c->Init(fail, zfail, zpass); + } +} + +void StencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass) { + gles2::cmds::StencilOpSeparate* c = + GetCmdSpace<gles2::cmds::StencilOpSeparate>(); + if (c) { + c->Init(face, fail, zfail, zpass); + } +} + +void TexImage2D(GLenum target, + GLint level, + GLint internalformat, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + uint32_t pixels_shm_id, + uint32_t pixels_shm_offset) { + gles2::cmds::TexImage2D* c = GetCmdSpace<gles2::cmds::TexImage2D>(); + if (c) { + c->Init(target, + level, + internalformat, + width, + height, + format, + type, + pixels_shm_id, + pixels_shm_offset); + } +} + +void TexParameterf(GLenum target, GLenum pname, GLfloat param) { + gles2::cmds::TexParameterf* c = GetCmdSpace<gles2::cmds::TexParameterf>(); + if (c) { + c->Init(target, pname, param); + } +} + +void TexParameterfvImmediate(GLenum target, + GLenum pname, + const GLfloat* params) { + const uint32_t size = gles2::cmds::TexParameterfvImmediate::ComputeSize(); + gles2::cmds::TexParameterfvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::TexParameterfvImmediate>(size); + if (c) { + c->Init(target, pname, params); + } +} + +void TexParameteri(GLenum target, GLenum pname, GLint param) { + gles2::cmds::TexParameteri* c = GetCmdSpace<gles2::cmds::TexParameteri>(); + if (c) { + c->Init(target, pname, param); + } +} + +void TexParameterivImmediate(GLenum target, GLenum pname, const GLint* params) { + const uint32_t size = gles2::cmds::TexParameterivImmediate::ComputeSize(); + gles2::cmds::TexParameterivImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::TexParameterivImmediate>(size); + if (c) { + c->Init(target, pname, params); + } +} + +void TexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + uint32_t pixels_shm_id, + uint32_t pixels_shm_offset, + GLboolean internal) { + gles2::cmds::TexSubImage2D* c = GetCmdSpace<gles2::cmds::TexSubImage2D>(); + if (c) { + c->Init(target, + level, + xoffset, + yoffset, + width, + height, + format, + type, + pixels_shm_id, + pixels_shm_offset, + internal); + } +} + +void Uniform1f(GLint location, GLfloat x) { + gles2::cmds::Uniform1f* c = GetCmdSpace<gles2::cmds::Uniform1f>(); + if (c) { + c->Init(location, x); + } +} + +void Uniform1fvImmediate(GLint location, GLsizei count, const GLfloat* v) { + const uint32_t size = gles2::cmds::Uniform1fvImmediate::ComputeSize(count); + gles2::cmds::Uniform1fvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform1fvImmediate>(size); + if (c) { + c->Init(location, count, v); + } +} + +void Uniform1i(GLint location, GLint x) { + gles2::cmds::Uniform1i* c = GetCmdSpace<gles2::cmds::Uniform1i>(); + if (c) { + c->Init(location, x); + } +} + +void Uniform1ivImmediate(GLint location, GLsizei count, const GLint* v) { + const uint32_t size = gles2::cmds::Uniform1ivImmediate::ComputeSize(count); + gles2::cmds::Uniform1ivImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform1ivImmediate>(size); + if (c) { + c->Init(location, count, v); + } +} + +void Uniform2f(GLint location, GLfloat x, GLfloat y) { + gles2::cmds::Uniform2f* c = GetCmdSpace<gles2::cmds::Uniform2f>(); + if (c) { + c->Init(location, x, y); + } +} + +void Uniform2fvImmediate(GLint location, GLsizei count, const GLfloat* v) { + const uint32_t size = gles2::cmds::Uniform2fvImmediate::ComputeSize(count); + gles2::cmds::Uniform2fvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform2fvImmediate>(size); + if (c) { + c->Init(location, count, v); + } +} + +void Uniform2i(GLint location, GLint x, GLint y) { + gles2::cmds::Uniform2i* c = GetCmdSpace<gles2::cmds::Uniform2i>(); + if (c) { + c->Init(location, x, y); + } +} + +void Uniform2ivImmediate(GLint location, GLsizei count, const GLint* v) { + const uint32_t size = gles2::cmds::Uniform2ivImmediate::ComputeSize(count); + gles2::cmds::Uniform2ivImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform2ivImmediate>(size); + if (c) { + c->Init(location, count, v); + } +} + +void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) { + gles2::cmds::Uniform3f* c = GetCmdSpace<gles2::cmds::Uniform3f>(); + if (c) { + c->Init(location, x, y, z); + } +} + +void Uniform3fvImmediate(GLint location, GLsizei count, const GLfloat* v) { + const uint32_t size = gles2::cmds::Uniform3fvImmediate::ComputeSize(count); + gles2::cmds::Uniform3fvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform3fvImmediate>(size); + if (c) { + c->Init(location, count, v); + } +} + +void Uniform3i(GLint location, GLint x, GLint y, GLint z) { + gles2::cmds::Uniform3i* c = GetCmdSpace<gles2::cmds::Uniform3i>(); + if (c) { + c->Init(location, x, y, z); + } +} + +void Uniform3ivImmediate(GLint location, GLsizei count, const GLint* v) { + const uint32_t size = gles2::cmds::Uniform3ivImmediate::ComputeSize(count); + gles2::cmds::Uniform3ivImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform3ivImmediate>(size); + if (c) { + c->Init(location, count, v); + } +} + +void Uniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + gles2::cmds::Uniform4f* c = GetCmdSpace<gles2::cmds::Uniform4f>(); + if (c) { + c->Init(location, x, y, z, w); + } +} + +void Uniform4fvImmediate(GLint location, GLsizei count, const GLfloat* v) { + const uint32_t size = gles2::cmds::Uniform4fvImmediate::ComputeSize(count); + gles2::cmds::Uniform4fvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform4fvImmediate>(size); + if (c) { + c->Init(location, count, v); + } +} + +void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) { + gles2::cmds::Uniform4i* c = GetCmdSpace<gles2::cmds::Uniform4i>(); + if (c) { + c->Init(location, x, y, z, w); + } +} + +void Uniform4ivImmediate(GLint location, GLsizei count, const GLint* v) { + const uint32_t size = gles2::cmds::Uniform4ivImmediate::ComputeSize(count); + gles2::cmds::Uniform4ivImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::Uniform4ivImmediate>(size); + if (c) { + c->Init(location, count, v); + } +} + +void UniformMatrix2fvImmediate(GLint location, + GLsizei count, + const GLfloat* value) { + const uint32_t size = + gles2::cmds::UniformMatrix2fvImmediate::ComputeSize(count); + gles2::cmds::UniformMatrix2fvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix2fvImmediate>( + size); + if (c) { + c->Init(location, count, value); + } +} + +void UniformMatrix3fvImmediate(GLint location, + GLsizei count, + const GLfloat* value) { + const uint32_t size = + gles2::cmds::UniformMatrix3fvImmediate::ComputeSize(count); + gles2::cmds::UniformMatrix3fvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix3fvImmediate>( + size); + if (c) { + c->Init(location, count, value); + } +} + +void UniformMatrix4fvImmediate(GLint location, + GLsizei count, + const GLfloat* value) { + const uint32_t size = + gles2::cmds::UniformMatrix4fvImmediate::ComputeSize(count); + gles2::cmds::UniformMatrix4fvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix4fvImmediate>( + size); + if (c) { + c->Init(location, count, value); + } +} + +void UseProgram(GLuint program) { + gles2::cmds::UseProgram* c = GetCmdSpace<gles2::cmds::UseProgram>(); + if (c) { + c->Init(program); + } +} + +void ValidateProgram(GLuint program) { + gles2::cmds::ValidateProgram* c = GetCmdSpace<gles2::cmds::ValidateProgram>(); + if (c) { + c->Init(program); + } +} + +void VertexAttrib1f(GLuint indx, GLfloat x) { + gles2::cmds::VertexAttrib1f* c = GetCmdSpace<gles2::cmds::VertexAttrib1f>(); + if (c) { + c->Init(indx, x); + } +} + +void VertexAttrib1fvImmediate(GLuint indx, const GLfloat* values) { + const uint32_t size = gles2::cmds::VertexAttrib1fvImmediate::ComputeSize(); + gles2::cmds::VertexAttrib1fvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::VertexAttrib1fvImmediate>( + size); + if (c) { + c->Init(indx, values); + } +} + +void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) { + gles2::cmds::VertexAttrib2f* c = GetCmdSpace<gles2::cmds::VertexAttrib2f>(); + if (c) { + c->Init(indx, x, y); + } +} + +void VertexAttrib2fvImmediate(GLuint indx, const GLfloat* values) { + const uint32_t size = gles2::cmds::VertexAttrib2fvImmediate::ComputeSize(); + gles2::cmds::VertexAttrib2fvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::VertexAttrib2fvImmediate>( + size); + if (c) { + c->Init(indx, values); + } +} + +void VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) { + gles2::cmds::VertexAttrib3f* c = GetCmdSpace<gles2::cmds::VertexAttrib3f>(); + if (c) { + c->Init(indx, x, y, z); + } +} + +void VertexAttrib3fvImmediate(GLuint indx, const GLfloat* values) { + const uint32_t size = gles2::cmds::VertexAttrib3fvImmediate::ComputeSize(); + gles2::cmds::VertexAttrib3fvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::VertexAttrib3fvImmediate>( + size); + if (c) { + c->Init(indx, values); + } +} + +void VertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { + gles2::cmds::VertexAttrib4f* c = GetCmdSpace<gles2::cmds::VertexAttrib4f>(); + if (c) { + c->Init(indx, x, y, z, w); + } +} + +void VertexAttrib4fvImmediate(GLuint indx, const GLfloat* values) { + const uint32_t size = gles2::cmds::VertexAttrib4fvImmediate::ComputeSize(); + gles2::cmds::VertexAttrib4fvImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::VertexAttrib4fvImmediate>( + size); + if (c) { + c->Init(indx, values); + } +} + +void VertexAttribPointer(GLuint indx, + GLint size, + GLenum type, + GLboolean normalized, + GLsizei stride, + GLuint offset) { + gles2::cmds::VertexAttribPointer* c = + GetCmdSpace<gles2::cmds::VertexAttribPointer>(); + if (c) { + c->Init(indx, size, type, normalized, stride, offset); + } +} + +void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) { + gles2::cmds::Viewport* c = GetCmdSpace<gles2::cmds::Viewport>(); + if (c) { + c->Init(x, y, width, height); + } +} + +void BlitFramebufferCHROMIUM(GLint srcX0, + GLint srcY0, + GLint srcX1, + GLint srcY1, + GLint dstX0, + GLint dstY0, + GLint dstX1, + GLint dstY1, + GLbitfield mask, + GLenum filter) { + gles2::cmds::BlitFramebufferCHROMIUM* c = + GetCmdSpace<gles2::cmds::BlitFramebufferCHROMIUM>(); + if (c) { + c->Init( + srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + } +} + +void RenderbufferStorageMultisampleCHROMIUM(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) { + gles2::cmds::RenderbufferStorageMultisampleCHROMIUM* c = + GetCmdSpace<gles2::cmds::RenderbufferStorageMultisampleCHROMIUM>(); + if (c) { + c->Init(target, samples, internalformat, width, height); + } +} + +void RenderbufferStorageMultisampleEXT(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) { + gles2::cmds::RenderbufferStorageMultisampleEXT* c = + GetCmdSpace<gles2::cmds::RenderbufferStorageMultisampleEXT>(); + if (c) { + c->Init(target, samples, internalformat, width, height); + } +} + +void FramebufferTexture2DMultisampleEXT(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLsizei samples) { + gles2::cmds::FramebufferTexture2DMultisampleEXT* c = + GetCmdSpace<gles2::cmds::FramebufferTexture2DMultisampleEXT>(); + if (c) { + c->Init(target, attachment, textarget, texture, samples); + } +} + +void TexStorage2DEXT(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height) { + gles2::cmds::TexStorage2DEXT* c = GetCmdSpace<gles2::cmds::TexStorage2DEXT>(); + if (c) { + c->Init(target, levels, internalFormat, width, height); + } +} + +void GenQueriesEXTImmediate(GLsizei n, GLuint* queries) { + const uint32_t size = gles2::cmds::GenQueriesEXTImmediate::ComputeSize(n); + gles2::cmds::GenQueriesEXTImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::GenQueriesEXTImmediate>(size); + if (c) { + c->Init(n, queries); + } +} + +void DeleteQueriesEXTImmediate(GLsizei n, const GLuint* queries) { + const uint32_t size = gles2::cmds::DeleteQueriesEXTImmediate::ComputeSize(n); + gles2::cmds::DeleteQueriesEXTImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::DeleteQueriesEXTImmediate>( + size); + if (c) { + c->Init(n, queries); + } +} + +void BeginQueryEXT(GLenum target, + GLuint id, + uint32_t sync_data_shm_id, + uint32_t sync_data_shm_offset) { + gles2::cmds::BeginQueryEXT* c = GetCmdSpace<gles2::cmds::BeginQueryEXT>(); + if (c) { + c->Init(target, id, sync_data_shm_id, sync_data_shm_offset); + } +} + +void EndQueryEXT(GLenum target, GLuint submit_count) { + gles2::cmds::EndQueryEXT* c = GetCmdSpace<gles2::cmds::EndQueryEXT>(); + if (c) { + c->Init(target, submit_count); + } +} + +void InsertEventMarkerEXT(GLuint bucket_id) { + gles2::cmds::InsertEventMarkerEXT* c = + GetCmdSpace<gles2::cmds::InsertEventMarkerEXT>(); + if (c) { + c->Init(bucket_id); + } +} + +void PushGroupMarkerEXT(GLuint bucket_id) { + gles2::cmds::PushGroupMarkerEXT* c = + GetCmdSpace<gles2::cmds::PushGroupMarkerEXT>(); + if (c) { + c->Init(bucket_id); + } +} + +void PopGroupMarkerEXT() { + gles2::cmds::PopGroupMarkerEXT* c = + GetCmdSpace<gles2::cmds::PopGroupMarkerEXT>(); + if (c) { + c->Init(); + } +} + +void GenVertexArraysOESImmediate(GLsizei n, GLuint* arrays) { + const uint32_t size = + gles2::cmds::GenVertexArraysOESImmediate::ComputeSize(n); + gles2::cmds::GenVertexArraysOESImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::GenVertexArraysOESImmediate>( + size); + if (c) { + c->Init(n, arrays); + } +} + +void DeleteVertexArraysOESImmediate(GLsizei n, const GLuint* arrays) { + const uint32_t size = + gles2::cmds::DeleteVertexArraysOESImmediate::ComputeSize(n); + gles2::cmds::DeleteVertexArraysOESImmediate* c = + GetImmediateCmdSpaceTotalSize< + gles2::cmds::DeleteVertexArraysOESImmediate>(size); + if (c) { + c->Init(n, arrays); + } +} + +void IsVertexArrayOES(GLuint array, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::IsVertexArrayOES* c = + GetCmdSpace<gles2::cmds::IsVertexArrayOES>(); + if (c) { + c->Init(array, result_shm_id, result_shm_offset); + } +} + +void BindVertexArrayOES(GLuint array) { + gles2::cmds::BindVertexArrayOES* c = + GetCmdSpace<gles2::cmds::BindVertexArrayOES>(); + if (c) { + c->Init(array); + } +} + +void SwapBuffers() { + gles2::cmds::SwapBuffers* c = GetCmdSpace<gles2::cmds::SwapBuffers>(); + if (c) { + c->Init(); + } +} + +void GetMaxValueInBufferCHROMIUM(GLuint buffer_id, + GLsizei count, + GLenum type, + GLuint offset, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::GetMaxValueInBufferCHROMIUM* c = + GetCmdSpace<gles2::cmds::GetMaxValueInBufferCHROMIUM>(); + if (c) { + c->Init(buffer_id, count, type, offset, result_shm_id, result_shm_offset); + } +} + +void GenSharedIdsCHROMIUM(GLuint namespace_id, + GLuint id_offset, + GLsizei n, + uint32_t ids_shm_id, + uint32_t ids_shm_offset) { + gles2::cmds::GenSharedIdsCHROMIUM* c = + GetCmdSpace<gles2::cmds::GenSharedIdsCHROMIUM>(); + if (c) { + c->Init(namespace_id, id_offset, n, ids_shm_id, ids_shm_offset); + } +} + +void DeleteSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + uint32_t ids_shm_id, + uint32_t ids_shm_offset) { + gles2::cmds::DeleteSharedIdsCHROMIUM* c = + GetCmdSpace<gles2::cmds::DeleteSharedIdsCHROMIUM>(); + if (c) { + c->Init(namespace_id, n, ids_shm_id, ids_shm_offset); + } +} + +void RegisterSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + uint32_t ids_shm_id, + uint32_t ids_shm_offset) { + gles2::cmds::RegisterSharedIdsCHROMIUM* c = + GetCmdSpace<gles2::cmds::RegisterSharedIdsCHROMIUM>(); + if (c) { + c->Init(namespace_id, n, ids_shm_id, ids_shm_offset); + } +} + +void EnableFeatureCHROMIUM(GLuint bucket_id, + uint32_t result_shm_id, + uint32_t result_shm_offset) { + gles2::cmds::EnableFeatureCHROMIUM* c = + GetCmdSpace<gles2::cmds::EnableFeatureCHROMIUM>(); + if (c) { + c->Init(bucket_id, result_shm_id, result_shm_offset); + } +} + +void ResizeCHROMIUM(GLuint width, GLuint height, GLfloat scale_factor) { + gles2::cmds::ResizeCHROMIUM* c = GetCmdSpace<gles2::cmds::ResizeCHROMIUM>(); + if (c) { + c->Init(width, height, scale_factor); + } +} + +void GetRequestableExtensionsCHROMIUM(uint32_t bucket_id) { + gles2::cmds::GetRequestableExtensionsCHROMIUM* c = + GetCmdSpace<gles2::cmds::GetRequestableExtensionsCHROMIUM>(); + if (c) { + c->Init(bucket_id); + } +} + +void RequestExtensionCHROMIUM(uint32_t bucket_id) { + gles2::cmds::RequestExtensionCHROMIUM* c = + GetCmdSpace<gles2::cmds::RequestExtensionCHROMIUM>(); + if (c) { + c->Init(bucket_id); + } +} + +void GetMultipleIntegervCHROMIUM(uint32_t pnames_shm_id, + uint32_t pnames_shm_offset, + GLuint count, + uint32_t results_shm_id, + uint32_t results_shm_offset, + GLsizeiptr size) { + gles2::cmds::GetMultipleIntegervCHROMIUM* c = + GetCmdSpace<gles2::cmds::GetMultipleIntegervCHROMIUM>(); + if (c) { + c->Init(pnames_shm_id, + pnames_shm_offset, + count, + results_shm_id, + results_shm_offset, size); - if (c) { - c->Init(location, count, transpose, value); - } - } - - void UniformMatrix4fv( - GLint location, GLsizei count, GLboolean transpose, uint32 value_shm_id, - uint32 value_shm_offset) { - gles2::cmds::UniformMatrix4fv* c = - GetCmdSpace<gles2::cmds::UniformMatrix4fv>(); - if (c) { - c->Init(location, count, transpose, value_shm_id, value_shm_offset); - } - } - - void UniformMatrix4fvImmediate( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) { - const uint32 size = - gles2::cmds::UniformMatrix4fvImmediate::ComputeSize(count); - gles2::cmds::UniformMatrix4fvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::UniformMatrix4fvImmediate>( - size); - if (c) { - c->Init(location, count, transpose, value); - } - } - - void UseProgram(GLuint program) { - gles2::cmds::UseProgram* c = GetCmdSpace<gles2::cmds::UseProgram>(); - if (c) { - c->Init(program); - } - } - - void ValidateProgram(GLuint program) { - gles2::cmds::ValidateProgram* c = - GetCmdSpace<gles2::cmds::ValidateProgram>(); - if (c) { - c->Init(program); - } - } - - void VertexAttrib1f(GLuint indx, GLfloat x) { - gles2::cmds::VertexAttrib1f* c = - GetCmdSpace<gles2::cmds::VertexAttrib1f>(); - if (c) { - c->Init(indx, x); - } - } - - void VertexAttrib1fv( - GLuint indx, uint32 values_shm_id, uint32 values_shm_offset) { - gles2::cmds::VertexAttrib1fv* c = - GetCmdSpace<gles2::cmds::VertexAttrib1fv>(); - if (c) { - c->Init(indx, values_shm_id, values_shm_offset); - } - } - - void VertexAttrib1fvImmediate(GLuint indx, const GLfloat* values) { - const uint32 size = gles2::cmds::VertexAttrib1fvImmediate::ComputeSize(); - gles2::cmds::VertexAttrib1fvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::VertexAttrib1fvImmediate>( - size); - if (c) { - c->Init(indx, values); - } - } - - void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) { - gles2::cmds::VertexAttrib2f* c = - GetCmdSpace<gles2::cmds::VertexAttrib2f>(); - if (c) { - c->Init(indx, x, y); - } - } - - void VertexAttrib2fv( - GLuint indx, uint32 values_shm_id, uint32 values_shm_offset) { - gles2::cmds::VertexAttrib2fv* c = - GetCmdSpace<gles2::cmds::VertexAttrib2fv>(); - if (c) { - c->Init(indx, values_shm_id, values_shm_offset); - } - } - - void VertexAttrib2fvImmediate(GLuint indx, const GLfloat* values) { - const uint32 size = gles2::cmds::VertexAttrib2fvImmediate::ComputeSize(); - gles2::cmds::VertexAttrib2fvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::VertexAttrib2fvImmediate>( - size); - if (c) { - c->Init(indx, values); - } - } - - void VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) { - gles2::cmds::VertexAttrib3f* c = - GetCmdSpace<gles2::cmds::VertexAttrib3f>(); - if (c) { - c->Init(indx, x, y, z); - } - } - - void VertexAttrib3fv( - GLuint indx, uint32 values_shm_id, uint32 values_shm_offset) { - gles2::cmds::VertexAttrib3fv* c = - GetCmdSpace<gles2::cmds::VertexAttrib3fv>(); - if (c) { - c->Init(indx, values_shm_id, values_shm_offset); - } - } - - void VertexAttrib3fvImmediate(GLuint indx, const GLfloat* values) { - const uint32 size = gles2::cmds::VertexAttrib3fvImmediate::ComputeSize(); - gles2::cmds::VertexAttrib3fvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::VertexAttrib3fvImmediate>( - size); - if (c) { - c->Init(indx, values); - } - } - - void VertexAttrib4f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { - gles2::cmds::VertexAttrib4f* c = - GetCmdSpace<gles2::cmds::VertexAttrib4f>(); - if (c) { - c->Init(indx, x, y, z, w); - } - } - - void VertexAttrib4fv( - GLuint indx, uint32 values_shm_id, uint32 values_shm_offset) { - gles2::cmds::VertexAttrib4fv* c = - GetCmdSpace<gles2::cmds::VertexAttrib4fv>(); - if (c) { - c->Init(indx, values_shm_id, values_shm_offset); - } - } - - void VertexAttrib4fvImmediate(GLuint indx, const GLfloat* values) { - const uint32 size = gles2::cmds::VertexAttrib4fvImmediate::ComputeSize(); - gles2::cmds::VertexAttrib4fvImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::VertexAttrib4fvImmediate>( - size); - if (c) { - c->Init(indx, values); - } - } - - void VertexAttribPointer( - GLuint indx, GLint size, GLenum type, GLboolean normalized, - GLsizei stride, GLuint offset) { - gles2::cmds::VertexAttribPointer* c = - GetCmdSpace<gles2::cmds::VertexAttribPointer>(); - if (c) { - c->Init(indx, size, type, normalized, stride, offset); - } - } - - void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) { - gles2::cmds::Viewport* c = GetCmdSpace<gles2::cmds::Viewport>(); - if (c) { - c->Init(x, y, width, height); - } - } - - void BlitFramebufferCHROMIUM( - GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, - GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { - gles2::cmds::BlitFramebufferCHROMIUM* c = - GetCmdSpace<gles2::cmds::BlitFramebufferCHROMIUM>(); - if (c) { - c->Init( - srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, - filter); - } - } - - void RenderbufferStorageMultisampleCHROMIUM( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) { - gles2::cmds::RenderbufferStorageMultisampleCHROMIUM* c = - GetCmdSpace<gles2::cmds::RenderbufferStorageMultisampleCHROMIUM>(); - if (c) { - c->Init(target, samples, internalformat, width, height); - } - } - - void RenderbufferStorageMultisampleEXT( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) { - gles2::cmds::RenderbufferStorageMultisampleEXT* c = - GetCmdSpace<gles2::cmds::RenderbufferStorageMultisampleEXT>(); - if (c) { - c->Init(target, samples, internalformat, width, height); - } - } - - void FramebufferTexture2DMultisampleEXT( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level, GLsizei samples) { - gles2::cmds::FramebufferTexture2DMultisampleEXT* c = - GetCmdSpace<gles2::cmds::FramebufferTexture2DMultisampleEXT>(); - if (c) { - c->Init(target, attachment, textarget, texture, level, samples); - } - } - - void TexStorage2DEXT( - GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, - GLsizei height) { - gles2::cmds::TexStorage2DEXT* c = - GetCmdSpace<gles2::cmds::TexStorage2DEXT>(); - if (c) { - c->Init(target, levels, internalFormat, width, height); - } - } - - void GenQueriesEXT( - GLsizei n, uint32 queries_shm_id, uint32 queries_shm_offset) { - gles2::cmds::GenQueriesEXT* c = GetCmdSpace<gles2::cmds::GenQueriesEXT>(); - if (c) { - c->Init(n, queries_shm_id, queries_shm_offset); - } - } - - void GenQueriesEXTImmediate(GLsizei n, GLuint* queries) { - const uint32 size = gles2::cmds::GenQueriesEXTImmediate::ComputeSize(n); - gles2::cmds::GenQueriesEXTImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::GenQueriesEXTImmediate>( - size); - if (c) { - c->Init(n, queries); - } - } - - void DeleteQueriesEXT( - GLsizei n, uint32 queries_shm_id, uint32 queries_shm_offset) { - gles2::cmds::DeleteQueriesEXT* c = - GetCmdSpace<gles2::cmds::DeleteQueriesEXT>(); - if (c) { - c->Init(n, queries_shm_id, queries_shm_offset); - } - } - - void DeleteQueriesEXTImmediate(GLsizei n, const GLuint* queries) { - const uint32 size = gles2::cmds::DeleteQueriesEXTImmediate::ComputeSize(n); - gles2::cmds::DeleteQueriesEXTImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::DeleteQueriesEXTImmediate>( - size); - if (c) { - c->Init(n, queries); - } - } - - void BeginQueryEXT( - GLenum target, GLuint id, uint32 sync_data_shm_id, - uint32 sync_data_shm_offset) { - gles2::cmds::BeginQueryEXT* c = GetCmdSpace<gles2::cmds::BeginQueryEXT>(); - if (c) { - c->Init(target, id, sync_data_shm_id, sync_data_shm_offset); - } - } - - void EndQueryEXT(GLenum target, GLuint submit_count) { - gles2::cmds::EndQueryEXT* c = GetCmdSpace<gles2::cmds::EndQueryEXT>(); - if (c) { - c->Init(target, submit_count); - } - } - - void InsertEventMarkerEXT(GLuint bucket_id) { - gles2::cmds::InsertEventMarkerEXT* c = - GetCmdSpace<gles2::cmds::InsertEventMarkerEXT>(); - if (c) { - c->Init(bucket_id); - } - } - - void PushGroupMarkerEXT(GLuint bucket_id) { - gles2::cmds::PushGroupMarkerEXT* c = - GetCmdSpace<gles2::cmds::PushGroupMarkerEXT>(); - if (c) { - c->Init(bucket_id); - } - } - - void PopGroupMarkerEXT() { - gles2::cmds::PopGroupMarkerEXT* c = - GetCmdSpace<gles2::cmds::PopGroupMarkerEXT>(); - if (c) { - c->Init(); - } - } - - void GenVertexArraysOES( - GLsizei n, uint32 arrays_shm_id, uint32 arrays_shm_offset) { - gles2::cmds::GenVertexArraysOES* c = - GetCmdSpace<gles2::cmds::GenVertexArraysOES>(); - if (c) { - c->Init(n, arrays_shm_id, arrays_shm_offset); - } - } - - void GenVertexArraysOESImmediate(GLsizei n, GLuint* arrays) { - const uint32 size = - gles2::cmds::GenVertexArraysOESImmediate::ComputeSize(n); - gles2::cmds::GenVertexArraysOESImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::GenVertexArraysOESImmediate>( - size); - if (c) { - c->Init(n, arrays); - } - } - - void DeleteVertexArraysOES( - GLsizei n, uint32 arrays_shm_id, uint32 arrays_shm_offset) { - gles2::cmds::DeleteVertexArraysOES* c = - GetCmdSpace<gles2::cmds::DeleteVertexArraysOES>(); - if (c) { - c->Init(n, arrays_shm_id, arrays_shm_offset); - } - } - - void DeleteVertexArraysOESImmediate(GLsizei n, const GLuint* arrays) { - const uint32 size = - gles2::cmds::DeleteVertexArraysOESImmediate::ComputeSize(n); - gles2::cmds::DeleteVertexArraysOESImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::DeleteVertexArraysOESImmediate>(size); // NOLINT - if (c) { - c->Init(n, arrays); - } - } - - void IsVertexArrayOES( - GLuint array, uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::IsVertexArrayOES* c = - GetCmdSpace<gles2::cmds::IsVertexArrayOES>(); - if (c) { - c->Init(array, result_shm_id, result_shm_offset); - } - } - - void BindVertexArrayOES(GLuint array) { - gles2::cmds::BindVertexArrayOES* c = - GetCmdSpace<gles2::cmds::BindVertexArrayOES>(); - if (c) { - c->Init(array); - } - } - - void SwapBuffers() { - gles2::cmds::SwapBuffers* c = GetCmdSpace<gles2::cmds::SwapBuffers>(); - if (c) { - c->Init(); - } - } - - void GetMaxValueInBufferCHROMIUM( - GLuint buffer_id, GLsizei count, GLenum type, GLuint offset, - uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::GetMaxValueInBufferCHROMIUM* c = - GetCmdSpace<gles2::cmds::GetMaxValueInBufferCHROMIUM>(); - if (c) { - c->Init( - buffer_id, count, type, offset, result_shm_id, result_shm_offset); - } - } - - void GenSharedIdsCHROMIUM( - GLuint namespace_id, GLuint id_offset, GLsizei n, uint32 ids_shm_id, - uint32 ids_shm_offset) { - gles2::cmds::GenSharedIdsCHROMIUM* c = - GetCmdSpace<gles2::cmds::GenSharedIdsCHROMIUM>(); - if (c) { - c->Init(namespace_id, id_offset, n, ids_shm_id, ids_shm_offset); - } - } - - void DeleteSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, uint32 ids_shm_id, - uint32 ids_shm_offset) { - gles2::cmds::DeleteSharedIdsCHROMIUM* c = - GetCmdSpace<gles2::cmds::DeleteSharedIdsCHROMIUM>(); - if (c) { - c->Init(namespace_id, n, ids_shm_id, ids_shm_offset); - } - } - - void RegisterSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, uint32 ids_shm_id, - uint32 ids_shm_offset) { - gles2::cmds::RegisterSharedIdsCHROMIUM* c = - GetCmdSpace<gles2::cmds::RegisterSharedIdsCHROMIUM>(); - if (c) { - c->Init(namespace_id, n, ids_shm_id, ids_shm_offset); - } - } - - void EnableFeatureCHROMIUM( - GLuint bucket_id, uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::EnableFeatureCHROMIUM* c = - GetCmdSpace<gles2::cmds::EnableFeatureCHROMIUM>(); - if (c) { - c->Init(bucket_id, result_shm_id, result_shm_offset); - } - } - - void ResizeCHROMIUM(GLuint width, GLuint height, GLfloat scale_factor) { - gles2::cmds::ResizeCHROMIUM* c = - GetCmdSpace<gles2::cmds::ResizeCHROMIUM>(); - if (c) { - c->Init(width, height, scale_factor); - } - } - - void GetRequestableExtensionsCHROMIUM(uint32 bucket_id) { - gles2::cmds::GetRequestableExtensionsCHROMIUM* c = - GetCmdSpace<gles2::cmds::GetRequestableExtensionsCHROMIUM>(); - if (c) { - c->Init(bucket_id); - } - } - - void RequestExtensionCHROMIUM(uint32 bucket_id) { - gles2::cmds::RequestExtensionCHROMIUM* c = - GetCmdSpace<gles2::cmds::RequestExtensionCHROMIUM>(); - if (c) { - c->Init(bucket_id); - } - } - - void GetMultipleIntegervCHROMIUM( - uint32 pnames_shm_id, uint32 pnames_shm_offset, GLuint count, - uint32 results_shm_id, uint32 results_shm_offset, GLsizeiptr size) { - gles2::cmds::GetMultipleIntegervCHROMIUM* c = - GetCmdSpace<gles2::cmds::GetMultipleIntegervCHROMIUM>(); - if (c) { - c->Init( - pnames_shm_id, pnames_shm_offset, count, results_shm_id, - results_shm_offset, size); - } - } - - void GetProgramInfoCHROMIUM(GLuint program, uint32 bucket_id) { - gles2::cmds::GetProgramInfoCHROMIUM* c = - GetCmdSpace<gles2::cmds::GetProgramInfoCHROMIUM>(); - if (c) { - c->Init(program, bucket_id); - } - } - - void CreateStreamTextureCHROMIUM( - GLuint client_id, uint32 result_shm_id, uint32 result_shm_offset) { - gles2::cmds::CreateStreamTextureCHROMIUM* c = - GetCmdSpace<gles2::cmds::CreateStreamTextureCHROMIUM>(); - if (c) { - c->Init(client_id, result_shm_id, result_shm_offset); - } - } - - void DestroyStreamTextureCHROMIUM(GLuint texture) { - gles2::cmds::DestroyStreamTextureCHROMIUM* c = - GetCmdSpace<gles2::cmds::DestroyStreamTextureCHROMIUM>(); - if (c) { - c->Init(texture); - } - } - - void GetTranslatedShaderSourceANGLE(GLuint shader, uint32 bucket_id) { - gles2::cmds::GetTranslatedShaderSourceANGLE* c = - GetCmdSpace<gles2::cmds::GetTranslatedShaderSourceANGLE>(); - if (c) { - c->Init(shader, bucket_id); - } - } - - void PostSubBufferCHROMIUM(GLint x, GLint y, GLint width, GLint height) { - gles2::cmds::PostSubBufferCHROMIUM* c = - GetCmdSpace<gles2::cmds::PostSubBufferCHROMIUM>(); - if (c) { - c->Init(x, y, width, height); - } - } - - void TexImageIOSurface2DCHROMIUM( - GLenum target, GLsizei width, GLsizei height, GLuint ioSurfaceId, - GLuint plane) { - gles2::cmds::TexImageIOSurface2DCHROMIUM* c = - GetCmdSpace<gles2::cmds::TexImageIOSurface2DCHROMIUM>(); - if (c) { - c->Init(target, width, height, ioSurfaceId, plane); - } - } - - void CopyTextureCHROMIUM( - GLenum target, GLenum source_id, GLenum dest_id, GLint level, - GLint internalformat, GLenum dest_type) { - gles2::cmds::CopyTextureCHROMIUM* c = - GetCmdSpace<gles2::cmds::CopyTextureCHROMIUM>(); - if (c) { - c->Init(target, source_id, dest_id, level, internalformat, dest_type); - } - } - - void DrawArraysInstancedANGLE( - GLenum mode, GLint first, GLsizei count, GLsizei primcount) { - gles2::cmds::DrawArraysInstancedANGLE* c = - GetCmdSpace<gles2::cmds::DrawArraysInstancedANGLE>(); - if (c) { - c->Init(mode, first, count, primcount); - } - } - - void DrawElementsInstancedANGLE( - GLenum mode, GLsizei count, GLenum type, GLuint index_offset, - GLsizei primcount) { - gles2::cmds::DrawElementsInstancedANGLE* c = - GetCmdSpace<gles2::cmds::DrawElementsInstancedANGLE>(); - if (c) { - c->Init(mode, count, type, index_offset, primcount); - } - } - - void VertexAttribDivisorANGLE(GLuint index, GLuint divisor) { - gles2::cmds::VertexAttribDivisorANGLE* c = - GetCmdSpace<gles2::cmds::VertexAttribDivisorANGLE>(); - if (c) { - c->Init(index, divisor); - } - } - - void ProduceTextureCHROMIUM( - GLenum target, uint32 mailbox_shm_id, uint32 mailbox_shm_offset) { - gles2::cmds::ProduceTextureCHROMIUM* c = - GetCmdSpace<gles2::cmds::ProduceTextureCHROMIUM>(); - if (c) { - c->Init(target, mailbox_shm_id, mailbox_shm_offset); - } - } - - void ProduceTextureCHROMIUMImmediate(GLenum target, const GLbyte* mailbox) { - const uint32 size = - gles2::cmds::ProduceTextureCHROMIUMImmediate::ComputeSize(); - gles2::cmds::ProduceTextureCHROMIUMImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::ProduceTextureCHROMIUMImmediate>(size); // NOLINT - if (c) { - c->Init(target, mailbox); - } - } - - void ConsumeTextureCHROMIUM( - GLenum target, uint32 mailbox_shm_id, uint32 mailbox_shm_offset) { - gles2::cmds::ConsumeTextureCHROMIUM* c = - GetCmdSpace<gles2::cmds::ConsumeTextureCHROMIUM>(); - if (c) { - c->Init(target, mailbox_shm_id, mailbox_shm_offset); - } - } - - void ConsumeTextureCHROMIUMImmediate(GLenum target, const GLbyte* mailbox) { - const uint32 size = - gles2::cmds::ConsumeTextureCHROMIUMImmediate::ComputeSize(); - gles2::cmds::ConsumeTextureCHROMIUMImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::ConsumeTextureCHROMIUMImmediate>(size); // NOLINT - if (c) { - c->Init(target, mailbox); - } - } - - void BindUniformLocationCHROMIUM( - GLuint program, GLint location, uint32 name_shm_id, - uint32 name_shm_offset, uint32 data_size) { - gles2::cmds::BindUniformLocationCHROMIUM* c = - GetCmdSpace<gles2::cmds::BindUniformLocationCHROMIUM>(); - if (c) { - c->Init(program, location, name_shm_id, name_shm_offset, data_size); - } - } - - void BindUniformLocationCHROMIUMBucket( - GLuint program, GLint location, uint32 name_bucket_id) { - gles2::cmds::BindUniformLocationCHROMIUMBucket* c = - GetCmdSpace<gles2::cmds::BindUniformLocationCHROMIUMBucket>(); - if (c) { - c->Init(program, location, name_bucket_id); - } - } - - void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) { - gles2::cmds::BindTexImage2DCHROMIUM* c = - GetCmdSpace<gles2::cmds::BindTexImage2DCHROMIUM>(); - if (c) { - c->Init(target, imageId); - } - } - - void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) { - gles2::cmds::ReleaseTexImage2DCHROMIUM* c = - GetCmdSpace<gles2::cmds::ReleaseTexImage2DCHROMIUM>(); - if (c) { - c->Init(target, imageId); - } - } - - void TraceBeginCHROMIUM(GLuint bucket_id) { - gles2::cmds::TraceBeginCHROMIUM* c = - GetCmdSpace<gles2::cmds::TraceBeginCHROMIUM>(); - if (c) { - c->Init(bucket_id); - } - } - - void TraceEndCHROMIUM() { - gles2::cmds::TraceEndCHROMIUM* c = - GetCmdSpace<gles2::cmds::TraceEndCHROMIUM>(); - if (c) { - c->Init(); - } - } - - void AsyncTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, uint32 data_shm_id, - uint32 data_shm_offset) { - gles2::cmds::AsyncTexSubImage2DCHROMIUM* c = - GetCmdSpace<gles2::cmds::AsyncTexSubImage2DCHROMIUM>(); - if (c) { - c->Init( - target, level, xoffset, yoffset, width, height, format, type, - data_shm_id, data_shm_offset); - } - } - - void AsyncTexImage2DCHROMIUM( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - uint32 pixels_shm_id, uint32 pixels_shm_offset) { - gles2::cmds::AsyncTexImage2DCHROMIUM* c = - GetCmdSpace<gles2::cmds::AsyncTexImage2DCHROMIUM>(); - if (c) { - c->Init( - target, level, internalformat, width, height, border, format, type, - pixels_shm_id, pixels_shm_offset); - } - } - - void WaitAsyncTexImage2DCHROMIUM(GLenum target) { - gles2::cmds::WaitAsyncTexImage2DCHROMIUM* c = - GetCmdSpace<gles2::cmds::WaitAsyncTexImage2DCHROMIUM>(); - if (c) { - c->Init(target); - } - } - - void DiscardFramebufferEXT( - GLenum target, GLsizei count, uint32 attachments_shm_id, - uint32 attachments_shm_offset) { - gles2::cmds::DiscardFramebufferEXT* c = - GetCmdSpace<gles2::cmds::DiscardFramebufferEXT>(); - if (c) { - c->Init(target, count, attachments_shm_id, attachments_shm_offset); - } - } - - void DiscardFramebufferEXTImmediate( - GLenum target, GLsizei count, const GLenum* attachments) { - const uint32 size = - gles2::cmds::DiscardFramebufferEXTImmediate::ComputeSize(count); - gles2::cmds::DiscardFramebufferEXTImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::DiscardFramebufferEXTImmediate>(size); // NOLINT - if (c) { - c->Init(target, count, attachments); - } - } - - void LoseContextCHROMIUM(GLenum current, GLenum other) { - gles2::cmds::LoseContextCHROMIUM* c = - GetCmdSpace<gles2::cmds::LoseContextCHROMIUM>(); - if (c) { - c->Init(current, other); - } - } - - void WaitSyncPointCHROMIUM(GLuint sync_point) { - gles2::cmds::WaitSyncPointCHROMIUM* c = - GetCmdSpace<gles2::cmds::WaitSyncPointCHROMIUM>(); - if (c) { - c->Init(sync_point); - } - } - - void DrawBuffersEXT( - GLsizei count, uint32 bufs_shm_id, uint32 bufs_shm_offset) { - gles2::cmds::DrawBuffersEXT* c = - GetCmdSpace<gles2::cmds::DrawBuffersEXT>(); - if (c) { - c->Init(count, bufs_shm_id, bufs_shm_offset); - } - } - - void DrawBuffersEXTImmediate(GLsizei count, const GLenum* bufs) { - const uint32 size = - gles2::cmds::DrawBuffersEXTImmediate::ComputeSize(count); - gles2::cmds::DrawBuffersEXTImmediate* c = - GetImmediateCmdSpaceTotalSize<gles2::cmds::DrawBuffersEXTImmediate>( - size); - if (c) { - c->Init(count, bufs); - } - } - - void DiscardBackbufferCHROMIUM() { - gles2::cmds::DiscardBackbufferCHROMIUM* c = - GetCmdSpace<gles2::cmds::DiscardBackbufferCHROMIUM>(); - if (c) { - c->Init(); - } } +} + +void GetProgramInfoCHROMIUM(GLuint program, uint32_t bucket_id) { + gles2::cmds::GetProgramInfoCHROMIUM* c = + GetCmdSpace<gles2::cmds::GetProgramInfoCHROMIUM>(); + if (c) { + c->Init(program, bucket_id); + } +} + +void GetTranslatedShaderSourceANGLE(GLuint shader, uint32_t bucket_id) { + gles2::cmds::GetTranslatedShaderSourceANGLE* c = + GetCmdSpace<gles2::cmds::GetTranslatedShaderSourceANGLE>(); + if (c) { + c->Init(shader, bucket_id); + } +} + +void PostSubBufferCHROMIUM(GLint x, GLint y, GLint width, GLint height) { + gles2::cmds::PostSubBufferCHROMIUM* c = + GetCmdSpace<gles2::cmds::PostSubBufferCHROMIUM>(); + if (c) { + c->Init(x, y, width, height); + } +} + +void TexImageIOSurface2DCHROMIUM(GLenum target, + GLsizei width, + GLsizei height, + GLuint ioSurfaceId, + GLuint plane) { + gles2::cmds::TexImageIOSurface2DCHROMIUM* c = + GetCmdSpace<gles2::cmds::TexImageIOSurface2DCHROMIUM>(); + if (c) { + c->Init(target, width, height, ioSurfaceId, plane); + } +} + +void CopyTextureCHROMIUM(GLenum target, + GLenum source_id, + GLenum dest_id, + GLint level, + GLint internalformat, + GLenum dest_type) { + gles2::cmds::CopyTextureCHROMIUM* c = + GetCmdSpace<gles2::cmds::CopyTextureCHROMIUM>(); + if (c) { + c->Init(target, source_id, dest_id, level, internalformat, dest_type); + } +} + +void DrawArraysInstancedANGLE(GLenum mode, + GLint first, + GLsizei count, + GLsizei primcount) { + gles2::cmds::DrawArraysInstancedANGLE* c = + GetCmdSpace<gles2::cmds::DrawArraysInstancedANGLE>(); + if (c) { + c->Init(mode, first, count, primcount); + } +} + +void DrawElementsInstancedANGLE(GLenum mode, + GLsizei count, + GLenum type, + GLuint index_offset, + GLsizei primcount) { + gles2::cmds::DrawElementsInstancedANGLE* c = + GetCmdSpace<gles2::cmds::DrawElementsInstancedANGLE>(); + if (c) { + c->Init(mode, count, type, index_offset, primcount); + } +} + +void VertexAttribDivisorANGLE(GLuint index, GLuint divisor) { + gles2::cmds::VertexAttribDivisorANGLE* c = + GetCmdSpace<gles2::cmds::VertexAttribDivisorANGLE>(); + if (c) { + c->Init(index, divisor); + } +} + +void ProduceTextureCHROMIUMImmediate(GLenum target, const GLbyte* mailbox) { + const uint32_t size = + gles2::cmds::ProduceTextureCHROMIUMImmediate::ComputeSize(); + gles2::cmds::ProduceTextureCHROMIUMImmediate* c = + GetImmediateCmdSpaceTotalSize< + gles2::cmds::ProduceTextureCHROMIUMImmediate>(size); + if (c) { + c->Init(target, mailbox); + } +} + +void ProduceTextureDirectCHROMIUMImmediate(GLuint texture, + GLenum target, + const GLbyte* mailbox) { + const uint32_t size = + gles2::cmds::ProduceTextureDirectCHROMIUMImmediate::ComputeSize(); + gles2::cmds::ProduceTextureDirectCHROMIUMImmediate* c = + GetImmediateCmdSpaceTotalSize< + gles2::cmds::ProduceTextureDirectCHROMIUMImmediate>(size); + if (c) { + c->Init(texture, target, mailbox); + } +} + +void ConsumeTextureCHROMIUMImmediate(GLenum target, const GLbyte* mailbox) { + const uint32_t size = + gles2::cmds::ConsumeTextureCHROMIUMImmediate::ComputeSize(); + gles2::cmds::ConsumeTextureCHROMIUMImmediate* c = + GetImmediateCmdSpaceTotalSize< + gles2::cmds::ConsumeTextureCHROMIUMImmediate>(size); + if (c) { + c->Init(target, mailbox); + } +} + +void BindUniformLocationCHROMIUMBucket(GLuint program, + GLint location, + uint32_t name_bucket_id) { + gles2::cmds::BindUniformLocationCHROMIUMBucket* c = + GetCmdSpace<gles2::cmds::BindUniformLocationCHROMIUMBucket>(); + if (c) { + c->Init(program, location, name_bucket_id); + } +} + +void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) { + gles2::cmds::BindTexImage2DCHROMIUM* c = + GetCmdSpace<gles2::cmds::BindTexImage2DCHROMIUM>(); + if (c) { + c->Init(target, imageId); + } +} + +void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) { + gles2::cmds::ReleaseTexImage2DCHROMIUM* c = + GetCmdSpace<gles2::cmds::ReleaseTexImage2DCHROMIUM>(); + if (c) { + c->Init(target, imageId); + } +} + +void TraceBeginCHROMIUM(GLuint bucket_id) { + gles2::cmds::TraceBeginCHROMIUM* c = + GetCmdSpace<gles2::cmds::TraceBeginCHROMIUM>(); + if (c) { + c->Init(bucket_id); + } +} + +void TraceEndCHROMIUM() { + gles2::cmds::TraceEndCHROMIUM* c = + GetCmdSpace<gles2::cmds::TraceEndCHROMIUM>(); + if (c) { + c->Init(); + } +} + +void AsyncTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + uint32_t data_shm_id, + uint32_t data_shm_offset, + uint32_t async_upload_token, + uint32_t sync_data_shm_id, + uint32_t sync_data_shm_offset) { + gles2::cmds::AsyncTexSubImage2DCHROMIUM* c = + GetCmdSpace<gles2::cmds::AsyncTexSubImage2DCHROMIUM>(); + if (c) { + c->Init(target, + level, + xoffset, + yoffset, + width, + height, + format, + type, + data_shm_id, + data_shm_offset, + async_upload_token, + sync_data_shm_id, + sync_data_shm_offset); + } +} + +void AsyncTexImage2DCHROMIUM(GLenum target, + GLint level, + GLint internalformat, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + uint32_t pixels_shm_id, + uint32_t pixels_shm_offset, + uint32_t async_upload_token, + uint32_t sync_data_shm_id, + uint32_t sync_data_shm_offset) { + gles2::cmds::AsyncTexImage2DCHROMIUM* c = + GetCmdSpace<gles2::cmds::AsyncTexImage2DCHROMIUM>(); + if (c) { + c->Init(target, + level, + internalformat, + width, + height, + format, + type, + pixels_shm_id, + pixels_shm_offset, + async_upload_token, + sync_data_shm_id, + sync_data_shm_offset); + } +} + +void WaitAsyncTexImage2DCHROMIUM(GLenum target) { + gles2::cmds::WaitAsyncTexImage2DCHROMIUM* c = + GetCmdSpace<gles2::cmds::WaitAsyncTexImage2DCHROMIUM>(); + if (c) { + c->Init(target); + } +} + +void WaitAllAsyncTexImage2DCHROMIUM() { + gles2::cmds::WaitAllAsyncTexImage2DCHROMIUM* c = + GetCmdSpace<gles2::cmds::WaitAllAsyncTexImage2DCHROMIUM>(); + if (c) { + c->Init(); + } +} + +void DiscardFramebufferEXTImmediate(GLenum target, + GLsizei count, + const GLenum* attachments) { + const uint32_t size = + gles2::cmds::DiscardFramebufferEXTImmediate::ComputeSize(count); + gles2::cmds::DiscardFramebufferEXTImmediate* c = + GetImmediateCmdSpaceTotalSize< + gles2::cmds::DiscardFramebufferEXTImmediate>(size); + if (c) { + c->Init(target, count, attachments); + } +} + +void LoseContextCHROMIUM(GLenum current, GLenum other) { + gles2::cmds::LoseContextCHROMIUM* c = + GetCmdSpace<gles2::cmds::LoseContextCHROMIUM>(); + if (c) { + c->Init(current, other); + } +} + +void WaitSyncPointCHROMIUM(GLuint sync_point) { + gles2::cmds::WaitSyncPointCHROMIUM* c = + GetCmdSpace<gles2::cmds::WaitSyncPointCHROMIUM>(); + if (c) { + c->Init(sync_point); + } +} + +void DrawBuffersEXTImmediate(GLsizei count, const GLenum* bufs) { + const uint32_t size = + gles2::cmds::DrawBuffersEXTImmediate::ComputeSize(count); + gles2::cmds::DrawBuffersEXTImmediate* c = + GetImmediateCmdSpaceTotalSize<gles2::cmds::DrawBuffersEXTImmediate>(size); + if (c) { + c->Init(count, bufs); + } +} + +void DiscardBackbufferCHROMIUM() { + gles2::cmds::DiscardBackbufferCHROMIUM* c = + GetCmdSpace<gles2::cmds::DiscardBackbufferCHROMIUM>(); + if (c) { + c->Init(); + } +} + +void ScheduleOverlayPlaneCHROMIUM(GLint plane_z_order, + GLenum plane_transform, + GLuint overlay_texture_id, + GLint bounds_x, + GLint bounds_y, + GLint bounds_width, + GLint bounds_height, + GLfloat uv_x, + GLfloat uv_y, + GLfloat uv_width, + GLfloat uv_height) { + gles2::cmds::ScheduleOverlayPlaneCHROMIUM* c = + GetCmdSpace<gles2::cmds::ScheduleOverlayPlaneCHROMIUM>(); + if (c) { + c->Init(plane_z_order, + plane_transform, + overlay_texture_id, + bounds_x, + bounds_y, + bounds_width, + bounds_height, + uv_x, + uv_y, + uv_width, + uv_height); + } +} #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_CMD_HELPER_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/client/gles2_implementation.cc b/chromium/gpu/command_buffer/client/gles2_implementation.cc index b0efc3769da..716fb55fbc2 100644 --- a/chromium/gpu/command_buffer/client/gles2_implementation.cc +++ b/chromium/gpu/command_buffer/client/gles2_implementation.cc @@ -6,23 +6,24 @@ #include "gpu/command_buffer/client/gles2_implementation.h" +#include <GLES2/gl2ext.h> +#include <GLES2/gl2extchromium.h> #include <algorithm> +#include <limits> #include <map> #include <queue> #include <set> -#include <limits> -#include <stdio.h> -#include <string.h> -#include <GLES2/gl2ext.h> -#include <GLES2/gl2extchromium.h> +#include <sstream> +#include <string> +#include "base/bind.h" #include "gpu/command_buffer/client/buffer_tracker.h" +#include "gpu/command_buffer/client/gpu_control.h" #include "gpu/command_buffer/client/gpu_memory_buffer_tracker.h" #include "gpu/command_buffer/client/program_info_manager.h" #include "gpu/command_buffer/client/query_tracker.h" #include "gpu/command_buffer/client/transfer_buffer.h" #include "gpu/command_buffer/client/vertex_array_object_manager.h" #include "gpu/command_buffer/common/gles2_cmd_utils.h" -#include "gpu/command_buffer/common/gpu_control.h" #include "gpu/command_buffer/common/trace_event.h" #include "ui/gfx/gpu_memory_buffer.h" @@ -31,8 +32,8 @@ #endif #if defined(GPU_CLIENT_DEBUG) -#include "ui/gl/gl_switches.h" #include "base/command_line.h" +#include "ui/gl/gl_switches.h" #endif namespace gpu { @@ -66,8 +67,8 @@ GLES2Implementation::GLStaticState::IntState::IntState() max_vertex_texture_image_units(0), max_vertex_uniform_vectors(0), num_compressed_texture_formats(0), - num_shader_binary_formats(0) { -} + num_shader_binary_formats(0), + bind_generates_resource_chromium(0) {} GLES2Implementation::SingleThreadChecker::SingleThreadChecker( GLES2Implementation* gles2_implementation) @@ -82,12 +83,12 @@ GLES2Implementation::SingleThreadChecker::~SingleThreadChecker() { } GLES2Implementation::GLES2Implementation( - GLES2CmdHelper* helper, - ShareGroup* share_group, - TransferBufferInterface* transfer_buffer, - bool bind_generates_resource, - bool free_everything_when_invisible, - GpuControl* gpu_control) + GLES2CmdHelper* helper, + ShareGroup* share_group, + TransferBufferInterface* transfer_buffer, + bool bind_generates_resource, + bool lose_context_when_out_of_memory, + GpuControl* gpu_control) : helper_(helper), transfer_buffer_(transfer_buffer), angle_pack_reverse_row_order_status_(kUnknownExtensionStatus), @@ -107,23 +108,25 @@ GLES2Implementation::GLES2Implementation( bound_array_buffer_id_(0), bound_pixel_pack_transfer_buffer_id_(0), bound_pixel_unpack_transfer_buffer_id_(0), + async_upload_token_(0), + async_upload_sync_(NULL), + async_upload_sync_shm_id_(0), + async_upload_sync_shm_offset_(0), error_bits_(0), debug_(false), + lose_context_when_out_of_memory_(lose_context_when_out_of_memory), use_count_(0), - current_query_(NULL), error_message_callback_(NULL), gpu_control_(gpu_control), - surface_visible_(true), - free_everything_when_invisible_(free_everything_when_invisible), capabilities_(gpu_control->GetCapabilities()), weak_ptr_factory_(this) { DCHECK(helper); DCHECK(transfer_buffer); DCHECK(gpu_control); - char temp[128]; - sprintf(temp, "%p", static_cast<void*>(this)); - this_in_hex_ = std::string(temp); + std::stringstream ss; + ss << std::hex << this; + this_in_hex_ = ss.str(); GPU_CLIENT_LOG_CODE_BLOCK({ debug_ = CommandLine::ForCurrentProcess()->HasSwitch( @@ -141,6 +144,7 @@ bool GLES2Implementation::Initialize( unsigned int min_transfer_buffer_size, unsigned int max_transfer_buffer_size, unsigned int mapped_memory_limit) { + TRACE_EVENT0("gpu", "GLES2Implementation::Initialize"); DCHECK_GE(starting_transfer_buffer_size, min_transfer_buffer_size); DCHECK_LE(starting_transfer_buffer_size, max_transfer_buffer_size); DCHECK_GE(min_transfer_buffer_size, kStartingOffset); @@ -155,7 +159,15 @@ bool GLES2Implementation::Initialize( return false; } - mapped_memory_.reset(new MappedMemoryManager(helper_, mapped_memory_limit)); + mapped_memory_.reset( + new MappedMemoryManager( + helper_, + base::Bind(&GLES2Implementation::PollAsyncUploads, + // The mapped memory manager is owned by |this| here, and + // since its destroyed before before we destroy ourselves + // we don't need extra safety measures for this closure. + base::Unretained(this)), + mapped_memory_limit)); unsigned chunk_size = 2 * 1024 * 1024; if (mapped_memory_limit != kNoLimit) { @@ -190,10 +202,21 @@ bool GLES2Implementation::Initialize( reserved_ids_[0], reserved_ids_[1])); + // GL_BIND_GENERATES_RESOURCE_CHROMIUM state must be the same + // on Client & Service. + if (static_state_.int_state.bind_generates_resource_chromium != + (share_group_->bind_generates_resource() ? 1 : 0)) { + SetGLError(GL_INVALID_OPERATION, + "Initialize", + "Service bind_generates_resource mismatch."); + return false; + } + return true; } bool GLES2Implementation::QueryAndCacheStaticState() { + TRACE_EVENT0("gpu", "GLES2Implementation::QueryAndCacheStaticState"); // Setup query for multiple GetIntegerv's static const GLenum pnames[] = { GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, @@ -208,6 +231,7 @@ bool GLES2Implementation::QueryAndCacheStaticState() { GL_MAX_VERTEX_UNIFORM_VECTORS, GL_NUM_COMPRESSED_TEXTURE_FORMATS, GL_NUM_SHADER_BINARY_FORMATS, + GL_BIND_GENERATES_RESOURCE_CHROMIUM, }; GetMultipleIntegervState integerv_state( @@ -276,8 +300,19 @@ GLES2Implementation::~GLES2Implementation() { #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) DeleteBuffers(arraysize(reserved_ids_), &reserved_ids_[0]); #endif + + // Release any per-context data in share group. + share_group_->FreeContext(this); + buffer_tracker_.reset(); + FreeAllAsyncUploadBuffers(); + + if (async_upload_sync_) { + mapped_memory_->Free(async_upload_sync_); + async_upload_sync_ = NULL; + } + // Make sure the commands make it the service. WaitForCmd(); } @@ -307,6 +342,7 @@ void GLES2Implementation::FreeUnusedSharedMemory() { } void GLES2Implementation::FreeEverything() { + FreeAllAsyncUploadBuffers(); WaitForCmd(); query_tracker_->Shrink(); FreeUnusedSharedMemory(); @@ -341,19 +377,15 @@ void GLES2Implementation::SignalQuery(uint32 query, } void GLES2Implementation::SetSurfaceVisible(bool visible) { + TRACE_EVENT1( + "gpu", "GLES2Implementation::SetSurfaceVisible", "visible", visible); // TODO(piman): This probably should be ShallowFlushCHROMIUM(). Flush(); - surface_visible_ = visible; gpu_control_->SetSurfaceVisible(visible); if (!visible) FreeEverything(); } -void GLES2Implementation::SendManagedMemoryStats( - const ManagedMemoryStats& stats) { - gpu_control_->SendManagedMemoryStats(stats); -} - void GLES2Implementation::WaitForCmd() { TRACE_EVENT0("gpu", "GLES2::WaitForCmd"); helper_->CommandBufferHelper::Finish(); @@ -484,6 +516,11 @@ void GLES2Implementation::SetGLError( error_message_callback_->OnErrorMessage(temp.c_str(), 0); } error_bits_ |= GLES2Util::GLErrorToErrorBit(error); + + if (error == GL_OUT_OF_MEMORY && lose_context_when_out_of_memory_) { + helper_->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, + GL_UNKNOWN_CONTEXT_RESET_ARB); + } } void GLES2Implementation::SetGLErrorInvalidEnum( @@ -827,6 +864,10 @@ void GLES2Implementation::DrawElements( if (count == 0) { return; } + if (vertex_array_object_manager_->bound_element_array_buffer() != 0 && + !ValidateOffset("glDrawElements", reinterpret_cast<GLintptr>(indices))) { + return; + } GLuint offset = 0; bool simulated = false; if (!vertex_array_object_manager_->SetupSimulatedIndexAndClientSideBuffers( @@ -847,8 +888,6 @@ void GLES2Implementation::Flush() { // Flush our command buffer // (tell the service to execute up to the flush cmd.) helper_->CommandBufferHelper::Flush(); - if (!surface_visible_ && free_everything_when_invisible_) - FreeEverything(); } void GLES2Implementation::ShallowFlushCHROMIUM() { @@ -863,27 +902,16 @@ void GLES2Implementation::ShallowFlushCHROMIUM() { void GLES2Implementation::Finish() { GPU_CLIENT_SINGLE_THREAD_CHECK(); FinishHelper(); - if (!surface_visible_ && free_everything_when_invisible_) - FreeEverything(); } void GLES2Implementation::ShallowFinishCHROMIUM() { GPU_CLIENT_SINGLE_THREAD_CHECK(); + TRACE_EVENT0("gpu", "GLES2::ShallowFinishCHROMIUM"); // Flush our command buffer (tell the service to execute up to the flush cmd // and don't return until it completes). helper_->CommandBufferHelper::Finish(); } -bool GLES2Implementation::MustBeContextLost() { - bool context_lost = helper_->IsContextLost(); - if (!context_lost) { - WaitForCmd(); - context_lost = helper_->IsContextLost(); - } - CHECK(context_lost); - return context_lost; -} - void GLES2Implementation::FinishHelper() { GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFinish()"); TRACE_EVENT0("gpu", "GLES2::Finish"); @@ -1090,14 +1118,14 @@ void GLES2Implementation::DeleteShaderStub( GLint GLES2Implementation::GetAttribLocationHelper( GLuint program, const char* name) { - typedef cmds::GetAttribLocationBucket::Result Result; + typedef cmds::GetAttribLocation::Result Result; Result* result = GetResultAs<Result*>(); if (!result) { return -1; } *result = -1; SetBucketAsCString(kResultBucketId, name); - helper_->GetAttribLocationBucket( + helper_->GetAttribLocation( program, kResultBucketId, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); helper_->SetBucketSize(kResultBucketId, 0); @@ -1119,14 +1147,14 @@ GLint GLES2Implementation::GetAttribLocation( GLint GLES2Implementation::GetUniformLocationHelper( GLuint program, const char* name) { - typedef cmds::GetUniformLocationBucket::Result Result; + typedef cmds::GetUniformLocation::Result Result; Result* result = GetResultAs<Result*>(); if (!result) { return -1; } *result = -1; SetBucketAsCString(kResultBucketId, name); - helper_->GetUniformLocationBucket(program, kResultBucketId, + helper_->GetUniformLocation(program, kResultBucketId, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); helper_->SetBucketSize(kResultBucketId, 0); @@ -1146,16 +1174,6 @@ GLint GLES2Implementation::GetUniformLocation( return loc; } -void GLES2Implementation::UseProgram(GLuint program) { - GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUseProgram(" << program << ")"); - if (current_program_ != program) { - current_program_ = program; - helper_->UseProgram(program); - } - CheckGLError(); -} - bool GLES2Implementation::GetProgramivHelper( GLuint program, GLenum pname, GLint* params) { bool got_value = share_group_->program_info_manager()->GetProgramiv( @@ -1228,13 +1246,13 @@ void GLES2Implementation::PixelStorei(GLenum pname, GLint param) { case GL_UNPACK_ALIGNMENT: unpack_alignment_ = param; break; - case GL_UNPACK_ROW_LENGTH: + case GL_UNPACK_ROW_LENGTH_EXT: unpack_row_length_ = param; return; - case GL_UNPACK_SKIP_ROWS: + case GL_UNPACK_SKIP_ROWS_EXT: unpack_skip_rows_ = param; return; - case GL_UNPACK_SKIP_PIXELS: + case GL_UNPACK_SKIP_PIXELS_EXT: unpack_skip_pixels_ = param; return; case GL_UNPACK_FLIP_Y_CHROMIUM: @@ -1251,7 +1269,6 @@ void GLES2Implementation::PixelStorei(GLenum pname, GLint param) { CheckGLError(); } - void GLES2Implementation::VertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* ptr) { @@ -1273,10 +1290,18 @@ void GLES2Implementation::VertexAttribPointer( #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) if (bound_array_buffer_id_ != 0) { // Only report NON client side buffers to the service. + if (!ValidateOffset("glVertexAttribPointer", + reinterpret_cast<GLintptr>(ptr))) { + return; + } helper_->VertexAttribPointer(index, size, type, normalized, stride, ToGLuint(ptr)); } #else // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) + if (!ValidateOffset("glVertexAttribPointer", + reinterpret_cast<GLintptr>(ptr))) { + return; + } helper_->VertexAttribPointer(index, size, type, normalized, stride, ToGLuint(ptr)); #endif // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) @@ -1366,10 +1391,8 @@ void GLES2Implementation::ShaderSource( void GLES2Implementation::BufferDataHelper( GLenum target, GLsizeiptr size, const void* data, GLenum usage) { - if (size < 0) { - SetGLError(GL_INVALID_VALUE, "glBufferData", "size < 0"); + if (!ValidateSize("glBufferData", size)) return; - } GLuint buffer_id; if (GetBoundPixelTransferBuffer(target, "glBufferData", &buffer_id)) { @@ -1378,13 +1401,8 @@ void GLES2Implementation::BufferDataHelper( } BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffer_id); - if (buffer) { - // Free buffer memory, pending the passage of a token. - buffer_tracker_->FreePendingToken(buffer, helper_->InsertToken()); - - // Remove old buffer. - buffer_tracker_->RemoveBuffer(buffer_id); - } + if (buffer) + RemoveTransferBuffer(buffer); // Create new buffer. buffer = buffer_tracker_->CreateBuffer(buffer_id, size); @@ -1445,8 +1463,8 @@ void GLES2Implementation::BufferSubDataHelper( return; } - if (size < 0) { - SetGLError(GL_INVALID_VALUE, "glBufferSubData", "size < 0"); + if (!ValidateSize("glBufferSubData", size) || + !ValidateOffset("glBufferSubData", offset)) { return; } @@ -1512,6 +1530,30 @@ void GLES2Implementation::BufferSubData( CheckGLError(); } +void GLES2Implementation::RemoveTransferBuffer(BufferTracker::Buffer* buffer) { + int32 token = buffer->last_usage_token(); + uint32 async_token = buffer->last_async_upload_token(); + + if (async_token) { + if (HasAsyncUploadTokenPassed(async_token)) { + buffer_tracker_->Free(buffer); + } else { + detached_async_upload_memory_.push_back( + std::make_pair(buffer->address(), async_token)); + buffer_tracker_->Unmanage(buffer); + } + } else if (token) { + if (helper_->HasTokenPassed(token)) + buffer_tracker_->Free(buffer); + else + buffer_tracker_->FreePendingToken(buffer, token); + } else { + buffer_tracker_->Free(buffer); + } + + buffer_tracker_->RemoveBuffer(buffer->id()); +} + bool GLES2Implementation::GetBoundPixelTransferBuffer( GLenum target, const char* function_name, @@ -1573,6 +1615,10 @@ void GLES2Implementation::CompressedTexImage2D( SetGLError(GL_INVALID_VALUE, "glCompressedTexImage2D", "dimension < 0"); return; } + if (border != 0) { + SetGLError(GL_INVALID_VALUE, "glCompressedTexImage2D", "border != 0"); + return; + } if (height == 0 || width == 0) { return; } @@ -1585,15 +1631,15 @@ void GLES2Implementation::CompressedTexImage2D( "glCompressedTexImage2D", offset, image_size); if (buffer && buffer->shm_id() != -1) { helper_->CompressedTexImage2D( - target, level, internalformat, width, height, border, image_size, + target, level, internalformat, width, height, image_size, buffer->shm_id(), buffer->shm_offset() + offset); - buffer->set_transfer_ready_token(helper_->InsertToken()); + buffer->set_last_usage_token(helper_->InsertToken()); } return; } SetBucketContents(kResultBucketId, data, image_size); helper_->CompressedTexImage2DBucket( - target, level, internalformat, width, height, border, kResultBucketId); + target, level, internalformat, width, height, kResultBucketId); // Free the bucket. This is not required but it does free up the memory. // and we don't have to wait for the result so from the client's perspective // it's cheap. @@ -1628,7 +1674,7 @@ void GLES2Implementation::CompressedTexSubImage2D( helper_->CompressedTexSubImage2D( target, level, xoffset, yoffset, width, height, format, image_size, buffer->shm_id(), buffer->shm_offset() + offset); - buffer->set_transfer_ready_token(helper_->InsertToken()); + buffer->set_last_usage_token(helper_->InsertToken()); CheckGLError(); } return; @@ -1695,6 +1741,10 @@ void GLES2Implementation::TexImage2D( SetGLError(GL_INVALID_VALUE, "glTexImage2D", "dimension < 0"); return; } + if (border != 0) { + SetGLError(GL_INVALID_VALUE, "glTexImage2D", "border != 0"); + return; + } uint32 size; uint32 unpadded_row_size; uint32 padded_row_size; @@ -1713,9 +1763,9 @@ void GLES2Implementation::TexImage2D( "glTexImage2D", offset, size); if (buffer && buffer->shm_id() != -1) { helper_->TexImage2D( - target, level, internalformat, width, height, border, format, type, + target, level, internalformat, width, height, format, type, buffer->shm_id(), buffer->shm_offset() + offset); - buffer->set_transfer_ready_token(helper_->InsertToken()); + buffer->set_last_usage_token(helper_->InsertToken()); CheckGLError(); } return; @@ -1724,7 +1774,7 @@ void GLES2Implementation::TexImage2D( // If there's no data just issue TexImage2D if (!pixels) { helper_->TexImage2D( - target, level, internalformat, width, height, border, format, type, + target, level, internalformat, width, height, format, type, 0, 0); CheckGLError(); return; @@ -1764,7 +1814,7 @@ void GLES2Implementation::TexImage2D( pixels, height, unpadded_row_size, src_padded_row_size, unpack_flip_y_, buffer.address(), padded_row_size); helper_->TexImage2D( - target, level, internalformat, width, height, border, format, type, + target, level, internalformat, width, height, format, type, buffer.shm_id(), buffer.offset()); CheckGLError(); return; @@ -1772,7 +1822,7 @@ void GLES2Implementation::TexImage2D( // No, so send it using TexSubImage2D. helper_->TexImage2D( - target, level, internalformat, width, height, border, format, type, + target, level, internalformat, width, height, format, type, 0, 0); TexSubImage2DImpl( target, level, 0, 0, width, height, format, type, unpadded_row_size, @@ -1821,7 +1871,7 @@ void GLES2Implementation::TexSubImage2D( helper_->TexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, buffer->shm_id(), buffer->shm_offset() + offset, false); - buffer->set_transfer_ready_token(helper_->InsertToken()); + buffer->set_last_usage_token(helper_->InsertToken()); CheckGLError(); } return; @@ -1859,9 +1909,9 @@ void GLES2Implementation::TexSubImage2D( } static GLint ComputeNumRowsThatFitInBuffer( - GLsizeiptr padded_row_size, GLsizeiptr unpadded_row_size, + uint32 padded_row_size, uint32 unpadded_row_size, unsigned int size) { - DCHECK_GE(unpadded_row_size, 0); + DCHECK_GE(unpadded_row_size, 0u); if (padded_row_size == 0) { return 1; } @@ -2146,7 +2196,8 @@ const GLubyte* GLES2Implementation::GetStringHelper(GLenum name) { case GL_EXTENSIONS: str += std::string(str.empty() ? "" : " ") + "GL_CHROMIUM_flipy " - "GL_EXT_unpack_subimage"; + "GL_EXT_unpack_subimage " + "GL_CHROMIUM_map_sub"; if (capabilities_.map_image) { // The first space character is intentional. str += " GL_CHROMIUM_map_image"; @@ -2404,24 +2455,24 @@ void GLES2Implementation::GenQueriesEXTHelper( // deleted the resource. bool GLES2Implementation::BindBufferHelper( - GLenum target, GLuint buffer) { + GLenum target, GLuint buffer_id) { // TODO(gman): See note #1 above. bool changed = false; switch (target) { case GL_ARRAY_BUFFER: - if (bound_array_buffer_id_ != buffer) { - bound_array_buffer_id_ = buffer; + if (bound_array_buffer_id_ != buffer_id) { + bound_array_buffer_id_ = buffer_id; changed = true; } break; case GL_ELEMENT_ARRAY_BUFFER: - changed = vertex_array_object_manager_->BindElementArray(buffer); + changed = vertex_array_object_manager_->BindElementArray(buffer_id); break; case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM: - bound_pixel_pack_transfer_buffer_id_ = buffer; + bound_pixel_pack_transfer_buffer_id_ = buffer_id; break; case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM: - bound_pixel_unpack_transfer_buffer_id_ = buffer; + bound_pixel_unpack_transfer_buffer_id_ = buffer_id; break; default: changed = true; @@ -2429,7 +2480,7 @@ bool GLES2Implementation::BindBufferHelper( } // TODO(gman): There's a bug here. If the target is invalid the ID will not be // used even though it's marked it as used here. - GetIdHandler(id_namespaces::kBuffers)->MarkAsUsedForBind(buffer); + GetIdHandler(id_namespaces::kBuffers)->MarkAsUsedForBind(buffer_id); return changed; } @@ -2530,7 +2581,7 @@ bool GLES2Implementation::BindTextureHelper(GLenum target, GLuint texture) { return changed; } -bool GLES2Implementation::BindVertexArrayHelper(GLuint array) { +bool GLES2Implementation::BindVertexArrayOESHelper(GLuint array) { // TODO(gman): See note #1 above. bool changed = false; if (!vertex_array_object_manager_->BindVertexArray(array, &changed)) { @@ -2545,6 +2596,15 @@ bool GLES2Implementation::BindVertexArrayHelper(GLuint array) { return changed; } +bool GLES2Implementation::UseProgramHelper(GLuint program) { + bool changed = false; + if (current_program_ != program) { + current_program_ = program; + changed = true; + } + return changed; +} + bool GLES2Implementation::IsBufferReservedId(GLuint id) { return vertex_array_object_manager_->IsReservedId(id); } @@ -2563,13 +2623,11 @@ void GLES2Implementation::DeleteBuffersHelper( bound_array_buffer_id_ = 0; } vertex_array_object_manager_->UnbindBuffer(buffers[ii]); + BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffers[ii]); - if (buffer) { - // Free buffer memory, pending the passage of a token. - buffer_tracker_->FreePendingToken(buffer, helper_->InsertToken()); - // Remove buffer. - buffer_tracker_->RemoveBuffer(buffers[ii]); - } + if (buffer) + RemoveTransferBuffer(buffer); + if (buffers[ii] == bound_pixel_unpack_transfer_buffer_id_) { bound_pixel_unpack_transfer_buffer_id_ = 0; } @@ -2782,7 +2840,7 @@ void GLES2Implementation::Swap() { weak_ptr_factory_.GetWeakPtr())); } -void GLES2Implementation::PartialSwapBuffers(gfx::Rect sub_buffer) { +void GLES2Implementation::PartialSwapBuffers(const gfx::Rect& sub_buffer) { PostSubBufferCHROMIUM(sub_buffer.x(), sub_buffer.y(), sub_buffer.width(), @@ -2796,6 +2854,46 @@ void GLES2Implementation::SetSwapBuffersCompleteCallback( swap_buffers_complete_callback_ = swap_buffers_complete_callback; } +static GLenum GetGLESOverlayTransform(gfx::OverlayTransform plane_transform) { + switch (plane_transform) { + case gfx::OVERLAY_TRANSFORM_INVALID: + break; + case gfx::OVERLAY_TRANSFORM_NONE: + return GL_OVERLAY_TRANSFORM_NONE_CHROMIUM; + case gfx::OVERLAY_TRANSFORM_FLIP_HORIZONTAL: + return GL_OVERLAY_TRANSFORM_FLIP_HORIZONTAL_CHROMIUM; + case gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL: + return GL_OVERLAY_TRANSFORM_FLIP_VERTICAL_CHROMIUM; + case gfx::OVERLAY_TRANSFORM_ROTATE_90: + return GL_OVERLAY_TRANSFORM_ROTATE_90_CHROMIUM; + case gfx::OVERLAY_TRANSFORM_ROTATE_180: + return GL_OVERLAY_TRANSFORM_ROTATE_180_CHROMIUM; + case gfx::OVERLAY_TRANSFORM_ROTATE_270: + return GL_OVERLAY_TRANSFORM_ROTATE_270_CHROMIUM; + } + NOTREACHED(); + return GL_OVERLAY_TRANSFORM_NONE_CHROMIUM; +} + +void GLES2Implementation::ScheduleOverlayPlane( + int plane_z_order, + gfx::OverlayTransform plane_transform, + unsigned overlay_texture_id, + const gfx::Rect& display_bounds, + const gfx::RectF& uv_rect) { + ScheduleOverlayPlaneCHROMIUM(plane_z_order, + GetGLESOverlayTransform(plane_transform), + overlay_texture_id, + display_bounds.x(), + display_bounds.y(), + display_bounds.width(), + display_bounds.height(), + uv_rect.x(), + uv_rect.y(), + uv_rect.width(), + uv_rect.height()); +} + void GLES2Implementation::OnSwapBuffersComplete() { if (!swap_buffers_complete_callback_.is_null()) swap_buffers_complete_callback_.Run(); @@ -2835,10 +2933,11 @@ void* GLES2Implementation::MapBufferSubDataCHROMIUM( "glMapBufferSubDataCHROMIUM", access, "access"); return NULL; } - if (offset < 0 || size < 0) { - SetGLError(GL_INVALID_VALUE, "glMapBufferSubDataCHROMIUM", "bad range"); + if (!ValidateSize("glMapBufferSubDataCHROMIUM", size) || + !ValidateOffset("glMapBufferSubDataCHROMIUM", offset)) { return NULL; } + int32 shm_id; unsigned int shm_offset; void* mem = mapped_memory_->Alloc(size, &shm_id, &shm_offset); @@ -3048,6 +3147,7 @@ void GLES2Implementation::GetMultipleIntegervCHROMIUM( " " << i << ": " << GLES2Util::GetStringGLState(pnames[i])); } }); + DCHECK(size >= 0 && FitInt32NonNegative<GLsizeiptr>(size)); GetMultipleIntegervState state(pnames, count, results, size); if (!GetMultipleIntegervSetup(&state)) { @@ -3208,29 +3308,8 @@ GLuint GLES2Implementation::CreateStreamTextureCHROMIUM(GLuint texture) { GPU_CLIENT_LOG("[" << GetLogPrefix() << "] CreateStreamTextureCHROMIUM(" << texture << ")"); TRACE_EVENT0("gpu", "GLES2::CreateStreamTextureCHROMIUM"); - typedef cmds::CreateStreamTextureCHROMIUM::Result Result; - Result* result = GetResultAs<Result*>(); - if (!result) { - return GL_ZERO; - } - *result = GL_ZERO; - - helper_->CreateStreamTextureCHROMIUM(texture, - GetResultShmId(), - GetResultShmOffset()); - WaitForCmd(); - GLuint result_value = *result; - CheckGLError(); - return result_value; -} - -void GLES2Implementation::DestroyStreamTextureCHROMIUM(GLuint texture) { - GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] DestroyStreamTextureCHROMIUM(" - << texture << ")"); - TRACE_EVENT0("gpu", "GLES2::DestroyStreamTextureCHROMIUM"); - helper_->DestroyStreamTextureCHROMIUM(texture); - CheckGLError(); + helper_->CommandBufferHelper::Flush(); + return gpu_control_->CreateStreamTexture(texture); } void GLES2Implementation::PostSubBufferCHROMIUM( @@ -3290,7 +3369,8 @@ void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) { << ", " << id << ")"); // if any outstanding queries INV_OP - if (current_query_) { + QueryMap::iterator it = current_queries_.find(target); + if (it != current_queries_.end()) { SetGLError( GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress"); return; @@ -3309,7 +3389,9 @@ void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) { if (!query) { query = query_tracker_->CreateQuery(id, target); if (!query) { - MustBeContextLost(); + SetGLError(GL_OUT_OF_MEMORY, + "glBeginQueryEXT", + "transfer buffer allocation failed"); return; } } else if (query->target() != target) { @@ -3318,7 +3400,7 @@ void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) { return; } - current_query_ = query; + current_queries_[target] = query; query->Begin(this); CheckGLError(); @@ -3333,19 +3415,15 @@ void GLES2Implementation::EndQueryEXT(GLenum target) { return; } - if (!current_query_) { + QueryMap::iterator it = current_queries_.find(target); + if (it == current_queries_.end()) { SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT", "no active query"); return; } - if (current_query_->target() != target) { - SetGLError(GL_INVALID_OPERATION, - "glEndQueryEXT", "target does not match active query"); - return; - } - - current_query_->End(this); - current_query_ = NULL; + QueryTracker::Query* query = it->second; + query->End(this); + current_queries_.erase(it); CheckGLError(); } @@ -3361,8 +3439,13 @@ void GLES2Implementation::GetQueryivEXT( SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname"); return; } - *params = (current_query_ && current_query_->target() == target) ? - current_query_->id() : 0; + QueryMap::iterator it = current_queries_.find(target); + if (it != current_queries_.end()) { + QueryTracker::Query* query = it->second; + *params = query->id(); + } else { + *params = 0; + } GPU_CLIENT_LOG(" " << *params); CheckGLError(); } @@ -3380,7 +3463,8 @@ void GLES2Implementation::GetQueryObjectuivEXT( return; } - if (query == current_query_) { + QueryMap::iterator it = current_queries_.find(query->target()); + if (it != current_queries_.end()) { SetGLError( GL_INVALID_OPERATION, "glQueryObjectuivEXT", "query active. Did you to call glEndQueryEXT?"); @@ -3399,8 +3483,7 @@ void GLES2Implementation::GetQueryObjectuivEXT( if (!query->CheckResultsAvailable(helper_)) { helper_->WaitForToken(query->token()); if (!query->CheckResultsAvailable(helper_)) { - // TODO(gman): Speed this up. - WaitForCmd(); + FinishHelper(); CHECK(query->CheckResultsAvailable(helper_)); } } @@ -3471,6 +3554,11 @@ void GLES2Implementation::DrawElementsInstancedANGLE( if (primcount == 0) { return; } + if (vertex_array_object_manager_->bound_element_array_buffer() != 0 && + !ValidateOffset("glDrawElementsInstancedANGLE", + reinterpret_cast<GLintptr>(indices))) { + return; + } GLuint offset = 0; bool simulated = false; if (!vertex_array_object_manager_->SetupSimulatedIndexAndClientSideBuffers( @@ -3490,12 +3578,66 @@ void GLES2Implementation::GenMailboxCHROMIUM( << static_cast<const void*>(mailbox) << ")"); TRACE_EVENT0("gpu", "GLES2::GenMailboxCHROMIUM"); - std::vector<gpu::Mailbox> names; - if (!gpu_control_->GenerateMailboxNames(1, &names)) { - SetGLError(GL_OUT_OF_MEMORY, "glGenMailboxCHROMIUM", "Generate failed."); - return; - } - memcpy(mailbox, names[0].name, GL_MAILBOX_SIZE_CHROMIUM); + gpu::Mailbox result = gpu::Mailbox::Generate(); + memcpy(mailbox, result.name, sizeof(result.name)); +} + +void GLES2Implementation::ProduceTextureCHROMIUM(GLenum target, + const GLbyte* data) { + GPU_CLIENT_SINGLE_THREAD_CHECK(); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glProduceTextureCHROMIUM(" + << static_cast<const void*>(data) << ")"); + const Mailbox& mailbox = *reinterpret_cast<const Mailbox*>(data); + DCHECK(mailbox.Verify()) << "ProduceTextureCHROMIUM was passed a " + "mailbox that was not generated by " + "GenMailboxCHROMIUM."; + helper_->ProduceTextureCHROMIUMImmediate(target, data); + CheckGLError(); +} + +void GLES2Implementation::ProduceTextureDirectCHROMIUM( + GLuint texture, GLenum target, const GLbyte* data) { + GPU_CLIENT_SINGLE_THREAD_CHECK(); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glProduceTextureDirectCHROMIUM(" + << static_cast<const void*>(data) << ")"); + const Mailbox& mailbox = *reinterpret_cast<const Mailbox*>(data); + DCHECK(mailbox.Verify()) << "ProduceTextureDirectCHROMIUM was passed a " + "mailbox that was not generated by " + "GenMailboxCHROMIUM."; + helper_->ProduceTextureDirectCHROMIUMImmediate(texture, target, data); + CheckGLError(); +} + +void GLES2Implementation::ConsumeTextureCHROMIUM(GLenum target, + const GLbyte* data) { + GPU_CLIENT_SINGLE_THREAD_CHECK(); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glConsumeTextureCHROMIUM(" + << static_cast<const void*>(data) << ")"); + const Mailbox& mailbox = *reinterpret_cast<const Mailbox*>(data); + DCHECK(mailbox.Verify()) << "ConsumeTextureCHROMIUM was passed a " + "mailbox that was not generated by " + "GenMailboxCHROMIUM."; + helper_->ConsumeTextureCHROMIUMImmediate(target, data); + CheckGLError(); +} + +GLuint GLES2Implementation::CreateAndConsumeTextureCHROMIUM( + GLenum target, const GLbyte* data) { + GPU_CLIENT_SINGLE_THREAD_CHECK(); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateAndConsumeTextureCHROMIUM(" + << static_cast<const void*>(data) << ")"); + const Mailbox& mailbox = *reinterpret_cast<const Mailbox*>(data); + DCHECK(mailbox.Verify()) << "CreateAndConsumeTextureCHROMIUM was passed a " + "mailbox that was not generated by " + "GenMailboxCHROMIUM."; + GLuint client_id; + GetIdHandler(id_namespaces::kTextures)->MakeIds(this, 0, 1, &client_id); + helper_->CreateAndConsumeTextureCHROMIUMImmediate(target, + client_id, data); + if (share_group_->bind_generates_resource()) + helper_->CommandBufferHelper::Flush(); + CheckGLError(); + return client_id; } void GLES2Implementation::PushGroupMarkerEXT( @@ -3609,9 +3751,9 @@ void* GLES2Implementation::MapBufferCHROMIUM(GLuint target, GLenum access) { // with this method of synchronization. Until this is fixed, // MapBufferCHROMIUM will not block even if the transfer is not ready // for these calls. - if (buffer->transfer_ready_token()) { - helper_->WaitForToken(buffer->transfer_ready_token()); - buffer->set_transfer_ready_token(0); + if (buffer->last_usage_token()) { + helper_->WaitForToken(buffer->last_usage_token()); + buffer->set_last_usage_token(0); } buffer->set_mapped(true); @@ -3645,8 +3787,73 @@ GLboolean GLES2Implementation::UnmapBufferCHROMIUM(GLuint target) { return true; } +bool GLES2Implementation::EnsureAsyncUploadSync() { + if (async_upload_sync_) + return true; + + int32 shm_id; + unsigned int shm_offset; + void* mem = mapped_memory_->Alloc(sizeof(AsyncUploadSync), + &shm_id, + &shm_offset); + if (!mem) + return false; + + async_upload_sync_shm_id_ = shm_id; + async_upload_sync_shm_offset_ = shm_offset; + async_upload_sync_ = static_cast<AsyncUploadSync*>(mem); + async_upload_sync_->Reset(); + + return true; +} + +uint32 GLES2Implementation::NextAsyncUploadToken() { + async_upload_token_++; + if (async_upload_token_ == 0) + async_upload_token_++; + return async_upload_token_; +} + +void GLES2Implementation::PollAsyncUploads() { + if (!async_upload_sync_) + return; + + if (helper_->IsContextLost()) { + DetachedAsyncUploadMemoryList::iterator it = + detached_async_upload_memory_.begin(); + while (it != detached_async_upload_memory_.end()) { + mapped_memory_->Free(it->first); + it = detached_async_upload_memory_.erase(it); + } + return; + } + + DetachedAsyncUploadMemoryList::iterator it = + detached_async_upload_memory_.begin(); + while (it != detached_async_upload_memory_.end()) { + if (HasAsyncUploadTokenPassed(it->second)) { + mapped_memory_->Free(it->first); + it = detached_async_upload_memory_.erase(it); + } else { + break; + } + } +} + +void GLES2Implementation::FreeAllAsyncUploadBuffers() { + // Free all completed unmanaged async uploads buffers. + PollAsyncUploads(); + + // Synchronously free rest of the unmanaged async upload buffers. + if (!detached_async_upload_memory_.empty()) { + WaitAllAsyncTexImage2DCHROMIUM(); + WaitForCmd(); + PollAsyncUploads(); + } +} + void GLES2Implementation::AsyncTexImage2DCHROMIUM( - GLenum target, GLint level, GLint internalformat, GLsizei width, + GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels) { GPU_CLIENT_SINGLE_THREAD_CHECK(); @@ -3662,6 +3869,10 @@ void GLES2Implementation::AsyncTexImage2DCHROMIUM( SetGLError(GL_INVALID_VALUE, "glTexImage2D", "dimension < 0"); return; } + if (border != 0) { + SetGLError(GL_INVALID_VALUE, "glTexImage2D", "border != 0"); + return; + } uint32 size; uint32 unpadded_row_size; uint32 padded_row_size; @@ -3675,8 +3886,13 @@ void GLES2Implementation::AsyncTexImage2DCHROMIUM( // If there's no data/buffer just issue the AsyncTexImage2D if (!pixels && !bound_pixel_unpack_transfer_buffer_id_) { helper_->AsyncTexImage2DCHROMIUM( - target, level, internalformat, width, height, border, format, type, - 0, 0); + target, level, internalformat, width, height, format, type, + 0, 0, 0, 0, 0); + return; + } + + if (!EnsureAsyncUploadSync()) { + SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory"); return; } @@ -3689,9 +3905,13 @@ void GLES2Implementation::AsyncTexImage2DCHROMIUM( bound_pixel_unpack_transfer_buffer_id_, "glAsyncTexImage2DCHROMIUM", offset, size); if (buffer && buffer->shm_id() != -1) { + uint32 async_token = NextAsyncUploadToken(); + buffer->set_last_async_upload_token(async_token); helper_->AsyncTexImage2DCHROMIUM( - target, level, internalformat, width, height, border, format, type, - buffer->shm_id(), buffer->shm_offset() + offset); + target, level, internalformat, width, height, format, type, + buffer->shm_id(), buffer->shm_offset() + offset, + async_token, + async_upload_sync_shm_id_, async_upload_sync_shm_offset_); } } @@ -3724,6 +3944,11 @@ void GLES2Implementation::AsyncTexSubImage2DCHROMIUM( return; } + if (!EnsureAsyncUploadSync()) { + SetGLError(GL_OUT_OF_MEMORY, "glTexImage2D", "out of memory"); + return; + } + // Async uploads require a transfer buffer to be bound. // TODO(hubbe): Make MapBufferCHROMIUM block if someone tries to re-use // the buffer before the transfer is finished. (Currently such @@ -3733,9 +3958,13 @@ void GLES2Implementation::AsyncTexSubImage2DCHROMIUM( bound_pixel_unpack_transfer_buffer_id_, "glAsyncTexSubImage2DCHROMIUM", offset, size); if (buffer && buffer->shm_id() != -1) { + uint32 async_token = NextAsyncUploadToken(); + buffer->set_last_async_upload_token(async_token); helper_->AsyncTexSubImage2DCHROMIUM( target, level, xoffset, yoffset, width, height, format, type, - buffer->shm_id(), buffer->shm_offset() + offset); + buffer->shm_id(), buffer->shm_offset() + offset, + async_token, + async_upload_sync_shm_id_, async_upload_sync_shm_offset_); } } @@ -3747,6 +3976,14 @@ void GLES2Implementation::WaitAsyncTexImage2DCHROMIUM(GLenum target) { CheckGLError(); } +void GLES2Implementation::WaitAllAsyncTexImage2DCHROMIUM() { + GPU_CLIENT_SINGLE_THREAD_CHECK(); + GPU_CLIENT_LOG("[" << GetLogPrefix() + << "] glWaitAllAsyncTexImage2DCHROMIUM()"); + helper_->WaitAllAsyncTexImage2DCHROMIUM(); + CheckGLError(); +} + GLuint GLES2Implementation::InsertSyncPointCHROMIUM() { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glInsertSyncPointCHROMIUM"); @@ -3754,8 +3991,10 @@ GLuint GLES2Implementation::InsertSyncPointCHROMIUM() { return gpu_control_->InsertSyncPoint(); } -GLuint GLES2Implementation::CreateImageCHROMIUMHelper( - GLsizei width, GLsizei height, GLenum internalformat) { +GLuint GLES2Implementation::CreateImageCHROMIUMHelper(GLsizei width, + GLsizei height, + GLenum internalformat, + GLenum usage) { if (width <= 0) { SetGLError(GL_INVALID_VALUE, "glCreateImageCHROMIUM", "width <= 0"); return 0; @@ -3771,7 +4010,7 @@ GLuint GLES2Implementation::CreateImageCHROMIUMHelper( // Create new buffer. GLuint buffer_id = gpu_memory_buffer_tracker_->CreateBuffer( - width, height, internalformat); + width, height, internalformat, usage); if (buffer_id == 0) { SetGLError(GL_OUT_OF_MEMORY, "glCreateImageCHROMIUM", "out of GPU memory."); return 0; @@ -3779,14 +4018,18 @@ GLuint GLES2Implementation::CreateImageCHROMIUMHelper( return buffer_id; } -GLuint GLES2Implementation::CreateImageCHROMIUM( - GLsizei width, GLsizei height, GLenum internalformat) { +GLuint GLES2Implementation::CreateImageCHROMIUM(GLsizei width, + GLsizei height, + GLenum internalformat, + GLenum usage) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateImageCHROMIUM(" - << width << ", " - << height << ", " - << GLES2Util::GetStringTextureInternalFormat(internalformat) << ")"); - GLuint image_id = CreateImageCHROMIUMHelper(width, height, internalformat); + GPU_CLIENT_LOG( + "[" << GetLogPrefix() << "] glCreateImageCHROMIUM(" << width << ", " + << height << ", " + << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", " + << GLES2Util::GetStringTextureInternalFormat(usage) << ")"); + GLuint image_id = + CreateImageCHROMIUMHelper(width, height, internalformat, usage); CheckGLError(); return image_id; } @@ -3837,49 +4080,28 @@ void GLES2Implementation::UnmapImageCHROMIUM(GLuint image_id) { CheckGLError(); } -void* GLES2Implementation::MapImageCHROMIUMHelper(GLuint image_id, - GLenum access) { +void* GLES2Implementation::MapImageCHROMIUMHelper(GLuint image_id) { gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer( image_id); if (!gpu_buffer) { SetGLError(GL_INVALID_OPERATION, "glMapImageCHROMIUM", "invalid image"); return NULL; } - gfx::GpuMemoryBuffer::AccessMode mode; - switch(access) { - case GL_WRITE_ONLY: - mode = gfx::GpuMemoryBuffer::WRITE_ONLY; - break; - case GL_READ_ONLY: - mode = gfx::GpuMemoryBuffer::READ_ONLY; - break; - case GL_READ_WRITE: - mode = gfx::GpuMemoryBuffer::READ_WRITE; - break; - default: - SetGLError(GL_INVALID_ENUM, "glMapImageCHROMIUM", - "invalid GPU access mode"); - return NULL; - } if (gpu_buffer->IsMapped()) { SetGLError(GL_INVALID_OPERATION, "glMapImageCHROMIUM", "already mapped"); return NULL; } - void* mapped_buffer = NULL; - gpu_buffer->Map(mode, &mapped_buffer); - return mapped_buffer; + return gpu_buffer->Map(); } -void* GLES2Implementation::MapImageCHROMIUM( - GLuint image_id, GLenum access) { +void* GLES2Implementation::MapImageCHROMIUM(GLuint image_id) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMapImageCHROMIUM(" - << image_id << ", " - << GLES2Util::GetStringEnum(access) << ")"); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMapImageCHROMIUM(" << image_id + << ")"); - void* mapped = MapImageCHROMIUMHelper(image_id, access); + void* mapped = MapImageCHROMIUMHelper(image_id); CheckGLError(); return mapped; } @@ -3900,6 +4122,12 @@ void GLES2Implementation::GetImageParameterivCHROMIUMHelper( return; } + if (!gpu_buffer->IsMapped()) { + SetGLError( + GL_INVALID_OPERATION, "glGetImageParameterivCHROMIUM", "not mapped"); + return; + } + *params = gpu_buffer->GetStride(); } @@ -3915,6 +4143,30 @@ void GLES2Implementation::GetImageParameterivCHROMIUM( CheckGLError(); } +bool GLES2Implementation::ValidateSize(const char* func, GLsizeiptr size) { + if (size < 0) { + SetGLError(GL_INVALID_VALUE, func, "size < 0"); + return false; + } + if (!FitInt32NonNegative<GLsizeiptr>(size)) { + SetGLError(GL_INVALID_OPERATION, func, "size more than 32-bit"); + return false; + } + return true; +} + +bool GLES2Implementation::ValidateOffset(const char* func, GLintptr offset) { + if (offset < 0) { + SetGLError(GL_INVALID_VALUE, func, "offset < 0"); + return false; + } + if (!FitInt32NonNegative<GLintptr>(offset)) { + SetGLError(GL_INVALID_OPERATION, func, "offset more than 32-bit"); + return false; + } + return true; +} + // Include the auto-generated part of this file. We split this because it means // we can easily edit the non-auto generated parts right here in this file // instead of having to edit some template or the code generator. diff --git a/chromium/gpu/command_buffer/client/gles2_implementation.h b/chromium/gpu/command_buffer/client/gles2_implementation.h index 6b6877f18b3..55d42d5a436 100644 --- a/chromium/gpu/command_buffer/client/gles2_implementation.h +++ b/chromium/gpu/command_buffer/client/gles2_implementation.h @@ -110,6 +110,12 @@ namespace gles2 { class ImageFactory; class VertexArrayObjectManager; +class GLES2ImplementationErrorMessageCallback { + public: + virtual ~GLES2ImplementationErrorMessageCallback() { } + virtual void OnErrorMessage(const char* msg, int id) = 0; +}; + // This class emulates GLES2 over command buffers. It can be used by a client // program so that the program does not need deal with shared memory and command // buffer management. See gl2_lib.h. Note that there is a performance gain to @@ -123,11 +129,6 @@ class GLES2_IMPL_EXPORT GLES2Implementation enum MappedMemoryLimit { kNoLimit = MappedMemoryManager::kNoLimit, }; - class ErrorMessageCallback { - public: - virtual ~ErrorMessageCallback() { } - virtual void OnErrorMessage(const char* msg, int id) = 0; - }; // Stores GL state that never changes. struct GLES2_IMPL_EXPORT GLStaticState { @@ -148,6 +149,7 @@ class GLES2_IMPL_EXPORT GLES2Implementation GLint max_vertex_uniform_vectors; GLint num_compressed_texture_formats; GLint num_shader_binary_formats; + GLint bind_generates_resource_chromium; }; IntState int_state; @@ -180,13 +182,12 @@ class GLES2_IMPL_EXPORT GLES2Implementation // Number of swap buffers allowed before waiting. static const size_t kMaxSwapBuffers = 2; - GLES2Implementation( - GLES2CmdHelper* helper, - ShareGroup* share_group, - TransferBufferInterface* transfer_buffer, - bool bind_generates_resource, - bool free_everything_when_invisible, - GpuControl* gpu_control); + GLES2Implementation(GLES2CmdHelper* helper, + ShareGroup* share_group, + TransferBufferInterface* transfer_buffer, + bool bind_generates_resource, + bool lose_context_when_out_of_memory, + GpuControl* gpu_control); virtual ~GLES2Implementation(); @@ -217,10 +218,15 @@ class GLES2_IMPL_EXPORT GLES2Implementation // ContextSupport implementation. virtual void Swap() OVERRIDE; - virtual void PartialSwapBuffers(gfx::Rect sub_buffer) OVERRIDE; + virtual void PartialSwapBuffers(const gfx::Rect& sub_buffer) OVERRIDE; virtual void SetSwapBuffersCompleteCallback( const base::Closure& swap_buffers_complete_callback) OVERRIDE; + virtual void ScheduleOverlayPlane(int plane_z_order, + gfx::OverlayTransform plane_transform, + unsigned overlay_texture_id, + const gfx::Rect& display_bounds, + const gfx::RectF& uv_rect) OVERRIDE; void GetProgramInfoCHROMIUMHelper(GLuint program, std::vector<int8>* result); GLint GetAttribLocationHelper(GLuint program, const char* name); @@ -241,10 +247,9 @@ class GLES2_IMPL_EXPORT GLES2Implementation virtual void SignalQuery(uint32 query, const base::Closure& callback) OVERRIDE; virtual void SetSurfaceVisible(bool visible) OVERRIDE; - virtual void SendManagedMemoryStats(const ManagedMemoryStats& stats) - OVERRIDE; - void SetErrorMessageCallback(ErrorMessageCallback* callback) { + void SetErrorMessageCallback( + GLES2ImplementationErrorMessageCallback* callback) { error_message_callback_ = callback; } @@ -260,6 +265,10 @@ class GLES2_IMPL_EXPORT GLES2Implementation return gpu_control_; } + ShareGroupContextData* share_group_context_data() { + return &share_group_context_data_; + } + private: friend class GLES2ImplementationTest; friend class VertexArrayObjectManager; @@ -491,12 +500,14 @@ class GLES2_IMPL_EXPORT GLES2Implementation bool IsRenderbufferReservedId(GLuint id) { return false; } bool IsTextureReservedId(GLuint id) { return false; } bool IsVertexArrayReservedId(GLuint id) { return false; } + bool IsProgramReservedId(GLuint id) { return false; } bool BindBufferHelper(GLenum target, GLuint texture); bool BindFramebufferHelper(GLenum target, GLuint texture); bool BindRenderbufferHelper(GLenum target, GLuint texture); bool BindTextureHelper(GLenum target, GLuint texture); - bool BindVertexArrayHelper(GLuint array); + bool BindVertexArrayOESHelper(GLuint array); + bool UseProgramHelper(GLuint program); void GenBuffersHelper(GLsizei n, const GLuint* buffers); void GenFramebuffersHelper(GLsizei n, const GLuint* framebuffers); @@ -532,10 +543,12 @@ class GLES2_IMPL_EXPORT GLES2Implementation GLenum target, GLintptr offset, GLsizeiptr size, const void* data, ScopedTransferBufferPtr* buffer); - GLuint CreateImageCHROMIUMHelper( - GLsizei width, GLsizei height, GLenum internalformat); + GLuint CreateImageCHROMIUMHelper(GLsizei width, + GLsizei height, + GLenum internalformat, + GLenum usage); void DestroyImageCHROMIUMHelper(GLuint image_id); - void* MapImageCHROMIUMHelper(GLuint image_id, GLenum access); + void* MapImageCHROMIUMHelper(GLuint image_id); void UnmapImageCHROMIUMHelper(GLuint image_id); void GetImageParameterivCHROMIUMHelper( GLuint image_id, GLenum pname, GLint* params); @@ -582,15 +595,50 @@ class GLES2_IMPL_EXPORT GLES2Implementation void FinishHelper(); - // Asserts that the context is lost. - // NOTE: This is an expensive call and should only be called - // for error checking. - bool MustBeContextLost(); - void RunIfContextNotLost(const base::Closure& callback); void OnSwapBuffersComplete(); + // Validate if an offset is valid, i.e., non-negative and fit into 32-bit. + // If not, generate an approriate error, and return false. + bool ValidateOffset(const char* func, GLintptr offset); + + // Validate if a size is valid, i.e., non-negative and fit into 32-bit. + // If not, generate an approriate error, and return false. + bool ValidateSize(const char* func, GLsizeiptr offset); + + // Remove the transfer buffer from the buffer tracker. For buffers used + // asynchronously the memory is free:ed if the upload has completed. For + // other buffers, the memory is either free:ed immediately or free:ed pending + // a token. + void RemoveTransferBuffer(BufferTracker::Buffer* buffer); + + // Returns true if the async upload token has passed. + // + // NOTE: This will detect wrapped async tokens by checking if the most + // significant bit of async token to check is 1 but the last read is 0, i.e. + // the uint32 wrapped. + bool HasAsyncUploadTokenPassed(uint32 token) const { + return async_upload_sync_->HasAsyncUploadTokenPassed(token); + } + + // Get the next async upload token. + uint32 NextAsyncUploadToken(); + + // Ensure that the shared memory used for synchronizing async upload tokens + // has been mapped. + // + // Returns false on error, true on success. + bool EnsureAsyncUploadSync(); + + // Checks the last read asynchronously upload token and frees any unmanaged + // transfer buffer that has its async token passed. + void PollAsyncUploads(); + + // Free every async upload buffer. If some async upload buffer is still in use + // wait for them to finish before freeing. + void FreeAllAsyncUploadBuffers(); + bool GetBoundPixelTransferBuffer( GLenum target, const char* function_name, GLuint* buffer_id); BufferTracker::Buffer* GetBoundPixelUnpackTransferBufferIfValid( @@ -663,6 +711,18 @@ class GLES2_IMPL_EXPORT GLES2Implementation GLuint bound_pixel_pack_transfer_buffer_id_; GLuint bound_pixel_unpack_transfer_buffer_id_; + // The current asynchronous pixel buffer upload token. + uint32 async_upload_token_; + + // The shared memory used for synchronizing asynchronous upload tokens. + AsyncUploadSync* async_upload_sync_; + int32 async_upload_sync_shm_id_; + unsigned int async_upload_sync_shm_offset_; + + // Unmanaged pixel transfer buffer memory pending asynchronous upload token. + typedef std::list<std::pair<void*, uint32> > DetachedAsyncUploadMemoryList; + DetachedAsyncUploadMemoryList detached_async_upload_memory_; + // Client side management for vertex array objects. Needed to correctly // track client side arrays. scoped_ptr<VertexArrayObjectManager> vertex_array_object_manager_; @@ -675,6 +735,9 @@ class GLES2_IMPL_EXPORT GLES2Implementation // Whether or not to print debugging info. bool debug_; + // When true, the context is lost when a GL_OUT_OF_MEMORY error occurs. + bool lose_context_when_out_of_memory_; + // Used to check for single threaded access. int use_count_; @@ -696,26 +759,24 @@ class GLES2_IMPL_EXPORT GLES2Implementation scoped_ptr<MappedMemoryManager> mapped_memory_; scoped_refptr<ShareGroup> share_group_; + ShareGroupContextData share_group_context_data_; scoped_ptr<QueryTracker> query_tracker_; - QueryTracker::Query* current_query_; + typedef std::map<GLuint, QueryTracker::Query*> QueryMap; + QueryMap current_queries_; scoped_ptr<BufferTracker> buffer_tracker_; scoped_ptr<GpuMemoryBufferTracker> gpu_memory_buffer_tracker_; - ErrorMessageCallback* error_message_callback_; + GLES2ImplementationErrorMessageCallback* error_message_callback_; scoped_ptr<std::string> current_trace_name_; GpuControl* gpu_control_; - bool surface_visible_; - bool free_everything_when_invisible_; - Capabilities capabilities_; - bool use_echo_for_swap_ack_; base::Closure swap_buffers_complete_callback_; base::WeakPtrFactory<GLES2Implementation> weak_ptr_factory_; diff --git a/chromium/gpu/command_buffer/client/gles2_implementation_autogen.h b/chromium/gpu/command_buffer/client/gles2_implementation_autogen.h index 5703956e415..db6760e162f 100644 --- a/chromium/gpu/command_buffer/client/gles2_implementation_autogen.h +++ b/chromium/gpu/command_buffer/client/gles2_implementation_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // This file is included by gles2_implementation.h to declare the @@ -15,8 +17,9 @@ virtual void ActiveTexture(GLenum texture) OVERRIDE; virtual void AttachShader(GLuint program, GLuint shader) OVERRIDE; -virtual void BindAttribLocation( - GLuint program, GLuint index, const char* name) OVERRIDE; +virtual void BindAttribLocation(GLuint program, + GLuint index, + const char* name) OVERRIDE; virtual void BindBuffer(GLenum target, GLuint buffer) OVERRIDE; @@ -26,8 +29,10 @@ virtual void BindRenderbuffer(GLenum target, GLuint renderbuffer) OVERRIDE; virtual void BindTexture(GLenum target, GLuint texture) OVERRIDE; -virtual void BlendColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) OVERRIDE; +virtual void BlendColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) OVERRIDE; virtual void BlendEquation(GLenum mode) OVERRIDE; @@ -35,49 +40,77 @@ virtual void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) OVERRIDE; virtual void BlendFunc(GLenum sfactor, GLenum dfactor) OVERRIDE; -virtual void BlendFuncSeparate( - GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) OVERRIDE; +virtual void BlendFuncSeparate(GLenum srcRGB, + GLenum dstRGB, + GLenum srcAlpha, + GLenum dstAlpha) OVERRIDE; -virtual void BufferData( - GLenum target, GLsizeiptr size, const void* data, GLenum usage) OVERRIDE; +virtual void BufferData(GLenum target, + GLsizeiptr size, + const void* data, + GLenum usage) OVERRIDE; -virtual void BufferSubData( - GLenum target, GLintptr offset, GLsizeiptr size, - const void* data) OVERRIDE; +virtual void BufferSubData(GLenum target, + GLintptr offset, + GLsizeiptr size, + const void* data) OVERRIDE; virtual GLenum CheckFramebufferStatus(GLenum target) OVERRIDE; virtual void Clear(GLbitfield mask) OVERRIDE; -virtual void ClearColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) OVERRIDE; +virtual void ClearColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) OVERRIDE; virtual void ClearDepthf(GLclampf depth) OVERRIDE; virtual void ClearStencil(GLint s) OVERRIDE; -virtual void ColorMask( - GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) OVERRIDE; +virtual void ColorMask(GLboolean red, + GLboolean green, + GLboolean blue, + GLboolean alpha) OVERRIDE; virtual void CompileShader(GLuint shader) OVERRIDE; -virtual void CompressedTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLsizei width, - GLsizei height, GLint border, GLsizei imageSize, - const void* data) OVERRIDE; - -virtual void CompressedTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLsizei imageSize, - const void* data) OVERRIDE; - -virtual void CopyTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, - GLsizei width, GLsizei height, GLint border) OVERRIDE; - -virtual void CopyTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, - GLsizei width, GLsizei height) OVERRIDE; +virtual void CompressedTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLsizei imageSize, + const void* data) OVERRIDE; + +virtual void CompressedTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLsizei imageSize, + const void* data) OVERRIDE; + +virtual void CopyTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLint border) OVERRIDE; + +virtual void CopyTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLint x, + GLint y, + GLsizei width, + GLsizei height) OVERRIDE; virtual GLuint CreateProgram() OVERRIDE; @@ -87,13 +120,12 @@ virtual void CullFace(GLenum mode) OVERRIDE; virtual void DeleteBuffers(GLsizei n, const GLuint* buffers) OVERRIDE; -virtual void DeleteFramebuffers( - GLsizei n, const GLuint* framebuffers) OVERRIDE; +virtual void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers) OVERRIDE; virtual void DeleteProgram(GLuint program) OVERRIDE; -virtual void DeleteRenderbuffers( - GLsizei n, const GLuint* renderbuffers) OVERRIDE; +virtual void DeleteRenderbuffers(GLsizei n, + const GLuint* renderbuffers) OVERRIDE; virtual void DeleteShader(GLuint shader) OVERRIDE; @@ -111,8 +143,10 @@ virtual void Disable(GLenum cap) OVERRIDE; virtual void DrawArrays(GLenum mode, GLint first, GLsizei count) OVERRIDE; -virtual void DrawElements( - GLenum mode, GLsizei count, GLenum type, const void* indices) OVERRIDE; +virtual void DrawElements(GLenum mode, + GLsizei count, + GLenum type, + const void* indices) OVERRIDE; virtual void Enable(GLenum cap) OVERRIDE; @@ -120,13 +154,16 @@ virtual void Finish() OVERRIDE; virtual void Flush() OVERRIDE; -virtual void FramebufferRenderbuffer( - GLenum target, GLenum attachment, GLenum renderbuffertarget, - GLuint renderbuffer) OVERRIDE; +virtual void FramebufferRenderbuffer(GLenum target, + GLenum attachment, + GLenum renderbuffertarget, + GLuint renderbuffer) OVERRIDE; -virtual void FramebufferTexture2D( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level) OVERRIDE; +virtual void FramebufferTexture2D(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level) OVERRIDE; virtual void FrontFace(GLenum mode) OVERRIDE; @@ -140,73 +177,97 @@ virtual void GenRenderbuffers(GLsizei n, GLuint* renderbuffers) OVERRIDE; virtual void GenTextures(GLsizei n, GLuint* textures) OVERRIDE; -virtual void GetActiveAttrib( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) OVERRIDE; - -virtual void GetActiveUniform( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) OVERRIDE; - -virtual void GetAttachedShaders( - GLuint program, GLsizei maxcount, GLsizei* count, - GLuint* shaders) OVERRIDE; +virtual void GetActiveAttrib(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) OVERRIDE; + +virtual void GetActiveUniform(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) OVERRIDE; + +virtual void GetAttachedShaders(GLuint program, + GLsizei maxcount, + GLsizei* count, + GLuint* shaders) OVERRIDE; virtual GLint GetAttribLocation(GLuint program, const char* name) OVERRIDE; virtual void GetBooleanv(GLenum pname, GLboolean* params) OVERRIDE; -virtual void GetBufferParameteriv( - GLenum target, GLenum pname, GLint* params) OVERRIDE; +virtual void GetBufferParameteriv(GLenum target, + GLenum pname, + GLint* params) OVERRIDE; virtual GLenum GetError() OVERRIDE; virtual void GetFloatv(GLenum pname, GLfloat* params) OVERRIDE; -virtual void GetFramebufferAttachmentParameteriv( - GLenum target, GLenum attachment, GLenum pname, GLint* params) OVERRIDE; +virtual void GetFramebufferAttachmentParameteriv(GLenum target, + GLenum attachment, + GLenum pname, + GLint* params) OVERRIDE; virtual void GetIntegerv(GLenum pname, GLint* params) OVERRIDE; -virtual void GetProgramiv( - GLuint program, GLenum pname, GLint* params) OVERRIDE; +virtual void GetProgramiv(GLuint program, GLenum pname, GLint* params) OVERRIDE; -virtual void GetProgramInfoLog( - GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) OVERRIDE; +virtual void GetProgramInfoLog(GLuint program, + GLsizei bufsize, + GLsizei* length, + char* infolog) OVERRIDE; -virtual void GetRenderbufferParameteriv( - GLenum target, GLenum pname, GLint* params) OVERRIDE; +virtual void GetRenderbufferParameteriv(GLenum target, + GLenum pname, + GLint* params) OVERRIDE; virtual void GetShaderiv(GLuint shader, GLenum pname, GLint* params) OVERRIDE; -virtual void GetShaderInfoLog( - GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) OVERRIDE; +virtual void GetShaderInfoLog(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* infolog) OVERRIDE; -virtual void GetShaderPrecisionFormat( - GLenum shadertype, GLenum precisiontype, GLint* range, - GLint* precision) OVERRIDE; +virtual void GetShaderPrecisionFormat(GLenum shadertype, + GLenum precisiontype, + GLint* range, + GLint* precision) OVERRIDE; -virtual void GetShaderSource( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) OVERRIDE; +virtual void GetShaderSource(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) OVERRIDE; virtual const GLubyte* GetString(GLenum name) OVERRIDE; -virtual void GetTexParameterfv( - GLenum target, GLenum pname, GLfloat* params) OVERRIDE; +virtual void GetTexParameterfv(GLenum target, + GLenum pname, + GLfloat* params) OVERRIDE; -virtual void GetTexParameteriv( - GLenum target, GLenum pname, GLint* params) OVERRIDE; +virtual void GetTexParameteriv(GLenum target, + GLenum pname, + GLint* params) OVERRIDE; -virtual void GetUniformfv( - GLuint program, GLint location, GLfloat* params) OVERRIDE; +virtual void GetUniformfv(GLuint program, + GLint location, + GLfloat* params) OVERRIDE; -virtual void GetUniformiv( - GLuint program, GLint location, GLint* params) OVERRIDE; +virtual void GetUniformiv(GLuint program, + GLint location, + GLint* params) OVERRIDE; virtual GLint GetUniformLocation(GLuint program, const char* name) OVERRIDE; -virtual void GetVertexAttribPointerv( - GLuint index, GLenum pname, void** pointer) OVERRIDE; +virtual void GetVertexAttribPointerv(GLuint index, + GLenum pname, + void** pointer) OVERRIDE; virtual void Hint(GLenum target, GLenum mode) OVERRIDE; @@ -232,27 +293,35 @@ virtual void PixelStorei(GLenum pname, GLint param) OVERRIDE; virtual void PolygonOffset(GLfloat factor, GLfloat units) OVERRIDE; -virtual void ReadPixels( - GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, - void* pixels) OVERRIDE; +virtual void ReadPixels(GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + void* pixels) OVERRIDE; virtual void ReleaseShaderCompiler() OVERRIDE; -virtual void RenderbufferStorage( - GLenum target, GLenum internalformat, GLsizei width, - GLsizei height) OVERRIDE; +virtual void RenderbufferStorage(GLenum target, + GLenum internalformat, + GLsizei width, + GLsizei height) OVERRIDE; virtual void SampleCoverage(GLclampf value, GLboolean invert) OVERRIDE; virtual void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) OVERRIDE; -virtual void ShaderBinary( - GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, - GLsizei length) OVERRIDE; +virtual void ShaderBinary(GLsizei n, + const GLuint* shaders, + GLenum binaryformat, + const void* binary, + GLsizei length) OVERRIDE; -virtual void ShaderSource( - GLuint shader, GLsizei count, const GLchar* const* str, - const GLint* length) OVERRIDE; +virtual void ShaderSource(GLuint shader, + GLsizei count, + const GLchar* const* str, + const GLint* length) OVERRIDE; virtual void ShallowFinishCHROMIUM() OVERRIDE; @@ -260,8 +329,10 @@ virtual void ShallowFlushCHROMIUM() OVERRIDE; virtual void StencilFunc(GLenum func, GLint ref, GLuint mask) OVERRIDE; -virtual void StencilFuncSeparate( - GLenum face, GLenum func, GLint ref, GLuint mask) OVERRIDE; +virtual void StencilFuncSeparate(GLenum face, + GLenum func, + GLint ref, + GLuint mask) OVERRIDE; virtual void StencilMask(GLuint mask) OVERRIDE; @@ -269,83 +340,108 @@ virtual void StencilMaskSeparate(GLenum face, GLuint mask) OVERRIDE; virtual void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) OVERRIDE; -virtual void StencilOpSeparate( - GLenum face, GLenum fail, GLenum zfail, GLenum zpass) OVERRIDE; +virtual void StencilOpSeparate(GLenum face, + GLenum fail, + GLenum zfail, + GLenum zpass) OVERRIDE; -virtual void TexImage2D( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) OVERRIDE; +virtual void TexImage2D(GLenum target, + GLint level, + GLint internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) OVERRIDE; -virtual void TexParameterf( - GLenum target, GLenum pname, GLfloat param) OVERRIDE; +virtual void TexParameterf(GLenum target, GLenum pname, GLfloat param) OVERRIDE; -virtual void TexParameterfv( - GLenum target, GLenum pname, const GLfloat* params) OVERRIDE; +virtual void TexParameterfv(GLenum target, + GLenum pname, + const GLfloat* params) OVERRIDE; virtual void TexParameteri(GLenum target, GLenum pname, GLint param) OVERRIDE; -virtual void TexParameteriv( - GLenum target, GLenum pname, const GLint* params) OVERRIDE; +virtual void TexParameteriv(GLenum target, + GLenum pname, + const GLint* params) OVERRIDE; -virtual void TexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* pixels) OVERRIDE; +virtual void TexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* pixels) OVERRIDE; virtual void Uniform1f(GLint location, GLfloat x) OVERRIDE; -virtual void Uniform1fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; +virtual void Uniform1fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; virtual void Uniform1i(GLint location, GLint x) OVERRIDE; -virtual void Uniform1iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void Uniform1iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; virtual void Uniform2f(GLint location, GLfloat x, GLfloat y) OVERRIDE; -virtual void Uniform2fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; +virtual void Uniform2fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; virtual void Uniform2i(GLint location, GLint x, GLint y) OVERRIDE; -virtual void Uniform2iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void Uniform2iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; -virtual void Uniform3f( - GLint location, GLfloat x, GLfloat y, GLfloat z) OVERRIDE; +virtual void Uniform3f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z) OVERRIDE; -virtual void Uniform3fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; +virtual void Uniform3fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; virtual void Uniform3i(GLint location, GLint x, GLint y, GLint z) OVERRIDE; -virtual void Uniform3iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void Uniform3iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; -virtual void Uniform4f( - GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) OVERRIDE; +virtual void Uniform4f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) OVERRIDE; -virtual void Uniform4fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; +virtual void Uniform4fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; -virtual void Uniform4i( - GLint location, GLint x, GLint y, GLint z, GLint w) OVERRIDE; +virtual void Uniform4i(GLint location, + GLint x, + GLint y, + GLint z, + GLint w) OVERRIDE; -virtual void Uniform4iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void Uniform4iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; -virtual void UniformMatrix2fv( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) OVERRIDE; +virtual void UniformMatrix2fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) OVERRIDE; -virtual void UniformMatrix3fv( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) OVERRIDE; +virtual void UniformMatrix3fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) OVERRIDE; -virtual void UniformMatrix4fv( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) OVERRIDE; +virtual void UniformMatrix4fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) OVERRIDE; virtual void UseProgram(GLuint program) OVERRIDE; @@ -359,43 +455,65 @@ virtual void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) OVERRIDE; virtual void VertexAttrib2fv(GLuint indx, const GLfloat* values) OVERRIDE; -virtual void VertexAttrib3f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z) OVERRIDE; +virtual void VertexAttrib3f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z) OVERRIDE; virtual void VertexAttrib3fv(GLuint indx, const GLfloat* values) OVERRIDE; -virtual void VertexAttrib4f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) OVERRIDE; +virtual void VertexAttrib4f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) OVERRIDE; virtual void VertexAttrib4fv(GLuint indx, const GLfloat* values) OVERRIDE; -virtual void VertexAttribPointer( - GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, - const void* ptr) OVERRIDE; - -virtual void Viewport( - GLint x, GLint y, GLsizei width, GLsizei height) OVERRIDE; - -virtual void BlitFramebufferCHROMIUM( - GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, - GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, - GLenum filter) OVERRIDE; - -virtual void RenderbufferStorageMultisampleCHROMIUM( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) OVERRIDE; - -virtual void RenderbufferStorageMultisampleEXT( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) OVERRIDE; - -virtual void FramebufferTexture2DMultisampleEXT( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level, GLsizei samples) OVERRIDE; - -virtual void TexStorage2DEXT( - GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, - GLsizei height) OVERRIDE; +virtual void VertexAttribPointer(GLuint indx, + GLint size, + GLenum type, + GLboolean normalized, + GLsizei stride, + const void* ptr) OVERRIDE; + +virtual void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) OVERRIDE; + +virtual void BlitFramebufferCHROMIUM(GLint srcX0, + GLint srcY0, + GLint srcX1, + GLint srcY1, + GLint dstX0, + GLint dstY0, + GLint dstX1, + GLint dstY1, + GLbitfield mask, + GLenum filter) OVERRIDE; + +virtual void RenderbufferStorageMultisampleCHROMIUM(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) OVERRIDE; + +virtual void RenderbufferStorageMultisampleEXT(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) OVERRIDE; + +virtual void FramebufferTexture2DMultisampleEXT(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level, + GLsizei samples) OVERRIDE; + +virtual void TexStorage2DEXT(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height) OVERRIDE; virtual void GenQueriesEXT(GLsizei n, GLuint* queries) OVERRIDE; @@ -407,14 +525,14 @@ virtual void BeginQueryEXT(GLenum target, GLuint id) OVERRIDE; virtual void EndQueryEXT(GLenum target) OVERRIDE; -virtual void GetQueryivEXT( - GLenum target, GLenum pname, GLint* params) OVERRIDE; +virtual void GetQueryivEXT(GLenum target, GLenum pname, GLint* params) OVERRIDE; -virtual void GetQueryObjectuivEXT( - GLuint id, GLenum pname, GLuint* params) OVERRIDE; +virtual void GetQueryObjectuivEXT(GLuint id, + GLenum pname, + GLuint* params) OVERRIDE; -virtual void InsertEventMarkerEXT( - GLsizei length, const GLchar* marker) OVERRIDE; +virtual void InsertEventMarkerEXT(GLsizei length, + const GLchar* marker) OVERRIDE; virtual void PushGroupMarkerEXT(GLsizei length, const GLchar* marker) OVERRIDE; @@ -430,17 +548,23 @@ virtual void BindVertexArrayOES(GLuint array) OVERRIDE; virtual void SwapBuffers() OVERRIDE; -virtual GLuint GetMaxValueInBufferCHROMIUM( - GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) OVERRIDE; +virtual GLuint GetMaxValueInBufferCHROMIUM(GLuint buffer_id, + GLsizei count, + GLenum type, + GLuint offset) OVERRIDE; -virtual void GenSharedIdsCHROMIUM( - GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) OVERRIDE; +virtual void GenSharedIdsCHROMIUM(GLuint namespace_id, + GLuint id_offset, + GLsizei n, + GLuint* ids) OVERRIDE; -virtual void DeleteSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) OVERRIDE; +virtual void DeleteSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) OVERRIDE; -virtual void RegisterSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) OVERRIDE; +virtual void RegisterSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) OVERRIDE; virtual GLboolean EnableFeatureCHROMIUM(const char* feature) OVERRIDE; @@ -448,23 +572,32 @@ virtual void* MapBufferCHROMIUM(GLuint target, GLenum access) OVERRIDE; virtual GLboolean UnmapBufferCHROMIUM(GLuint target) OVERRIDE; -virtual void* MapImageCHROMIUM(GLuint image_id, GLenum access) OVERRIDE; +virtual void* MapImageCHROMIUM(GLuint image_id) OVERRIDE; virtual void UnmapImageCHROMIUM(GLuint image_id) OVERRIDE; -virtual void* MapBufferSubDataCHROMIUM( - GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) OVERRIDE; +virtual void* MapBufferSubDataCHROMIUM(GLuint target, + GLintptr offset, + GLsizeiptr size, + GLenum access) OVERRIDE; virtual void UnmapBufferSubDataCHROMIUM(const void* mem) OVERRIDE; -virtual void* MapTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, GLenum access) OVERRIDE; +virtual void* MapTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + GLenum access) OVERRIDE; virtual void UnmapTexSubImage2DCHROMIUM(const void* mem) OVERRIDE; -virtual void ResizeCHROMIUM( - GLuint width, GLuint height, GLfloat scale_factor) OVERRIDE; +virtual void ResizeCHROMIUM(GLuint width, + GLuint height, + GLfloat scale_factor) OVERRIDE; virtual const GLchar* GetRequestableExtensionsCHROMIUM() OVERRIDE; @@ -472,58 +605,83 @@ virtual void RequestExtensionCHROMIUM(const char* extension) OVERRIDE; virtual void RateLimitOffscreenContextCHROMIUM() OVERRIDE; -virtual void GetMultipleIntegervCHROMIUM( - const GLenum* pnames, GLuint count, GLint* results, - GLsizeiptr size) OVERRIDE; +virtual void GetMultipleIntegervCHROMIUM(const GLenum* pnames, + GLuint count, + GLint* results, + GLsizeiptr size) OVERRIDE; -virtual void GetProgramInfoCHROMIUM( - GLuint program, GLsizei bufsize, GLsizei* size, void* info) OVERRIDE; +virtual void GetProgramInfoCHROMIUM(GLuint program, + GLsizei bufsize, + GLsizei* size, + void* info) OVERRIDE; virtual GLuint CreateStreamTextureCHROMIUM(GLuint texture) OVERRIDE; -virtual void DestroyStreamTextureCHROMIUM(GLuint texture) OVERRIDE; - -virtual GLuint CreateImageCHROMIUM( - GLsizei width, GLsizei height, GLenum internalformat) OVERRIDE; +virtual GLuint CreateImageCHROMIUM(GLsizei width, + GLsizei height, + GLenum internalformat, + GLenum usage) OVERRIDE; virtual void DestroyImageCHROMIUM(GLuint image_id) OVERRIDE; -virtual void GetImageParameterivCHROMIUM( - GLuint image_id, GLenum pname, GLint* params) OVERRIDE; - -virtual void GetTranslatedShaderSourceANGLE( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) OVERRIDE; - -virtual void PostSubBufferCHROMIUM( - GLint x, GLint y, GLint width, GLint height) OVERRIDE; - -virtual void TexImageIOSurface2DCHROMIUM( - GLenum target, GLsizei width, GLsizei height, GLuint ioSurfaceId, - GLuint plane) OVERRIDE; - -virtual void CopyTextureCHROMIUM( - GLenum target, GLenum source_id, GLenum dest_id, GLint level, - GLint internalformat, GLenum dest_type) OVERRIDE; - -virtual void DrawArraysInstancedANGLE( - GLenum mode, GLint first, GLsizei count, GLsizei primcount) OVERRIDE; - -virtual void DrawElementsInstancedANGLE( - GLenum mode, GLsizei count, GLenum type, const void* indices, - GLsizei primcount) OVERRIDE; +virtual void GetImageParameterivCHROMIUM(GLuint image_id, + GLenum pname, + GLint* params) OVERRIDE; + +virtual void GetTranslatedShaderSourceANGLE(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) OVERRIDE; + +virtual void PostSubBufferCHROMIUM(GLint x, + GLint y, + GLint width, + GLint height) OVERRIDE; + +virtual void TexImageIOSurface2DCHROMIUM(GLenum target, + GLsizei width, + GLsizei height, + GLuint ioSurfaceId, + GLuint plane) OVERRIDE; + +virtual void CopyTextureCHROMIUM(GLenum target, + GLenum source_id, + GLenum dest_id, + GLint level, + GLint internalformat, + GLenum dest_type) OVERRIDE; + +virtual void DrawArraysInstancedANGLE(GLenum mode, + GLint first, + GLsizei count, + GLsizei primcount) OVERRIDE; + +virtual void DrawElementsInstancedANGLE(GLenum mode, + GLsizei count, + GLenum type, + const void* indices, + GLsizei primcount) OVERRIDE; virtual void VertexAttribDivisorANGLE(GLuint index, GLuint divisor) OVERRIDE; virtual void GenMailboxCHROMIUM(GLbyte* mailbox) OVERRIDE; -virtual void ProduceTextureCHROMIUM( - GLenum target, const GLbyte* mailbox) OVERRIDE; +virtual void ProduceTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) OVERRIDE; -virtual void ConsumeTextureCHROMIUM( - GLenum target, const GLbyte* mailbox) OVERRIDE; +virtual void ProduceTextureDirectCHROMIUM(GLuint texture, + GLenum target, + const GLbyte* mailbox) OVERRIDE; -virtual void BindUniformLocationCHROMIUM( - GLuint program, GLint location, const char* name) OVERRIDE; +virtual void ConsumeTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) OVERRIDE; + +virtual GLuint CreateAndConsumeTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) OVERRIDE; + +virtual void BindUniformLocationCHROMIUM(GLuint program, + GLint location, + const char* name) OVERRIDE; virtual void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) OVERRIDE; @@ -533,19 +691,33 @@ virtual void TraceBeginCHROMIUM(const char* name) OVERRIDE; virtual void TraceEndCHROMIUM() OVERRIDE; -virtual void AsyncTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* data) OVERRIDE; - -virtual void AsyncTexImage2DCHROMIUM( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) OVERRIDE; +virtual void AsyncTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* data) OVERRIDE; + +virtual void AsyncTexImage2DCHROMIUM(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) OVERRIDE; virtual void WaitAsyncTexImage2DCHROMIUM(GLenum target) OVERRIDE; -virtual void DiscardFramebufferEXT( - GLenum target, GLsizei count, const GLenum* attachments) OVERRIDE; +virtual void WaitAllAsyncTexImage2DCHROMIUM() OVERRIDE; + +virtual void DiscardFramebufferEXT(GLenum target, + GLsizei count, + const GLenum* attachments) OVERRIDE; virtual void LoseContextCHROMIUM(GLenum current, GLenum other) OVERRIDE; @@ -557,5 +729,16 @@ virtual void DrawBuffersEXT(GLsizei count, const GLenum* bufs) OVERRIDE; virtual void DiscardBackbufferCHROMIUM() OVERRIDE; -#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_AUTOGEN_H_ +virtual void ScheduleOverlayPlaneCHROMIUM(GLint plane_z_order, + GLenum plane_transform, + GLuint overlay_texture_id, + GLint bounds_x, + GLint bounds_y, + GLint bounds_width, + GLint bounds_height, + GLfloat uv_x, + GLfloat uv_y, + GLfloat uv_width, + GLfloat uv_height) OVERRIDE; +#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_AUTOGEN_H_ diff --git a/chromium/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/chromium/gpu/command_buffer/client/gles2_implementation_impl_autogen.h index 3b92eb2933e..4f721a8d1cd 100644 --- a/chromium/gpu/command_buffer/client/gles2_implementation_impl_autogen.h +++ b/chromium/gpu/command_buffer/client/gles2_implementation_impl_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // This file is included by gles2_implementation.cc to define the @@ -13,14 +15,17 @@ void GLES2Implementation::AttachShader(GLuint program, GLuint shader) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glAttachShader(" << program << ", " << shader << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glAttachShader(" << program << ", " + << shader << ")"); helper_->AttachShader(program, shader); CheckGLError(); } void GLES2Implementation::BindBuffer(GLenum target, GLuint buffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindBuffer(" << GLES2Util::GetStringBufferTarget(target) << ", " << buffer << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindBuffer(" + << GLES2Util::GetStringBufferTarget(target) << ", " + << buffer << ")"); if (IsBufferReservedId(buffer)) { SetGLError(GL_INVALID_OPERATION, "BindBuffer", "buffer reserved id"); return; @@ -33,7 +38,9 @@ void GLES2Implementation::BindBuffer(GLenum target, GLuint buffer) { void GLES2Implementation::BindFramebuffer(GLenum target, GLuint framebuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindFramebuffer(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << framebuffer << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindFramebuffer(" + << GLES2Util::GetStringFrameBufferTarget(target) << ", " + << framebuffer << ")"); if (IsFramebufferReservedId(framebuffer)) { SetGLError( GL_INVALID_OPERATION, "BindFramebuffer", "framebuffer reserved id"); @@ -45,10 +52,11 @@ void GLES2Implementation::BindFramebuffer(GLenum target, GLuint framebuffer) { CheckGLError(); } -void GLES2Implementation::BindRenderbuffer( - GLenum target, GLuint renderbuffer) { +void GLES2Implementation::BindRenderbuffer(GLenum target, GLuint renderbuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindRenderbuffer(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << renderbuffer << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindRenderbuffer(" + << GLES2Util::GetStringRenderBufferTarget(target) << ", " + << renderbuffer << ")"); if (IsRenderbufferReservedId(renderbuffer)) { SetGLError( GL_INVALID_OPERATION, "BindRenderbuffer", "renderbuffer reserved id"); @@ -62,7 +70,9 @@ void GLES2Implementation::BindRenderbuffer( void GLES2Implementation::BindTexture(GLenum target, GLuint texture) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTexture(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << texture << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTexture(" + << GLES2Util::GetStringTextureBindTarget(target) << ", " + << texture << ")"); if (IsTextureReservedId(texture)) { SetGLError(GL_INVALID_OPERATION, "BindTexture", "texture reserved id"); return; @@ -73,40 +83,54 @@ void GLES2Implementation::BindTexture(GLenum target, GLuint texture) { CheckGLError(); } -void GLES2Implementation::BlendColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { +void GLES2Implementation::BlendColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendColor(" << red << ", " << green << ", " << blue << ", " << alpha << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendColor(" << red << ", " + << green << ", " << blue << ", " << alpha << ")"); helper_->BlendColor(red, green, blue, alpha); CheckGLError(); } void GLES2Implementation::BlendEquation(GLenum mode) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendEquation(" << GLES2Util::GetStringEquation(mode) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendEquation(" + << GLES2Util::GetStringEquation(mode) << ")"); helper_->BlendEquation(mode); CheckGLError(); } -void GLES2Implementation::BlendEquationSeparate( - GLenum modeRGB, GLenum modeAlpha) { +void GLES2Implementation::BlendEquationSeparate(GLenum modeRGB, + GLenum modeAlpha) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendEquationSeparate(" << GLES2Util::GetStringEquation(modeRGB) << ", " << GLES2Util::GetStringEquation(modeAlpha) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendEquationSeparate(" + << GLES2Util::GetStringEquation(modeRGB) << ", " + << GLES2Util::GetStringEquation(modeAlpha) << ")"); helper_->BlendEquationSeparate(modeRGB, modeAlpha); CheckGLError(); } void GLES2Implementation::BlendFunc(GLenum sfactor, GLenum dfactor) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendFunc(" << GLES2Util::GetStringSrcBlendFactor(sfactor) << ", " << GLES2Util::GetStringDstBlendFactor(dfactor) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendFunc(" + << GLES2Util::GetStringSrcBlendFactor(sfactor) << ", " + << GLES2Util::GetStringDstBlendFactor(dfactor) << ")"); helper_->BlendFunc(sfactor, dfactor); CheckGLError(); } -void GLES2Implementation::BlendFuncSeparate( - GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { +void GLES2Implementation::BlendFuncSeparate(GLenum srcRGB, + GLenum dstRGB, + GLenum srcAlpha, + GLenum dstAlpha) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendFuncSeparate(" << GLES2Util::GetStringSrcBlendFactor(srcRGB) << ", " << GLES2Util::GetStringDstBlendFactor(dstRGB) << ", " << GLES2Util::GetStringSrcBlendFactor(srcAlpha) << ", " << GLES2Util::GetStringDstBlendFactor(dstAlpha) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlendFuncSeparate(" + << GLES2Util::GetStringSrcBlendFactor(srcRGB) << ", " + << GLES2Util::GetStringDstBlendFactor(dstRGB) << ", " + << GLES2Util::GetStringSrcBlendFactor(srcAlpha) << ", " + << GLES2Util::GetStringDstBlendFactor(dstAlpha) << ")"); helper_->BlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); CheckGLError(); } @@ -114,7 +138,8 @@ void GLES2Implementation::BlendFuncSeparate( GLenum GLES2Implementation::CheckFramebufferStatus(GLenum target) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::CheckFramebufferStatus"); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCheckFramebufferStatus(" << GLES2Util::GetStringFrameBufferTarget(target) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCheckFramebufferStatus(" + << GLES2Util::GetStringFrameBufferTarget(target) << ")"); typedef cmds::CheckFramebufferStatus::Result Result; Result* result = GetResultAs<Result*>(); if (!result) { @@ -137,10 +162,13 @@ void GLES2Implementation::Clear(GLbitfield mask) { CheckGLError(); } -void GLES2Implementation::ClearColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { +void GLES2Implementation::ClearColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearColor(" << red << ", " << green << ", " << blue << ", " << alpha << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glClearColor(" << red << ", " + << green << ", " << blue << ", " << alpha << ")"); helper_->ClearColor(red, green, blue, alpha); CheckGLError(); } @@ -159,26 +187,43 @@ void GLES2Implementation::ClearStencil(GLint s) { CheckGLError(); } -void GLES2Implementation::ColorMask( - GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { +void GLES2Implementation::ColorMask(GLboolean red, + GLboolean green, + GLboolean blue, + GLboolean alpha) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glColorMask(" << GLES2Util::GetStringBool(red) << ", " << GLES2Util::GetStringBool(green) << ", " << GLES2Util::GetStringBool(blue) << ", " << GLES2Util::GetStringBool(alpha) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glColorMask(" + << GLES2Util::GetStringBool(red) << ", " + << GLES2Util::GetStringBool(green) << ", " + << GLES2Util::GetStringBool(blue) << ", " + << GLES2Util::GetStringBool(alpha) << ")"); helper_->ColorMask(red, green, blue, alpha); CheckGLError(); } void GLES2Implementation::CompileShader(GLuint shader) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCompileShader(" << shader << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCompileShader(" << shader + << ")"); helper_->CompileShader(shader); CheckGLError(); } -void GLES2Implementation::CopyTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, - GLsizei width, GLsizei height, GLint border) { +void GLES2Implementation::CopyTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLint border) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTexImage2D(" << GLES2Util::GetStringTextureTarget(target) << ", " << level << ", " << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", " << x << ", " << y << ", " << width << ", " << height << ", " << border << ")"); // NOLINT + GPU_CLIENT_LOG( + "[" << GetLogPrefix() << "] glCopyTexImage2D(" + << GLES2Util::GetStringTextureTarget(target) << ", " << level << ", " + << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", " + << x << ", " << y << ", " << width << ", " << height << ", " << border + << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "width < 0"); return; @@ -187,16 +232,27 @@ void GLES2Implementation::CopyTexImage2D( SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "height < 0"); return; } - helper_->CopyTexImage2D( - target, level, internalformat, x, y, width, height, border); + if (border != 0) { + SetGLError(GL_INVALID_VALUE, "glCopyTexImage2D", "border GL_INVALID_VALUE"); + return; + } + helper_->CopyTexImage2D(target, level, internalformat, x, y, width, height); CheckGLError(); } -void GLES2Implementation::CopyTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, - GLsizei width, GLsizei height) { +void GLES2Implementation::CopyTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLint x, + GLint y, + GLsizei width, + GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTexSubImage2D(" << GLES2Util::GetStringTextureTarget(target) << ", " << level << ", " << xoffset << ", " << yoffset << ", " << x << ", " << y << ", " << width << ", " << height << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTexSubImage2D(" + << GLES2Util::GetStringTextureTarget(target) << ", " + << level << ", " << xoffset << ", " << yoffset << ", " << x + << ", " << y << ", " << width << ", " << height << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glCopyTexSubImage2D", "width < 0"); return; @@ -212,10 +268,11 @@ void GLES2Implementation::CopyTexSubImage2D( GLuint GLES2Implementation::CreateProgram() { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateProgram(" << ")"); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateProgram(" + << ")"); GLuint client_id; - GetIdHandler(id_namespaces::kProgramsAndShaders)-> - MakeIds(this, 0, 1, &client_id); + GetIdHandler(id_namespaces::kProgramsAndShaders) + ->MakeIds(this, 0, 1, &client_id); helper_->CreateProgram(client_id); GPU_CLIENT_LOG("returned " << client_id); CheckGLError(); @@ -224,10 +281,11 @@ GLuint GLES2Implementation::CreateProgram() { GLuint GLES2Implementation::CreateShader(GLenum type) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateShader(" << GLES2Util::GetStringShaderType(type) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateShader(" + << GLES2Util::GetStringShaderType(type) << ")"); GLuint client_id; - GetIdHandler(id_namespaces::kProgramsAndShaders)-> - MakeIds(this, 0, 1, &client_id); + GetIdHandler(id_namespaces::kProgramsAndShaders) + ->MakeIds(this, 0, 1, &client_id); helper_->CreateShader(type, client_id); GPU_CLIENT_LOG("returned " << client_id); CheckGLError(); @@ -236,14 +294,16 @@ GLuint GLES2Implementation::CreateShader(GLenum type) { void GLES2Implementation::CullFace(GLenum mode) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCullFace(" << GLES2Util::GetStringFaceType(mode) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCullFace(" + << GLES2Util::GetStringFaceType(mode) << ")"); helper_->CullFace(mode); CheckGLError(); } void GLES2Implementation::DeleteBuffers(GLsizei n, const GLuint* buffers) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteBuffers(" << n << ", " << static_cast<const void*>(buffers) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteBuffers(" << n << ", " + << static_cast<const void*>(buffers) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << buffers[i]); @@ -262,10 +322,11 @@ void GLES2Implementation::DeleteBuffers(GLsizei n, const GLuint* buffers) { CheckGLError(); } -void GLES2Implementation::DeleteFramebuffers( - GLsizei n, const GLuint* framebuffers) { +void GLES2Implementation::DeleteFramebuffers(GLsizei n, + const GLuint* framebuffers) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteFramebuffers(" << n << ", " << static_cast<const void*>(framebuffers) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteFramebuffers(" << n << ", " + << static_cast<const void*>(framebuffers) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << framebuffers[i]); @@ -286,16 +347,18 @@ void GLES2Implementation::DeleteFramebuffers( void GLES2Implementation::DeleteProgram(GLuint program) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteProgram(" << program << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteProgram(" << program + << ")"); GPU_CLIENT_DCHECK(program != 0); DeleteProgramHelper(program); CheckGLError(); } -void GLES2Implementation::DeleteRenderbuffers( - GLsizei n, const GLuint* renderbuffers) { +void GLES2Implementation::DeleteRenderbuffers(GLsizei n, + const GLuint* renderbuffers) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteRenderbuffers(" << n << ", " << static_cast<const void*>(renderbuffers) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteRenderbuffers(" << n + << ", " << static_cast<const void*>(renderbuffers) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << renderbuffers[i]); @@ -324,7 +387,8 @@ void GLES2Implementation::DeleteShader(GLuint shader) { void GLES2Implementation::DeleteTextures(GLsizei n, const GLuint* textures) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteTextures(" << n << ", " << static_cast<const void*>(textures) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteTextures(" << n << ", " + << static_cast<const void*>(textures) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << textures[i]); @@ -345,70 +409,92 @@ void GLES2Implementation::DeleteTextures(GLsizei n, const GLuint* textures) { void GLES2Implementation::DepthFunc(GLenum func) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthFunc(" << GLES2Util::GetStringCmpFunction(func) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthFunc(" + << GLES2Util::GetStringCmpFunction(func) << ")"); helper_->DepthFunc(func); CheckGLError(); } void GLES2Implementation::DepthMask(GLboolean flag) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthMask(" << GLES2Util::GetStringBool(flag) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthMask(" + << GLES2Util::GetStringBool(flag) << ")"); helper_->DepthMask(flag); CheckGLError(); } void GLES2Implementation::DepthRangef(GLclampf zNear, GLclampf zFar) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthRangef(" << zNear << ", " << zFar << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDepthRangef(" << zNear << ", " + << zFar << ")"); helper_->DepthRangef(zNear, zFar); CheckGLError(); } void GLES2Implementation::DetachShader(GLuint program, GLuint shader) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDetachShader(" << program << ", " << shader << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDetachShader(" << program << ", " + << shader << ")"); helper_->DetachShader(program, shader); CheckGLError(); } -void GLES2Implementation::FramebufferRenderbuffer( - GLenum target, GLenum attachment, GLenum renderbuffertarget, - GLuint renderbuffer) { +void GLES2Implementation::FramebufferRenderbuffer(GLenum target, + GLenum attachment, + GLenum renderbuffertarget, + GLuint renderbuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferRenderbuffer(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringRenderBufferTarget(renderbuffertarget) << ", " << renderbuffer << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferRenderbuffer(" + << GLES2Util::GetStringFrameBufferTarget(target) << ", " + << GLES2Util::GetStringAttachment(attachment) << ", " + << GLES2Util::GetStringRenderBufferTarget( + renderbuffertarget) << ", " << renderbuffer << ")"); helper_->FramebufferRenderbuffer( target, attachment, renderbuffertarget, renderbuffer); CheckGLError(); } -void GLES2Implementation::FramebufferTexture2D( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level) { +void GLES2Implementation::FramebufferTexture2D(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferTexture2D(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringTextureTarget(textarget) << ", " << texture << ", " << level << ")"); // NOLINT - helper_->FramebufferTexture2D(target, attachment, textarget, texture, level); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferTexture2D(" + << GLES2Util::GetStringFrameBufferTarget(target) << ", " + << GLES2Util::GetStringAttachment(attachment) << ", " + << GLES2Util::GetStringTextureTarget(textarget) << ", " + << texture << ", " << level << ")"); + if (level != 0) { + SetGLError( + GL_INVALID_VALUE, "glFramebufferTexture2D", "level GL_INVALID_VALUE"); + return; + } + helper_->FramebufferTexture2D(target, attachment, textarget, texture); CheckGLError(); } void GLES2Implementation::FrontFace(GLenum mode) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFrontFace(" << GLES2Util::GetStringFaceMode(mode) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFrontFace(" + << GLES2Util::GetStringFaceMode(mode) << ")"); helper_->FrontFace(mode); CheckGLError(); } void GLES2Implementation::GenBuffers(GLsizei n, GLuint* buffers) { - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenBuffers(" << n << ", " << static_cast<const void*>(buffers) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenBuffers(" << n << ", " + << static_cast<const void*>(buffers) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenBuffers", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); - GetIdHandler(id_namespaces::kBuffers)-> - MakeIds(this, 0, n, buffers); + GetIdHandler(id_namespaces::kBuffers)->MakeIds(this, 0, n, buffers); GenBuffersHelper(n, buffers); helper_->GenBuffersImmediate(n, buffers); - helper_->CommandBufferHelper::Flush(); + if (share_group_->bind_generates_resource()) + helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << buffers[i]); @@ -419,23 +505,25 @@ void GLES2Implementation::GenBuffers(GLsizei n, GLuint* buffers) { void GLES2Implementation::GenerateMipmap(GLenum target) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenerateMipmap(" << GLES2Util::GetStringTextureBindTarget(target) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenerateMipmap(" + << GLES2Util::GetStringTextureBindTarget(target) << ")"); helper_->GenerateMipmap(target); CheckGLError(); } void GLES2Implementation::GenFramebuffers(GLsizei n, GLuint* framebuffers) { - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenFramebuffers(" << n << ", " << static_cast<const void*>(framebuffers) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenFramebuffers(" << n << ", " + << static_cast<const void*>(framebuffers) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenFramebuffers", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); - GetIdHandler(id_namespaces::kFramebuffers)-> - MakeIds(this, 0, n, framebuffers); + GetIdHandler(id_namespaces::kFramebuffers)->MakeIds(this, 0, n, framebuffers); GenFramebuffersHelper(n, framebuffers); helper_->GenFramebuffersImmediate(n, framebuffers); - helper_->CommandBufferHelper::Flush(); + if (share_group_->bind_generates_resource()) + helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << framebuffers[i]); @@ -445,17 +533,19 @@ void GLES2Implementation::GenFramebuffers(GLsizei n, GLuint* framebuffers) { } void GLES2Implementation::GenRenderbuffers(GLsizei n, GLuint* renderbuffers) { - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenRenderbuffers(" << n << ", " << static_cast<const void*>(renderbuffers) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenRenderbuffers(" << n << ", " + << static_cast<const void*>(renderbuffers) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenRenderbuffers", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); - GetIdHandler(id_namespaces::kRenderbuffers)-> - MakeIds(this, 0, n, renderbuffers); + GetIdHandler(id_namespaces::kRenderbuffers) + ->MakeIds(this, 0, n, renderbuffers); GenRenderbuffersHelper(n, renderbuffers); helper_->GenRenderbuffersImmediate(n, renderbuffers); - helper_->CommandBufferHelper::Flush(); + if (share_group_->bind_generates_resource()) + helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << renderbuffers[i]); @@ -465,17 +555,18 @@ void GLES2Implementation::GenRenderbuffers(GLsizei n, GLuint* renderbuffers) { } void GLES2Implementation::GenTextures(GLsizei n, GLuint* textures) { - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenTextures(" << n << ", " << static_cast<const void*>(textures) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenTextures(" << n << ", " + << static_cast<const void*>(textures) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenTextures", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); - GetIdHandler(id_namespaces::kTextures)-> - MakeIds(this, 0, n, textures); + GetIdHandler(id_namespaces::kTextures)->MakeIds(this, 0, n, textures); GenTexturesHelper(n, textures); helper_->GenTexturesImmediate(n, textures); - helper_->CommandBufferHelper::Flush(); + if (share_group_->bind_generates_resource()) + helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << textures[i]); @@ -487,7 +578,9 @@ void GLES2Implementation::GenTextures(GLsizei n, GLuint* textures) { void GLES2Implementation::GetBooleanv(GLenum pname, GLboolean* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLboolean, params); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetBooleanv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetBooleanv(" + << GLES2Util::GetStringGLState(pname) << ", " + << static_cast<const void*>(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetBooleanv"); if (GetBooleanvHelper(pname, params)) { return; @@ -498,22 +591,25 @@ void GLES2Implementation::GetBooleanv(GLenum pname, GLboolean* params) { return; } result->SetNumResults(0); - helper_->GetBooleanv(pname, - GetResultShmId(), GetResultShmOffset()); + helper_->GetBooleanv(pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ - for (int32 i = 0; i < result->GetNumResults(); ++i) { + for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } -void GLES2Implementation::GetBufferParameteriv( - GLenum target, GLenum pname, GLint* params) { +void GLES2Implementation::GetBufferParameteriv(GLenum target, + GLenum pname, + GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetBufferParameteriv(" << GLES2Util::GetStringBufferTarget(target) << ", " << GLES2Util::GetStringBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetBufferParameteriv(" + << GLES2Util::GetStringBufferTarget(target) << ", " + << GLES2Util::GetStringBufferParameter(pname) << ", " + << static_cast<const void*>(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetBufferParameteriv"); if (GetBufferParameterivHelper(target, pname, params)) { return; @@ -524,12 +620,12 @@ void GLES2Implementation::GetBufferParameteriv( return; } result->SetNumResults(0); - helper_->GetBufferParameteriv(target, pname, - GetResultShmId(), GetResultShmOffset()); + helper_->GetBufferParameteriv( + target, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ - for (int32 i = 0; i < result->GetNumResults(); ++i) { + for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); @@ -537,7 +633,9 @@ void GLES2Implementation::GetBufferParameteriv( } void GLES2Implementation::GetFloatv(GLenum pname, GLfloat* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetFloatv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetFloatv(" + << GLES2Util::GetStringGLState(pname) << ", " + << static_cast<const void*>(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetFloatv"); if (GetFloatvHelper(pname, params)) { return; @@ -548,25 +646,32 @@ void GLES2Implementation::GetFloatv(GLenum pname, GLfloat* params) { return; } result->SetNumResults(0); - helper_->GetFloatv(pname, - GetResultShmId(), GetResultShmOffset()); + helper_->GetFloatv(pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ - for (int32 i = 0; i < result->GetNumResults(); ++i) { + for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } -void GLES2Implementation::GetFramebufferAttachmentParameteriv( - GLenum target, GLenum attachment, GLenum pname, GLint* params) { +void GLES2Implementation::GetFramebufferAttachmentParameteriv(GLenum target, + GLenum attachment, + GLenum pname, + GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetFramebufferAttachmentParameteriv(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringFrameBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT - TRACE_EVENT0("gpu", "GLES2Implementation::GetFramebufferAttachmentParameteriv"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() + << "] glGetFramebufferAttachmentParameteriv(" + << GLES2Util::GetStringFrameBufferTarget(target) << ", " + << GLES2Util::GetStringAttachment(attachment) << ", " + << GLES2Util::GetStringFrameBufferParameter(pname) << ", " + << static_cast<const void*>(params) << ")"); + TRACE_EVENT0("gpu", + "GLES2Implementation::GetFramebufferAttachmentParameteriv"); if (GetFramebufferAttachmentParameterivHelper( - target, attachment, pname, params)) { + target, attachment, pname, params)) { return; } typedef cmds::GetFramebufferAttachmentParameteriv::Result Result; @@ -575,12 +680,12 @@ void GLES2Implementation::GetFramebufferAttachmentParameteriv( return; } result->SetNumResults(0); - helper_->GetFramebufferAttachmentParameteriv(target, attachment, pname, - GetResultShmId(), GetResultShmOffset()); + helper_->GetFramebufferAttachmentParameteriv( + target, attachment, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ - for (int32 i = 0; i < result->GetNumResults(); ++i) { + for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); @@ -589,7 +694,9 @@ void GLES2Implementation::GetFramebufferAttachmentParameteriv( void GLES2Implementation::GetIntegerv(GLenum pname, GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetIntegerv(" << GLES2Util::GetStringGLState(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetIntegerv(" + << GLES2Util::GetStringGLState(pname) << ", " + << static_cast<const void*>(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetIntegerv"); if (GetIntegervHelper(pname, params)) { return; @@ -600,22 +707,24 @@ void GLES2Implementation::GetIntegerv(GLenum pname, GLint* params) { return; } result->SetNumResults(0); - helper_->GetIntegerv(pname, - GetResultShmId(), GetResultShmOffset()); + helper_->GetIntegerv(pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ - for (int32 i = 0; i < result->GetNumResults(); ++i) { + for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } -void GLES2Implementation::GetProgramiv( - GLuint program, GLenum pname, GLint* params) { +void GLES2Implementation::GetProgramiv(GLuint program, + GLenum pname, + GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetProgramiv(" << program << ", " << GLES2Util::GetStringProgramParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetProgramiv(" << program << ", " + << GLES2Util::GetStringProgramParameter(pname) << ", " + << static_cast<const void*>(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetProgramiv"); if (GetProgramivHelper(program, pname, params)) { return; @@ -626,35 +735,33 @@ void GLES2Implementation::GetProgramiv( return; } result->SetNumResults(0); - helper_->GetProgramiv(program, pname, - GetResultShmId(), GetResultShmOffset()); + helper_->GetProgramiv(program, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ - for (int32 i = 0; i < result->GetNumResults(); ++i) { + for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } -void GLES2Implementation::GetProgramInfoLog( - GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) { +void GLES2Implementation::GetProgramInfoLog(GLuint program, + GLsizei bufsize, + GLsizei* length, + char* infolog) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length); - GPU_CLIENT_LOG("[" << GetLogPrefix() - << "] glGetProgramInfoLog" << "(" - << program << ", " - << bufsize << ", " - << static_cast<void*>(length) << ", " - << static_cast<void*>(infolog) << ")"); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetProgramInfoLog" + << "(" << program << ", " << bufsize << ", " + << static_cast<void*>(length) << ", " + << static_cast<void*>(infolog) << ")"); helper_->SetBucketSize(kResultBucketId, 0); helper_->GetProgramInfoLog(program, kResultBucketId); std::string str; GLsizei max_size = 0; if (GetBucketAsString(kResultBucketId, &str)) { if (bufsize > 0) { - max_size = - std::min(static_cast<size_t>(bufsize) - 1, str.size()); + max_size = std::min(static_cast<size_t>(bufsize) - 1, str.size()); memcpy(infolog, str.c_str(), max_size); infolog[max_size] = '\0'; GPU_CLIENT_LOG("------\n" << infolog << "\n------"); @@ -665,11 +772,15 @@ void GLES2Implementation::GetProgramInfoLog( } CheckGLError(); } -void GLES2Implementation::GetRenderbufferParameteriv( - GLenum target, GLenum pname, GLint* params) { +void GLES2Implementation::GetRenderbufferParameteriv(GLenum target, + GLenum pname, + GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetRenderbufferParameteriv(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << GLES2Util::GetStringRenderBufferParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetRenderbufferParameteriv(" + << GLES2Util::GetStringRenderBufferTarget(target) << ", " + << GLES2Util::GetStringRenderBufferParameter(pname) << ", " + << static_cast<const void*>(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetRenderbufferParameteriv"); if (GetRenderbufferParameterivHelper(target, pname, params)) { return; @@ -680,22 +791,25 @@ void GLES2Implementation::GetRenderbufferParameteriv( return; } result->SetNumResults(0); - helper_->GetRenderbufferParameteriv(target, pname, - GetResultShmId(), GetResultShmOffset()); + helper_->GetRenderbufferParameteriv( + target, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ - for (int32 i = 0; i < result->GetNumResults(); ++i) { + for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } -void GLES2Implementation::GetShaderiv( - GLuint shader, GLenum pname, GLint* params) { +void GLES2Implementation::GetShaderiv(GLuint shader, + GLenum pname, + GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetShaderiv(" << shader << ", " << GLES2Util::GetStringShaderParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetShaderiv(" << shader << ", " + << GLES2Util::GetStringShaderParameter(pname) << ", " + << static_cast<const void*>(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetShaderiv"); if (GetShaderivHelper(shader, pname, params)) { return; @@ -706,35 +820,33 @@ void GLES2Implementation::GetShaderiv( return; } result->SetNumResults(0); - helper_->GetShaderiv(shader, pname, - GetResultShmId(), GetResultShmOffset()); + helper_->GetShaderiv(shader, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ - for (int32 i = 0; i < result->GetNumResults(); ++i) { + for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } -void GLES2Implementation::GetShaderInfoLog( - GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) { +void GLES2Implementation::GetShaderInfoLog(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* infolog) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length); - GPU_CLIENT_LOG("[" << GetLogPrefix() - << "] glGetShaderInfoLog" << "(" - << shader << ", " - << bufsize << ", " - << static_cast<void*>(length) << ", " - << static_cast<void*>(infolog) << ")"); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetShaderInfoLog" + << "(" << shader << ", " << bufsize << ", " + << static_cast<void*>(length) << ", " + << static_cast<void*>(infolog) << ")"); helper_->SetBucketSize(kResultBucketId, 0); helper_->GetShaderInfoLog(shader, kResultBucketId); std::string str; GLsizei max_size = 0; if (GetBucketAsString(kResultBucketId, &str)) { if (bufsize > 0) { - max_size = - std::min(static_cast<size_t>(bufsize) - 1, str.size()); + max_size = std::min(static_cast<size_t>(bufsize) - 1, str.size()); memcpy(infolog, str.c_str(), max_size); infolog[max_size] = '\0'; GPU_CLIENT_LOG("------\n" << infolog << "\n------"); @@ -745,24 +857,23 @@ void GLES2Implementation::GetShaderInfoLog( } CheckGLError(); } -void GLES2Implementation::GetShaderSource( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) { +void GLES2Implementation::GetShaderSource(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length); - GPU_CLIENT_LOG("[" << GetLogPrefix() - << "] glGetShaderSource" << "(" - << shader << ", " - << bufsize << ", " - << static_cast<void*>(length) << ", " - << static_cast<void*>(source) << ")"); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetShaderSource" + << "(" << shader << ", " << bufsize << ", " + << static_cast<void*>(length) << ", " + << static_cast<void*>(source) << ")"); helper_->SetBucketSize(kResultBucketId, 0); helper_->GetShaderSource(shader, kResultBucketId); std::string str; GLsizei max_size = 0; if (GetBucketAsString(kResultBucketId, &str)) { if (bufsize > 0) { - max_size = - std::min(static_cast<size_t>(bufsize) - 1, str.size()); + max_size = std::min(static_cast<size_t>(bufsize) - 1, str.size()); memcpy(source, str.c_str(), max_size); source[max_size] = '\0'; GPU_CLIENT_LOG("------\n" << source << "\n------"); @@ -773,10 +884,14 @@ void GLES2Implementation::GetShaderSource( } CheckGLError(); } -void GLES2Implementation::GetTexParameterfv( - GLenum target, GLenum pname, GLfloat* params) { +void GLES2Implementation::GetTexParameterfv(GLenum target, + GLenum pname, + GLfloat* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTexParameterfv(" << GLES2Util::GetStringGetTexParamTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTexParameterfv(" + << GLES2Util::GetStringGetTexParamTarget(target) << ", " + << GLES2Util::GetStringTextureParameter(pname) << ", " + << static_cast<const void*>(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetTexParameterfv"); if (GetTexParameterfvHelper(target, pname, params)) { return; @@ -787,22 +902,26 @@ void GLES2Implementation::GetTexParameterfv( return; } result->SetNumResults(0); - helper_->GetTexParameterfv(target, pname, - GetResultShmId(), GetResultShmOffset()); + helper_->GetTexParameterfv( + target, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ - for (int32 i = 0; i < result->GetNumResults(); ++i) { + for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); CheckGLError(); } -void GLES2Implementation::GetTexParameteriv( - GLenum target, GLenum pname, GLint* params) { +void GLES2Implementation::GetTexParameteriv(GLenum target, + GLenum pname, + GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTexParameteriv(" << GLES2Util::GetStringGetTexParamTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTexParameteriv(" + << GLES2Util::GetStringGetTexParamTarget(target) << ", " + << GLES2Util::GetStringTextureParameter(pname) << ", " + << static_cast<const void*>(params) << ")"); TRACE_EVENT0("gpu", "GLES2Implementation::GetTexParameteriv"); if (GetTexParameterivHelper(target, pname, params)) { return; @@ -813,12 +932,12 @@ void GLES2Implementation::GetTexParameteriv( return; } result->SetNumResults(0); - helper_->GetTexParameteriv(target, pname, - GetResultShmId(), GetResultShmOffset()); + helper_->GetTexParameteriv( + target, pname, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); result->CopyResult(params); GPU_CLIENT_LOG_CODE_BLOCK({ - for (int32 i = 0; i < result->GetNumResults(); ++i) { + for (int32_t i = 0; i < result->GetNumResults(); ++i) { GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]); } }); @@ -826,7 +945,9 @@ void GLES2Implementation::GetTexParameteriv( } void GLES2Implementation::Hint(GLenum target, GLenum mode) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glHint(" << GLES2Util::GetStringHintTarget(target) << ", " << GLES2Util::GetStringHintMode(mode) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glHint(" + << GLES2Util::GetStringHintTarget(target) << ", " + << GLES2Util::GetStringHintMode(mode) << ")"); helper_->Hint(target, mode); CheckGLError(); } @@ -852,7 +973,8 @@ GLboolean GLES2Implementation::IsBuffer(GLuint buffer) { GLboolean GLES2Implementation::IsFramebuffer(GLuint framebuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsFramebuffer"); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsFramebuffer(" << framebuffer << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsFramebuffer(" << framebuffer + << ")"); typedef cmds::IsFramebuffer::Result Result; Result* result = GetResultAs<Result*>(); if (!result) { @@ -888,15 +1010,15 @@ GLboolean GLES2Implementation::IsProgram(GLuint program) { GLboolean GLES2Implementation::IsRenderbuffer(GLuint renderbuffer) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsRenderbuffer"); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsRenderbuffer(" << renderbuffer << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsRenderbuffer(" << renderbuffer + << ")"); typedef cmds::IsRenderbuffer::Result Result; Result* result = GetResultAs<Result*>(); if (!result) { return GL_FALSE; } *result = 0; - helper_->IsRenderbuffer( - renderbuffer, GetResultShmId(), GetResultShmOffset()); + helper_->IsRenderbuffer(renderbuffer, GetResultShmId(), GetResultShmOffset()); WaitForCmd(); GLboolean result_value = *result; GPU_CLIENT_LOG("returned " << result_value); @@ -949,22 +1071,29 @@ void GLES2Implementation::LineWidth(GLfloat width) { void GLES2Implementation::PolygonOffset(GLfloat factor, GLfloat units) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPolygonOffset(" << factor << ", " << units << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPolygonOffset(" << factor << ", " + << units << ")"); helper_->PolygonOffset(factor, units); CheckGLError(); } void GLES2Implementation::ReleaseShaderCompiler() { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReleaseShaderCompiler(" << ")"); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReleaseShaderCompiler(" + << ")"); helper_->ReleaseShaderCompiler(); CheckGLError(); } -void GLES2Implementation::RenderbufferStorage( - GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { +void GLES2Implementation::RenderbufferStorage(GLenum target, + GLenum internalformat, + GLsizei width, + GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRenderbufferStorage(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) << ", " << width << ", " << height << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRenderbufferStorage(" + << GLES2Util::GetStringRenderBufferTarget(target) << ", " + << GLES2Util::GetStringRenderBufferFormat(internalformat) + << ", " << width << ", " << height << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glRenderbufferStorage", "width < 0"); return; @@ -979,15 +1108,19 @@ void GLES2Implementation::RenderbufferStorage( void GLES2Implementation::SampleCoverage(GLclampf value, GLboolean invert) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSampleCoverage(" << value << ", " << GLES2Util::GetStringBool(invert) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSampleCoverage(" << value << ", " + << GLES2Util::GetStringBool(invert) << ")"); helper_->SampleCoverage(value, invert); CheckGLError(); } -void GLES2Implementation::Scissor( - GLint x, GLint y, GLsizei width, GLsizei height) { +void GLES2Implementation::Scissor(GLint x, + GLint y, + GLsizei width, + GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glScissor(" << x << ", " << y << ", " << width << ", " << height << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glScissor(" << x << ", " << y + << ", " << width << ", " << height << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glScissor", "width < 0"); return; @@ -1002,15 +1135,22 @@ void GLES2Implementation::Scissor( void GLES2Implementation::StencilFunc(GLenum func, GLint ref, GLuint mask) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilFunc(" << GLES2Util::GetStringCmpFunction(func) << ", " << ref << ", " << mask << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilFunc(" + << GLES2Util::GetStringCmpFunction(func) << ", " << ref + << ", " << mask << ")"); helper_->StencilFunc(func, ref, mask); CheckGLError(); } -void GLES2Implementation::StencilFuncSeparate( - GLenum face, GLenum func, GLint ref, GLuint mask) { +void GLES2Implementation::StencilFuncSeparate(GLenum face, + GLenum func, + GLint ref, + GLuint mask) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilFuncSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << GLES2Util::GetStringCmpFunction(func) << ", " << ref << ", " << mask << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilFuncSeparate(" + << GLES2Util::GetStringFaceType(face) << ", " + << GLES2Util::GetStringCmpFunction(func) << ", " << ref + << ", " << mask << ")"); helper_->StencilFuncSeparate(face, func, ref, mask); CheckGLError(); } @@ -1024,55 +1164,82 @@ void GLES2Implementation::StencilMask(GLuint mask) { void GLES2Implementation::StencilMaskSeparate(GLenum face, GLuint mask) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilMaskSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << mask << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilMaskSeparate(" + << GLES2Util::GetStringFaceType(face) << ", " << mask + << ")"); helper_->StencilMaskSeparate(face, mask); CheckGLError(); } void GLES2Implementation::StencilOp(GLenum fail, GLenum zfail, GLenum zpass) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilOp(" << GLES2Util::GetStringStencilOp(fail) << ", " << GLES2Util::GetStringStencilOp(zfail) << ", " << GLES2Util::GetStringStencilOp(zpass) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilOp(" + << GLES2Util::GetStringStencilOp(fail) << ", " + << GLES2Util::GetStringStencilOp(zfail) << ", " + << GLES2Util::GetStringStencilOp(zpass) << ")"); helper_->StencilOp(fail, zfail, zpass); CheckGLError(); } -void GLES2Implementation::StencilOpSeparate( - GLenum face, GLenum fail, GLenum zfail, GLenum zpass) { +void GLES2Implementation::StencilOpSeparate(GLenum face, + GLenum fail, + GLenum zfail, + GLenum zpass) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilOpSeparate(" << GLES2Util::GetStringFaceType(face) << ", " << GLES2Util::GetStringStencilOp(fail) << ", " << GLES2Util::GetStringStencilOp(zfail) << ", " << GLES2Util::GetStringStencilOp(zpass) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glStencilOpSeparate(" + << GLES2Util::GetStringFaceType(face) << ", " + << GLES2Util::GetStringStencilOp(fail) << ", " + << GLES2Util::GetStringStencilOp(zfail) << ", " + << GLES2Util::GetStringStencilOp(zpass) << ")"); helper_->StencilOpSeparate(face, fail, zfail, zpass); CheckGLError(); } -void GLES2Implementation::TexParameterf( - GLenum target, GLenum pname, GLfloat param) { +void GLES2Implementation::TexParameterf(GLenum target, + GLenum pname, + GLfloat param) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameterf(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << param << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameterf(" + << GLES2Util::GetStringTextureBindTarget(target) << ", " + << GLES2Util::GetStringTextureParameter(pname) << ", " + << param << ")"); helper_->TexParameterf(target, pname, param); CheckGLError(); } -void GLES2Implementation::TexParameterfv( - GLenum target, GLenum pname, const GLfloat* params) { +void GLES2Implementation::TexParameterfv(GLenum target, + GLenum pname, + const GLfloat* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameterfv(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameterfv(" + << GLES2Util::GetStringTextureBindTarget(target) << ", " + << GLES2Util::GetStringTextureParameter(pname) << ", " + << static_cast<const void*>(params) << ")"); GPU_CLIENT_LOG("values: " << params[0]); helper_->TexParameterfvImmediate(target, pname, params); CheckGLError(); } -void GLES2Implementation::TexParameteri( - GLenum target, GLenum pname, GLint param) { +void GLES2Implementation::TexParameteri(GLenum target, + GLenum pname, + GLint param) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameteri(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << param << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameteri(" + << GLES2Util::GetStringTextureBindTarget(target) << ", " + << GLES2Util::GetStringTextureParameter(pname) << ", " + << param << ")"); helper_->TexParameteri(target, pname, param); CheckGLError(); } -void GLES2Implementation::TexParameteriv( - GLenum target, GLenum pname, const GLint* params) { +void GLES2Implementation::TexParameteriv(GLenum target, + GLenum pname, + const GLint* params) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameteriv(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << GLES2Util::GetStringTextureParameter(pname) << ", " << static_cast<const void*>(params) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexParameteriv(" + << GLES2Util::GetStringTextureBindTarget(target) << ", " + << GLES2Util::GetStringTextureParameter(pname) << ", " + << static_cast<const void*>(params) << ")"); GPU_CLIENT_LOG("values: " << params[0]); helper_->TexParameterivImmediate(target, pname, params); CheckGLError(); @@ -1080,18 +1247,21 @@ void GLES2Implementation::TexParameteriv( void GLES2Implementation::Uniform1f(GLint location, GLfloat x) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1f(" << location << ", " << x << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1f(" << location << ", " + << x << ")"); helper_->Uniform1f(location, x); CheckGLError(); } -void GLES2Implementation::Uniform1fv( - GLint location, GLsizei count, const GLfloat* v) { +void GLES2Implementation::Uniform1fv(GLint location, + GLsizei count, + const GLfloat* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1fv(" << location << ", " + << count << ", " << static_cast<const void*>(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 1]); + GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 1]); } }); if (count < 0) { @@ -1104,18 +1274,21 @@ void GLES2Implementation::Uniform1fv( void GLES2Implementation::Uniform1i(GLint location, GLint x) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1i(" << location << ", " << x << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1i(" << location << ", " + << x << ")"); helper_->Uniform1i(location, x); CheckGLError(); } -void GLES2Implementation::Uniform1iv( - GLint location, GLsizei count, const GLint* v) { +void GLES2Implementation::Uniform1iv(GLint location, + GLsizei count, + const GLint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform1iv(" << location << ", " + << count << ", " << static_cast<const void*>(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 1]); + GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 1]); } }); if (count < 0) { @@ -1128,18 +1301,21 @@ void GLES2Implementation::Uniform1iv( void GLES2Implementation::Uniform2f(GLint location, GLfloat x, GLfloat y) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2f(" << location << ", " << x << ", " << y << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2f(" << location << ", " + << x << ", " << y << ")"); helper_->Uniform2f(location, x, y); CheckGLError(); } -void GLES2Implementation::Uniform2fv( - GLint location, GLsizei count, const GLfloat* v) { +void GLES2Implementation::Uniform2fv(GLint location, + GLsizei count, + const GLfloat* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2fv(" << location << ", " + << count << ", " << static_cast<const void*>(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]); // NOLINT + GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]); } }); if (count < 0) { @@ -1152,18 +1328,21 @@ void GLES2Implementation::Uniform2fv( void GLES2Implementation::Uniform2i(GLint location, GLint x, GLint y) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2i(" << location << ", " << x << ", " << y << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2i(" << location << ", " + << x << ", " << y << ")"); helper_->Uniform2i(location, x, y); CheckGLError(); } -void GLES2Implementation::Uniform2iv( - GLint location, GLsizei count, const GLint* v) { +void GLES2Implementation::Uniform2iv(GLint location, + GLsizei count, + const GLint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform2iv(" << location << ", " + << count << ", " << static_cast<const void*>(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]); // NOLINT + GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 2] << ", " << v[1 + i * 2]); } }); if (count < 0) { @@ -1174,21 +1353,27 @@ void GLES2Implementation::Uniform2iv( CheckGLError(); } -void GLES2Implementation::Uniform3f( - GLint location, GLfloat x, GLfloat y, GLfloat z) { +void GLES2Implementation::Uniform3f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3f(" << location << ", " << x << ", " << y << ", " << z << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3f(" << location << ", " + << x << ", " << y << ", " << z << ")"); helper_->Uniform3f(location, x, y, z); CheckGLError(); } -void GLES2Implementation::Uniform3fv( - GLint location, GLsizei count, const GLfloat* v) { +void GLES2Implementation::Uniform3fv(GLint location, + GLsizei count, + const GLfloat* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3fv(" << location << ", " + << count << ", " << static_cast<const void*>(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3] << ", " << v[2 + i * 3]); // NOLINT + GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3] + << ", " << v[2 + i * 3]); } }); if (count < 0) { @@ -1199,21 +1384,24 @@ void GLES2Implementation::Uniform3fv( CheckGLError(); } -void GLES2Implementation::Uniform3i( - GLint location, GLint x, GLint y, GLint z) { +void GLES2Implementation::Uniform3i(GLint location, GLint x, GLint y, GLint z) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3i(" << location << ", " << x << ", " << y << ", " << z << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3i(" << location << ", " + << x << ", " << y << ", " << z << ")"); helper_->Uniform3i(location, x, y, z); CheckGLError(); } -void GLES2Implementation::Uniform3iv( - GLint location, GLsizei count, const GLint* v) { +void GLES2Implementation::Uniform3iv(GLint location, + GLsizei count, + const GLint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform3iv(" << location << ", " + << count << ", " << static_cast<const void*>(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3] << ", " << v[2 + i * 3]); // NOLINT + GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 3] << ", " << v[1 + i * 3] + << ", " << v[2 + i * 3]); } }); if (count < 0) { @@ -1224,21 +1412,28 @@ void GLES2Implementation::Uniform3iv( CheckGLError(); } -void GLES2Implementation::Uniform4f( - GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { +void GLES2Implementation::Uniform4f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4f(" << location << ", " << x << ", " << y << ", " << z << ", " << w << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4f(" << location << ", " + << x << ", " << y << ", " << z << ", " << w << ")"); helper_->Uniform4f(location, x, y, z, w); CheckGLError(); } -void GLES2Implementation::Uniform4fv( - GLint location, GLsizei count, const GLfloat* v) { +void GLES2Implementation::Uniform4fv(GLint location, + GLsizei count, + const GLfloat* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4fv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4fv(" << location << ", " + << count << ", " << static_cast<const void*>(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4] << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]); // NOLINT + GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4] + << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]); } }); if (count < 0) { @@ -1249,21 +1444,28 @@ void GLES2Implementation::Uniform4fv( CheckGLError(); } -void GLES2Implementation::Uniform4i( - GLint location, GLint x, GLint y, GLint z, GLint w) { +void GLES2Implementation::Uniform4i(GLint location, + GLint x, + GLint y, + GLint z, + GLint w) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4i(" << location << ", " << x << ", " << y << ", " << z << ", " << w << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4i(" << location << ", " + << x << ", " << y << ", " << z << ", " << w << ")"); helper_->Uniform4i(location, x, y, z, w); CheckGLError(); } -void GLES2Implementation::Uniform4iv( - GLint location, GLsizei count, const GLint* v) { +void GLES2Implementation::Uniform4iv(GLint location, + GLsizei count, + const GLint* v) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4iv(" << location << ", " << count << ", " << static_cast<const void*>(v) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniform4iv(" << location << ", " + << count << ", " << static_cast<const void*>(v) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4] << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]); // NOLINT + GPU_CLIENT_LOG(" " << i << ": " << v[0 + i * 4] << ", " << v[1 + i * 4] + << ", " << v[2 + i * 4] << ", " << v[3 + i * 4]); } }); if (count < 0) { @@ -1274,74 +1476,135 @@ void GLES2Implementation::Uniform4iv( CheckGLError(); } -void GLES2Implementation::UniformMatrix2fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { +void GLES2Implementation::UniformMatrix2fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix2fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast<const void*>(value) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix2fv(" << location + << ", " << count << ", " + << GLES2Util::GetStringBool(transpose) << ", " + << static_cast<const void*>(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << value[0 + i * 4] << ", " << value[1 + i * 4] << ", " << value[2 + i * 4] << ", " << value[3 + i * 4]); // NOLINT + GPU_CLIENT_LOG(" " << i << ": " << value[0 + i * 4] << ", " + << value[1 + i * 4] << ", " << value[2 + i * 4] + << ", " << value[3 + i * 4]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix2fv", "count < 0"); return; } - helper_->UniformMatrix2fvImmediate(location, count, transpose, value); + if (transpose != false) { + SetGLError( + GL_INVALID_VALUE, "glUniformMatrix2fv", "transpose GL_INVALID_VALUE"); + return; + } + helper_->UniformMatrix2fvImmediate(location, count, value); CheckGLError(); } -void GLES2Implementation::UniformMatrix3fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { +void GLES2Implementation::UniformMatrix3fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix3fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast<const void*>(value) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix3fv(" << location + << ", " << count << ", " + << GLES2Util::GetStringBool(transpose) << ", " + << static_cast<const void*>(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << value[0 + i * 9] << ", " << value[1 + i * 9] << ", " << value[2 + i * 9] << ", " << value[3 + i * 9] << ", " << value[4 + i * 9] << ", " << value[5 + i * 9] << ", " << value[6 + i * 9] << ", " << value[7 + i * 9] << ", " << value[8 + i * 9]); // NOLINT + GPU_CLIENT_LOG(" " << i << ": " << value[0 + i * 9] << ", " + << value[1 + i * 9] << ", " << value[2 + i * 9] + << ", " << value[3 + i * 9] << ", " + << value[4 + i * 9] << ", " << value[5 + i * 9] + << ", " << value[6 + i * 9] << ", " + << value[7 + i * 9] << ", " << value[8 + i * 9]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix3fv", "count < 0"); return; } - helper_->UniformMatrix3fvImmediate(location, count, transpose, value); + if (transpose != false) { + SetGLError( + GL_INVALID_VALUE, "glUniformMatrix3fv", "transpose GL_INVALID_VALUE"); + return; + } + helper_->UniformMatrix3fvImmediate(location, count, value); CheckGLError(); } -void GLES2Implementation::UniformMatrix4fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { +void GLES2Implementation::UniformMatrix4fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix4fv(" << location << ", " << count << ", " << GLES2Util::GetStringBool(transpose) << ", " << static_cast<const void*>(value) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUniformMatrix4fv(" << location + << ", " << count << ", " + << GLES2Util::GetStringBool(transpose) << ", " + << static_cast<const void*>(value) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << value[0 + i * 16] << ", " << value[1 + i * 16] << ", " << value[2 + i * 16] << ", " << value[3 + i * 16] << ", " << value[4 + i * 16] << ", " << value[5 + i * 16] << ", " << value[6 + i * 16] << ", " << value[7 + i * 16] << ", " << value[8 + i * 16] << ", " << value[9 + i * 16] << ", " << value[10 + i * 16] << ", " << value[11 + i * 16] << ", " << value[12 + i * 16] << ", " << value[13 + i * 16] << ", " << value[14 + i * 16] << ", " << value[15 + i * 16]); // NOLINT + GPU_CLIENT_LOG( + " " << i << ": " << value[0 + i * 16] << ", " << value[1 + i * 16] + << ", " << value[2 + i * 16] << ", " << value[3 + i * 16] << ", " + << value[4 + i * 16] << ", " << value[5 + i * 16] << ", " + << value[6 + i * 16] << ", " << value[7 + i * 16] << ", " + << value[8 + i * 16] << ", " << value[9 + i * 16] << ", " + << value[10 + i * 16] << ", " << value[11 + i * 16] << ", " + << value[12 + i * 16] << ", " << value[13 + i * 16] << ", " + << value[14 + i * 16] << ", " << value[15 + i * 16]); } }); if (count < 0) { SetGLError(GL_INVALID_VALUE, "glUniformMatrix4fv", "count < 0"); return; } - helper_->UniformMatrix4fvImmediate(location, count, transpose, value); + if (transpose != false) { + SetGLError( + GL_INVALID_VALUE, "glUniformMatrix4fv", "transpose GL_INVALID_VALUE"); + return; + } + helper_->UniformMatrix4fvImmediate(location, count, value); + CheckGLError(); +} + +void GLES2Implementation::UseProgram(GLuint program) { + GPU_CLIENT_SINGLE_THREAD_CHECK(); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUseProgram(" << program << ")"); + if (IsProgramReservedId(program)) { + SetGLError(GL_INVALID_OPERATION, "UseProgram", "program reserved id"); + return; + } + if (UseProgramHelper(program)) { + helper_->UseProgram(program); + } CheckGLError(); } void GLES2Implementation::ValidateProgram(GLuint program) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glValidateProgram(" << program << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glValidateProgram(" << program + << ")"); helper_->ValidateProgram(program); CheckGLError(); } void GLES2Implementation::VertexAttrib1f(GLuint indx, GLfloat x) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib1f(" << indx << ", " << x << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib1f(" << indx << ", " + << x << ")"); helper_->VertexAttrib1f(indx, x); CheckGLError(); } void GLES2Implementation::VertexAttrib1fv(GLuint indx, const GLfloat* values) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib1fv(" << indx << ", " << static_cast<const void*>(values) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib1fv(" << indx << ", " + << static_cast<const void*>(values) << ")"); GPU_CLIENT_LOG("values: " << values[0]); helper_->VertexAttrib1fvImmediate(indx, values); CheckGLError(); @@ -1349,55 +1612,71 @@ void GLES2Implementation::VertexAttrib1fv(GLuint indx, const GLfloat* values) { void GLES2Implementation::VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib2f(" << indx << ", " << x << ", " << y << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib2f(" << indx << ", " + << x << ", " << y << ")"); helper_->VertexAttrib2f(indx, x, y); CheckGLError(); } void GLES2Implementation::VertexAttrib2fv(GLuint indx, const GLfloat* values) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib2fv(" << indx << ", " << static_cast<const void*>(values) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib2fv(" << indx << ", " + << static_cast<const void*>(values) << ")"); GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1]); helper_->VertexAttrib2fvImmediate(indx, values); CheckGLError(); } -void GLES2Implementation::VertexAttrib3f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z) { +void GLES2Implementation::VertexAttrib3f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib3f(" << indx << ", " << x << ", " << y << ", " << z << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib3f(" << indx << ", " + << x << ", " << y << ", " << z << ")"); helper_->VertexAttrib3f(indx, x, y, z); CheckGLError(); } void GLES2Implementation::VertexAttrib3fv(GLuint indx, const GLfloat* values) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib3fv(" << indx << ", " << static_cast<const void*>(values) << ")"); // NOLINT - GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1] << ", " << values[2]); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib3fv(" << indx << ", " + << static_cast<const void*>(values) << ")"); + GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1] << ", " + << values[2]); helper_->VertexAttrib3fvImmediate(indx, values); CheckGLError(); } -void GLES2Implementation::VertexAttrib4f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { +void GLES2Implementation::VertexAttrib4f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib4f(" << indx << ", " << x << ", " << y << ", " << z << ", " << w << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib4f(" << indx << ", " + << x << ", " << y << ", " << z << ", " << w << ")"); helper_->VertexAttrib4f(indx, x, y, z, w); CheckGLError(); } void GLES2Implementation::VertexAttrib4fv(GLuint indx, const GLfloat* values) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib4fv(" << indx << ", " << static_cast<const void*>(values) << ")"); // NOLINT - GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1] << ", " << values[2] << ", " << values[3]); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttrib4fv(" << indx << ", " + << static_cast<const void*>(values) << ")"); + GPU_CLIENT_LOG("values: " << values[0] << ", " << values[1] << ", " + << values[2] << ", " << values[3]); helper_->VertexAttrib4fvImmediate(indx, values); CheckGLError(); } -void GLES2Implementation::Viewport( - GLint x, GLint y, GLsizei width, GLsizei height) { +void GLES2Implementation::Viewport(GLint x, + GLint y, + GLsizei width, + GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glViewport(" << x << ", " << y << ", " << width << ", " << height << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glViewport(" << x << ", " << y + << ", " << width << ", " << height << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glViewport", "width < 0"); return; @@ -1410,34 +1689,55 @@ void GLES2Implementation::Viewport( CheckGLError(); } -void GLES2Implementation::BlitFramebufferCHROMIUM( - GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, - GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { +void GLES2Implementation::BlitFramebufferCHROMIUM(GLint srcX0, + GLint srcY0, + GLint srcX1, + GLint srcY1, + GLint dstX0, + GLint dstY0, + GLint dstX1, + GLint dstY1, + GLbitfield mask, + GLenum filter) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlitFramebufferCHROMIUM(" << srcX0 << ", " << srcY0 << ", " << srcX1 << ", " << srcY1 << ", " << dstX0 << ", " << dstY0 << ", " << dstX1 << ", " << dstY1 << ", " << mask << ", " << GLES2Util::GetStringBlitFilter(filter) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBlitFramebufferCHROMIUM(" + << srcX0 << ", " << srcY0 << ", " << srcX1 << ", " << srcY1 + << ", " << dstX0 << ", " << dstY0 << ", " << dstX1 << ", " + << dstY1 << ", " << mask << ", " + << GLES2Util::GetStringBlitFilter(filter) << ")"); helper_->BlitFramebufferCHROMIUM( srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); CheckGLError(); } void GLES2Implementation::RenderbufferStorageMultisampleCHROMIUM( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, + GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRenderbufferStorageMultisampleCHROMIUM(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << samples << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) << ", " << width << ", " << height << ")"); // NOLINT + GPU_CLIENT_LOG( + "[" << GetLogPrefix() << "] glRenderbufferStorageMultisampleCHROMIUM(" + << GLES2Util::GetStringRenderBufferTarget(target) << ", " << samples + << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) + << ", " << width << ", " << height << ")"); if (samples < 0) { - SetGLError( - GL_INVALID_VALUE, "glRenderbufferStorageMultisampleCHROMIUM", "samples < 0"); // NOLINT + SetGLError(GL_INVALID_VALUE, + "glRenderbufferStorageMultisampleCHROMIUM", + "samples < 0"); return; } if (width < 0) { - SetGLError( - GL_INVALID_VALUE, "glRenderbufferStorageMultisampleCHROMIUM", "width < 0"); // NOLINT + SetGLError(GL_INVALID_VALUE, + "glRenderbufferStorageMultisampleCHROMIUM", + "width < 0"); return; } if (height < 0) { - SetGLError( - GL_INVALID_VALUE, "glRenderbufferStorageMultisampleCHROMIUM", "height < 0"); // NOLINT + SetGLError(GL_INVALID_VALUE, + "glRenderbufferStorageMultisampleCHROMIUM", + "height < 0"); return; } helper_->RenderbufferStorageMultisampleCHROMIUM( @@ -1446,10 +1746,17 @@ void GLES2Implementation::RenderbufferStorageMultisampleCHROMIUM( } void GLES2Implementation::RenderbufferStorageMultisampleEXT( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, + GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRenderbufferStorageMultisampleEXT(" << GLES2Util::GetStringRenderBufferTarget(target) << ", " << samples << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) << ", " << width << ", " << height << ")"); // NOLINT + GPU_CLIENT_LOG( + "[" << GetLogPrefix() << "] glRenderbufferStorageMultisampleEXT(" + << GLES2Util::GetStringRenderBufferTarget(target) << ", " << samples + << ", " << GLES2Util::GetStringRenderBufferFormat(internalformat) + << ", " << width << ", " << height << ")"); if (samples < 0) { SetGLError( GL_INVALID_VALUE, "glRenderbufferStorageMultisampleEXT", "samples < 0"); @@ -1470,26 +1777,47 @@ void GLES2Implementation::RenderbufferStorageMultisampleEXT( CheckGLError(); } -void GLES2Implementation::FramebufferTexture2DMultisampleEXT( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level, GLsizei samples) { +void GLES2Implementation::FramebufferTexture2DMultisampleEXT(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level, + GLsizei samples) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFramebufferTexture2DMultisampleEXT(" << GLES2Util::GetStringFrameBufferTarget(target) << ", " << GLES2Util::GetStringAttachment(attachment) << ", " << GLES2Util::GetStringTextureTarget(textarget) << ", " << texture << ", " << level << ", " << samples << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() + << "] glFramebufferTexture2DMultisampleEXT(" + << GLES2Util::GetStringFrameBufferTarget(target) << ", " + << GLES2Util::GetStringAttachment(attachment) << ", " + << GLES2Util::GetStringTextureTarget(textarget) << ", " + << texture << ", " << level << ", " << samples << ")"); + if (level != 0) { + SetGLError(GL_INVALID_VALUE, + "glFramebufferTexture2DMultisampleEXT", + "level GL_INVALID_VALUE"); + return; + } if (samples < 0) { - SetGLError( - GL_INVALID_VALUE, "glFramebufferTexture2DMultisampleEXT", "samples < 0"); // NOLINT + SetGLError(GL_INVALID_VALUE, + "glFramebufferTexture2DMultisampleEXT", + "samples < 0"); return; } helper_->FramebufferTexture2DMultisampleEXT( - target, attachment, textarget, texture, level, samples); + target, attachment, textarget, texture, samples); CheckGLError(); } -void GLES2Implementation::TexStorage2DEXT( - GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, - GLsizei height) { +void GLES2Implementation::TexStorage2DEXT(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexStorage2DEXT(" << GLES2Util::GetStringTextureTarget(target) << ", " << levels << ", " << GLES2Util::GetStringTextureInternalFormatStorage(internalFormat) << ", " << width << ", " << height << ")"); // NOLINT + GPU_CLIENT_LOG( + "[" << GetLogPrefix() << "] glTexStorage2DEXT(" + << GLES2Util::GetStringTextureTarget(target) << ", " << levels << ", " + << GLES2Util::GetStringTextureInternalFormatStorage(internalFormat) + << ", " << width << ", " << height << ")"); if (levels < 0) { SetGLError(GL_INVALID_VALUE, "glTexStorage2DEXT", "levels < 0"); return; @@ -1507,17 +1835,18 @@ void GLES2Implementation::TexStorage2DEXT( } void GLES2Implementation::GenQueriesEXT(GLsizei n, GLuint* queries) { - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenQueriesEXT(" << n << ", " << static_cast<const void*>(queries) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenQueriesEXT(" << n << ", " + << static_cast<const void*>(queries) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenQueriesEXT", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); - GetIdHandler(id_namespaces::kQueries)-> - MakeIds(this, 0, n, queries); + GetIdHandler(id_namespaces::kQueries)->MakeIds(this, 0, n, queries); GenQueriesEXTHelper(n, queries); helper_->GenQueriesEXTImmediate(n, queries); - helper_->CommandBufferHelper::Flush(); + if (share_group_->bind_generates_resource()) + helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << queries[i]); @@ -1528,7 +1857,8 @@ void GLES2Implementation::GenQueriesEXT(GLsizei n, GLuint* queries) { void GLES2Implementation::DeleteQueriesEXT(GLsizei n, const GLuint* queries) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteQueriesEXT(" << n << ", " << static_cast<const void*>(queries) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteQueriesEXT(" << n << ", " + << static_cast<const void*>(queries) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << queries[i]); @@ -1548,17 +1878,18 @@ void GLES2Implementation::DeleteQueriesEXT(GLsizei n, const GLuint* queries) { } void GLES2Implementation::GenVertexArraysOES(GLsizei n, GLuint* arrays) { - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenVertexArraysOES(" << n << ", " << static_cast<const void*>(arrays) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenVertexArraysOES(" << n << ", " + << static_cast<const void*>(arrays) << ")"); if (n < 0) { SetGLError(GL_INVALID_VALUE, "glGenVertexArraysOES", "n < 0"); return; } GPU_CLIENT_SINGLE_THREAD_CHECK(); - GetIdHandler(id_namespaces::kVertexArrays)-> - MakeIds(this, 0, n, arrays); + GetIdHandler(id_namespaces::kVertexArrays)->MakeIds(this, 0, n, arrays); GenVertexArraysOESHelper(n, arrays); helper_->GenVertexArraysOESImmediate(n, arrays); - helper_->CommandBufferHelper::Flush(); + if (share_group_->bind_generates_resource()) + helper_->CommandBufferHelper::Flush(); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << arrays[i]); @@ -1567,10 +1898,11 @@ void GLES2Implementation::GenVertexArraysOES(GLsizei n, GLuint* arrays) { CheckGLError(); } -void GLES2Implementation::DeleteVertexArraysOES( - GLsizei n, const GLuint* arrays) { +void GLES2Implementation::DeleteVertexArraysOES(GLsizei n, + const GLuint* arrays) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteVertexArraysOES(" << n << ", " << static_cast<const void*>(arrays) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteVertexArraysOES(" << n + << ", " << static_cast<const void*>(arrays) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < n; ++i) { GPU_CLIENT_LOG(" " << i << ": " << arrays[i]); @@ -1592,7 +1924,8 @@ void GLES2Implementation::DeleteVertexArraysOES( GLboolean GLES2Implementation::IsVertexArrayOES(GLuint array) { GPU_CLIENT_SINGLE_THREAD_CHECK(); TRACE_EVENT0("gpu", "GLES2Implementation::IsVertexArrayOES"); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsVertexArrayOES(" << array << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsVertexArrayOES(" << array + << ")"); typedef cmds::IsVertexArrayOES::Result Result; Result* result = GetResultAs<Result*>(); if (!result) { @@ -1609,36 +1942,35 @@ GLboolean GLES2Implementation::IsVertexArrayOES(GLuint array) { void GLES2Implementation::BindVertexArrayOES(GLuint array) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindVertexArrayOES(" << array << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindVertexArrayOES(" << array + << ")"); if (IsVertexArrayReservedId(array)) { - SetGLError( - GL_INVALID_OPERATION, "BindVertexArrayOES", "array reserved id"); + SetGLError(GL_INVALID_OPERATION, "BindVertexArrayOES", "array reserved id"); return; } - if (BindVertexArrayHelper(array)) { + if (BindVertexArrayOESHelper(array)) { helper_->BindVertexArrayOES(array); } CheckGLError(); } -void GLES2Implementation::GetTranslatedShaderSourceANGLE( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) { +void GLES2Implementation::GetTranslatedShaderSourceANGLE(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_VALIDATE_DESTINATION_OPTIONAL_INITALIZATION(GLsizei, length); - GPU_CLIENT_LOG("[" << GetLogPrefix() - << "] glGetTranslatedShaderSourceANGLE" << "(" - << shader << ", " - << bufsize << ", " - << static_cast<void*>(length) << ", " - << static_cast<void*>(source) << ")"); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetTranslatedShaderSourceANGLE" + << "(" << shader << ", " << bufsize << ", " + << static_cast<void*>(length) << ", " + << static_cast<void*>(source) << ")"); helper_->SetBucketSize(kResultBucketId, 0); helper_->GetTranslatedShaderSourceANGLE(shader, kResultBucketId); std::string str; GLsizei max_size = 0; if (GetBucketAsString(kResultBucketId, &str)) { if (bufsize > 0) { - max_size = - std::min(static_cast<size_t>(bufsize) - 1, str.size()); + max_size = std::min(static_cast<size_t>(bufsize) - 1, str.size()); memcpy(source, str.c_str(), max_size); source[max_size] = '\0'; GPU_CLIENT_LOG("------\n" << source << "\n------"); @@ -1649,18 +1981,22 @@ void GLES2Implementation::GetTranslatedShaderSourceANGLE( } CheckGLError(); } -void GLES2Implementation::TexImageIOSurface2DCHROMIUM( - GLenum target, GLsizei width, GLsizei height, GLuint ioSurfaceId, - GLuint plane) { +void GLES2Implementation::TexImageIOSurface2DCHROMIUM(GLenum target, + GLsizei width, + GLsizei height, + GLuint ioSurfaceId, + GLuint plane) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImageIOSurface2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << width << ", " << height << ", " << ioSurfaceId << ", " << plane << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImageIOSurface2DCHROMIUM(" + << GLES2Util::GetStringTextureBindTarget(target) << ", " + << width << ", " << height << ", " << ioSurfaceId << ", " + << plane << ")"); if (width < 0) { SetGLError(GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "width < 0"); return; } if (height < 0) { - SetGLError( - GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "height < 0"); + SetGLError(GL_INVALID_VALUE, "glTexImageIOSurface2DCHROMIUM", "height < 0"); return; } helper_->TexImageIOSurface2DCHROMIUM( @@ -1668,57 +2004,53 @@ void GLES2Implementation::TexImageIOSurface2DCHROMIUM( CheckGLError(); } -void GLES2Implementation::CopyTextureCHROMIUM( - GLenum target, GLenum source_id, GLenum dest_id, GLint level, - GLint internalformat, GLenum dest_type) { +void GLES2Implementation::CopyTextureCHROMIUM(GLenum target, + GLenum source_id, + GLenum dest_id, + GLint level, + GLint internalformat, + GLenum dest_type) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTextureCHROMIUM(" << GLES2Util::GetStringEnum(target) << ", " << GLES2Util::GetStringEnum(source_id) << ", " << GLES2Util::GetStringEnum(dest_id) << ", " << level << ", " << internalformat << ", " << GLES2Util::GetStringPixelType(dest_type) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCopyTextureCHROMIUM(" + << GLES2Util::GetStringEnum(target) << ", " + << GLES2Util::GetStringEnum(source_id) << ", " + << GLES2Util::GetStringEnum(dest_id) << ", " << level + << ", " << internalformat << ", " + << GLES2Util::GetStringPixelType(dest_type) << ")"); helper_->CopyTextureCHROMIUM( target, source_id, dest_id, level, internalformat, dest_type); CheckGLError(); } -void GLES2Implementation::ProduceTextureCHROMIUM( - GLenum target, const GLbyte* mailbox) { +void GLES2Implementation::BindTexImage2DCHROMIUM(GLenum target, GLint imageId) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glProduceTextureCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << static_cast<const void*>(mailbox) << ")"); // NOLINT - GPU_CLIENT_LOG("values: " << mailbox[0] << ", " << mailbox[1] << ", " << mailbox[2] << ", " << mailbox[3] << ", " << mailbox[4] << ", " << mailbox[5] << ", " << mailbox[6] << ", " << mailbox[7] << ", " << mailbox[8] << ", " << mailbox[9] << ", " << mailbox[10] << ", " << mailbox[11] << ", " << mailbox[12] << ", " << mailbox[13] << ", " << mailbox[14] << ", " << mailbox[15] << ", " << mailbox[16] << ", " << mailbox[17] << ", " << mailbox[18] << ", " << mailbox[19] << ", " << mailbox[20] << ", " << mailbox[21] << ", " << mailbox[22] << ", " << mailbox[23] << ", " << mailbox[24] << ", " << mailbox[25] << ", " << mailbox[26] << ", " << mailbox[27] << ", " << mailbox[28] << ", " << mailbox[29] << ", " << mailbox[30] << ", " << mailbox[31] << ", " << mailbox[32] << ", " << mailbox[33] << ", " << mailbox[34] << ", " << mailbox[35] << ", " << mailbox[36] << ", " << mailbox[37] << ", " << mailbox[38] << ", " << mailbox[39] << ", " << mailbox[40] << ", " << mailbox[41] << ", " << mailbox[42] << ", " << mailbox[43] << ", " << mailbox[44] << ", " << mailbox[45] << ", " << mailbox[46] << ", " << mailbox[47] << ", " << mailbox[48] << ", " << mailbox[49] << ", " << mailbox[50] << ", " << mailbox[51] << ", " << mailbox[52] << ", " << mailbox[53] << ", " << mailbox[54] << ", " << mailbox[55] << ", " << mailbox[56] << ", " << mailbox[57] << ", " << mailbox[58] << ", " << mailbox[59] << ", " << mailbox[60] << ", " << mailbox[61] << ", " << mailbox[62] << ", " << mailbox[63]); // NOLINT - helper_->ProduceTextureCHROMIUMImmediate(target, mailbox); - CheckGLError(); -} - -void GLES2Implementation::ConsumeTextureCHROMIUM( - GLenum target, const GLbyte* mailbox) { - GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glConsumeTextureCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << static_cast<const void*>(mailbox) << ")"); // NOLINT - GPU_CLIENT_LOG("values: " << mailbox[0] << ", " << mailbox[1] << ", " << mailbox[2] << ", " << mailbox[3] << ", " << mailbox[4] << ", " << mailbox[5] << ", " << mailbox[6] << ", " << mailbox[7] << ", " << mailbox[8] << ", " << mailbox[9] << ", " << mailbox[10] << ", " << mailbox[11] << ", " << mailbox[12] << ", " << mailbox[13] << ", " << mailbox[14] << ", " << mailbox[15] << ", " << mailbox[16] << ", " << mailbox[17] << ", " << mailbox[18] << ", " << mailbox[19] << ", " << mailbox[20] << ", " << mailbox[21] << ", " << mailbox[22] << ", " << mailbox[23] << ", " << mailbox[24] << ", " << mailbox[25] << ", " << mailbox[26] << ", " << mailbox[27] << ", " << mailbox[28] << ", " << mailbox[29] << ", " << mailbox[30] << ", " << mailbox[31] << ", " << mailbox[32] << ", " << mailbox[33] << ", " << mailbox[34] << ", " << mailbox[35] << ", " << mailbox[36] << ", " << mailbox[37] << ", " << mailbox[38] << ", " << mailbox[39] << ", " << mailbox[40] << ", " << mailbox[41] << ", " << mailbox[42] << ", " << mailbox[43] << ", " << mailbox[44] << ", " << mailbox[45] << ", " << mailbox[46] << ", " << mailbox[47] << ", " << mailbox[48] << ", " << mailbox[49] << ", " << mailbox[50] << ", " << mailbox[51] << ", " << mailbox[52] << ", " << mailbox[53] << ", " << mailbox[54] << ", " << mailbox[55] << ", " << mailbox[56] << ", " << mailbox[57] << ", " << mailbox[58] << ", " << mailbox[59] << ", " << mailbox[60] << ", " << mailbox[61] << ", " << mailbox[62] << ", " << mailbox[63]); // NOLINT - helper_->ConsumeTextureCHROMIUMImmediate(target, mailbox); - CheckGLError(); -} - -void GLES2Implementation::BindTexImage2DCHROMIUM( - GLenum target, GLint imageId) { - GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTexImage2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << imageId << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTexImage2DCHROMIUM(" + << GLES2Util::GetStringTextureBindTarget(target) << ", " + << imageId << ")"); helper_->BindTexImage2DCHROMIUM(target, imageId); CheckGLError(); } -void GLES2Implementation::ReleaseTexImage2DCHROMIUM( - GLenum target, GLint imageId) { +void GLES2Implementation::ReleaseTexImage2DCHROMIUM(GLenum target, + GLint imageId) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReleaseTexImage2DCHROMIUM(" << GLES2Util::GetStringTextureBindTarget(target) << ", " << imageId << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReleaseTexImage2DCHROMIUM(" + << GLES2Util::GetStringTextureBindTarget(target) << ", " + << imageId << ")"); helper_->ReleaseTexImage2DCHROMIUM(target, imageId); CheckGLError(); } -void GLES2Implementation::DiscardFramebufferEXT( - GLenum target, GLsizei count, const GLenum* attachments) { +void GLES2Implementation::DiscardFramebufferEXT(GLenum target, + GLsizei count, + const GLenum* attachments) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDiscardFramebufferEXT(" << GLES2Util::GetStringEnum(target) << ", " << count << ", " << static_cast<const void*>(attachments) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDiscardFramebufferEXT(" + << GLES2Util::GetStringEnum(target) << ", " << count + << ", " << static_cast<const void*>(attachments) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << attachments[0 + i * 1]); + GPU_CLIENT_LOG(" " << i << ": " << attachments[0 + i * 1]); } }); if (count < 0) { @@ -1731,24 +2063,28 @@ void GLES2Implementation::DiscardFramebufferEXT( void GLES2Implementation::LoseContextCHROMIUM(GLenum current, GLenum other) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glLoseContextCHROMIUM(" << GLES2Util::GetStringEnum(current) << ", " << GLES2Util::GetStringEnum(other) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glLoseContextCHROMIUM(" + << GLES2Util::GetStringResetStatus(current) << ", " + << GLES2Util::GetStringResetStatus(other) << ")"); helper_->LoseContextCHROMIUM(current, other); CheckGLError(); } void GLES2Implementation::WaitSyncPointCHROMIUM(GLuint sync_point) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glWaitSyncPointCHROMIUM(" << sync_point << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glWaitSyncPointCHROMIUM(" + << sync_point << ")"); helper_->WaitSyncPointCHROMIUM(sync_point); CheckGLError(); } void GLES2Implementation::DrawBuffersEXT(GLsizei count, const GLenum* bufs) { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawBuffersEXT(" << count << ", " << static_cast<const void*>(bufs) << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawBuffersEXT(" << count << ", " + << static_cast<const void*>(bufs) << ")"); GPU_CLIENT_LOG_CODE_BLOCK({ for (GLsizei i = 0; i < count; ++i) { - GPU_CLIENT_LOG(" " << i << ": " << bufs[0 + i * 1]); + GPU_CLIENT_LOG(" " << i << ": " << bufs[0 + i * 1]); } }); if (count < 0) { @@ -1761,10 +2097,43 @@ void GLES2Implementation::DrawBuffersEXT(GLsizei count, const GLenum* bufs) { void GLES2Implementation::DiscardBackbufferCHROMIUM() { GPU_CLIENT_SINGLE_THREAD_CHECK(); - GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDiscardBackbufferCHROMIUM(" << ")"); // NOLINT + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDiscardBackbufferCHROMIUM(" + << ")"); helper_->DiscardBackbufferCHROMIUM(); CheckGLError(); } -#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_ +void GLES2Implementation::ScheduleOverlayPlaneCHROMIUM( + GLint plane_z_order, + GLenum plane_transform, + GLuint overlay_texture_id, + GLint bounds_x, + GLint bounds_y, + GLint bounds_width, + GLint bounds_height, + GLfloat uv_x, + GLfloat uv_y, + GLfloat uv_width, + GLfloat uv_height) { + GPU_CLIENT_SINGLE_THREAD_CHECK(); + GPU_CLIENT_LOG( + "[" << GetLogPrefix() << "] glScheduleOverlayPlaneCHROMIUM(" + << plane_z_order << ", " << GLES2Util::GetStringEnum(plane_transform) + << ", " << overlay_texture_id << ", " << bounds_x << ", " << bounds_y + << ", " << bounds_width << ", " << bounds_height << ", " << uv_x + << ", " << uv_y << ", " << uv_width << ", " << uv_height << ")"); + helper_->ScheduleOverlayPlaneCHROMIUM(plane_z_order, + plane_transform, + overlay_texture_id, + bounds_x, + bounds_y, + bounds_width, + bounds_height, + uv_x, + uv_y, + uv_width, + uv_height); + CheckGLError(); +} +#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_IMPL_AUTOGEN_H_ diff --git a/chromium/gpu/command_buffer/client/gles2_implementation_unittest.cc b/chromium/gpu/command_buffer/client/gles2_implementation_unittest.cc index e6e0861d188..a318ab8f33f 100644 --- a/chromium/gpu/command_buffer/client/gles2_implementation_unittest.cc +++ b/chromium/gpu/command_buffer/client/gles2_implementation_unittest.cc @@ -6,6 +6,8 @@ #include "gpu/command_buffer/client/gles2_implementation.h" +#include <limits> + #include <GLES2/gl2ext.h> #include <GLES2/gl2extchromium.h> #include "base/compiler_specific.h" @@ -167,11 +169,11 @@ class MockTransferBuffer : public TransferBufferInterface { static const int kNumBuffers = 2; uint8* actual_buffer() const { - return static_cast<uint8*>(buffers_[actual_buffer_index_].ptr); + return static_cast<uint8*>(buffers_[actual_buffer_index_]->memory()); } uint8* expected_buffer() const { - return static_cast<uint8*>(buffers_[expected_buffer_index_].ptr); + return static_cast<uint8*>(buffers_[expected_buffer_index_]->memory()); } uint32 AllocateExpectedTransferBuffer(size_t size) { @@ -214,7 +216,7 @@ class MockTransferBuffer : public TransferBufferInterface { size_t result_size_; uint32 alignment_; int buffer_ids_[kNumBuffers]; - gpu::Buffer buffers_[kNumBuffers]; + scoped_refptr<Buffer> buffers_[kNumBuffers]; int actual_buffer_index_; int expected_buffer_index_; void* last_alloc_; @@ -297,8 +299,65 @@ void MockTransferBuffer::FreePendingToken(void* p, unsigned int /* token */) { last_alloc_ = NULL; } +// API wrapper for Buffers. +class GenBuffersAPI { + public: + static void Gen(GLES2Implementation* gl_impl, GLsizei n, GLuint* ids) { + gl_impl->GenBuffers(n, ids); + } + + static void Delete(GLES2Implementation* gl_impl, + GLsizei n, + const GLuint* ids) { + gl_impl->DeleteBuffers(n, ids); + } +}; + +// API wrapper for Framebuffers. +class GenFramebuffersAPI { + public: + static void Gen(GLES2Implementation* gl_impl, GLsizei n, GLuint* ids) { + gl_impl->GenFramebuffers(n, ids); + } + + static void Delete(GLES2Implementation* gl_impl, + GLsizei n, + const GLuint* ids) { + gl_impl->DeleteFramebuffers(n, ids); + } +}; + +// API wrapper for Renderbuffers. +class GenRenderbuffersAPI { + public: + static void Gen(GLES2Implementation* gl_impl, GLsizei n, GLuint* ids) { + gl_impl->GenRenderbuffers(n, ids); + } + + static void Delete(GLES2Implementation* gl_impl, + GLsizei n, + const GLuint* ids) { + gl_impl->DeleteRenderbuffers(n, ids); + } +}; + +// API wrapper for Textures. +class GenTexturesAPI { + public: + static void Gen(GLES2Implementation* gl_impl, GLsizei n, GLuint* ids) { + gl_impl->GenTextures(n, ids); + } + + static void Delete(GLES2Implementation* gl_impl, + GLsizei n, + const GLuint* ids) { + gl_impl->DeleteTextures(n, ids); + } +}; + class GLES2ImplementationTest : public testing::Test { protected: + static const int kNumTestContexts = 2; static const uint8 kInitialValue = 0xBD; static const int32 kNumCommandEntries = 500; static const int32 kCommandBufferSizeBytes = @@ -319,7 +378,7 @@ class GLES2ImplementationTest : public testing::Test { static const GLint kNumShaderBinaryFormats = 0; static const GLuint kStartId = 1024; static const GLuint kBuffersStartId = - GLES2Implementation::kClientSideArrayId + 2; + GLES2Implementation::kClientSideArrayId + 2 * kNumTestContexts; static const GLuint kFramebuffersStartId = 1; static const GLuint kProgramsAndShadersStartId = 1; static const GLuint kRenderbuffersStartId = 1; @@ -329,18 +388,130 @@ class GLES2ImplementationTest : public testing::Test { typedef MockTransferBuffer::ExpectedMemoryInfo ExpectedMemoryInfo; - GLES2ImplementationTest() - : commands_(NULL), - token_(0) { - } + class TestContext { + public: + TestContext() : commands_(NULL), token_(0) {} + + bool Initialize(ShareGroup* share_group, + bool bind_generates_resource, + bool lose_context_when_out_of_memory) { + command_buffer_.reset(new StrictMock<MockClientCommandBuffer>()); + if (!command_buffer_->Initialize()) + return false; + + transfer_buffer_.reset( + new MockTransferBuffer(command_buffer_.get(), + kTransferBufferSize, + GLES2Implementation::kStartingOffset, + GLES2Implementation::kAlignment)); + + helper_.reset(new GLES2CmdHelper(command_buffer())); + helper_->Initialize(kCommandBufferSizeBytes); + + gpu_control_.reset(new StrictMock<MockClientGpuControl>()); + EXPECT_CALL(*gpu_control_, GetCapabilities()) + .WillOnce(testing::Return(Capabilities())); + + GLES2Implementation::GLStaticState state; + GLES2Implementation::GLStaticState::IntState& int_state = state.int_state; + int_state.max_combined_texture_image_units = + kMaxCombinedTextureImageUnits; + int_state.max_cube_map_texture_size = kMaxCubeMapTextureSize; + int_state.max_fragment_uniform_vectors = kMaxFragmentUniformVectors; + int_state.max_renderbuffer_size = kMaxRenderbufferSize; + int_state.max_texture_image_units = kMaxTextureImageUnits; + int_state.max_texture_size = kMaxTextureSize; + int_state.max_varying_vectors = kMaxVaryingVectors; + int_state.max_vertex_attribs = kMaxVertexAttribs; + int_state.max_vertex_texture_image_units = kMaxVertexTextureImageUnits; + int_state.max_vertex_uniform_vectors = kMaxVertexUniformVectors; + int_state.num_compressed_texture_formats = kNumCompressedTextureFormats; + int_state.num_shader_binary_formats = kNumShaderBinaryFormats; + int_state.bind_generates_resource_chromium = + bind_generates_resource ? 1 : 0; + + // This just happens to work for now because IntState has 1 GLint per + // state. + // If IntState gets more complicated this code will need to get more + // complicated. + ExpectedMemoryInfo mem1 = transfer_buffer_->GetExpectedMemory( + sizeof(GLES2Implementation::GLStaticState::IntState) * 2 + + sizeof(cmds::GetShaderPrecisionFormat::Result) * 12); + + { + InSequence sequence; + + EXPECT_CALL(*command_buffer_, OnFlush()) + .WillOnce(SetMemory(mem1.ptr + sizeof(int_state), int_state)) + .RetiresOnSaturation(); + GetNextToken(); // eat the token that starting up will use. + + gl_.reset(new GLES2Implementation(helper_.get(), + share_group, + transfer_buffer_.get(), + bind_generates_resource, + lose_context_when_out_of_memory, + gpu_control_.get())); + + if (!gl_->Initialize(kTransferBufferSize, + kTransferBufferSize, + kTransferBufferSize, + GLES2Implementation::kNoLimit)) + return false; + } + + EXPECT_CALL(*command_buffer_, OnFlush()).Times(1).RetiresOnSaturation(); + helper_->CommandBufferHelper::Finish(); + ::testing::Mock::VerifyAndClearExpectations(gl_.get()); + + scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer(); + commands_ = static_cast<CommandBufferEntry*>(ring_buffer->memory()) + + command_buffer()->GetLastState().put_offset; + ClearCommands(); + EXPECT_TRUE(transfer_buffer_->InSync()); + + ::testing::Mock::VerifyAndClearExpectations(command_buffer()); + return true; + } + + void TearDown() { + Mock::VerifyAndClear(gl_.get()); + EXPECT_CALL(*command_buffer(), OnFlush()).Times(AnyNumber()); + // For command buffer. + EXPECT_CALL(*command_buffer(), DestroyTransferBuffer(_)) + .Times(AtLeast(1)); + gl_.reset(); + } + + MockClientCommandBuffer* command_buffer() const { + return command_buffer_.get(); + } + + int GetNextToken() { return ++token_; } + + void ClearCommands() { + scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer(); + memset(ring_buffer->memory(), kInitialValue, ring_buffer->size()); + } + + scoped_ptr<MockClientCommandBuffer> command_buffer_; + scoped_ptr<MockClientGpuControl> gpu_control_; + scoped_ptr<GLES2CmdHelper> helper_; + scoped_ptr<MockTransferBuffer> transfer_buffer_; + scoped_ptr<GLES2Implementation> gl_; + CommandBufferEntry* commands_; + int token_; + }; + + GLES2ImplementationTest() : commands_(NULL) {} virtual void SetUp() OVERRIDE; virtual void TearDown() OVERRIDE; bool NoCommandsWritten() { - Buffer ring_buffer = helper_->get_ring_buffer(); - const uint8* cmds = reinterpret_cast<const uint8*>(ring_buffer.ptr); - const uint8* end = cmds + ring_buffer.size; + scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer(); + const uint8* cmds = reinterpret_cast<const uint8*>(ring_buffer->memory()); + const uint8* end = cmds + ring_buffer->size(); for (; cmds < end; ++cmds) { if (*cmds != kInitialValue) { return false; @@ -353,97 +524,51 @@ class GLES2ImplementationTest : public testing::Test { return gl_->query_tracker_->GetQuery(id); } - void Initialize(bool bind_generates_resource) { - command_buffer_.reset(new StrictMock<MockClientCommandBuffer>()); - ASSERT_TRUE(command_buffer_->Initialize()); - - transfer_buffer_.reset(new MockTransferBuffer( - command_buffer(), - kTransferBufferSize, - GLES2Implementation::kStartingOffset, - GLES2Implementation::kAlignment)); - - helper_.reset(new GLES2CmdHelper(command_buffer())); - helper_->Initialize(kCommandBufferSizeBytes); - - gpu_control_.reset(new StrictMock<MockClientGpuControl>()); - EXPECT_CALL(*gpu_control_, GetCapabilities()) - .WillOnce(testing::Return(Capabilities())); - - GLES2Implementation::GLStaticState state; - GLES2Implementation::GLStaticState::IntState& int_state = state.int_state; - int_state.max_combined_texture_image_units = kMaxCombinedTextureImageUnits; - int_state.max_cube_map_texture_size = kMaxCubeMapTextureSize; - int_state.max_fragment_uniform_vectors = kMaxFragmentUniformVectors; - int_state.max_renderbuffer_size = kMaxRenderbufferSize; - int_state.max_texture_image_units = kMaxTextureImageUnits; - int_state.max_texture_size = kMaxTextureSize; - int_state.max_varying_vectors = kMaxVaryingVectors; - int_state.max_vertex_attribs = kMaxVertexAttribs; - int_state.max_vertex_texture_image_units = kMaxVertexTextureImageUnits; - int_state.max_vertex_uniform_vectors = kMaxVertexUniformVectors; - int_state.num_compressed_texture_formats = kNumCompressedTextureFormats; - int_state.num_shader_binary_formats = kNumShaderBinaryFormats; - - // This just happens to work for now because IntState has 1 GLint per state. - // If IntState gets more complicated this code will need to get more - // complicated. - ExpectedMemoryInfo mem1 = GetExpectedMemory( - sizeof(GLES2Implementation::GLStaticState::IntState) * 2 + - sizeof(cmds::GetShaderPrecisionFormat::Result) * 12); - - { - InSequence sequence; - - EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(mem1.ptr + sizeof(int_state), int_state)) - .RetiresOnSaturation(); - GetNextToken(); // eat the token that starting up will use. - - gl_.reset(new GLES2Implementation( - helper_.get(), - NULL, - transfer_buffer_.get(), - bind_generates_resource, - false /* free_everything_when_invisible */, - gpu_control_.get())); - ASSERT_TRUE(gl_->Initialize( - kTransferBufferSize, - kTransferBufferSize, - kTransferBufferSize, - GLES2Implementation::kNoLimit)); - } + struct ContextInitOptions { + ContextInitOptions() + : bind_generates_resource_client(true), + bind_generates_resource_service(true), + lose_context_when_out_of_memory(false) {} - EXPECT_CALL(*command_buffer(), OnFlush()) - .Times(1) - .RetiresOnSaturation(); - helper_->CommandBufferHelper::Finish(); - ::testing::Mock::VerifyAndClearExpectations(gl_.get()); + bool bind_generates_resource_client; + bool bind_generates_resource_service; + bool lose_context_when_out_of_memory; + }; - Buffer ring_buffer = helper_->get_ring_buffer(); - commands_ = static_cast<CommandBufferEntry*>(ring_buffer.ptr) + - command_buffer()->GetState().put_offset; - ClearCommands(); - EXPECT_TRUE(transfer_buffer_->InSync()); + bool Initialize(const ContextInitOptions& init_options) { + bool success = true; + share_group_ = new ShareGroup(init_options.bind_generates_resource_service); - ::testing::Mock::VerifyAndClearExpectations(command_buffer()); + for (int i = 0; i < kNumTestContexts; i++) { + if (!test_contexts_[i].Initialize( + share_group_.get(), + init_options.bind_generates_resource_client, + init_options.lose_context_when_out_of_memory)) + success = false; + } + + // Default to test context 0. + gpu_control_ = test_contexts_[0].gpu_control_.get(); + helper_ = test_contexts_[0].helper_.get(); + transfer_buffer_ = test_contexts_[0].transfer_buffer_.get(); + gl_ = test_contexts_[0].gl_.get(); + commands_ = test_contexts_[0].commands_; + return success; } MockClientCommandBuffer* command_buffer() const { - return command_buffer_.get(); + return test_contexts_[0].command_buffer_.get(); } - int GetNextToken() { - return ++token_; - } + int GetNextToken() { return test_contexts_[0].GetNextToken(); } const void* GetPut() { return helper_->GetSpace(0); } void ClearCommands() { - Buffer ring_buffer = helper_->get_ring_buffer(); - memset(ring_buffer.ptr, kInitialValue, ring_buffer.size); + scoped_refptr<Buffer> ring_buffer = helper_->get_ring_buffer(); + memset(ring_buffer->memory(), kInitialValue, ring_buffer->size()); } size_t MaxTransferBufferSize() { @@ -473,40 +598,133 @@ class GLES2ImplementationTest : public testing::Test { return gl_->GetError(); } + const std::string& GetLastError() { + return gl_->GetLastError(); + } + bool GetBucketContents(uint32 bucket_id, std::vector<int8>* data) { return gl_->GetBucketContents(bucket_id, data); } - Sequence sequence_; - scoped_ptr<MockClientCommandBuffer> command_buffer_; - scoped_ptr<MockClientGpuControl> gpu_control_; - scoped_ptr<GLES2CmdHelper> helper_; - scoped_ptr<MockTransferBuffer> transfer_buffer_; - scoped_ptr<GLES2Implementation> gl_; + TestContext test_contexts_[kNumTestContexts]; + + scoped_refptr<ShareGroup> share_group_; + MockClientGpuControl* gpu_control_; + GLES2CmdHelper* helper_; + MockTransferBuffer* transfer_buffer_; + GLES2Implementation* gl_; CommandBufferEntry* commands_; - int token_; }; void GLES2ImplementationTest::SetUp() { - Initialize(true); + ContextInitOptions init_options; + ASSERT_TRUE(Initialize(init_options)); } void GLES2ImplementationTest::TearDown() { - Mock::VerifyAndClear(gl_.get()); - EXPECT_CALL(*command_buffer(), OnFlush()).Times(AnyNumber()); - // For command buffer. - EXPECT_CALL(*command_buffer(), DestroyTransferBuffer(_)) - .Times(AtLeast(1)); - gl_.reset(); + for (int i = 0; i < kNumTestContexts; i++) + test_contexts_[i].TearDown(); } +class GLES2ImplementationManualInitTest : public GLES2ImplementationTest { + protected: + virtual void SetUp() OVERRIDE {} +}; + class GLES2ImplementationStrictSharedTest : public GLES2ImplementationTest { protected: virtual void SetUp() OVERRIDE; + + template <class ResApi> + void FlushGenerationTest() { + GLuint id1, id2, id3; + + // Generate valid id. + ResApi::Gen(gl_, 1, &id1); + EXPECT_NE(id1, 0u); + + // Delete id1 and generate id2. id1 should not be reused. + ResApi::Delete(gl_, 1, &id1); + ResApi::Gen(gl_, 1, &id2); + EXPECT_NE(id2, 0u); + EXPECT_NE(id2, id1); + + // Expect id1 reuse after Flush. + gl_->Flush(); + ResApi::Gen(gl_, 1, &id3); + EXPECT_EQ(id3, id1); + } + + // Ids should not be reused unless the |Deleting| context does a Flush() + // AND triggers a lazy release after that. + template <class ResApi> + void CrossContextGenerationTest() { + GLES2Implementation* gl1 = test_contexts_[0].gl_.get(); + GLES2Implementation* gl2 = test_contexts_[1].gl_.get(); + GLuint id1, id2, id3; + + // Delete, no flush on context 1. No reuse. + ResApi::Gen(gl1, 1, &id1); + ResApi::Delete(gl1, 1, &id1); + ResApi::Gen(gl1, 1, &id2); + EXPECT_NE(id1, id2); + + // Flush context 2. Still no reuse. + gl2->Flush(); + ResApi::Gen(gl2, 1, &id3); + EXPECT_NE(id1, id3); + EXPECT_NE(id2, id3); + + // Flush on context 1, but no lazy release. Still no reuse. + gl1->Flush(); + ResApi::Gen(gl2, 1, &id3); + EXPECT_NE(id1, id3); + + // Lazy release triggered by another Delete. Should reuse id1. + ResApi::Delete(gl1, 1, &id2); + ResApi::Gen(gl2, 1, &id3); + EXPECT_EQ(id1, id3); + } + + // Same as CrossContextGenerationTest(), but triggers an Auto Flush on + // the Delete(). Tests an edge case regression. + template <class ResApi> + void CrossContextGenerationAutoFlushTest() { + GLES2Implementation* gl1 = test_contexts_[0].gl_.get(); + GLES2Implementation* gl2 = test_contexts_[1].gl_.get(); + GLuint id1, id2, id3; + + // Delete, no flush on context 1. No reuse. + // By half filling the buffer, an internal flush is forced on the Delete(). + ResApi::Gen(gl1, 1, &id1); + gl1->helper()->Noop(kNumCommandEntries / 2); + ResApi::Delete(gl1, 1, &id1); + ResApi::Gen(gl1, 1, &id2); + EXPECT_NE(id1, id2); + + // Flush context 2. Still no reuse. + gl2->Flush(); + ResApi::Gen(gl2, 1, &id3); + EXPECT_NE(id1, id3); + EXPECT_NE(id2, id3); + + // Flush on context 1, but no lazy release. Still no reuse. + gl1->Flush(); + ResApi::Gen(gl2, 1, &id3); + EXPECT_NE(id1, id3); + + // Lazy release triggered by another Delete. Should reuse id1. + ResApi::Delete(gl1, 1, &id2); + ResApi::Gen(gl2, 1, &id3); + EXPECT_EQ(id1, id3); + } }; void GLES2ImplementationStrictSharedTest::SetUp() { - Initialize(false); + ContextInitOptions init_options; + init_options.bind_generates_resource_client = false; + init_options.bind_generates_resource_service = false; + ASSERT_TRUE(Initialize(init_options)); } // GCC requires these declarations, but MSVC requires they not be present @@ -2091,7 +2309,7 @@ TEST_F(GLES2ImplementationTest, TexImage2D) { Cmds expected; expected.tex_image_2d.Init( - kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, + kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, mem1.id, mem1.offset); expected.set_token.Init(GetNextToken()); gl_->TexImage2D( @@ -2108,7 +2326,7 @@ TEST_F(GLES2ImplementationTest, TexImage2D) { ExpectedMemoryInfo mem2 = GetExpectedMemory(sizeof(pixels)); Cmds2 expected2; expected2.tex_image_2d.Init( - kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, + kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, mem2.id, mem2.offset); expected2.set_token.Init(GetNextToken()); const void* commands2 = GetPut(); @@ -2163,7 +2381,7 @@ TEST_F(GLES2ImplementationTest, TexImage2D2Writes) { Cmds expected; expected.tex_image_2d.Init( - kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, + kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, 0, 0); expected.tex_sub_image_2d1.Init( kTarget, kLevel, 0, 0, kWidth, kHeight / 2, kFormat, kType, @@ -2196,7 +2414,7 @@ TEST_F(GLES2ImplementationTest, TexImage2D2Writes) { ExpectedMemoryInfo mem3 = GetExpectedMemory(half_size); ExpectedMemoryInfo mem4 = GetExpectedMemory(half_size); expected.tex_image_2d.Init( - kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, + kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, 0, 0); expected.tex_sub_image_2d1.Init( kTarget, kLevel, 0, kHeight / 2, kWidth, kHeight / 2, kFormat, kType, @@ -2260,7 +2478,7 @@ TEST_F(GLES2ImplementationTest, TexSubImage2DFlipY) { Cmds expected; expected.pixel_store_i1.Init(GL_UNPACK_ALIGNMENT, kPixelStoreUnpackAlignment); expected.tex_image_2d.Init( - kTarget, kLevel, kFormat, kTextureWidth, kTextureHeight, kBorder, kFormat, + kTarget, kLevel, kFormat, kTextureWidth, kTextureHeight, kFormat, kType, 0, 0); expected.pixel_store_i2.Init(GL_UNPACK_FLIP_Y_CHROMIUM, GL_TRUE); expected.tex_sub_image_2d1.Init(kTarget, kLevel, kSubImageXOffset, @@ -2355,9 +2573,9 @@ TEST_F(GLES2ImplementationTest, SubImageUnpack) { const void* commands = GetPut(); gl_->PixelStorei(GL_UNPACK_ALIGNMENT, alignment); - gl_->PixelStorei(GL_UNPACK_ROW_LENGTH, kSrcWidth); - gl_->PixelStorei(GL_UNPACK_SKIP_PIXELS, kSrcSubImageX0); - gl_->PixelStorei(GL_UNPACK_SKIP_ROWS, kSrcSubImageY0); + gl_->PixelStorei(GL_UNPACK_ROW_LENGTH_EXT, kSrcWidth); + gl_->PixelStorei(GL_UNPACK_SKIP_PIXELS_EXT, kSrcSubImageX0); + gl_->PixelStorei(GL_UNPACK_SKIP_ROWS_EXT, kSrcSubImageY0); gl_->PixelStorei(GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); if (sub) { gl_->TexImage2D( @@ -2372,7 +2590,7 @@ TEST_F(GLES2ImplementationTest, SubImageUnpack) { texSubImageExpected.pixel_store_i2.Init( GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); texSubImageExpected.tex_image_2d.Init( - GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, kBorder, + GL_TEXTURE_2D, kLevel, kFormat, kTexWidth, kTexHeight, kFormat, kType, 0, 0); texSubImageExpected.tex_sub_image_2d.Init( GL_TEXTURE_2D, kLevel, kTexSubXOffset, kTexSubYOffset, @@ -2390,7 +2608,7 @@ TEST_F(GLES2ImplementationTest, SubImageUnpack) { GL_UNPACK_FLIP_Y_CHROMIUM, flip_y); texImageExpected.tex_image_2d.Init( GL_TEXTURE_2D, kLevel, kFormat, kSrcSubImageWidth, - kSrcSubImageHeight, kBorder, kFormat, kType, mem.id, mem.offset); + kSrcSubImageHeight, kFormat, kType, mem.id, mem.offset); EXPECT_EQ(0, memcmp( &texImageExpected, commands, sizeof(texImageExpected))); } @@ -2413,6 +2631,93 @@ TEST_F(GLES2ImplementationTest, SubImageUnpack) { } } +// Test texture related calls with invalid arguments. +TEST_F(GLES2ImplementationTest, TextureInvalidArguments) { + struct Cmds { + cmds::TexImage2D tex_image_2d; + cmd::SetToken set_token; + }; + const GLenum kTarget = GL_TEXTURE_2D; + const GLint kLevel = 0; + const GLenum kFormat = GL_RGB; + const GLsizei kWidth = 3; + const GLsizei kHeight = 4; + const GLint kBorder = 0; + const GLint kInvalidBorder = 1; + const GLenum kType = GL_UNSIGNED_BYTE; + const GLint kPixelStoreUnpackAlignment = 4; + static uint8 pixels[] = { + 11, 12, 13, 13, 14, 15, 15, 16, 17, 101, 102, 103, + 21, 22, 23, 23, 24, 25, 25, 26, 27, 201, 202, 203, + 31, 32, 33, 33, 34, 35, 35, 36, 37, 123, 124, 125, + 41, 42, 43, 43, 44, 45, 45, 46, 47, + }; + + // Verify that something works. + + ExpectedMemoryInfo mem1 = GetExpectedMemory(sizeof(pixels)); + + Cmds expected; + expected.tex_image_2d.Init( + kTarget, kLevel, kFormat, kWidth, kHeight, kFormat, kType, + mem1.id, mem1.offset); + expected.set_token.Init(GetNextToken()); + gl_->TexImage2D( + kTarget, kLevel, kFormat, kWidth, kHeight, kBorder, kFormat, kType, + pixels); + EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); + EXPECT_TRUE(CheckRect( + kWidth, kHeight, kFormat, kType, kPixelStoreUnpackAlignment, false, + pixels, mem1.ptr)); + + ClearCommands(); + + // Use invalid border. + gl_->TexImage2D( + kTarget, kLevel, kFormat, kWidth, kHeight, kInvalidBorder, kFormat, kType, + pixels); + + EXPECT_TRUE(NoCommandsWritten()); + EXPECT_EQ(GL_INVALID_VALUE, CheckError()); + + ClearCommands(); + + gl_->AsyncTexImage2DCHROMIUM( + kTarget, kLevel, kFormat, kWidth, kHeight, kInvalidBorder, kFormat, kType, + NULL); + + EXPECT_TRUE(NoCommandsWritten()); + EXPECT_EQ(GL_INVALID_VALUE, CheckError()); + + ClearCommands(); + + // Checking for CompressedTexImage2D argument validation is a bit tricky due + // to (runtime-detected) compression formats. Try to infer the error with an + // aux check. + const GLenum kCompressedFormat = GL_ETC1_RGB8_OES; + gl_->CompressedTexImage2D( + kTarget, kLevel, kCompressedFormat, kWidth, kHeight, kBorder, + arraysize(pixels), pixels); + + // In the above, kCompressedFormat and arraysize(pixels) are possibly wrong + // values. First ensure that these do not cause failures at the client. If + // this check ever fails, it probably means that client checks more than at + // the time of writing of this test. In this case, more code needs to be + // written for this test. + EXPECT_FALSE(NoCommandsWritten()); + + ClearCommands(); + + // Changing border to invalid border should make the call fail at the client + // checks. + gl_->CompressedTexImage2D( + kTarget, kLevel, kCompressedFormat, kWidth, kHeight, kInvalidBorder, + arraysize(pixels), pixels); + EXPECT_TRUE(NoCommandsWritten()); + EXPECT_EQ(GL_INVALID_VALUE, CheckError()); +} + + // Binds can not be cached with bind_generates_resource = false because // our id might not be valid. More specifically if you bind on contextA then // delete on contextB the resource is still bound on contextA but GetInterger @@ -2444,32 +2749,56 @@ TEST_F(GLES2ImplementationStrictSharedTest, BindsNotCached) { } } -TEST_F(GLES2ImplementationTest, CreateStreamTextureCHROMIUM) { - const GLuint kTextureId = 123; - const GLuint kResult = 456; - - struct Cmds { - cmds::CreateStreamTextureCHROMIUM create_stream; - }; - - ExpectedMemoryInfo result1 = - GetExpectedResultMemory( - sizeof(cmds::CreateStreamTextureCHROMIUM::Result)); - ExpectedMemoryInfo result2 = - GetExpectedResultMemory(sizeof(cmds::GetError::Result)); - - Cmds expected; - expected.create_stream.Init(kTextureId, result1.id, result1.offset); +// glGen* Ids must not be reused until glDelete* commands have been +// flushed by glFlush. +TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestBuffers) { + FlushGenerationTest<GenBuffersAPI>(); +} +TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestFramebuffers) { + FlushGenerationTest<GenFramebuffersAPI>(); +} +TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestRenderbuffers) { + FlushGenerationTest<GenRenderbuffersAPI>(); +} +TEST_F(GLES2ImplementationStrictSharedTest, FlushGenerationTestTextures) { + FlushGenerationTest<GenTexturesAPI>(); +} - EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(result1.ptr, kResult)) - .WillOnce(SetMemory(result2.ptr, GLuint(GL_NO_ERROR))) - .RetiresOnSaturation(); +// glGen* Ids must not be reused cross-context until glDelete* commands are +// flushed by glFlush, and the Ids are lazily freed after. +TEST_F(GLES2ImplementationStrictSharedTest, CrossContextGenerationTestBuffers) { + CrossContextGenerationTest<GenBuffersAPI>(); +} +TEST_F(GLES2ImplementationStrictSharedTest, + CrossContextGenerationTestFramebuffers) { + CrossContextGenerationTest<GenFramebuffersAPI>(); +} +TEST_F(GLES2ImplementationStrictSharedTest, + CrossContextGenerationTestRenderbuffers) { + CrossContextGenerationTest<GenRenderbuffersAPI>(); +} +TEST_F(GLES2ImplementationStrictSharedTest, + CrossContextGenerationTestTextures) { + CrossContextGenerationTest<GenTexturesAPI>(); +} - GLuint handle = gl_->CreateStreamTextureCHROMIUM(kTextureId); - EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); - EXPECT_EQ(handle, kResult); - EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), gl_->GetError()); +// Test Delete which causes auto flush. Tests a regression case that occurred +// in testing. +TEST_F(GLES2ImplementationStrictSharedTest, + CrossContextGenerationAutoFlushTestBuffers) { + CrossContextGenerationAutoFlushTest<GenBuffersAPI>(); +} +TEST_F(GLES2ImplementationStrictSharedTest, + CrossContextGenerationAutoFlushTestFramebuffers) { + CrossContextGenerationAutoFlushTest<GenFramebuffersAPI>(); +} +TEST_F(GLES2ImplementationStrictSharedTest, + CrossContextGenerationAutoFlushTestRenderbuffers) { + CrossContextGenerationAutoFlushTest<GenRenderbuffersAPI>(); +} +TEST_F(GLES2ImplementationStrictSharedTest, + CrossContextGenerationAutoFlushTestTextures) { + CrossContextGenerationAutoFlushTest<GenTexturesAPI>(); } TEST_F(GLES2ImplementationTest, GetString) { @@ -2480,7 +2809,8 @@ TEST_F(GLES2ImplementationTest, GetString) { const char* expected_str = "foobar " "GL_CHROMIUM_flipy " - "GL_EXT_unpack_subimage"; + "GL_EXT_unpack_subimage " + "GL_CHROMIUM_map_sub"; const char kBad = 0x12; struct Cmds { cmd::SetBucketSize set_bucket_size1; @@ -2668,9 +2998,6 @@ TEST_F(GLES2ImplementationTest, BeginEndQueryEXT) { EXPECT_TRUE(NoCommandsWritten()); EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); - // Test BeginQueryEXT fails if id not GENed. - // TODO(gman): - // Test BeginQueryEXT inserts command. struct BeginCmds { cmds::BeginQueryEXT begin_query; @@ -2724,7 +3051,7 @@ TEST_F(GLES2ImplementationTest, BeginEndQueryEXT) { EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); // Test 2nd Begin/End increments count. - uint32 old_submit_count = query->submit_count(); + base::subtle::Atomic32 old_submit_count = query->submit_count(); gl_->BeginQueryEXT(GL_ANY_SAMPLES_PASSED_EXT, id1); EXPECT_NE(old_submit_count, query->submit_count()); expected_end_cmds.end_query.Init( @@ -2758,7 +3085,6 @@ TEST_F(GLES2ImplementationTest, BeginEndQueryEXT) { // Test GetQueryObjectuivEXT CheckResultsAvailable ClearCommands(); gl_->GetQueryObjectuivEXT(id1, GL_QUERY_RESULT_AVAILABLE_EXT, &available); - EXPECT_TRUE(NoCommandsWritten()); EXPECT_EQ(0u, available); } @@ -2873,6 +3199,212 @@ TEST_F(GLES2ImplementationTest, Enable) { EXPECT_TRUE(NoCommandsWritten()); } +TEST_F(GLES2ImplementationTest, ConsumeTextureCHROMIUM) { + struct Cmds { + cmds::ConsumeTextureCHROMIUMImmediate cmd; + GLbyte data[64]; + }; + + Mailbox mailbox = Mailbox::Generate(); + Cmds expected; + expected.cmd.Init(GL_TEXTURE_2D, mailbox.name); + gl_->ConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); + EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); +} + +TEST_F(GLES2ImplementationTest, CreateAndConsumeTextureCHROMIUM) { + struct Cmds { + cmds::CreateAndConsumeTextureCHROMIUMImmediate cmd; + GLbyte data[64]; + }; + + Mailbox mailbox = Mailbox::Generate(); + Cmds expected; + expected.cmd.Init(GL_TEXTURE_2D, kTexturesStartId, mailbox.name); + GLuint id = gl_->CreateAndConsumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); + EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); + EXPECT_EQ(kTexturesStartId, id); +} + +TEST_F(GLES2ImplementationTest, ProduceTextureCHROMIUM) { + struct Cmds { + cmds::ProduceTextureCHROMIUMImmediate cmd; + GLbyte data[64]; + }; + + Mailbox mailbox = Mailbox::Generate(); + Cmds expected; + expected.cmd.Init(GL_TEXTURE_2D, mailbox.name); + gl_->ProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); + EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); +} + +TEST_F(GLES2ImplementationTest, ProduceTextureDirectCHROMIUM) { + struct Cmds { + cmds::ProduceTextureDirectCHROMIUMImmediate cmd; + GLbyte data[64]; + }; + + Mailbox mailbox = Mailbox::Generate(); + Cmds expected; + expected.cmd.Init(kTexturesStartId, GL_TEXTURE_2D, mailbox.name); + gl_->ProduceTextureDirectCHROMIUM( + kTexturesStartId, GL_TEXTURE_2D, mailbox.name); + EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); +} + +TEST_F(GLES2ImplementationTest, LimitSizeAndOffsetTo32Bit) { + GLsizeiptr size; + GLintptr offset; + if (sizeof(size) <= 4 || sizeof(offset) <= 4) + return; + // The below two casts should be no-op, as we return early if + // it's 32-bit system. + int64 value64 = 0x100000000; + size = static_cast<GLsizeiptr>(value64); + offset = static_cast<GLintptr>(value64); + + const char kSizeOverflowMessage[] = "size more than 32-bit"; + const char kOffsetOverflowMessage[] = "offset more than 32-bit"; + + const GLfloat buf[] = { 1.0, 1.0, 1.0, 1.0 }; + const GLubyte indices[] = { 0 }; + + const GLuint kClientArrayBufferId = 0x789; + const GLuint kClientElementArrayBufferId = 0x790; + gl_->BindBuffer(GL_ARRAY_BUFFER, kClientArrayBufferId); + gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, kClientElementArrayBufferId); + EXPECT_EQ(GL_NO_ERROR, CheckError()); + + // Call BufferData() should succeed with legal paramaters. + gl_->BufferData(GL_ARRAY_BUFFER, sizeof(buf), buf, GL_DYNAMIC_DRAW); + gl_->BufferData( + GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_DYNAMIC_DRAW); + EXPECT_EQ(GL_NO_ERROR, CheckError()); + + // BufferData: size + gl_->BufferData(GL_ARRAY_BUFFER, size, buf, GL_DYNAMIC_DRAW); + EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); + EXPECT_STREQ(kSizeOverflowMessage, GetLastError().c_str()); + + // Call BufferSubData() should succeed with legal paramaters. + gl_->BufferSubData(GL_ARRAY_BUFFER, 0, sizeof(buf[0]), buf); + EXPECT_EQ(GL_NO_ERROR, CheckError()); + + // BufferSubData: offset + gl_->BufferSubData(GL_ARRAY_BUFFER, offset, 1, buf); + EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); + EXPECT_STREQ(kOffsetOverflowMessage, GetLastError().c_str()); + + // BufferSubData: size + EXPECT_EQ(GL_NO_ERROR, CheckError()); + gl_->BufferSubData(GL_ARRAY_BUFFER, 0, size, buf); + EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); + EXPECT_STREQ(kSizeOverflowMessage, GetLastError().c_str()); + + // Call MapBufferSubDataCHROMIUM() should succeed with legal paramaters. + void* mem = + gl_->MapBufferSubDataCHROMIUM(GL_ARRAY_BUFFER, 0, 1, GL_WRITE_ONLY); + EXPECT_TRUE(NULL != mem); + EXPECT_EQ(GL_NO_ERROR, CheckError()); + gl_->UnmapBufferSubDataCHROMIUM(mem); + + // MapBufferSubDataCHROMIUM: offset + EXPECT_TRUE(NULL == gl_->MapBufferSubDataCHROMIUM( + GL_ARRAY_BUFFER, offset, 1, GL_WRITE_ONLY)); + EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); + EXPECT_STREQ(kOffsetOverflowMessage, GetLastError().c_str()); + + // MapBufferSubDataCHROMIUM: size + EXPECT_EQ(GL_NO_ERROR, CheckError()); + EXPECT_TRUE(NULL == gl_->MapBufferSubDataCHROMIUM( + GL_ARRAY_BUFFER, 0, size, GL_WRITE_ONLY)); + EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); + EXPECT_STREQ(kSizeOverflowMessage, GetLastError().c_str()); + + // Call DrawElements() should succeed with legal paramaters. + gl_->DrawElements(GL_POINTS, 1, GL_UNSIGNED_BYTE, NULL); + EXPECT_EQ(GL_NO_ERROR, CheckError()); + + // DrawElements: offset + gl_->DrawElements( + GL_POINTS, 1, GL_UNSIGNED_BYTE, reinterpret_cast<void*>(offset)); + EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); + EXPECT_STREQ(kOffsetOverflowMessage, GetLastError().c_str()); + + // Call DrawElementsInstancedANGLE() should succeed with legal paramaters. + gl_->DrawElementsInstancedANGLE(GL_POINTS, 1, GL_UNSIGNED_BYTE, NULL, 1); + EXPECT_EQ(GL_NO_ERROR, CheckError()); + + // DrawElementsInstancedANGLE: offset + gl_->DrawElementsInstancedANGLE( + GL_POINTS, 1, GL_UNSIGNED_BYTE, reinterpret_cast<void*>(offset), 1); + EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); + EXPECT_STREQ(kOffsetOverflowMessage, GetLastError().c_str()); + + // Call VertexAttribPointer() should succeed with legal paramaters. + const GLuint kAttribIndex = 1; + const GLsizei kStride = 4; + gl_->VertexAttribPointer( + kAttribIndex, 1, GL_FLOAT, GL_FALSE, kStride, NULL); + EXPECT_EQ(GL_NO_ERROR, CheckError()); + + // VertexAttribPointer: offset + gl_->VertexAttribPointer( + kAttribIndex, 1, GL_FLOAT, GL_FALSE, kStride, + reinterpret_cast<void*>(offset)); + EXPECT_EQ(GL_INVALID_OPERATION, CheckError()); + EXPECT_STREQ(kOffsetOverflowMessage, GetLastError().c_str()); +} + +TEST_F(GLES2ImplementationManualInitTest, LoseContextOnOOM) { + ContextInitOptions init_options; + init_options.lose_context_when_out_of_memory = true; + ASSERT_TRUE(Initialize(init_options)); + + struct Cmds { + cmds::LoseContextCHROMIUM cmd; + }; + + GLsizei max = std::numeric_limits<GLsizei>::max(); + EXPECT_CALL(*gpu_control_, CreateGpuMemoryBuffer(max, max, _, _, _)) + .WillOnce(Return(static_cast<gfx::GpuMemoryBuffer*>(NULL))); + gl_->CreateImageCHROMIUM(max, max, 0, GL_IMAGE_MAP_CHROMIUM); + // The context should be lost. + Cmds expected; + expected.cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_UNKNOWN_CONTEXT_RESET_ARB); + EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); +} + +TEST_F(GLES2ImplementationManualInitTest, NoLoseContextOnOOM) { + ContextInitOptions init_options; + ASSERT_TRUE(Initialize(init_options)); + + struct Cmds { + cmds::LoseContextCHROMIUM cmd; + }; + + GLsizei max = std::numeric_limits<GLsizei>::max(); + EXPECT_CALL(*gpu_control_, CreateGpuMemoryBuffer(max, max, _, _, _)) + .WillOnce(Return(static_cast<gfx::GpuMemoryBuffer*>(NULL))); + gl_->CreateImageCHROMIUM(max, max, 0, GL_IMAGE_MAP_CHROMIUM); + // The context should not be lost. + EXPECT_TRUE(NoCommandsWritten()); +} + +TEST_F(GLES2ImplementationManualInitTest, FailInitOnBGRMismatch1) { + ContextInitOptions init_options; + init_options.bind_generates_resource_client = false; + init_options.bind_generates_resource_service = true; + EXPECT_FALSE(Initialize(init_options)); +} + +TEST_F(GLES2ImplementationManualInitTest, FailInitOnBGRMismatch2) { + ContextInitOptions init_options; + init_options.bind_generates_resource_client = true; + init_options.bind_generates_resource_service = false; + EXPECT_FALSE(Initialize(init_options)); +} #include "gpu/command_buffer/client/gles2_implementation_unittest_autogen.h" diff --git a/chromium/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h b/chromium/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h index 38e32a69b25..d75697e357e 100644 --- a/chromium/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h +++ b/chromium/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // This file is included by gles2_implementation.h to declare the @@ -11,7 +13,6 @@ #ifndef GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_UNITTEST_AUTOGEN_H_ #define GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_UNITTEST_AUTOGEN_H_ - TEST_F(GLES2ImplementationTest, AttachShader) { struct Cmds { cmds::AttachShader cmd; @@ -126,14 +127,13 @@ TEST_F(GLES2ImplementationTest, CheckFramebufferStatus) { cmds::CheckFramebufferStatus cmd; }; - typedef cmds::CheckFramebufferStatus::Result Result; Cmds expected; ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(cmds::CheckFramebufferStatus::Result)); expected.cmd.Init(1, result1.id, result1.offset); EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(result1.ptr, uint32(1))) + .WillOnce(SetMemory(result1.ptr, uint32_t(1))) .RetiresOnSaturation(); GLboolean result = gl_->CheckFramebufferStatus(1); @@ -168,9 +168,9 @@ TEST_F(GLES2ImplementationTest, ClearDepthf) { cmds::ClearDepthf cmd; }; Cmds expected; - expected.cmd.Init(1); + expected.cmd.Init(0.5f); - gl_->ClearDepthf(1); + gl_->ClearDepthf(0.5f); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } @@ -214,12 +214,18 @@ TEST_F(GLES2ImplementationTest, CopyTexImage2D) { cmds::CopyTexImage2D cmd; }; Cmds expected; - expected.cmd.Init(GL_TEXTURE_2D, 2, GL_ALPHA, 4, 5, 6, 7, 0); + expected.cmd.Init(GL_TEXTURE_2D, 2, GL_ALPHA, 4, 5, 6, 7); gl_->CopyTexImage2D(GL_TEXTURE_2D, 2, GL_ALPHA, 4, 5, 6, 7, 0); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } +TEST_F(GLES2ImplementationTest, CopyTexImage2DInvalidConstantArg7) { + gl_->CopyTexImage2D(GL_TEXTURE_2D, 2, GL_ALPHA, 4, 5, 6, 7, 1); + EXPECT_TRUE(NoCommandsWritten()); + EXPECT_EQ(GL_INVALID_VALUE, CheckError()); +} + TEST_F(GLES2ImplementationTest, CopyTexSubImage2D) { struct Cmds { cmds::CopyTexSubImage2D cmd; @@ -243,7 +249,7 @@ TEST_F(GLES2ImplementationTest, CullFace) { } TEST_F(GLES2ImplementationTest, DeleteBuffers) { - GLuint ids[2] = { kBuffersStartId, kBuffersStartId + 1 }; + GLuint ids[2] = {kBuffersStartId, kBuffersStartId + 1}; struct Cmds { cmds::DeleteBuffersImmediate del; GLuint data[2]; @@ -257,7 +263,7 @@ TEST_F(GLES2ImplementationTest, DeleteBuffers) { } TEST_F(GLES2ImplementationTest, DeleteFramebuffers) { - GLuint ids[2] = { kFramebuffersStartId, kFramebuffersStartId + 1 }; + GLuint ids[2] = {kFramebuffersStartId, kFramebuffersStartId + 1}; struct Cmds { cmds::DeleteFramebuffersImmediate del; GLuint data[2]; @@ -282,7 +288,7 @@ TEST_F(GLES2ImplementationTest, DeleteProgram) { } TEST_F(GLES2ImplementationTest, DeleteRenderbuffers) { - GLuint ids[2] = { kRenderbuffersStartId, kRenderbuffersStartId + 1 }; + GLuint ids[2] = {kRenderbuffersStartId, kRenderbuffersStartId + 1}; struct Cmds { cmds::DeleteRenderbuffersImmediate del; GLuint data[2]; @@ -307,7 +313,7 @@ TEST_F(GLES2ImplementationTest, DeleteShader) { } TEST_F(GLES2ImplementationTest, DeleteTextures) { - GLuint ids[2] = { kTexturesStartId, kTexturesStartId + 1 }; + GLuint ids[2] = {kTexturesStartId, kTexturesStartId + 1}; struct Cmds { cmds::DeleteTexturesImmediate del; GLuint data[2]; @@ -425,13 +431,20 @@ TEST_F(GLES2ImplementationTest, FramebufferTexture2D) { cmds::FramebufferTexture2D cmd; }; Cmds expected; - expected.cmd.Init(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 4, 0); + expected.cmd.Init(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 4); gl_->FramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 4, 0); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } +TEST_F(GLES2ImplementationTest, FramebufferTexture2DInvalidConstantArg4) { + gl_->FramebufferTexture2D( + GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 4, 1); + EXPECT_TRUE(NoCommandsWritten()); + EXPECT_EQ(GL_INVALID_VALUE, CheckError()); +} + TEST_F(GLES2ImplementationTest, FrontFace) { struct Cmds { cmds::FrontFace cmd; @@ -444,7 +457,9 @@ TEST_F(GLES2ImplementationTest, FrontFace) { } TEST_F(GLES2ImplementationTest, GenBuffers) { - GLuint ids[2] = { 0, }; + GLuint ids[2] = { + 0, + }; struct Cmds { cmds::GenBuffersImmediate gen; GLuint data[2]; @@ -471,7 +486,9 @@ TEST_F(GLES2ImplementationTest, GenerateMipmap) { } TEST_F(GLES2ImplementationTest, GenFramebuffers) { - GLuint ids[2] = { 0, }; + GLuint ids[2] = { + 0, + }; struct Cmds { cmds::GenFramebuffersImmediate gen; GLuint data[2]; @@ -487,7 +504,9 @@ TEST_F(GLES2ImplementationTest, GenFramebuffers) { } TEST_F(GLES2ImplementationTest, GenRenderbuffers) { - GLuint ids[2] = { 0, }; + GLuint ids[2] = { + 0, + }; struct Cmds { cmds::GenRenderbuffersImmediate gen; GLuint data[2]; @@ -503,7 +522,9 @@ TEST_F(GLES2ImplementationTest, GenRenderbuffers) { } TEST_F(GLES2ImplementationTest, GenTextures) { - GLuint ids[2] = { 0, }; + GLuint ids[2] = { + 0, + }; struct Cmds { cmds::GenTexturesImmediate gen; GLuint data[2]; @@ -581,14 +602,18 @@ TEST_F(GLES2ImplementationTest, GetFramebufferAttachmentParameteriv) { Result::Type result = 0; Cmds expected; ExpectedMemoryInfo result1 = GetExpectedResultMemory(4); - expected.cmd.Init( - 123, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, - result1.id, result1.offset); + expected.cmd.Init(123, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, + result1.id, + result1.offset); EXPECT_CALL(*command_buffer(), OnFlush()) .WillOnce(SetMemory(result1.ptr, SizedResultHelper<Result::Type>(1))) .RetiresOnSaturation(); gl_->GetFramebufferAttachmentParameteriv( - 123, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, + 123, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &result); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); EXPECT_EQ(static_cast<Result::Type>(1), result); @@ -754,14 +779,13 @@ TEST_F(GLES2ImplementationTest, IsBuffer) { cmds::IsBuffer cmd; }; - typedef cmds::IsBuffer::Result Result; Cmds expected; ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(cmds::IsBuffer::Result)); expected.cmd.Init(1, result1.id, result1.offset); EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(result1.ptr, uint32(1))) + .WillOnce(SetMemory(result1.ptr, uint32_t(1))) .RetiresOnSaturation(); GLboolean result = gl_->IsBuffer(1); @@ -774,14 +798,13 @@ TEST_F(GLES2ImplementationTest, IsEnabled) { cmds::IsEnabled cmd; }; - typedef cmds::IsEnabled::Result Result; Cmds expected; ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(cmds::IsEnabled::Result)); expected.cmd.Init(1, result1.id, result1.offset); EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(result1.ptr, uint32(1))) + .WillOnce(SetMemory(result1.ptr, uint32_t(1))) .RetiresOnSaturation(); GLboolean result = gl_->IsEnabled(1); @@ -794,14 +817,13 @@ TEST_F(GLES2ImplementationTest, IsFramebuffer) { cmds::IsFramebuffer cmd; }; - typedef cmds::IsFramebuffer::Result Result; Cmds expected; ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(cmds::IsFramebuffer::Result)); expected.cmd.Init(1, result1.id, result1.offset); EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(result1.ptr, uint32(1))) + .WillOnce(SetMemory(result1.ptr, uint32_t(1))) .RetiresOnSaturation(); GLboolean result = gl_->IsFramebuffer(1); @@ -814,14 +836,13 @@ TEST_F(GLES2ImplementationTest, IsProgram) { cmds::IsProgram cmd; }; - typedef cmds::IsProgram::Result Result; Cmds expected; ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(cmds::IsProgram::Result)); expected.cmd.Init(1, result1.id, result1.offset); EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(result1.ptr, uint32(1))) + .WillOnce(SetMemory(result1.ptr, uint32_t(1))) .RetiresOnSaturation(); GLboolean result = gl_->IsProgram(1); @@ -834,14 +855,13 @@ TEST_F(GLES2ImplementationTest, IsRenderbuffer) { cmds::IsRenderbuffer cmd; }; - typedef cmds::IsRenderbuffer::Result Result; Cmds expected; ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(cmds::IsRenderbuffer::Result)); expected.cmd.Init(1, result1.id, result1.offset); EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(result1.ptr, uint32(1))) + .WillOnce(SetMemory(result1.ptr, uint32_t(1))) .RetiresOnSaturation(); GLboolean result = gl_->IsRenderbuffer(1); @@ -854,14 +874,13 @@ TEST_F(GLES2ImplementationTest, IsShader) { cmds::IsShader cmd; }; - typedef cmds::IsShader::Result Result; Cmds expected; ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(cmds::IsShader::Result)); expected.cmd.Init(1, result1.id, result1.offset); EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(result1.ptr, uint32(1))) + .WillOnce(SetMemory(result1.ptr, uint32_t(1))) .RetiresOnSaturation(); GLboolean result = gl_->IsShader(1); @@ -874,14 +893,13 @@ TEST_F(GLES2ImplementationTest, IsTexture) { cmds::IsTexture cmd; }; - typedef cmds::IsTexture::Result Result; Cmds expected; ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(cmds::IsTexture::Result)); expected.cmd.Init(1, result1.id, result1.offset); EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(result1.ptr, uint32(1))) + .WillOnce(SetMemory(result1.ptr, uint32_t(1))) .RetiresOnSaturation(); GLboolean result = gl_->IsTexture(1); @@ -894,9 +912,9 @@ TEST_F(GLES2ImplementationTest, LineWidth) { cmds::LineWidth cmd; }; Cmds expected; - expected.cmd.Init(1); + expected.cmd.Init(0.5f); - gl_->LineWidth(1); + gl_->LineWidth(0.5f); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } @@ -1048,9 +1066,9 @@ TEST_F(GLES2ImplementationTest, TexParameterf) { cmds::TexParameterf cmd; }; Cmds expected; - expected.cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 3); + expected.cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - gl_->TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 3); + gl_->TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } @@ -1075,9 +1093,9 @@ TEST_F(GLES2ImplementationTest, TexParameteri) { cmds::TexParameteri cmd; }; Cmds expected; - expected.cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 3); + expected.cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 3); + gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } @@ -1342,11 +1360,23 @@ TEST_F(GLES2ImplementationTest, UniformMatrix2fv) { data[ii][jj] = static_cast<GLfloat>(ii * 4 + jj); } } - expected.cmd.Init(1, 2, false, &data[0][0]); + expected.cmd.Init(1, 2, &data[0][0]); gl_->UniformMatrix2fv(1, 2, false, &data[0][0]); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } +TEST_F(GLES2ImplementationTest, UniformMatrix2fvInvalidConstantArg2) { + GLfloat data[2][4] = {{0}}; + for (int ii = 0; ii < 2; ++ii) { + for (int jj = 0; jj < 4; ++jj) { + data[ii][jj] = static_cast<GLfloat>(ii * 4 + jj); + } + } + gl_->UniformMatrix2fv(1, 2, true, &data[0][0]); + EXPECT_TRUE(NoCommandsWritten()); + EXPECT_EQ(GL_INVALID_VALUE, CheckError()); +} + TEST_F(GLES2ImplementationTest, UniformMatrix3fv) { GLfloat data[2][9] = {{0}}; struct Cmds { @@ -1360,11 +1390,23 @@ TEST_F(GLES2ImplementationTest, UniformMatrix3fv) { data[ii][jj] = static_cast<GLfloat>(ii * 9 + jj); } } - expected.cmd.Init(1, 2, false, &data[0][0]); + expected.cmd.Init(1, 2, &data[0][0]); gl_->UniformMatrix3fv(1, 2, false, &data[0][0]); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } +TEST_F(GLES2ImplementationTest, UniformMatrix3fvInvalidConstantArg2) { + GLfloat data[2][9] = {{0}}; + for (int ii = 0; ii < 2; ++ii) { + for (int jj = 0; jj < 9; ++jj) { + data[ii][jj] = static_cast<GLfloat>(ii * 9 + jj); + } + } + gl_->UniformMatrix3fv(1, 2, true, &data[0][0]); + EXPECT_TRUE(NoCommandsWritten()); + EXPECT_EQ(GL_INVALID_VALUE, CheckError()); +} + TEST_F(GLES2ImplementationTest, UniformMatrix4fv) { GLfloat data[2][16] = {{0}}; struct Cmds { @@ -1378,11 +1420,23 @@ TEST_F(GLES2ImplementationTest, UniformMatrix4fv) { data[ii][jj] = static_cast<GLfloat>(ii * 16 + jj); } } - expected.cmd.Init(1, 2, false, &data[0][0]); + expected.cmd.Init(1, 2, &data[0][0]); gl_->UniformMatrix4fv(1, 2, false, &data[0][0]); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } +TEST_F(GLES2ImplementationTest, UniformMatrix4fvInvalidConstantArg2) { + GLfloat data[2][16] = {{0}}; + for (int ii = 0; ii < 2; ++ii) { + for (int jj = 0; jj < 16; ++jj) { + data[ii][jj] = static_cast<GLfloat>(ii * 16 + jj); + } + } + gl_->UniformMatrix4fv(1, 2, true, &data[0][0]); + EXPECT_TRUE(NoCommandsWritten()); + EXPECT_EQ(GL_INVALID_VALUE, CheckError()); +} + TEST_F(GLES2ImplementationTest, UseProgram) { struct Cmds { cmds::UseProgram cmd; @@ -1392,6 +1446,9 @@ TEST_F(GLES2ImplementationTest, UseProgram) { gl_->UseProgram(1); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); + ClearCommands(); + gl_->UseProgram(1); + EXPECT_TRUE(NoCommandsWritten()); } TEST_F(GLES2ImplementationTest, ValidateProgram) { @@ -1563,14 +1620,21 @@ TEST_F(GLES2ImplementationTest, FramebufferTexture2DMultisampleEXT) { cmds::FramebufferTexture2DMultisampleEXT cmd; }; Cmds expected; - expected.cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 4, 0, 6); + expected.cmd.Init(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 4, 6); gl_->FramebufferTexture2DMultisampleEXT( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 4, 0, 6); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } +TEST_F(GLES2ImplementationTest, + FramebufferTexture2DMultisampleEXTInvalidConstantArg4) { + gl_->FramebufferTexture2DMultisampleEXT( + GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 4, 1, 6); + EXPECT_TRUE(NoCommandsWritten()); + EXPECT_EQ(GL_INVALID_VALUE, CheckError()); +} + TEST_F(GLES2ImplementationTest, TexStorage2DEXT) { struct Cmds { cmds::TexStorage2DEXT cmd; @@ -1583,7 +1647,9 @@ TEST_F(GLES2ImplementationTest, TexStorage2DEXT) { } TEST_F(GLES2ImplementationTest, GenQueriesEXT) { - GLuint ids[2] = { 0, }; + GLuint ids[2] = { + 0, + }; struct Cmds { cmds::GenQueriesEXTImmediate gen; GLuint data[2]; @@ -1599,7 +1665,7 @@ TEST_F(GLES2ImplementationTest, GenQueriesEXT) { } TEST_F(GLES2ImplementationTest, DeleteQueriesEXT) { - GLuint ids[2] = { kQueriesStartId, kQueriesStartId + 1 }; + GLuint ids[2] = {kQueriesStartId, kQueriesStartId + 1}; struct Cmds { cmds::DeleteQueriesEXTImmediate del; GLuint data[2]; @@ -1627,7 +1693,9 @@ TEST_F(GLES2ImplementationTest, PopGroupMarkerEXT) { } TEST_F(GLES2ImplementationTest, GenVertexArraysOES) { - GLuint ids[2] = { 0, }; + GLuint ids[2] = { + 0, + }; struct Cmds { cmds::GenVertexArraysOESImmediate gen; GLuint data[2]; @@ -1643,7 +1711,7 @@ TEST_F(GLES2ImplementationTest, GenVertexArraysOES) { } TEST_F(GLES2ImplementationTest, DeleteVertexArraysOES) { - GLuint ids[2] = { kVertexArraysStartId, kVertexArraysStartId + 1 }; + GLuint ids[2] = {kVertexArraysStartId, kVertexArraysStartId + 1}; struct Cmds { cmds::DeleteVertexArraysOESImmediate del; GLuint data[2]; @@ -1661,14 +1729,13 @@ TEST_F(GLES2ImplementationTest, IsVertexArrayOES) { cmds::IsVertexArrayOES cmd; }; - typedef cmds::IsVertexArrayOES::Result Result; Cmds expected; ExpectedMemoryInfo result1 = GetExpectedResultMemory(sizeof(cmds::IsVertexArrayOES::Result)); expected.cmd.Init(1, result1.id, result1.offset); EXPECT_CALL(*command_buffer(), OnFlush()) - .WillOnce(SetMemory(result1.ptr, uint32(1))) + .WillOnce(SetMemory(result1.ptr, uint32_t(1))) .RetiresOnSaturation(); GLboolean result = gl_->IsVertexArrayOES(1); @@ -1691,17 +1758,7 @@ TEST_F(GLES2ImplementationTest, ResizeCHROMIUM) { EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } // TODO: Implement unit test for GetRequestableExtensionsCHROMIUM - -TEST_F(GLES2ImplementationTest, DestroyStreamTextureCHROMIUM) { - struct Cmds { - cmds::DestroyStreamTextureCHROMIUM cmd; - }; - Cmds expected; - expected.cmd.Init(1); - - gl_->DestroyStreamTextureCHROMIUM(1); - EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); -} +// TODO: Implement unit test for CreateStreamTextureCHROMIUM // TODO: Implement unit test for GetTranslatedShaderSourceANGLE TEST_F(GLES2ImplementationTest, TexImageIOSurface2DCHROMIUM) { @@ -1748,38 +1805,6 @@ TEST_F(GLES2ImplementationTest, VertexAttribDivisorANGLE) { EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } // TODO: Implement unit test for GenMailboxCHROMIUM - -TEST_F(GLES2ImplementationTest, ProduceTextureCHROMIUM) { - GLbyte data[64] = {0}; - struct Cmds { - cmds::ProduceTextureCHROMIUMImmediate cmd; - GLbyte data[64]; - }; - - for (int jj = 0; jj < 64; ++jj) { - data[jj] = static_cast<GLbyte>(jj); - } - Cmds expected; - expected.cmd.Init(GL_TEXTURE_2D, &data[0]); - gl_->ProduceTextureCHROMIUM(GL_TEXTURE_2D, &data[0]); - EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); -} - -TEST_F(GLES2ImplementationTest, ConsumeTextureCHROMIUM) { - GLbyte data[64] = {0}; - struct Cmds { - cmds::ConsumeTextureCHROMIUMImmediate cmd; - GLbyte data[64]; - }; - - for (int jj = 0; jj < 64; ++jj) { - data[jj] = static_cast<GLbyte>(jj); - } - Cmds expected; - expected.cmd.Init(GL_TEXTURE_2D, &data[0]); - gl_->ConsumeTextureCHROMIUM(GL_TEXTURE_2D, &data[0]); - EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); -} // TODO: Implement unit test for BindUniformLocationCHROMIUM TEST_F(GLES2ImplementationTest, BindTexImage2DCHROMIUM) { @@ -1827,9 +1852,10 @@ TEST_F(GLES2ImplementationTest, LoseContextCHROMIUM) { cmds::LoseContextCHROMIUM cmd; }; Cmds expected; - expected.cmd.Init(1, 2); + expected.cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_GUILTY_CONTEXT_RESET_ARB); - gl_->LoseContextCHROMIUM(1, 2); + gl_->LoseContextCHROMIUM(GL_GUILTY_CONTEXT_RESET_ARB, + GL_GUILTY_CONTEXT_RESET_ARB); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } // TODO: Implement unit test for InsertSyncPointCHROMIUM @@ -1874,4 +1900,3 @@ TEST_F(GLES2ImplementationTest, DiscardBackbufferCHROMIUM) { EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); } #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_UNITTEST_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/client/gles2_interface_autogen.h b/chromium/gpu/command_buffer/client/gles2_interface_autogen.h index 029bf691bc1..ad0a418ff2e 100644 --- a/chromium/gpu/command_buffer/client/gles2_interface_autogen.h +++ b/chromium/gpu/command_buffer/client/gles2_interface_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // This file is included by gles2_interface.h to declare the @@ -13,44 +15,78 @@ virtual void ActiveTexture(GLenum texture) = 0; virtual void AttachShader(GLuint program, GLuint shader) = 0; -virtual void BindAttribLocation( - GLuint program, GLuint index, const char* name) = 0; +virtual void BindAttribLocation(GLuint program, + GLuint index, + const char* name) = 0; virtual void BindBuffer(GLenum target, GLuint buffer) = 0; virtual void BindFramebuffer(GLenum target, GLuint framebuffer) = 0; virtual void BindRenderbuffer(GLenum target, GLuint renderbuffer) = 0; virtual void BindTexture(GLenum target, GLuint texture) = 0; -virtual void BlendColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = 0; +virtual void BlendColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) = 0; virtual void BlendEquation(GLenum mode) = 0; virtual void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) = 0; virtual void BlendFunc(GLenum sfactor, GLenum dfactor) = 0; -virtual void BlendFuncSeparate( - GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) = 0; -virtual void BufferData( - GLenum target, GLsizeiptr size, const void* data, GLenum usage) = 0; -virtual void BufferSubData( - GLenum target, GLintptr offset, GLsizeiptr size, const void* data) = 0; +virtual void BlendFuncSeparate(GLenum srcRGB, + GLenum dstRGB, + GLenum srcAlpha, + GLenum dstAlpha) = 0; +virtual void BufferData(GLenum target, + GLsizeiptr size, + const void* data, + GLenum usage) = 0; +virtual void BufferSubData(GLenum target, + GLintptr offset, + GLsizeiptr size, + const void* data) = 0; virtual GLenum CheckFramebufferStatus(GLenum target) = 0; virtual void Clear(GLbitfield mask) = 0; -virtual void ClearColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = 0; +virtual void ClearColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) = 0; virtual void ClearDepthf(GLclampf depth) = 0; virtual void ClearStencil(GLint s) = 0; -virtual void ColorMask( - GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) = 0; +virtual void ColorMask(GLboolean red, + GLboolean green, + GLboolean blue, + GLboolean alpha) = 0; virtual void CompileShader(GLuint shader) = 0; -virtual void CompressedTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLsizei width, - GLsizei height, GLint border, GLsizei imageSize, const void* data) = 0; -virtual void CompressedTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLsizei imageSize, const void* data) = 0; -virtual void CopyTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, - GLsizei width, GLsizei height, GLint border) = 0; -virtual void CopyTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, - GLsizei width, GLsizei height) = 0; +virtual void CompressedTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLsizei imageSize, + const void* data) = 0; +virtual void CompressedTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLsizei imageSize, + const void* data) = 0; +virtual void CopyTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLint border) = 0; +virtual void CopyTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLint x, + GLint y, + GLsizei width, + GLsizei height) = 0; virtual GLuint CreateProgram() = 0; virtual GLuint CreateShader(GLenum type) = 0; virtual void CullFace(GLenum mode) = 0; @@ -67,66 +103,93 @@ virtual void DetachShader(GLuint program, GLuint shader) = 0; virtual void Disable(GLenum cap) = 0; virtual void DisableVertexAttribArray(GLuint index) = 0; virtual void DrawArrays(GLenum mode, GLint first, GLsizei count) = 0; -virtual void DrawElements( - GLenum mode, GLsizei count, GLenum type, const void* indices) = 0; +virtual void DrawElements(GLenum mode, + GLsizei count, + GLenum type, + const void* indices) = 0; virtual void Enable(GLenum cap) = 0; virtual void EnableVertexAttribArray(GLuint index) = 0; virtual void Finish() = 0; virtual void Flush() = 0; -virtual void FramebufferRenderbuffer( - GLenum target, GLenum attachment, GLenum renderbuffertarget, - GLuint renderbuffer) = 0; -virtual void FramebufferTexture2D( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level) = 0; +virtual void FramebufferRenderbuffer(GLenum target, + GLenum attachment, + GLenum renderbuffertarget, + GLuint renderbuffer) = 0; +virtual void FramebufferTexture2D(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level) = 0; virtual void FrontFace(GLenum mode) = 0; virtual void GenBuffers(GLsizei n, GLuint* buffers) = 0; virtual void GenerateMipmap(GLenum target) = 0; virtual void GenFramebuffers(GLsizei n, GLuint* framebuffers) = 0; virtual void GenRenderbuffers(GLsizei n, GLuint* renderbuffers) = 0; virtual void GenTextures(GLsizei n, GLuint* textures) = 0; -virtual void GetActiveAttrib( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) = 0; -virtual void GetActiveUniform( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) = 0; -virtual void GetAttachedShaders( - GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) = 0; +virtual void GetActiveAttrib(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) = 0; +virtual void GetActiveUniform(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) = 0; +virtual void GetAttachedShaders(GLuint program, + GLsizei maxcount, + GLsizei* count, + GLuint* shaders) = 0; virtual GLint GetAttribLocation(GLuint program, const char* name) = 0; virtual void GetBooleanv(GLenum pname, GLboolean* params) = 0; -virtual void GetBufferParameteriv(GLenum target, GLenum pname, GLint* params) = - 0; +virtual void GetBufferParameteriv(GLenum target, + GLenum pname, + GLint* params) = 0; virtual GLenum GetError() = 0; virtual void GetFloatv(GLenum pname, GLfloat* params) = 0; -virtual void GetFramebufferAttachmentParameteriv( - GLenum target, GLenum attachment, GLenum pname, GLint* params) = 0; +virtual void GetFramebufferAttachmentParameteriv(GLenum target, + GLenum attachment, + GLenum pname, + GLint* params) = 0; virtual void GetIntegerv(GLenum pname, GLint* params) = 0; virtual void GetProgramiv(GLuint program, GLenum pname, GLint* params) = 0; -virtual void GetProgramInfoLog( - GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) = 0; -virtual void GetRenderbufferParameteriv( - GLenum target, GLenum pname, GLint* params) = 0; +virtual void GetProgramInfoLog(GLuint program, + GLsizei bufsize, + GLsizei* length, + char* infolog) = 0; +virtual void GetRenderbufferParameteriv(GLenum target, + GLenum pname, + GLint* params) = 0; virtual void GetShaderiv(GLuint shader, GLenum pname, GLint* params) = 0; -virtual void GetShaderInfoLog( - GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) = 0; -virtual void GetShaderPrecisionFormat( - GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) = - 0; -virtual void GetShaderSource( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) = 0; +virtual void GetShaderInfoLog(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* infolog) = 0; +virtual void GetShaderPrecisionFormat(GLenum shadertype, + GLenum precisiontype, + GLint* range, + GLint* precision) = 0; +virtual void GetShaderSource(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) = 0; virtual const GLubyte* GetString(GLenum name) = 0; -virtual void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) = - 0; +virtual void GetTexParameterfv(GLenum target, + GLenum pname, + GLfloat* params) = 0; virtual void GetTexParameteriv(GLenum target, GLenum pname, GLint* params) = 0; virtual void GetUniformfv(GLuint program, GLint location, GLfloat* params) = 0; virtual void GetUniformiv(GLuint program, GLint location, GLint* params) = 0; virtual GLint GetUniformLocation(GLuint program, const char* name) = 0; -virtual void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) = - 0; +virtual void GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) = 0; virtual void GetVertexAttribiv(GLuint index, GLenum pname, GLint* params) = 0; -virtual void GetVertexAttribPointerv( - GLuint index, GLenum pname, void** pointer) = 0; +virtual void GetVertexAttribPointerv(GLuint index, + GLenum pname, + void** pointer) = 0; virtual void Hint(GLenum target, GLenum mode) = 0; virtual GLboolean IsBuffer(GLuint buffer) = 0; virtual GLboolean IsEnabled(GLenum cap) = 0; @@ -139,43 +202,69 @@ virtual void LineWidth(GLfloat width) = 0; virtual void LinkProgram(GLuint program) = 0; virtual void PixelStorei(GLenum pname, GLint param) = 0; virtual void PolygonOffset(GLfloat factor, GLfloat units) = 0; -virtual void ReadPixels( - GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, - void* pixels) = 0; +virtual void ReadPixels(GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + void* pixels) = 0; virtual void ReleaseShaderCompiler() = 0; -virtual void RenderbufferStorage( - GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = 0; +virtual void RenderbufferStorage(GLenum target, + GLenum internalformat, + GLsizei width, + GLsizei height) = 0; virtual void SampleCoverage(GLclampf value, GLboolean invert) = 0; virtual void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) = 0; -virtual void ShaderBinary( - GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, - GLsizei length) = 0; -virtual void ShaderSource( - GLuint shader, GLsizei count, const GLchar* const* str, - const GLint* length) = 0; +virtual void ShaderBinary(GLsizei n, + const GLuint* shaders, + GLenum binaryformat, + const void* binary, + GLsizei length) = 0; +virtual void ShaderSource(GLuint shader, + GLsizei count, + const GLchar* const* str, + const GLint* length) = 0; virtual void ShallowFinishCHROMIUM() = 0; virtual void ShallowFlushCHROMIUM() = 0; virtual void StencilFunc(GLenum func, GLint ref, GLuint mask) = 0; -virtual void StencilFuncSeparate( - GLenum face, GLenum func, GLint ref, GLuint mask) = 0; +virtual void StencilFuncSeparate(GLenum face, + GLenum func, + GLint ref, + GLuint mask) = 0; virtual void StencilMask(GLuint mask) = 0; virtual void StencilMaskSeparate(GLenum face, GLuint mask) = 0; virtual void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) = 0; -virtual void StencilOpSeparate( - GLenum face, GLenum fail, GLenum zfail, GLenum zpass) = 0; -virtual void TexImage2D( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) = 0; +virtual void StencilOpSeparate(GLenum face, + GLenum fail, + GLenum zfail, + GLenum zpass) = 0; +virtual void TexImage2D(GLenum target, + GLint level, + GLint internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) = 0; virtual void TexParameterf(GLenum target, GLenum pname, GLfloat param) = 0; -virtual void TexParameterfv( - GLenum target, GLenum pname, const GLfloat* params) = 0; +virtual void TexParameterfv(GLenum target, + GLenum pname, + const GLfloat* params) = 0; virtual void TexParameteri(GLenum target, GLenum pname, GLint param) = 0; -virtual void TexParameteriv(GLenum target, GLenum pname, const GLint* params) = - 0; -virtual void TexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* pixels) = 0; +virtual void TexParameteriv(GLenum target, + GLenum pname, + const GLint* params) = 0; +virtual void TexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* pixels) = 0; virtual void Uniform1f(GLint location, GLfloat x) = 0; virtual void Uniform1fv(GLint location, GLsizei count, const GLfloat* v) = 0; virtual void Uniform1i(GLint location, GLint x) = 0; @@ -188,20 +277,26 @@ virtual void Uniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z) = 0; virtual void Uniform3fv(GLint location, GLsizei count, const GLfloat* v) = 0; virtual void Uniform3i(GLint location, GLint x, GLint y, GLint z) = 0; virtual void Uniform3iv(GLint location, GLsizei count, const GLint* v) = 0; -virtual void Uniform4f( - GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = 0; +virtual void Uniform4f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) = 0; virtual void Uniform4fv(GLint location, GLsizei count, const GLfloat* v) = 0; virtual void Uniform4i(GLint location, GLint x, GLint y, GLint z, GLint w) = 0; virtual void Uniform4iv(GLint location, GLsizei count, const GLint* v) = 0; -virtual void UniformMatrix2fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = - 0; -virtual void UniformMatrix3fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = - 0; -virtual void UniformMatrix4fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) = - 0; +virtual void UniformMatrix2fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) = 0; +virtual void UniformMatrix3fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) = 0; +virtual void UniformMatrix4fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) = 0; virtual void UseProgram(GLuint program) = 0; virtual void ValidateProgram(GLuint program) = 0; virtual void VertexAttrib1f(GLuint indx, GLfloat x) = 0; @@ -210,28 +305,50 @@ virtual void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) = 0; virtual void VertexAttrib2fv(GLuint indx, const GLfloat* values) = 0; virtual void VertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z) = 0; virtual void VertexAttrib3fv(GLuint indx, const GLfloat* values) = 0; -virtual void VertexAttrib4f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) = 0; +virtual void VertexAttrib4f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) = 0; virtual void VertexAttrib4fv(GLuint indx, const GLfloat* values) = 0; -virtual void VertexAttribPointer( - GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, - const void* ptr) = 0; +virtual void VertexAttribPointer(GLuint indx, + GLint size, + GLenum type, + GLboolean normalized, + GLsizei stride, + const void* ptr) = 0; virtual void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) = 0; -virtual void BlitFramebufferCHROMIUM( - GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, - GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) = 0; -virtual void RenderbufferStorageMultisampleCHROMIUM( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) = 0; -virtual void RenderbufferStorageMultisampleEXT( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) = 0; -virtual void FramebufferTexture2DMultisampleEXT( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level, GLsizei samples) = 0; -virtual void TexStorage2DEXT( - GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, - GLsizei height) = 0; +virtual void BlitFramebufferCHROMIUM(GLint srcX0, + GLint srcY0, + GLint srcX1, + GLint srcY1, + GLint dstX0, + GLint dstY0, + GLint dstX1, + GLint dstY1, + GLbitfield mask, + GLenum filter) = 0; +virtual void RenderbufferStorageMultisampleCHROMIUM(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) = 0; +virtual void RenderbufferStorageMultisampleEXT(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) = 0; +virtual void FramebufferTexture2DMultisampleEXT(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level, + GLsizei samples) = 0; +virtual void TexStorage2DEXT(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height) = 0; virtual void GenQueriesEXT(GLsizei n, GLuint* queries) = 0; virtual void DeleteQueriesEXT(GLsizei n, const GLuint* queries) = 0; virtual GLboolean IsQueryEXT(GLuint id) = 0; @@ -247,81 +364,144 @@ virtual void DeleteVertexArraysOES(GLsizei n, const GLuint* arrays) = 0; virtual GLboolean IsVertexArrayOES(GLuint array) = 0; virtual void BindVertexArrayOES(GLuint array) = 0; virtual void SwapBuffers() = 0; -virtual GLuint GetMaxValueInBufferCHROMIUM( - GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) = 0; -virtual void GenSharedIdsCHROMIUM( - GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) = 0; -virtual void DeleteSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) = 0; -virtual void RegisterSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) = 0; +virtual GLuint GetMaxValueInBufferCHROMIUM(GLuint buffer_id, + GLsizei count, + GLenum type, + GLuint offset) = 0; +virtual void GenSharedIdsCHROMIUM(GLuint namespace_id, + GLuint id_offset, + GLsizei n, + GLuint* ids) = 0; +virtual void DeleteSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) = 0; +virtual void RegisterSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) = 0; virtual GLboolean EnableFeatureCHROMIUM(const char* feature) = 0; virtual void* MapBufferCHROMIUM(GLuint target, GLenum access) = 0; virtual GLboolean UnmapBufferCHROMIUM(GLuint target) = 0; -virtual void* MapImageCHROMIUM(GLuint image_id, GLenum access) = 0; +virtual void* MapImageCHROMIUM(GLuint image_id) = 0; virtual void UnmapImageCHROMIUM(GLuint image_id) = 0; -virtual void* MapBufferSubDataCHROMIUM( - GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) = 0; +virtual void* MapBufferSubDataCHROMIUM(GLuint target, + GLintptr offset, + GLsizeiptr size, + GLenum access) = 0; virtual void UnmapBufferSubDataCHROMIUM(const void* mem) = 0; -virtual void* MapTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, GLenum access) = 0; +virtual void* MapTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + GLenum access) = 0; virtual void UnmapTexSubImage2DCHROMIUM(const void* mem) = 0; -virtual void ResizeCHROMIUM(GLuint width, GLuint height, GLfloat scale_factor) = - 0; +virtual void ResizeCHROMIUM(GLuint width, + GLuint height, + GLfloat scale_factor) = 0; virtual const GLchar* GetRequestableExtensionsCHROMIUM() = 0; virtual void RequestExtensionCHROMIUM(const char* extension) = 0; virtual void RateLimitOffscreenContextCHROMIUM() = 0; -virtual void GetMultipleIntegervCHROMIUM( - const GLenum* pnames, GLuint count, GLint* results, GLsizeiptr size) = 0; -virtual void GetProgramInfoCHROMIUM( - GLuint program, GLsizei bufsize, GLsizei* size, void* info) = 0; +virtual void GetMultipleIntegervCHROMIUM(const GLenum* pnames, + GLuint count, + GLint* results, + GLsizeiptr size) = 0; +virtual void GetProgramInfoCHROMIUM(GLuint program, + GLsizei bufsize, + GLsizei* size, + void* info) = 0; virtual GLuint CreateStreamTextureCHROMIUM(GLuint texture) = 0; -virtual void DestroyStreamTextureCHROMIUM(GLuint texture) = 0; -virtual GLuint CreateImageCHROMIUM( - GLsizei width, GLsizei height, GLenum internalformat) = 0; +virtual GLuint CreateImageCHROMIUM(GLsizei width, + GLsizei height, + GLenum internalformat, + GLenum usage) = 0; virtual void DestroyImageCHROMIUM(GLuint image_id) = 0; -virtual void GetImageParameterivCHROMIUM( - GLuint image_id, GLenum pname, GLint* params) = 0; -virtual void GetTranslatedShaderSourceANGLE( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) = 0; -virtual void PostSubBufferCHROMIUM( - GLint x, GLint y, GLint width, GLint height) = 0; -virtual void TexImageIOSurface2DCHROMIUM( - GLenum target, GLsizei width, GLsizei height, GLuint ioSurfaceId, - GLuint plane) = 0; -virtual void CopyTextureCHROMIUM( - GLenum target, GLenum source_id, GLenum dest_id, GLint level, - GLint internalformat, GLenum dest_type) = 0; -virtual void DrawArraysInstancedANGLE( - GLenum mode, GLint first, GLsizei count, GLsizei primcount) = 0; -virtual void DrawElementsInstancedANGLE( - GLenum mode, GLsizei count, GLenum type, const void* indices, - GLsizei primcount) = 0; +virtual void GetImageParameterivCHROMIUM(GLuint image_id, + GLenum pname, + GLint* params) = 0; +virtual void GetTranslatedShaderSourceANGLE(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) = 0; +virtual void PostSubBufferCHROMIUM(GLint x, + GLint y, + GLint width, + GLint height) = 0; +virtual void TexImageIOSurface2DCHROMIUM(GLenum target, + GLsizei width, + GLsizei height, + GLuint ioSurfaceId, + GLuint plane) = 0; +virtual void CopyTextureCHROMIUM(GLenum target, + GLenum source_id, + GLenum dest_id, + GLint level, + GLint internalformat, + GLenum dest_type) = 0; +virtual void DrawArraysInstancedANGLE(GLenum mode, + GLint first, + GLsizei count, + GLsizei primcount) = 0; +virtual void DrawElementsInstancedANGLE(GLenum mode, + GLsizei count, + GLenum type, + const void* indices, + GLsizei primcount) = 0; virtual void VertexAttribDivisorANGLE(GLuint index, GLuint divisor) = 0; virtual void GenMailboxCHROMIUM(GLbyte* mailbox) = 0; virtual void ProduceTextureCHROMIUM(GLenum target, const GLbyte* mailbox) = 0; +virtual void ProduceTextureDirectCHROMIUM(GLuint texture, + GLenum target, + const GLbyte* mailbox) = 0; virtual void ConsumeTextureCHROMIUM(GLenum target, const GLbyte* mailbox) = 0; -virtual void BindUniformLocationCHROMIUM( - GLuint program, GLint location, const char* name) = 0; +virtual GLuint CreateAndConsumeTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) = 0; +virtual void BindUniformLocationCHROMIUM(GLuint program, + GLint location, + const char* name) = 0; virtual void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) = 0; virtual void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) = 0; virtual void TraceBeginCHROMIUM(const char* name) = 0; virtual void TraceEndCHROMIUM() = 0; -virtual void AsyncTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* data) = 0; -virtual void AsyncTexImage2DCHROMIUM( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) = 0; +virtual void AsyncTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* data) = 0; +virtual void AsyncTexImage2DCHROMIUM(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) = 0; virtual void WaitAsyncTexImage2DCHROMIUM(GLenum target) = 0; -virtual void DiscardFramebufferEXT( - GLenum target, GLsizei count, const GLenum* attachments) = 0; +virtual void WaitAllAsyncTexImage2DCHROMIUM() = 0; +virtual void DiscardFramebufferEXT(GLenum target, + GLsizei count, + const GLenum* attachments) = 0; virtual void LoseContextCHROMIUM(GLenum current, GLenum other) = 0; virtual GLuint InsertSyncPointCHROMIUM() = 0; virtual void WaitSyncPointCHROMIUM(GLuint sync_point) = 0; virtual void DrawBuffersEXT(GLsizei count, const GLenum* bufs) = 0; virtual void DiscardBackbufferCHROMIUM() = 0; +virtual void ScheduleOverlayPlaneCHROMIUM(GLint plane_z_order, + GLenum plane_transform, + GLuint overlay_texture_id, + GLint bounds_x, + GLint bounds_y, + GLint bounds_width, + GLint bounds_height, + GLfloat uv_x, + GLfloat uv_y, + GLfloat uv_width, + GLfloat uv_height) = 0; #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_INTERFACE_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/chromium/gpu/command_buffer/client/gles2_interface_stub_autogen.h index 59c0ce9e8fb..25bdd96c126 100644 --- a/chromium/gpu/command_buffer/client/gles2_interface_stub_autogen.h +++ b/chromium/gpu/command_buffer/client/gles2_interface_stub_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // This file is included by gles2_interface_stub.h. @@ -12,56 +14,86 @@ virtual void ActiveTexture(GLenum texture) OVERRIDE; virtual void AttachShader(GLuint program, GLuint shader) OVERRIDE; -virtual void BindAttribLocation( - GLuint program, GLuint index, const char* name) OVERRIDE; +virtual void BindAttribLocation(GLuint program, + GLuint index, + const char* name) OVERRIDE; virtual void BindBuffer(GLenum target, GLuint buffer) OVERRIDE; virtual void BindFramebuffer(GLenum target, GLuint framebuffer) OVERRIDE; virtual void BindRenderbuffer(GLenum target, GLuint renderbuffer) OVERRIDE; virtual void BindTexture(GLenum target, GLuint texture) OVERRIDE; -virtual void BlendColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) OVERRIDE; +virtual void BlendColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) OVERRIDE; virtual void BlendEquation(GLenum mode) OVERRIDE; virtual void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) OVERRIDE; virtual void BlendFunc(GLenum sfactor, GLenum dfactor) OVERRIDE; -virtual void BlendFuncSeparate( - GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) OVERRIDE; -virtual void BufferData( - GLenum target, GLsizeiptr size, const void* data, GLenum usage) OVERRIDE; -virtual void BufferSubData( - GLenum target, GLintptr offset, GLsizeiptr size, - const void* data) OVERRIDE; +virtual void BlendFuncSeparate(GLenum srcRGB, + GLenum dstRGB, + GLenum srcAlpha, + GLenum dstAlpha) OVERRIDE; +virtual void BufferData(GLenum target, + GLsizeiptr size, + const void* data, + GLenum usage) OVERRIDE; +virtual void BufferSubData(GLenum target, + GLintptr offset, + GLsizeiptr size, + const void* data) OVERRIDE; virtual GLenum CheckFramebufferStatus(GLenum target) OVERRIDE; virtual void Clear(GLbitfield mask) OVERRIDE; -virtual void ClearColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) OVERRIDE; +virtual void ClearColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) OVERRIDE; virtual void ClearDepthf(GLclampf depth) OVERRIDE; virtual void ClearStencil(GLint s) OVERRIDE; -virtual void ColorMask( - GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) OVERRIDE; +virtual void ColorMask(GLboolean red, + GLboolean green, + GLboolean blue, + GLboolean alpha) OVERRIDE; virtual void CompileShader(GLuint shader) OVERRIDE; -virtual void CompressedTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLsizei width, - GLsizei height, GLint border, GLsizei imageSize, - const void* data) OVERRIDE; -virtual void CompressedTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLsizei imageSize, - const void* data) OVERRIDE; -virtual void CopyTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, - GLsizei width, GLsizei height, GLint border) OVERRIDE; -virtual void CopyTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, - GLsizei width, GLsizei height) OVERRIDE; +virtual void CompressedTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLsizei imageSize, + const void* data) OVERRIDE; +virtual void CompressedTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLsizei imageSize, + const void* data) OVERRIDE; +virtual void CopyTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLint border) OVERRIDE; +virtual void CopyTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLint x, + GLint y, + GLsizei width, + GLsizei height) OVERRIDE; virtual GLuint CreateProgram() OVERRIDE; virtual GLuint CreateShader(GLenum type) OVERRIDE; virtual void CullFace(GLenum mode) OVERRIDE; virtual void DeleteBuffers(GLsizei n, const GLuint* buffers) OVERRIDE; -virtual void DeleteFramebuffers( - GLsizei n, const GLuint* framebuffers) OVERRIDE; +virtual void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers) OVERRIDE; virtual void DeleteProgram(GLuint program) OVERRIDE; -virtual void DeleteRenderbuffers( - GLsizei n, const GLuint* renderbuffers) OVERRIDE; +virtual void DeleteRenderbuffers(GLsizei n, + const GLuint* renderbuffers) OVERRIDE; virtual void DeleteShader(GLuint shader) OVERRIDE; virtual void DeleteTextures(GLsizei n, const GLuint* textures) OVERRIDE; virtual void DepthFunc(GLenum func) OVERRIDE; @@ -71,72 +103,103 @@ virtual void DetachShader(GLuint program, GLuint shader) OVERRIDE; virtual void Disable(GLenum cap) OVERRIDE; virtual void DisableVertexAttribArray(GLuint index) OVERRIDE; virtual void DrawArrays(GLenum mode, GLint first, GLsizei count) OVERRIDE; -virtual void DrawElements( - GLenum mode, GLsizei count, GLenum type, const void* indices) OVERRIDE; +virtual void DrawElements(GLenum mode, + GLsizei count, + GLenum type, + const void* indices) OVERRIDE; virtual void Enable(GLenum cap) OVERRIDE; virtual void EnableVertexAttribArray(GLuint index) OVERRIDE; virtual void Finish() OVERRIDE; virtual void Flush() OVERRIDE; -virtual void FramebufferRenderbuffer( - GLenum target, GLenum attachment, GLenum renderbuffertarget, - GLuint renderbuffer) OVERRIDE; -virtual void FramebufferTexture2D( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level) OVERRIDE; +virtual void FramebufferRenderbuffer(GLenum target, + GLenum attachment, + GLenum renderbuffertarget, + GLuint renderbuffer) OVERRIDE; +virtual void FramebufferTexture2D(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level) OVERRIDE; virtual void FrontFace(GLenum mode) OVERRIDE; virtual void GenBuffers(GLsizei n, GLuint* buffers) OVERRIDE; virtual void GenerateMipmap(GLenum target) OVERRIDE; virtual void GenFramebuffers(GLsizei n, GLuint* framebuffers) OVERRIDE; virtual void GenRenderbuffers(GLsizei n, GLuint* renderbuffers) OVERRIDE; virtual void GenTextures(GLsizei n, GLuint* textures) OVERRIDE; -virtual void GetActiveAttrib( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) OVERRIDE; -virtual void GetActiveUniform( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) OVERRIDE; -virtual void GetAttachedShaders( - GLuint program, GLsizei maxcount, GLsizei* count, - GLuint* shaders) OVERRIDE; +virtual void GetActiveAttrib(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) OVERRIDE; +virtual void GetActiveUniform(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) OVERRIDE; +virtual void GetAttachedShaders(GLuint program, + GLsizei maxcount, + GLsizei* count, + GLuint* shaders) OVERRIDE; virtual GLint GetAttribLocation(GLuint program, const char* name) OVERRIDE; virtual void GetBooleanv(GLenum pname, GLboolean* params) OVERRIDE; -virtual void GetBufferParameteriv( - GLenum target, GLenum pname, GLint* params) OVERRIDE; +virtual void GetBufferParameteriv(GLenum target, + GLenum pname, + GLint* params) OVERRIDE; virtual GLenum GetError() OVERRIDE; virtual void GetFloatv(GLenum pname, GLfloat* params) OVERRIDE; -virtual void GetFramebufferAttachmentParameteriv( - GLenum target, GLenum attachment, GLenum pname, GLint* params) OVERRIDE; +virtual void GetFramebufferAttachmentParameteriv(GLenum target, + GLenum attachment, + GLenum pname, + GLint* params) OVERRIDE; virtual void GetIntegerv(GLenum pname, GLint* params) OVERRIDE; -virtual void GetProgramiv( - GLuint program, GLenum pname, GLint* params) OVERRIDE; -virtual void GetProgramInfoLog( - GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) OVERRIDE; -virtual void GetRenderbufferParameteriv( - GLenum target, GLenum pname, GLint* params) OVERRIDE; +virtual void GetProgramiv(GLuint program, GLenum pname, GLint* params) OVERRIDE; +virtual void GetProgramInfoLog(GLuint program, + GLsizei bufsize, + GLsizei* length, + char* infolog) OVERRIDE; +virtual void GetRenderbufferParameteriv(GLenum target, + GLenum pname, + GLint* params) OVERRIDE; virtual void GetShaderiv(GLuint shader, GLenum pname, GLint* params) OVERRIDE; -virtual void GetShaderInfoLog( - GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) OVERRIDE; -virtual void GetShaderPrecisionFormat( - GLenum shadertype, GLenum precisiontype, GLint* range, - GLint* precision) OVERRIDE; -virtual void GetShaderSource( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) OVERRIDE; +virtual void GetShaderInfoLog(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* infolog) OVERRIDE; +virtual void GetShaderPrecisionFormat(GLenum shadertype, + GLenum precisiontype, + GLint* range, + GLint* precision) OVERRIDE; +virtual void GetShaderSource(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) OVERRIDE; virtual const GLubyte* GetString(GLenum name) OVERRIDE; -virtual void GetTexParameterfv( - GLenum target, GLenum pname, GLfloat* params) OVERRIDE; -virtual void GetTexParameteriv( - GLenum target, GLenum pname, GLint* params) OVERRIDE; -virtual void GetUniformfv( - GLuint program, GLint location, GLfloat* params) OVERRIDE; -virtual void GetUniformiv( - GLuint program, GLint location, GLint* params) OVERRIDE; +virtual void GetTexParameterfv(GLenum target, + GLenum pname, + GLfloat* params) OVERRIDE; +virtual void GetTexParameteriv(GLenum target, + GLenum pname, + GLint* params) OVERRIDE; +virtual void GetUniformfv(GLuint program, + GLint location, + GLfloat* params) OVERRIDE; +virtual void GetUniformiv(GLuint program, + GLint location, + GLint* params) OVERRIDE; virtual GLint GetUniformLocation(GLuint program, const char* name) OVERRIDE; -virtual void GetVertexAttribfv( - GLuint index, GLenum pname, GLfloat* params) OVERRIDE; -virtual void GetVertexAttribiv( - GLuint index, GLenum pname, GLint* params) OVERRIDE; -virtual void GetVertexAttribPointerv( - GLuint index, GLenum pname, void** pointer) OVERRIDE; +virtual void GetVertexAttribfv(GLuint index, + GLenum pname, + GLfloat* params) OVERRIDE; +virtual void GetVertexAttribiv(GLuint index, + GLenum pname, + GLint* params) OVERRIDE; +virtual void GetVertexAttribPointerv(GLuint index, + GLenum pname, + void** pointer) OVERRIDE; virtual void Hint(GLenum target, GLenum mode) OVERRIDE; virtual GLboolean IsBuffer(GLuint buffer) OVERRIDE; virtual GLboolean IsEnabled(GLenum cap) OVERRIDE; @@ -149,125 +212,182 @@ virtual void LineWidth(GLfloat width) OVERRIDE; virtual void LinkProgram(GLuint program) OVERRIDE; virtual void PixelStorei(GLenum pname, GLint param) OVERRIDE; virtual void PolygonOffset(GLfloat factor, GLfloat units) OVERRIDE; -virtual void ReadPixels( - GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, - void* pixels) OVERRIDE; +virtual void ReadPixels(GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + void* pixels) OVERRIDE; virtual void ReleaseShaderCompiler() OVERRIDE; -virtual void RenderbufferStorage( - GLenum target, GLenum internalformat, GLsizei width, - GLsizei height) OVERRIDE; +virtual void RenderbufferStorage(GLenum target, + GLenum internalformat, + GLsizei width, + GLsizei height) OVERRIDE; virtual void SampleCoverage(GLclampf value, GLboolean invert) OVERRIDE; virtual void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) OVERRIDE; -virtual void ShaderBinary( - GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, - GLsizei length) OVERRIDE; -virtual void ShaderSource( - GLuint shader, GLsizei count, const GLchar* const* str, - const GLint* length) OVERRIDE; +virtual void ShaderBinary(GLsizei n, + const GLuint* shaders, + GLenum binaryformat, + const void* binary, + GLsizei length) OVERRIDE; +virtual void ShaderSource(GLuint shader, + GLsizei count, + const GLchar* const* str, + const GLint* length) OVERRIDE; virtual void ShallowFinishCHROMIUM() OVERRIDE; virtual void ShallowFlushCHROMIUM() OVERRIDE; virtual void StencilFunc(GLenum func, GLint ref, GLuint mask) OVERRIDE; -virtual void StencilFuncSeparate( - GLenum face, GLenum func, GLint ref, GLuint mask) OVERRIDE; +virtual void StencilFuncSeparate(GLenum face, + GLenum func, + GLint ref, + GLuint mask) OVERRIDE; virtual void StencilMask(GLuint mask) OVERRIDE; virtual void StencilMaskSeparate(GLenum face, GLuint mask) OVERRIDE; virtual void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) OVERRIDE; -virtual void StencilOpSeparate( - GLenum face, GLenum fail, GLenum zfail, GLenum zpass) OVERRIDE; -virtual void TexImage2D( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) OVERRIDE; -virtual void TexParameterf( - GLenum target, GLenum pname, GLfloat param) OVERRIDE; -virtual void TexParameterfv( - GLenum target, GLenum pname, const GLfloat* params) OVERRIDE; +virtual void StencilOpSeparate(GLenum face, + GLenum fail, + GLenum zfail, + GLenum zpass) OVERRIDE; +virtual void TexImage2D(GLenum target, + GLint level, + GLint internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) OVERRIDE; +virtual void TexParameterf(GLenum target, GLenum pname, GLfloat param) OVERRIDE; +virtual void TexParameterfv(GLenum target, + GLenum pname, + const GLfloat* params) OVERRIDE; virtual void TexParameteri(GLenum target, GLenum pname, GLint param) OVERRIDE; -virtual void TexParameteriv( - GLenum target, GLenum pname, const GLint* params) OVERRIDE; -virtual void TexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* pixels) OVERRIDE; +virtual void TexParameteriv(GLenum target, + GLenum pname, + const GLint* params) OVERRIDE; +virtual void TexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* pixels) OVERRIDE; virtual void Uniform1f(GLint location, GLfloat x) OVERRIDE; -virtual void Uniform1fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; +virtual void Uniform1fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; virtual void Uniform1i(GLint location, GLint x) OVERRIDE; -virtual void Uniform1iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void Uniform1iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; virtual void Uniform2f(GLint location, GLfloat x, GLfloat y) OVERRIDE; -virtual void Uniform2fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; +virtual void Uniform2fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; virtual void Uniform2i(GLint location, GLint x, GLint y) OVERRIDE; -virtual void Uniform2iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; -virtual void Uniform3f( - GLint location, GLfloat x, GLfloat y, GLfloat z) OVERRIDE; -virtual void Uniform3fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; +virtual void Uniform2iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void Uniform3f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z) OVERRIDE; +virtual void Uniform3fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; virtual void Uniform3i(GLint location, GLint x, GLint y, GLint z) OVERRIDE; -virtual void Uniform3iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; -virtual void Uniform4f( - GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) OVERRIDE; -virtual void Uniform4fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; -virtual void Uniform4i( - GLint location, GLint x, GLint y, GLint z, GLint w) OVERRIDE; -virtual void Uniform4iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; -virtual void UniformMatrix2fv( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) OVERRIDE; -virtual void UniformMatrix3fv( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) OVERRIDE; -virtual void UniformMatrix4fv( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) OVERRIDE; +virtual void Uniform3iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void Uniform4f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) OVERRIDE; +virtual void Uniform4fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; +virtual void Uniform4i(GLint location, + GLint x, + GLint y, + GLint z, + GLint w) OVERRIDE; +virtual void Uniform4iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void UniformMatrix2fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) OVERRIDE; +virtual void UniformMatrix3fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) OVERRIDE; +virtual void UniformMatrix4fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) OVERRIDE; virtual void UseProgram(GLuint program) OVERRIDE; virtual void ValidateProgram(GLuint program) OVERRIDE; virtual void VertexAttrib1f(GLuint indx, GLfloat x) OVERRIDE; virtual void VertexAttrib1fv(GLuint indx, const GLfloat* values) OVERRIDE; virtual void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) OVERRIDE; virtual void VertexAttrib2fv(GLuint indx, const GLfloat* values) OVERRIDE; -virtual void VertexAttrib3f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z) OVERRIDE; +virtual void VertexAttrib3f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z) OVERRIDE; virtual void VertexAttrib3fv(GLuint indx, const GLfloat* values) OVERRIDE; -virtual void VertexAttrib4f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) OVERRIDE; +virtual void VertexAttrib4f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) OVERRIDE; virtual void VertexAttrib4fv(GLuint indx, const GLfloat* values) OVERRIDE; -virtual void VertexAttribPointer( - GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, - const void* ptr) OVERRIDE; -virtual void Viewport( - GLint x, GLint y, GLsizei width, GLsizei height) OVERRIDE; -virtual void BlitFramebufferCHROMIUM( - GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, - GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, - GLenum filter) OVERRIDE; -virtual void RenderbufferStorageMultisampleCHROMIUM( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) OVERRIDE; -virtual void RenderbufferStorageMultisampleEXT( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) OVERRIDE; -virtual void FramebufferTexture2DMultisampleEXT( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level, GLsizei samples) OVERRIDE; -virtual void TexStorage2DEXT( - GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, - GLsizei height) OVERRIDE; +virtual void VertexAttribPointer(GLuint indx, + GLint size, + GLenum type, + GLboolean normalized, + GLsizei stride, + const void* ptr) OVERRIDE; +virtual void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) OVERRIDE; +virtual void BlitFramebufferCHROMIUM(GLint srcX0, + GLint srcY0, + GLint srcX1, + GLint srcY1, + GLint dstX0, + GLint dstY0, + GLint dstX1, + GLint dstY1, + GLbitfield mask, + GLenum filter) OVERRIDE; +virtual void RenderbufferStorageMultisampleCHROMIUM(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) OVERRIDE; +virtual void RenderbufferStorageMultisampleEXT(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) OVERRIDE; +virtual void FramebufferTexture2DMultisampleEXT(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level, + GLsizei samples) OVERRIDE; +virtual void TexStorage2DEXT(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height) OVERRIDE; virtual void GenQueriesEXT(GLsizei n, GLuint* queries) OVERRIDE; virtual void DeleteQueriesEXT(GLsizei n, const GLuint* queries) OVERRIDE; virtual GLboolean IsQueryEXT(GLuint id) OVERRIDE; virtual void BeginQueryEXT(GLenum target, GLuint id) OVERRIDE; virtual void EndQueryEXT(GLenum target) OVERRIDE; -virtual void GetQueryivEXT( - GLenum target, GLenum pname, GLint* params) OVERRIDE; -virtual void GetQueryObjectuivEXT( - GLuint id, GLenum pname, GLuint* params) OVERRIDE; -virtual void InsertEventMarkerEXT( - GLsizei length, const GLchar* marker) OVERRIDE; +virtual void GetQueryivEXT(GLenum target, GLenum pname, GLint* params) OVERRIDE; +virtual void GetQueryObjectuivEXT(GLuint id, + GLenum pname, + GLuint* params) OVERRIDE; +virtual void InsertEventMarkerEXT(GLsizei length, + const GLchar* marker) OVERRIDE; virtual void PushGroupMarkerEXT(GLsizei length, const GLchar* marker) OVERRIDE; virtual void PopGroupMarkerEXT() OVERRIDE; virtual void GenVertexArraysOES(GLsizei n, GLuint* arrays) OVERRIDE; @@ -275,84 +395,146 @@ virtual void DeleteVertexArraysOES(GLsizei n, const GLuint* arrays) OVERRIDE; virtual GLboolean IsVertexArrayOES(GLuint array) OVERRIDE; virtual void BindVertexArrayOES(GLuint array) OVERRIDE; virtual void SwapBuffers() OVERRIDE; -virtual GLuint GetMaxValueInBufferCHROMIUM( - GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) OVERRIDE; -virtual void GenSharedIdsCHROMIUM( - GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) OVERRIDE; -virtual void DeleteSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) OVERRIDE; -virtual void RegisterSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) OVERRIDE; +virtual GLuint GetMaxValueInBufferCHROMIUM(GLuint buffer_id, + GLsizei count, + GLenum type, + GLuint offset) OVERRIDE; +virtual void GenSharedIdsCHROMIUM(GLuint namespace_id, + GLuint id_offset, + GLsizei n, + GLuint* ids) OVERRIDE; +virtual void DeleteSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) OVERRIDE; +virtual void RegisterSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) OVERRIDE; virtual GLboolean EnableFeatureCHROMIUM(const char* feature) OVERRIDE; virtual void* MapBufferCHROMIUM(GLuint target, GLenum access) OVERRIDE; virtual GLboolean UnmapBufferCHROMIUM(GLuint target) OVERRIDE; -virtual void* MapImageCHROMIUM(GLuint image_id, GLenum access) OVERRIDE; +virtual void* MapImageCHROMIUM(GLuint image_id) OVERRIDE; virtual void UnmapImageCHROMIUM(GLuint image_id) OVERRIDE; -virtual void* MapBufferSubDataCHROMIUM( - GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) OVERRIDE; +virtual void* MapBufferSubDataCHROMIUM(GLuint target, + GLintptr offset, + GLsizeiptr size, + GLenum access) OVERRIDE; virtual void UnmapBufferSubDataCHROMIUM(const void* mem) OVERRIDE; -virtual void* MapTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, GLenum access) OVERRIDE; +virtual void* MapTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + GLenum access) OVERRIDE; virtual void UnmapTexSubImage2DCHROMIUM(const void* mem) OVERRIDE; -virtual void ResizeCHROMIUM( - GLuint width, GLuint height, GLfloat scale_factor) OVERRIDE; +virtual void ResizeCHROMIUM(GLuint width, + GLuint height, + GLfloat scale_factor) OVERRIDE; virtual const GLchar* GetRequestableExtensionsCHROMIUM() OVERRIDE; virtual void RequestExtensionCHROMIUM(const char* extension) OVERRIDE; virtual void RateLimitOffscreenContextCHROMIUM() OVERRIDE; -virtual void GetMultipleIntegervCHROMIUM( - const GLenum* pnames, GLuint count, GLint* results, - GLsizeiptr size) OVERRIDE; -virtual void GetProgramInfoCHROMIUM( - GLuint program, GLsizei bufsize, GLsizei* size, void* info) OVERRIDE; +virtual void GetMultipleIntegervCHROMIUM(const GLenum* pnames, + GLuint count, + GLint* results, + GLsizeiptr size) OVERRIDE; +virtual void GetProgramInfoCHROMIUM(GLuint program, + GLsizei bufsize, + GLsizei* size, + void* info) OVERRIDE; virtual GLuint CreateStreamTextureCHROMIUM(GLuint texture) OVERRIDE; -virtual void DestroyStreamTextureCHROMIUM(GLuint texture) OVERRIDE; -virtual GLuint CreateImageCHROMIUM( - GLsizei width, GLsizei height, GLenum internalformat) OVERRIDE; +virtual GLuint CreateImageCHROMIUM(GLsizei width, + GLsizei height, + GLenum internalformat, + GLenum usage) OVERRIDE; virtual void DestroyImageCHROMIUM(GLuint image_id) OVERRIDE; -virtual void GetImageParameterivCHROMIUM( - GLuint image_id, GLenum pname, GLint* params) OVERRIDE; -virtual void GetTranslatedShaderSourceANGLE( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) OVERRIDE; -virtual void PostSubBufferCHROMIUM( - GLint x, GLint y, GLint width, GLint height) OVERRIDE; -virtual void TexImageIOSurface2DCHROMIUM( - GLenum target, GLsizei width, GLsizei height, GLuint ioSurfaceId, - GLuint plane) OVERRIDE; -virtual void CopyTextureCHROMIUM( - GLenum target, GLenum source_id, GLenum dest_id, GLint level, - GLint internalformat, GLenum dest_type) OVERRIDE; -virtual void DrawArraysInstancedANGLE( - GLenum mode, GLint first, GLsizei count, GLsizei primcount) OVERRIDE; -virtual void DrawElementsInstancedANGLE( - GLenum mode, GLsizei count, GLenum type, const void* indices, - GLsizei primcount) OVERRIDE; +virtual void GetImageParameterivCHROMIUM(GLuint image_id, + GLenum pname, + GLint* params) OVERRIDE; +virtual void GetTranslatedShaderSourceANGLE(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) OVERRIDE; +virtual void PostSubBufferCHROMIUM(GLint x, + GLint y, + GLint width, + GLint height) OVERRIDE; +virtual void TexImageIOSurface2DCHROMIUM(GLenum target, + GLsizei width, + GLsizei height, + GLuint ioSurfaceId, + GLuint plane) OVERRIDE; +virtual void CopyTextureCHROMIUM(GLenum target, + GLenum source_id, + GLenum dest_id, + GLint level, + GLint internalformat, + GLenum dest_type) OVERRIDE; +virtual void DrawArraysInstancedANGLE(GLenum mode, + GLint first, + GLsizei count, + GLsizei primcount) OVERRIDE; +virtual void DrawElementsInstancedANGLE(GLenum mode, + GLsizei count, + GLenum type, + const void* indices, + GLsizei primcount) OVERRIDE; virtual void VertexAttribDivisorANGLE(GLuint index, GLuint divisor) OVERRIDE; virtual void GenMailboxCHROMIUM(GLbyte* mailbox) OVERRIDE; -virtual void ProduceTextureCHROMIUM( - GLenum target, const GLbyte* mailbox) OVERRIDE; -virtual void ConsumeTextureCHROMIUM( - GLenum target, const GLbyte* mailbox) OVERRIDE; -virtual void BindUniformLocationCHROMIUM( - GLuint program, GLint location, const char* name) OVERRIDE; +virtual void ProduceTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) OVERRIDE; +virtual void ProduceTextureDirectCHROMIUM(GLuint texture, + GLenum target, + const GLbyte* mailbox) OVERRIDE; +virtual void ConsumeTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) OVERRIDE; +virtual GLuint CreateAndConsumeTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) OVERRIDE; +virtual void BindUniformLocationCHROMIUM(GLuint program, + GLint location, + const char* name) OVERRIDE; virtual void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) OVERRIDE; virtual void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) OVERRIDE; virtual void TraceBeginCHROMIUM(const char* name) OVERRIDE; virtual void TraceEndCHROMIUM() OVERRIDE; -virtual void AsyncTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* data) OVERRIDE; -virtual void AsyncTexImage2DCHROMIUM( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) OVERRIDE; +virtual void AsyncTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* data) OVERRIDE; +virtual void AsyncTexImage2DCHROMIUM(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) OVERRIDE; virtual void WaitAsyncTexImage2DCHROMIUM(GLenum target) OVERRIDE; -virtual void DiscardFramebufferEXT( - GLenum target, GLsizei count, const GLenum* attachments) OVERRIDE; +virtual void WaitAllAsyncTexImage2DCHROMIUM() OVERRIDE; +virtual void DiscardFramebufferEXT(GLenum target, + GLsizei count, + const GLenum* attachments) OVERRIDE; virtual void LoseContextCHROMIUM(GLenum current, GLenum other) OVERRIDE; virtual GLuint InsertSyncPointCHROMIUM() OVERRIDE; virtual void WaitSyncPointCHROMIUM(GLuint sync_point) OVERRIDE; virtual void DrawBuffersEXT(GLsizei count, const GLenum* bufs) OVERRIDE; virtual void DiscardBackbufferCHROMIUM() OVERRIDE; +virtual void ScheduleOverlayPlaneCHROMIUM(GLint plane_z_order, + GLenum plane_transform, + GLuint overlay_texture_id, + GLint bounds_x, + GLint bounds_y, + GLint bounds_width, + GLint bounds_height, + GLfloat uv_x, + GLfloat uv_y, + GLfloat uv_width, + GLfloat uv_height) OVERRIDE; #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_INTERFACE_STUB_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/chromium/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h index e6a26d43d40..4e83921be4e 100644 --- a/chromium/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h +++ b/chromium/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // This file is included by gles2_interface_stub.cc. @@ -12,85 +14,108 @@ void GLES2InterfaceStub::ActiveTexture(GLenum /* texture */) { } -void GLES2InterfaceStub::AttachShader( - GLuint /* program */, GLuint /* shader */) { +void GLES2InterfaceStub::AttachShader(GLuint /* program */, + GLuint /* shader */) { } -void GLES2InterfaceStub::BindAttribLocation( - GLuint /* program */, GLuint /* index */, const char* /* name */) { +void GLES2InterfaceStub::BindAttribLocation(GLuint /* program */, + GLuint /* index */, + const char* /* name */) { } void GLES2InterfaceStub::BindBuffer(GLenum /* target */, GLuint /* buffer */) { } -void GLES2InterfaceStub::BindFramebuffer( - GLenum /* target */, GLuint /* framebuffer */) { +void GLES2InterfaceStub::BindFramebuffer(GLenum /* target */, + GLuint /* framebuffer */) { } -void GLES2InterfaceStub::BindRenderbuffer( - GLenum /* target */, GLuint /* renderbuffer */) { +void GLES2InterfaceStub::BindRenderbuffer(GLenum /* target */, + GLuint /* renderbuffer */) { } -void GLES2InterfaceStub::BindTexture( - GLenum /* target */, GLuint /* texture */) { +void GLES2InterfaceStub::BindTexture(GLenum /* target */, + GLuint /* texture */) { } -void GLES2InterfaceStub::BlendColor( - GLclampf /* red */, GLclampf /* green */, GLclampf /* blue */, - GLclampf /* alpha */) { +void GLES2InterfaceStub::BlendColor(GLclampf /* red */, + GLclampf /* green */, + GLclampf /* blue */, + GLclampf /* alpha */) { } void GLES2InterfaceStub::BlendEquation(GLenum /* mode */) { } -void GLES2InterfaceStub::BlendEquationSeparate( - GLenum /* modeRGB */, GLenum /* modeAlpha */) { +void GLES2InterfaceStub::BlendEquationSeparate(GLenum /* modeRGB */, + GLenum /* modeAlpha */) { } -void GLES2InterfaceStub::BlendFunc( - GLenum /* sfactor */, GLenum /* dfactor */) { +void GLES2InterfaceStub::BlendFunc(GLenum /* sfactor */, GLenum /* dfactor */) { } -void GLES2InterfaceStub::BlendFuncSeparate( - GLenum /* srcRGB */, GLenum /* dstRGB */, GLenum /* srcAlpha */, - GLenum /* dstAlpha */) { +void GLES2InterfaceStub::BlendFuncSeparate(GLenum /* srcRGB */, + GLenum /* dstRGB */, + GLenum /* srcAlpha */, + GLenum /* dstAlpha */) { } -void GLES2InterfaceStub::BufferData( - GLenum /* target */, GLsizeiptr /* size */, const void* /* data */, - GLenum /* usage */) { +void GLES2InterfaceStub::BufferData(GLenum /* target */, + GLsizeiptr /* size */, + const void* /* data */, + GLenum /* usage */) { } -void GLES2InterfaceStub::BufferSubData( - GLenum /* target */, GLintptr /* offset */, GLsizeiptr /* size */, - const void* /* data */) { +void GLES2InterfaceStub::BufferSubData(GLenum /* target */, + GLintptr /* offset */, + GLsizeiptr /* size */, + const void* /* data */) { } GLenum GLES2InterfaceStub::CheckFramebufferStatus(GLenum /* target */) { return 0; } void GLES2InterfaceStub::Clear(GLbitfield /* mask */) { } -void GLES2InterfaceStub::ClearColor( - GLclampf /* red */, GLclampf /* green */, GLclampf /* blue */, - GLclampf /* alpha */) { +void GLES2InterfaceStub::ClearColor(GLclampf /* red */, + GLclampf /* green */, + GLclampf /* blue */, + GLclampf /* alpha */) { } void GLES2InterfaceStub::ClearDepthf(GLclampf /* depth */) { } void GLES2InterfaceStub::ClearStencil(GLint /* s */) { } -void GLES2InterfaceStub::ColorMask( - GLboolean /* red */, GLboolean /* green */, GLboolean /* blue */, - GLboolean /* alpha */) { +void GLES2InterfaceStub::ColorMask(GLboolean /* red */, + GLboolean /* green */, + GLboolean /* blue */, + GLboolean /* alpha */) { } void GLES2InterfaceStub::CompileShader(GLuint /* shader */) { } -void GLES2InterfaceStub::CompressedTexImage2D( - GLenum /* target */, GLint /* level */, GLenum /* internalformat */, - GLsizei /* width */, GLsizei /* height */, GLint /* border */, - GLsizei /* imageSize */, const void* /* data */) { -} -void GLES2InterfaceStub::CompressedTexSubImage2D( - GLenum /* target */, GLint /* level */, GLint /* xoffset */, - GLint /* yoffset */, GLsizei /* width */, GLsizei /* height */, - GLenum /* format */, GLsizei /* imageSize */, const void* /* data */) { -} -void GLES2InterfaceStub::CopyTexImage2D( - GLenum /* target */, GLint /* level */, GLenum /* internalformat */, - GLint /* x */, GLint /* y */, GLsizei /* width */, GLsizei /* height */, - GLint /* border */) { -} -void GLES2InterfaceStub::CopyTexSubImage2D( - GLenum /* target */, GLint /* level */, GLint /* xoffset */, - GLint /* yoffset */, GLint /* x */, GLint /* y */, GLsizei /* width */, - GLsizei /* height */) { +void GLES2InterfaceStub::CompressedTexImage2D(GLenum /* target */, + GLint /* level */, + GLenum /* internalformat */, + GLsizei /* width */, + GLsizei /* height */, + GLint /* border */, + GLsizei /* imageSize */, + const void* /* data */) { +} +void GLES2InterfaceStub::CompressedTexSubImage2D(GLenum /* target */, + GLint /* level */, + GLint /* xoffset */, + GLint /* yoffset */, + GLsizei /* width */, + GLsizei /* height */, + GLenum /* format */, + GLsizei /* imageSize */, + const void* /* data */) { +} +void GLES2InterfaceStub::CopyTexImage2D(GLenum /* target */, + GLint /* level */, + GLenum /* internalformat */, + GLint /* x */, + GLint /* y */, + GLsizei /* width */, + GLsizei /* height */, + GLint /* border */) { +} +void GLES2InterfaceStub::CopyTexSubImage2D(GLenum /* target */, + GLint /* level */, + GLint /* xoffset */, + GLint /* yoffset */, + GLint /* x */, + GLint /* y */, + GLsizei /* width */, + GLsizei /* height */) { } GLuint GLES2InterfaceStub::CreateProgram() { return 0; @@ -100,42 +125,45 @@ GLuint GLES2InterfaceStub::CreateShader(GLenum /* type */) { } void GLES2InterfaceStub::CullFace(GLenum /* mode */) { } -void GLES2InterfaceStub::DeleteBuffers( - GLsizei /* n */, const GLuint* /* buffers */) { +void GLES2InterfaceStub::DeleteBuffers(GLsizei /* n */, + const GLuint* /* buffers */) { } -void GLES2InterfaceStub::DeleteFramebuffers( - GLsizei /* n */, const GLuint* /* framebuffers */) { +void GLES2InterfaceStub::DeleteFramebuffers(GLsizei /* n */, + const GLuint* /* framebuffers */) { } void GLES2InterfaceStub::DeleteProgram(GLuint /* program */) { } void GLES2InterfaceStub::DeleteRenderbuffers( - GLsizei /* n */, const GLuint* /* renderbuffers */) { + GLsizei /* n */, + const GLuint* /* renderbuffers */) { } void GLES2InterfaceStub::DeleteShader(GLuint /* shader */) { } -void GLES2InterfaceStub::DeleteTextures( - GLsizei /* n */, const GLuint* /* textures */) { +void GLES2InterfaceStub::DeleteTextures(GLsizei /* n */, + const GLuint* /* textures */) { } void GLES2InterfaceStub::DepthFunc(GLenum /* func */) { } void GLES2InterfaceStub::DepthMask(GLboolean /* flag */) { } -void GLES2InterfaceStub::DepthRangef( - GLclampf /* zNear */, GLclampf /* zFar */) { +void GLES2InterfaceStub::DepthRangef(GLclampf /* zNear */, + GLclampf /* zFar */) { } -void GLES2InterfaceStub::DetachShader( - GLuint /* program */, GLuint /* shader */) { +void GLES2InterfaceStub::DetachShader(GLuint /* program */, + GLuint /* shader */) { } void GLES2InterfaceStub::Disable(GLenum /* cap */) { } void GLES2InterfaceStub::DisableVertexAttribArray(GLuint /* index */) { } -void GLES2InterfaceStub::DrawArrays( - GLenum /* mode */, GLint /* first */, GLsizei /* count */) { +void GLES2InterfaceStub::DrawArrays(GLenum /* mode */, + GLint /* first */, + GLsizei /* count */) { } -void GLES2InterfaceStub::DrawElements( - GLenum /* mode */, GLsizei /* count */, GLenum /* type */, - const void* /* indices */) { +void GLES2InterfaceStub::DrawElements(GLenum /* mode */, + GLsizei /* count */, + GLenum /* type */, + const void* /* indices */) { } void GLES2InterfaceStub::Enable(GLenum /* cap */) { } @@ -146,12 +174,16 @@ void GLES2InterfaceStub::Finish() { void GLES2InterfaceStub::Flush() { } void GLES2InterfaceStub::FramebufferRenderbuffer( - GLenum /* target */, GLenum /* attachment */, - GLenum /* renderbuffertarget */, GLuint /* renderbuffer */) { + GLenum /* target */, + GLenum /* attachment */, + GLenum /* renderbuffertarget */, + GLuint /* renderbuffer */) { } -void GLES2InterfaceStub::FramebufferTexture2D( - GLenum /* target */, GLenum /* attachment */, GLenum /* textarget */, - GLuint /* texture */, GLint /* level */) { +void GLES2InterfaceStub::FramebufferTexture2D(GLenum /* target */, + GLenum /* attachment */, + GLenum /* textarget */, + GLuint /* texture */, + GLint /* level */) { } void GLES2InterfaceStub::FrontFace(GLenum /* mode */) { } @@ -159,37 +191,45 @@ void GLES2InterfaceStub::GenBuffers(GLsizei /* n */, GLuint* /* buffers */) { } void GLES2InterfaceStub::GenerateMipmap(GLenum /* target */) { } -void GLES2InterfaceStub::GenFramebuffers( - GLsizei /* n */, GLuint* /* framebuffers */) { +void GLES2InterfaceStub::GenFramebuffers(GLsizei /* n */, + GLuint* /* framebuffers */) { } -void GLES2InterfaceStub::GenRenderbuffers( - GLsizei /* n */, GLuint* /* renderbuffers */) { +void GLES2InterfaceStub::GenRenderbuffers(GLsizei /* n */, + GLuint* /* renderbuffers */) { } void GLES2InterfaceStub::GenTextures(GLsizei /* n */, GLuint* /* textures */) { } -void GLES2InterfaceStub::GetActiveAttrib( - GLuint /* program */, GLuint /* index */, GLsizei /* bufsize */, - GLsizei* /* length */, GLint* /* size */, GLenum* /* type */, - char* /* name */) { -} -void GLES2InterfaceStub::GetActiveUniform( - GLuint /* program */, GLuint /* index */, GLsizei /* bufsize */, - GLsizei* /* length */, GLint* /* size */, GLenum* /* type */, - char* /* name */) { -} -void GLES2InterfaceStub::GetAttachedShaders( - GLuint /* program */, GLsizei /* maxcount */, GLsizei* /* count */, - GLuint* /* shaders */) { -} -GLint GLES2InterfaceStub::GetAttribLocation( - GLuint /* program */, const char* /* name */) { +void GLES2InterfaceStub::GetActiveAttrib(GLuint /* program */, + GLuint /* index */, + GLsizei /* bufsize */, + GLsizei* /* length */, + GLint* /* size */, + GLenum* /* type */, + char* /* name */) { +} +void GLES2InterfaceStub::GetActiveUniform(GLuint /* program */, + GLuint /* index */, + GLsizei /* bufsize */, + GLsizei* /* length */, + GLint* /* size */, + GLenum* /* type */, + char* /* name */) { +} +void GLES2InterfaceStub::GetAttachedShaders(GLuint /* program */, + GLsizei /* maxcount */, + GLsizei* /* count */, + GLuint* /* shaders */) { +} +GLint GLES2InterfaceStub::GetAttribLocation(GLuint /* program */, + const char* /* name */) { return 0; } -void GLES2InterfaceStub::GetBooleanv( - GLenum /* pname */, GLboolean* /* params */) { +void GLES2InterfaceStub::GetBooleanv(GLenum /* pname */, + GLboolean* /* params */) { } -void GLES2InterfaceStub::GetBufferParameteriv( - GLenum /* target */, GLenum /* pname */, GLint* /* params */) { +void GLES2InterfaceStub::GetBufferParameteriv(GLenum /* target */, + GLenum /* pname */, + GLint* /* params */) { } GLenum GLES2InterfaceStub::GetError() { return 0; @@ -197,63 +237,79 @@ GLenum GLES2InterfaceStub::GetError() { void GLES2InterfaceStub::GetFloatv(GLenum /* pname */, GLfloat* /* params */) { } void GLES2InterfaceStub::GetFramebufferAttachmentParameteriv( - GLenum /* target */, GLenum /* attachment */, GLenum /* pname */, + GLenum /* target */, + GLenum /* attachment */, + GLenum /* pname */, GLint* /* params */) { } void GLES2InterfaceStub::GetIntegerv(GLenum /* pname */, GLint* /* params */) { } -void GLES2InterfaceStub::GetProgramiv( - GLuint /* program */, GLenum /* pname */, GLint* /* params */) { +void GLES2InterfaceStub::GetProgramiv(GLuint /* program */, + GLenum /* pname */, + GLint* /* params */) { } -void GLES2InterfaceStub::GetProgramInfoLog( - GLuint /* program */, GLsizei /* bufsize */, GLsizei* /* length */, - char* /* infolog */) { +void GLES2InterfaceStub::GetProgramInfoLog(GLuint /* program */, + GLsizei /* bufsize */, + GLsizei* /* length */, + char* /* infolog */) { } -void GLES2InterfaceStub::GetRenderbufferParameteriv( - GLenum /* target */, GLenum /* pname */, GLint* /* params */) { +void GLES2InterfaceStub::GetRenderbufferParameteriv(GLenum /* target */, + GLenum /* pname */, + GLint* /* params */) { } -void GLES2InterfaceStub::GetShaderiv( - GLuint /* shader */, GLenum /* pname */, GLint* /* params */) { +void GLES2InterfaceStub::GetShaderiv(GLuint /* shader */, + GLenum /* pname */, + GLint* /* params */) { } -void GLES2InterfaceStub::GetShaderInfoLog( - GLuint /* shader */, GLsizei /* bufsize */, GLsizei* /* length */, - char* /* infolog */) { +void GLES2InterfaceStub::GetShaderInfoLog(GLuint /* shader */, + GLsizei /* bufsize */, + GLsizei* /* length */, + char* /* infolog */) { } -void GLES2InterfaceStub::GetShaderPrecisionFormat( - GLenum /* shadertype */, GLenum /* precisiontype */, GLint* /* range */, - GLint* /* precision */) { +void GLES2InterfaceStub::GetShaderPrecisionFormat(GLenum /* shadertype */, + GLenum /* precisiontype */, + GLint* /* range */, + GLint* /* precision */) { } -void GLES2InterfaceStub::GetShaderSource( - GLuint /* shader */, GLsizei /* bufsize */, GLsizei* /* length */, - char* /* source */) { +void GLES2InterfaceStub::GetShaderSource(GLuint /* shader */, + GLsizei /* bufsize */, + GLsizei* /* length */, + char* /* source */) { } const GLubyte* GLES2InterfaceStub::GetString(GLenum /* name */) { return 0; } -void GLES2InterfaceStub::GetTexParameterfv( - GLenum /* target */, GLenum /* pname */, GLfloat* /* params */) { +void GLES2InterfaceStub::GetTexParameterfv(GLenum /* target */, + GLenum /* pname */, + GLfloat* /* params */) { } -void GLES2InterfaceStub::GetTexParameteriv( - GLenum /* target */, GLenum /* pname */, GLint* /* params */) { +void GLES2InterfaceStub::GetTexParameteriv(GLenum /* target */, + GLenum /* pname */, + GLint* /* params */) { } -void GLES2InterfaceStub::GetUniformfv( - GLuint /* program */, GLint /* location */, GLfloat* /* params */) { +void GLES2InterfaceStub::GetUniformfv(GLuint /* program */, + GLint /* location */, + GLfloat* /* params */) { } -void GLES2InterfaceStub::GetUniformiv( - GLuint /* program */, GLint /* location */, GLint* /* params */) { +void GLES2InterfaceStub::GetUniformiv(GLuint /* program */, + GLint /* location */, + GLint* /* params */) { } -GLint GLES2InterfaceStub::GetUniformLocation( - GLuint /* program */, const char* /* name */) { +GLint GLES2InterfaceStub::GetUniformLocation(GLuint /* program */, + const char* /* name */) { return 0; } -void GLES2InterfaceStub::GetVertexAttribfv( - GLuint /* index */, GLenum /* pname */, GLfloat* /* params */) { +void GLES2InterfaceStub::GetVertexAttribfv(GLuint /* index */, + GLenum /* pname */, + GLfloat* /* params */) { } -void GLES2InterfaceStub::GetVertexAttribiv( - GLuint /* index */, GLenum /* pname */, GLint* /* params */) { +void GLES2InterfaceStub::GetVertexAttribiv(GLuint /* index */, + GLenum /* pname */, + GLint* /* params */) { } -void GLES2InterfaceStub::GetVertexAttribPointerv( - GLuint /* index */, GLenum /* pname */, void** /* pointer */) { +void GLES2InterfaceStub::GetVertexAttribPointerv(GLuint /* index */, + GLenum /* pname */, + void** /* pointer */) { } void GLES2InterfaceStub::Hint(GLenum /* target */, GLenum /* mode */) { } @@ -284,136 +340,186 @@ void GLES2InterfaceStub::LinkProgram(GLuint /* program */) { } void GLES2InterfaceStub::PixelStorei(GLenum /* pname */, GLint /* param */) { } -void GLES2InterfaceStub::PolygonOffset( - GLfloat /* factor */, GLfloat /* units */) { +void GLES2InterfaceStub::PolygonOffset(GLfloat /* factor */, + GLfloat /* units */) { } -void GLES2InterfaceStub::ReadPixels( - GLint /* x */, GLint /* y */, GLsizei /* width */, GLsizei /* height */, - GLenum /* format */, GLenum /* type */, void* /* pixels */) { +void GLES2InterfaceStub::ReadPixels(GLint /* x */, + GLint /* y */, + GLsizei /* width */, + GLsizei /* height */, + GLenum /* format */, + GLenum /* type */, + void* /* pixels */) { } void GLES2InterfaceStub::ReleaseShaderCompiler() { } -void GLES2InterfaceStub::RenderbufferStorage( - GLenum /* target */, GLenum /* internalformat */, GLsizei /* width */, - GLsizei /* height */) { +void GLES2InterfaceStub::RenderbufferStorage(GLenum /* target */, + GLenum /* internalformat */, + GLsizei /* width */, + GLsizei /* height */) { } -void GLES2InterfaceStub::SampleCoverage( - GLclampf /* value */, GLboolean /* invert */) { +void GLES2InterfaceStub::SampleCoverage(GLclampf /* value */, + GLboolean /* invert */) { } -void GLES2InterfaceStub::Scissor( - GLint /* x */, GLint /* y */, GLsizei /* width */, GLsizei /* height */) { +void GLES2InterfaceStub::Scissor(GLint /* x */, + GLint /* y */, + GLsizei /* width */, + GLsizei /* height */) { } -void GLES2InterfaceStub::ShaderBinary( - GLsizei /* n */, const GLuint* /* shaders */, GLenum /* binaryformat */, - const void* /* binary */, GLsizei /* length */) { +void GLES2InterfaceStub::ShaderBinary(GLsizei /* n */, + const GLuint* /* shaders */, + GLenum /* binaryformat */, + const void* /* binary */, + GLsizei /* length */) { } -void GLES2InterfaceStub::ShaderSource( - GLuint /* shader */, GLsizei /* count */, const GLchar* const* /* str */, - const GLint* /* length */) { +void GLES2InterfaceStub::ShaderSource(GLuint /* shader */, + GLsizei /* count */, + const GLchar* const* /* str */, + const GLint* /* length */) { } void GLES2InterfaceStub::ShallowFinishCHROMIUM() { } void GLES2InterfaceStub::ShallowFlushCHROMIUM() { } -void GLES2InterfaceStub::StencilFunc( - GLenum /* func */, GLint /* ref */, GLuint /* mask */) { +void GLES2InterfaceStub::StencilFunc(GLenum /* func */, + GLint /* ref */, + GLuint /* mask */) { } -void GLES2InterfaceStub::StencilFuncSeparate( - GLenum /* face */, GLenum /* func */, GLint /* ref */, GLuint /* mask */) { +void GLES2InterfaceStub::StencilFuncSeparate(GLenum /* face */, + GLenum /* func */, + GLint /* ref */, + GLuint /* mask */) { } void GLES2InterfaceStub::StencilMask(GLuint /* mask */) { } -void GLES2InterfaceStub::StencilMaskSeparate( - GLenum /* face */, GLuint /* mask */) { -} -void GLES2InterfaceStub::StencilOp( - GLenum /* fail */, GLenum /* zfail */, GLenum /* zpass */) { -} -void GLES2InterfaceStub::StencilOpSeparate( - GLenum /* face */, GLenum /* fail */, GLenum /* zfail */, - GLenum /* zpass */) { -} -void GLES2InterfaceStub::TexImage2D( - GLenum /* target */, GLint /* level */, GLint /* internalformat */, - GLsizei /* width */, GLsizei /* height */, GLint /* border */, - GLenum /* format */, GLenum /* type */, const void* /* pixels */) { -} -void GLES2InterfaceStub::TexParameterf( - GLenum /* target */, GLenum /* pname */, GLfloat /* param */) { -} -void GLES2InterfaceStub::TexParameterfv( - GLenum /* target */, GLenum /* pname */, const GLfloat* /* params */) { -} -void GLES2InterfaceStub::TexParameteri( - GLenum /* target */, GLenum /* pname */, GLint /* param */) { -} -void GLES2InterfaceStub::TexParameteriv( - GLenum /* target */, GLenum /* pname */, const GLint* /* params */) { -} -void GLES2InterfaceStub::TexSubImage2D( - GLenum /* target */, GLint /* level */, GLint /* xoffset */, - GLint /* yoffset */, GLsizei /* width */, GLsizei /* height */, - GLenum /* format */, GLenum /* type */, const void* /* pixels */) { +void GLES2InterfaceStub::StencilMaskSeparate(GLenum /* face */, + GLuint /* mask */) { +} +void GLES2InterfaceStub::StencilOp(GLenum /* fail */, + GLenum /* zfail */, + GLenum /* zpass */) { +} +void GLES2InterfaceStub::StencilOpSeparate(GLenum /* face */, + GLenum /* fail */, + GLenum /* zfail */, + GLenum /* zpass */) { +} +void GLES2InterfaceStub::TexImage2D(GLenum /* target */, + GLint /* level */, + GLint /* internalformat */, + GLsizei /* width */, + GLsizei /* height */, + GLint /* border */, + GLenum /* format */, + GLenum /* type */, + const void* /* pixels */) { +} +void GLES2InterfaceStub::TexParameterf(GLenum /* target */, + GLenum /* pname */, + GLfloat /* param */) { +} +void GLES2InterfaceStub::TexParameterfv(GLenum /* target */, + GLenum /* pname */, + const GLfloat* /* params */) { +} +void GLES2InterfaceStub::TexParameteri(GLenum /* target */, + GLenum /* pname */, + GLint /* param */) { +} +void GLES2InterfaceStub::TexParameteriv(GLenum /* target */, + GLenum /* pname */, + const GLint* /* params */) { +} +void GLES2InterfaceStub::TexSubImage2D(GLenum /* target */, + GLint /* level */, + GLint /* xoffset */, + GLint /* yoffset */, + GLsizei /* width */, + GLsizei /* height */, + GLenum /* format */, + GLenum /* type */, + const void* /* pixels */) { } void GLES2InterfaceStub::Uniform1f(GLint /* location */, GLfloat /* x */) { } -void GLES2InterfaceStub::Uniform1fv( - GLint /* location */, GLsizei /* count */, const GLfloat* /* v */) { +void GLES2InterfaceStub::Uniform1fv(GLint /* location */, + GLsizei /* count */, + const GLfloat* /* v */) { } void GLES2InterfaceStub::Uniform1i(GLint /* location */, GLint /* x */) { } -void GLES2InterfaceStub::Uniform1iv( - GLint /* location */, GLsizei /* count */, const GLint* /* v */) { -} -void GLES2InterfaceStub::Uniform2f( - GLint /* location */, GLfloat /* x */, GLfloat /* y */) { -} -void GLES2InterfaceStub::Uniform2fv( - GLint /* location */, GLsizei /* count */, const GLfloat* /* v */) { -} -void GLES2InterfaceStub::Uniform2i( - GLint /* location */, GLint /* x */, GLint /* y */) { -} -void GLES2InterfaceStub::Uniform2iv( - GLint /* location */, GLsizei /* count */, const GLint* /* v */) { -} -void GLES2InterfaceStub::Uniform3f( - GLint /* location */, GLfloat /* x */, GLfloat /* y */, GLfloat /* z */) { -} -void GLES2InterfaceStub::Uniform3fv( - GLint /* location */, GLsizei /* count */, const GLfloat* /* v */) { -} -void GLES2InterfaceStub::Uniform3i( - GLint /* location */, GLint /* x */, GLint /* y */, GLint /* z */) { -} -void GLES2InterfaceStub::Uniform3iv( - GLint /* location */, GLsizei /* count */, const GLint* /* v */) { -} -void GLES2InterfaceStub::Uniform4f( - GLint /* location */, GLfloat /* x */, GLfloat /* y */, GLfloat /* z */, - GLfloat /* w */) { -} -void GLES2InterfaceStub::Uniform4fv( - GLint /* location */, GLsizei /* count */, const GLfloat* /* v */) { -} -void GLES2InterfaceStub::Uniform4i( - GLint /* location */, GLint /* x */, GLint /* y */, GLint /* z */, - GLint /* w */) { -} -void GLES2InterfaceStub::Uniform4iv( - GLint /* location */, GLsizei /* count */, const GLint* /* v */) { -} -void GLES2InterfaceStub::UniformMatrix2fv( - GLint /* location */, GLsizei /* count */, GLboolean /* transpose */, - const GLfloat* /* value */) { -} -void GLES2InterfaceStub::UniformMatrix3fv( - GLint /* location */, GLsizei /* count */, GLboolean /* transpose */, - const GLfloat* /* value */) { -} -void GLES2InterfaceStub::UniformMatrix4fv( - GLint /* location */, GLsizei /* count */, GLboolean /* transpose */, - const GLfloat* /* value */) { +void GLES2InterfaceStub::Uniform1iv(GLint /* location */, + GLsizei /* count */, + const GLint* /* v */) { +} +void GLES2InterfaceStub::Uniform2f(GLint /* location */, + GLfloat /* x */, + GLfloat /* y */) { +} +void GLES2InterfaceStub::Uniform2fv(GLint /* location */, + GLsizei /* count */, + const GLfloat* /* v */) { +} +void GLES2InterfaceStub::Uniform2i(GLint /* location */, + GLint /* x */, + GLint /* y */) { +} +void GLES2InterfaceStub::Uniform2iv(GLint /* location */, + GLsizei /* count */, + const GLint* /* v */) { +} +void GLES2InterfaceStub::Uniform3f(GLint /* location */, + GLfloat /* x */, + GLfloat /* y */, + GLfloat /* z */) { +} +void GLES2InterfaceStub::Uniform3fv(GLint /* location */, + GLsizei /* count */, + const GLfloat* /* v */) { +} +void GLES2InterfaceStub::Uniform3i(GLint /* location */, + GLint /* x */, + GLint /* y */, + GLint /* z */) { +} +void GLES2InterfaceStub::Uniform3iv(GLint /* location */, + GLsizei /* count */, + const GLint* /* v */) { +} +void GLES2InterfaceStub::Uniform4f(GLint /* location */, + GLfloat /* x */, + GLfloat /* y */, + GLfloat /* z */, + GLfloat /* w */) { +} +void GLES2InterfaceStub::Uniform4fv(GLint /* location */, + GLsizei /* count */, + const GLfloat* /* v */) { +} +void GLES2InterfaceStub::Uniform4i(GLint /* location */, + GLint /* x */, + GLint /* y */, + GLint /* z */, + GLint /* w */) { +} +void GLES2InterfaceStub::Uniform4iv(GLint /* location */, + GLsizei /* count */, + const GLint* /* v */) { +} +void GLES2InterfaceStub::UniformMatrix2fv(GLint /* location */, + GLsizei /* count */, + GLboolean /* transpose */, + const GLfloat* /* value */) { +} +void GLES2InterfaceStub::UniformMatrix3fv(GLint /* location */, + GLsizei /* count */, + GLboolean /* transpose */, + const GLfloat* /* value */) { +} +void GLES2InterfaceStub::UniformMatrix4fv(GLint /* location */, + GLsizei /* count */, + GLboolean /* transpose */, + const GLfloat* /* value */) { } void GLES2InterfaceStub::UseProgram(GLuint /* program */) { } @@ -421,61 +527,88 @@ void GLES2InterfaceStub::ValidateProgram(GLuint /* program */) { } void GLES2InterfaceStub::VertexAttrib1f(GLuint /* indx */, GLfloat /* x */) { } -void GLES2InterfaceStub::VertexAttrib1fv( - GLuint /* indx */, const GLfloat* /* values */) { -} -void GLES2InterfaceStub::VertexAttrib2f( - GLuint /* indx */, GLfloat /* x */, GLfloat /* y */) { -} -void GLES2InterfaceStub::VertexAttrib2fv( - GLuint /* indx */, const GLfloat* /* values */) { -} -void GLES2InterfaceStub::VertexAttrib3f( - GLuint /* indx */, GLfloat /* x */, GLfloat /* y */, GLfloat /* z */) { -} -void GLES2InterfaceStub::VertexAttrib3fv( - GLuint /* indx */, const GLfloat* /* values */) { -} -void GLES2InterfaceStub::VertexAttrib4f( - GLuint /* indx */, GLfloat /* x */, GLfloat /* y */, GLfloat /* z */, - GLfloat /* w */) { -} -void GLES2InterfaceStub::VertexAttrib4fv( - GLuint /* indx */, const GLfloat* /* values */) { -} -void GLES2InterfaceStub::VertexAttribPointer( - GLuint /* indx */, GLint /* size */, GLenum /* type */, - GLboolean /* normalized */, GLsizei /* stride */, const void* /* ptr */) { -} -void GLES2InterfaceStub::Viewport( - GLint /* x */, GLint /* y */, GLsizei /* width */, GLsizei /* height */) { -} -void GLES2InterfaceStub::BlitFramebufferCHROMIUM( - GLint /* srcX0 */, GLint /* srcY0 */, GLint /* srcX1 */, GLint /* srcY1 */, - GLint /* dstX0 */, GLint /* dstY0 */, GLint /* dstX1 */, GLint /* dstY1 */, - GLbitfield /* mask */, GLenum /* filter */) { +void GLES2InterfaceStub::VertexAttrib1fv(GLuint /* indx */, + const GLfloat* /* values */) { +} +void GLES2InterfaceStub::VertexAttrib2f(GLuint /* indx */, + GLfloat /* x */, + GLfloat /* y */) { +} +void GLES2InterfaceStub::VertexAttrib2fv(GLuint /* indx */, + const GLfloat* /* values */) { +} +void GLES2InterfaceStub::VertexAttrib3f(GLuint /* indx */, + GLfloat /* x */, + GLfloat /* y */, + GLfloat /* z */) { +} +void GLES2InterfaceStub::VertexAttrib3fv(GLuint /* indx */, + const GLfloat* /* values */) { +} +void GLES2InterfaceStub::VertexAttrib4f(GLuint /* indx */, + GLfloat /* x */, + GLfloat /* y */, + GLfloat /* z */, + GLfloat /* w */) { +} +void GLES2InterfaceStub::VertexAttrib4fv(GLuint /* indx */, + const GLfloat* /* values */) { +} +void GLES2InterfaceStub::VertexAttribPointer(GLuint /* indx */, + GLint /* size */, + GLenum /* type */, + GLboolean /* normalized */, + GLsizei /* stride */, + const void* /* ptr */) { +} +void GLES2InterfaceStub::Viewport(GLint /* x */, + GLint /* y */, + GLsizei /* width */, + GLsizei /* height */) { +} +void GLES2InterfaceStub::BlitFramebufferCHROMIUM(GLint /* srcX0 */, + GLint /* srcY0 */, + GLint /* srcX1 */, + GLint /* srcY1 */, + GLint /* dstX0 */, + GLint /* dstY0 */, + GLint /* dstX1 */, + GLint /* dstY1 */, + GLbitfield /* mask */, + GLenum /* filter */) { } void GLES2InterfaceStub::RenderbufferStorageMultisampleCHROMIUM( - GLenum /* target */, GLsizei /* samples */, GLenum /* internalformat */, - GLsizei /* width */, GLsizei /* height */) { + GLenum /* target */, + GLsizei /* samples */, + GLenum /* internalformat */, + GLsizei /* width */, + GLsizei /* height */) { } void GLES2InterfaceStub::RenderbufferStorageMultisampleEXT( - GLenum /* target */, GLsizei /* samples */, GLenum /* internalformat */, - GLsizei /* width */, GLsizei /* height */) { + GLenum /* target */, + GLsizei /* samples */, + GLenum /* internalformat */, + GLsizei /* width */, + GLsizei /* height */) { } void GLES2InterfaceStub::FramebufferTexture2DMultisampleEXT( - GLenum /* target */, GLenum /* attachment */, GLenum /* textarget */, - GLuint /* texture */, GLint /* level */, GLsizei /* samples */) { + GLenum /* target */, + GLenum /* attachment */, + GLenum /* textarget */, + GLuint /* texture */, + GLint /* level */, + GLsizei /* samples */) { } -void GLES2InterfaceStub::TexStorage2DEXT( - GLenum /* target */, GLsizei /* levels */, GLenum /* internalFormat */, - GLsizei /* width */, GLsizei /* height */) { +void GLES2InterfaceStub::TexStorage2DEXT(GLenum /* target */, + GLsizei /* levels */, + GLenum /* internalFormat */, + GLsizei /* width */, + GLsizei /* height */) { } -void GLES2InterfaceStub::GenQueriesEXT( - GLsizei /* n */, GLuint* /* queries */) { +void GLES2InterfaceStub::GenQueriesEXT(GLsizei /* n */, GLuint* /* queries */) { } -void GLES2InterfaceStub::DeleteQueriesEXT( - GLsizei /* n */, const GLuint* /* queries */) { +void GLES2InterfaceStub::DeleteQueriesEXT(GLsizei /* n */, + const GLuint* /* queries */) { } GLboolean GLES2InterfaceStub::IsQueryEXT(GLuint /* id */) { return 0; @@ -484,25 +617,27 @@ void GLES2InterfaceStub::BeginQueryEXT(GLenum /* target */, GLuint /* id */) { } void GLES2InterfaceStub::EndQueryEXT(GLenum /* target */) { } -void GLES2InterfaceStub::GetQueryivEXT( - GLenum /* target */, GLenum /* pname */, GLint* /* params */) { +void GLES2InterfaceStub::GetQueryivEXT(GLenum /* target */, + GLenum /* pname */, + GLint* /* params */) { } -void GLES2InterfaceStub::GetQueryObjectuivEXT( - GLuint /* id */, GLenum /* pname */, GLuint* /* params */) { +void GLES2InterfaceStub::GetQueryObjectuivEXT(GLuint /* id */, + GLenum /* pname */, + GLuint* /* params */) { } -void GLES2InterfaceStub::InsertEventMarkerEXT( - GLsizei /* length */, const GLchar* /* marker */) { +void GLES2InterfaceStub::InsertEventMarkerEXT(GLsizei /* length */, + const GLchar* /* marker */) { } -void GLES2InterfaceStub::PushGroupMarkerEXT( - GLsizei /* length */, const GLchar* /* marker */) { +void GLES2InterfaceStub::PushGroupMarkerEXT(GLsizei /* length */, + const GLchar* /* marker */) { } void GLES2InterfaceStub::PopGroupMarkerEXT() { } -void GLES2InterfaceStub::GenVertexArraysOES( - GLsizei /* n */, GLuint* /* arrays */) { +void GLES2InterfaceStub::GenVertexArraysOES(GLsizei /* n */, + GLuint* /* arrays */) { } -void GLES2InterfaceStub::DeleteVertexArraysOES( - GLsizei /* n */, const GLuint* /* arrays */) { +void GLES2InterfaceStub::DeleteVertexArraysOES(GLsizei /* n */, + const GLuint* /* arrays */) { } GLboolean GLES2InterfaceStub::IsVertexArrayOES(GLuint /* array */) { return 0; @@ -511,161 +646,219 @@ void GLES2InterfaceStub::BindVertexArrayOES(GLuint /* array */) { } void GLES2InterfaceStub::SwapBuffers() { } -GLuint GLES2InterfaceStub::GetMaxValueInBufferCHROMIUM( - GLuint /* buffer_id */, GLsizei /* count */, GLenum /* type */, - GLuint /* offset */) { +GLuint GLES2InterfaceStub::GetMaxValueInBufferCHROMIUM(GLuint /* buffer_id */, + GLsizei /* count */, + GLenum /* type */, + GLuint /* offset */) { return 0; } -void GLES2InterfaceStub::GenSharedIdsCHROMIUM( - GLuint /* namespace_id */, GLuint /* id_offset */, GLsizei /* n */, - GLuint* /* ids */) { +void GLES2InterfaceStub::GenSharedIdsCHROMIUM(GLuint /* namespace_id */, + GLuint /* id_offset */, + GLsizei /* n */, + GLuint* /* ids */) { } -void GLES2InterfaceStub::DeleteSharedIdsCHROMIUM( - GLuint /* namespace_id */, GLsizei /* n */, const GLuint* /* ids */) { +void GLES2InterfaceStub::DeleteSharedIdsCHROMIUM(GLuint /* namespace_id */, + GLsizei /* n */, + const GLuint* /* ids */) { } -void GLES2InterfaceStub::RegisterSharedIdsCHROMIUM( - GLuint /* namespace_id */, GLsizei /* n */, const GLuint* /* ids */) { +void GLES2InterfaceStub::RegisterSharedIdsCHROMIUM(GLuint /* namespace_id */, + GLsizei /* n */, + const GLuint* /* ids */) { } -GLboolean GLES2InterfaceStub::EnableFeatureCHROMIUM( - const char* /* feature */) { +GLboolean GLES2InterfaceStub::EnableFeatureCHROMIUM(const char* /* feature */) { return 0; } -void* GLES2InterfaceStub::MapBufferCHROMIUM( - GLuint /* target */, GLenum /* access */) { +void* GLES2InterfaceStub::MapBufferCHROMIUM(GLuint /* target */, + GLenum /* access */) { return 0; } GLboolean GLES2InterfaceStub::UnmapBufferCHROMIUM(GLuint /* target */) { return 0; } -void* GLES2InterfaceStub::MapImageCHROMIUM( - GLuint /* image_id */, GLenum /* access */) { +void* GLES2InterfaceStub::MapImageCHROMIUM(GLuint /* image_id */) { return 0; } void GLES2InterfaceStub::UnmapImageCHROMIUM(GLuint /* image_id */) { } -void* GLES2InterfaceStub::MapBufferSubDataCHROMIUM( - GLuint /* target */, GLintptr /* offset */, GLsizeiptr /* size */, - GLenum /* access */) { +void* GLES2InterfaceStub::MapBufferSubDataCHROMIUM(GLuint /* target */, + GLintptr /* offset */, + GLsizeiptr /* size */, + GLenum /* access */) { return 0; } void GLES2InterfaceStub::UnmapBufferSubDataCHROMIUM(const void* /* mem */) { } -void* GLES2InterfaceStub::MapTexSubImage2DCHROMIUM( - GLenum /* target */, GLint /* level */, GLint /* xoffset */, - GLint /* yoffset */, GLsizei /* width */, GLsizei /* height */, - GLenum /* format */, GLenum /* type */, GLenum /* access */) { +void* GLES2InterfaceStub::MapTexSubImage2DCHROMIUM(GLenum /* target */, + GLint /* level */, + GLint /* xoffset */, + GLint /* yoffset */, + GLsizei /* width */, + GLsizei /* height */, + GLenum /* format */, + GLenum /* type */, + GLenum /* access */) { return 0; } void GLES2InterfaceStub::UnmapTexSubImage2DCHROMIUM(const void* /* mem */) { } -void GLES2InterfaceStub::ResizeCHROMIUM( - GLuint /* width */, GLuint /* height */, GLfloat /* scale_factor */) { +void GLES2InterfaceStub::ResizeCHROMIUM(GLuint /* width */, + GLuint /* height */, + GLfloat /* scale_factor */) { } const GLchar* GLES2InterfaceStub::GetRequestableExtensionsCHROMIUM() { return 0; } -void GLES2InterfaceStub::RequestExtensionCHROMIUM( - const char* /* extension */) { +void GLES2InterfaceStub::RequestExtensionCHROMIUM(const char* /* extension */) { } void GLES2InterfaceStub::RateLimitOffscreenContextCHROMIUM() { } -void GLES2InterfaceStub::GetMultipleIntegervCHROMIUM( - const GLenum* /* pnames */, GLuint /* count */, GLint* /* results */, - GLsizeiptr /* size */) { +void GLES2InterfaceStub::GetMultipleIntegervCHROMIUM(const GLenum* /* pnames */, + GLuint /* count */, + GLint* /* results */, + GLsizeiptr /* size */) { } -void GLES2InterfaceStub::GetProgramInfoCHROMIUM( - GLuint /* program */, GLsizei /* bufsize */, GLsizei* /* size */, - void* /* info */) { +void GLES2InterfaceStub::GetProgramInfoCHROMIUM(GLuint /* program */, + GLsizei /* bufsize */, + GLsizei* /* size */, + void* /* info */) { } GLuint GLES2InterfaceStub::CreateStreamTextureCHROMIUM(GLuint /* texture */) { return 0; } -void GLES2InterfaceStub::DestroyStreamTextureCHROMIUM(GLuint /* texture */) { -} -GLuint GLES2InterfaceStub::CreateImageCHROMIUM( - GLsizei /* width */, GLsizei /* height */, GLenum /* internalformat */) { +GLuint GLES2InterfaceStub::CreateImageCHROMIUM(GLsizei /* width */, + GLsizei /* height */, + GLenum /* internalformat */, + GLenum /* usage */) { return 0; } void GLES2InterfaceStub::DestroyImageCHROMIUM(GLuint /* image_id */) { } -void GLES2InterfaceStub::GetImageParameterivCHROMIUM( - GLuint /* image_id */, GLenum /* pname */, GLint* /* params */) { -} -void GLES2InterfaceStub::GetTranslatedShaderSourceANGLE( - GLuint /* shader */, GLsizei /* bufsize */, GLsizei* /* length */, - char* /* source */) { -} -void GLES2InterfaceStub::PostSubBufferCHROMIUM( - GLint /* x */, GLint /* y */, GLint /* width */, GLint /* height */) { -} -void GLES2InterfaceStub::TexImageIOSurface2DCHROMIUM( - GLenum /* target */, GLsizei /* width */, GLsizei /* height */, - GLuint /* ioSurfaceId */, GLuint /* plane */) { +void GLES2InterfaceStub::GetImageParameterivCHROMIUM(GLuint /* image_id */, + GLenum /* pname */, + GLint* /* params */) { +} +void GLES2InterfaceStub::GetTranslatedShaderSourceANGLE(GLuint /* shader */, + GLsizei /* bufsize */, + GLsizei* /* length */, + char* /* source */) { +} +void GLES2InterfaceStub::PostSubBufferCHROMIUM(GLint /* x */, + GLint /* y */, + GLint /* width */, + GLint /* height */) { +} +void GLES2InterfaceStub::TexImageIOSurface2DCHROMIUM(GLenum /* target */, + GLsizei /* width */, + GLsizei /* height */, + GLuint /* ioSurfaceId */, + GLuint /* plane */) { +} +void GLES2InterfaceStub::CopyTextureCHROMIUM(GLenum /* target */, + GLenum /* source_id */, + GLenum /* dest_id */, + GLint /* level */, + GLint /* internalformat */, + GLenum /* dest_type */) { +} +void GLES2InterfaceStub::DrawArraysInstancedANGLE(GLenum /* mode */, + GLint /* first */, + GLsizei /* count */, + GLsizei /* primcount */) { +} +void GLES2InterfaceStub::DrawElementsInstancedANGLE(GLenum /* mode */, + GLsizei /* count */, + GLenum /* type */, + const void* /* indices */, + GLsizei /* primcount */) { +} +void GLES2InterfaceStub::VertexAttribDivisorANGLE(GLuint /* index */, + GLuint /* divisor */) { } -void GLES2InterfaceStub::CopyTextureCHROMIUM( - GLenum /* target */, GLenum /* source_id */, GLenum /* dest_id */, - GLint /* level */, GLint /* internalformat */, GLenum /* dest_type */) { -} -void GLES2InterfaceStub::DrawArraysInstancedANGLE( - GLenum /* mode */, GLint /* first */, GLsizei /* count */, - GLsizei /* primcount */) { +void GLES2InterfaceStub::GenMailboxCHROMIUM(GLbyte* /* mailbox */) { } -void GLES2InterfaceStub::DrawElementsInstancedANGLE( - GLenum /* mode */, GLsizei /* count */, GLenum /* type */, - const void* /* indices */, GLsizei /* primcount */) { +void GLES2InterfaceStub::ProduceTextureCHROMIUM(GLenum /* target */, + const GLbyte* /* mailbox */) { } -void GLES2InterfaceStub::VertexAttribDivisorANGLE( - GLuint /* index */, GLuint /* divisor */) { +void GLES2InterfaceStub::ProduceTextureDirectCHROMIUM( + GLuint /* texture */, + GLenum /* target */, + const GLbyte* /* mailbox */) { } -void GLES2InterfaceStub::GenMailboxCHROMIUM(GLbyte* /* mailbox */) { +void GLES2InterfaceStub::ConsumeTextureCHROMIUM(GLenum /* target */, + const GLbyte* /* mailbox */) { } -void GLES2InterfaceStub::ProduceTextureCHROMIUM( - GLenum /* target */, const GLbyte* /* mailbox */) { -} -void GLES2InterfaceStub::ConsumeTextureCHROMIUM( - GLenum /* target */, const GLbyte* /* mailbox */) { +GLuint GLES2InterfaceStub::CreateAndConsumeTextureCHROMIUM( + GLenum /* target */, + const GLbyte* /* mailbox */) { + return 0; } -void GLES2InterfaceStub::BindUniformLocationCHROMIUM( - GLuint /* program */, GLint /* location */, const char* /* name */) { +void GLES2InterfaceStub::BindUniformLocationCHROMIUM(GLuint /* program */, + GLint /* location */, + const char* /* name */) { } -void GLES2InterfaceStub::BindTexImage2DCHROMIUM( - GLenum /* target */, GLint /* imageId */) { +void GLES2InterfaceStub::BindTexImage2DCHROMIUM(GLenum /* target */, + GLint /* imageId */) { } -void GLES2InterfaceStub::ReleaseTexImage2DCHROMIUM( - GLenum /* target */, GLint /* imageId */) { +void GLES2InterfaceStub::ReleaseTexImage2DCHROMIUM(GLenum /* target */, + GLint /* imageId */) { } void GLES2InterfaceStub::TraceBeginCHROMIUM(const char* /* name */) { } void GLES2InterfaceStub::TraceEndCHROMIUM() { } -void GLES2InterfaceStub::AsyncTexSubImage2DCHROMIUM( - GLenum /* target */, GLint /* level */, GLint /* xoffset */, - GLint /* yoffset */, GLsizei /* width */, GLsizei /* height */, - GLenum /* format */, GLenum /* type */, const void* /* data */) { -} -void GLES2InterfaceStub::AsyncTexImage2DCHROMIUM( - GLenum /* target */, GLint /* level */, GLint /* internalformat */, - GLsizei /* width */, GLsizei /* height */, GLint /* border */, - GLenum /* format */, GLenum /* type */, const void* /* pixels */) { +void GLES2InterfaceStub::AsyncTexSubImage2DCHROMIUM(GLenum /* target */, + GLint /* level */, + GLint /* xoffset */, + GLint /* yoffset */, + GLsizei /* width */, + GLsizei /* height */, + GLenum /* format */, + GLenum /* type */, + const void* /* data */) { +} +void GLES2InterfaceStub::AsyncTexImage2DCHROMIUM(GLenum /* target */, + GLint /* level */, + GLenum /* internalformat */, + GLsizei /* width */, + GLsizei /* height */, + GLint /* border */, + GLenum /* format */, + GLenum /* type */, + const void* /* pixels */) { } void GLES2InterfaceStub::WaitAsyncTexImage2DCHROMIUM(GLenum /* target */) { } +void GLES2InterfaceStub::WaitAllAsyncTexImage2DCHROMIUM() { +} void GLES2InterfaceStub::DiscardFramebufferEXT( - GLenum /* target */, GLsizei /* count */, + GLenum /* target */, + GLsizei /* count */, const GLenum* /* attachments */) { } -void GLES2InterfaceStub::LoseContextCHROMIUM( - GLenum /* current */, GLenum /* other */) { +void GLES2InterfaceStub::LoseContextCHROMIUM(GLenum /* current */, + GLenum /* other */) { } GLuint GLES2InterfaceStub::InsertSyncPointCHROMIUM() { return 0; } void GLES2InterfaceStub::WaitSyncPointCHROMIUM(GLuint /* sync_point */) { } -void GLES2InterfaceStub::DrawBuffersEXT( - GLsizei /* count */, const GLenum* /* bufs */) { +void GLES2InterfaceStub::DrawBuffersEXT(GLsizei /* count */, + const GLenum* /* bufs */) { } void GLES2InterfaceStub::DiscardBackbufferCHROMIUM() { } +void GLES2InterfaceStub::ScheduleOverlayPlaneCHROMIUM( + GLint /* plane_z_order */, + GLenum /* plane_transform */, + GLuint /* overlay_texture_id */, + GLint /* bounds_x */, + GLint /* bounds_y */, + GLint /* bounds_width */, + GLint /* bounds_height */, + GLfloat /* uv_x */, + GLfloat /* uv_y */, + GLfloat /* uv_width */, + GLfloat /* uv_height */) { +} #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_INTERFACE_STUB_IMPL_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/chromium/gpu/command_buffer/client/gles2_trace_implementation_autogen.h index d811db571a8..b40ae9a46a2 100644 --- a/chromium/gpu/command_buffer/client/gles2_trace_implementation_autogen.h +++ b/chromium/gpu/command_buffer/client/gles2_trace_implementation_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // This file is included by gles2_trace_implementation.h @@ -12,56 +14,86 @@ virtual void ActiveTexture(GLenum texture) OVERRIDE; virtual void AttachShader(GLuint program, GLuint shader) OVERRIDE; -virtual void BindAttribLocation( - GLuint program, GLuint index, const char* name) OVERRIDE; +virtual void BindAttribLocation(GLuint program, + GLuint index, + const char* name) OVERRIDE; virtual void BindBuffer(GLenum target, GLuint buffer) OVERRIDE; virtual void BindFramebuffer(GLenum target, GLuint framebuffer) OVERRIDE; virtual void BindRenderbuffer(GLenum target, GLuint renderbuffer) OVERRIDE; virtual void BindTexture(GLenum target, GLuint texture) OVERRIDE; -virtual void BlendColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) OVERRIDE; +virtual void BlendColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) OVERRIDE; virtual void BlendEquation(GLenum mode) OVERRIDE; virtual void BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha) OVERRIDE; virtual void BlendFunc(GLenum sfactor, GLenum dfactor) OVERRIDE; -virtual void BlendFuncSeparate( - GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) OVERRIDE; -virtual void BufferData( - GLenum target, GLsizeiptr size, const void* data, GLenum usage) OVERRIDE; -virtual void BufferSubData( - GLenum target, GLintptr offset, GLsizeiptr size, - const void* data) OVERRIDE; +virtual void BlendFuncSeparate(GLenum srcRGB, + GLenum dstRGB, + GLenum srcAlpha, + GLenum dstAlpha) OVERRIDE; +virtual void BufferData(GLenum target, + GLsizeiptr size, + const void* data, + GLenum usage) OVERRIDE; +virtual void BufferSubData(GLenum target, + GLintptr offset, + GLsizeiptr size, + const void* data) OVERRIDE; virtual GLenum CheckFramebufferStatus(GLenum target) OVERRIDE; virtual void Clear(GLbitfield mask) OVERRIDE; -virtual void ClearColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) OVERRIDE; +virtual void ClearColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) OVERRIDE; virtual void ClearDepthf(GLclampf depth) OVERRIDE; virtual void ClearStencil(GLint s) OVERRIDE; -virtual void ColorMask( - GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) OVERRIDE; +virtual void ColorMask(GLboolean red, + GLboolean green, + GLboolean blue, + GLboolean alpha) OVERRIDE; virtual void CompileShader(GLuint shader) OVERRIDE; -virtual void CompressedTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLsizei width, - GLsizei height, GLint border, GLsizei imageSize, - const void* data) OVERRIDE; -virtual void CompressedTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLsizei imageSize, - const void* data) OVERRIDE; -virtual void CopyTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, - GLsizei width, GLsizei height, GLint border) OVERRIDE; -virtual void CopyTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, - GLsizei width, GLsizei height) OVERRIDE; +virtual void CompressedTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLsizei imageSize, + const void* data) OVERRIDE; +virtual void CompressedTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLsizei imageSize, + const void* data) OVERRIDE; +virtual void CopyTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLint border) OVERRIDE; +virtual void CopyTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLint x, + GLint y, + GLsizei width, + GLsizei height) OVERRIDE; virtual GLuint CreateProgram() OVERRIDE; virtual GLuint CreateShader(GLenum type) OVERRIDE; virtual void CullFace(GLenum mode) OVERRIDE; virtual void DeleteBuffers(GLsizei n, const GLuint* buffers) OVERRIDE; -virtual void DeleteFramebuffers( - GLsizei n, const GLuint* framebuffers) OVERRIDE; +virtual void DeleteFramebuffers(GLsizei n, const GLuint* framebuffers) OVERRIDE; virtual void DeleteProgram(GLuint program) OVERRIDE; -virtual void DeleteRenderbuffers( - GLsizei n, const GLuint* renderbuffers) OVERRIDE; +virtual void DeleteRenderbuffers(GLsizei n, + const GLuint* renderbuffers) OVERRIDE; virtual void DeleteShader(GLuint shader) OVERRIDE; virtual void DeleteTextures(GLsizei n, const GLuint* textures) OVERRIDE; virtual void DepthFunc(GLenum func) OVERRIDE; @@ -71,72 +103,103 @@ virtual void DetachShader(GLuint program, GLuint shader) OVERRIDE; virtual void Disable(GLenum cap) OVERRIDE; virtual void DisableVertexAttribArray(GLuint index) OVERRIDE; virtual void DrawArrays(GLenum mode, GLint first, GLsizei count) OVERRIDE; -virtual void DrawElements( - GLenum mode, GLsizei count, GLenum type, const void* indices) OVERRIDE; +virtual void DrawElements(GLenum mode, + GLsizei count, + GLenum type, + const void* indices) OVERRIDE; virtual void Enable(GLenum cap) OVERRIDE; virtual void EnableVertexAttribArray(GLuint index) OVERRIDE; virtual void Finish() OVERRIDE; virtual void Flush() OVERRIDE; -virtual void FramebufferRenderbuffer( - GLenum target, GLenum attachment, GLenum renderbuffertarget, - GLuint renderbuffer) OVERRIDE; -virtual void FramebufferTexture2D( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level) OVERRIDE; +virtual void FramebufferRenderbuffer(GLenum target, + GLenum attachment, + GLenum renderbuffertarget, + GLuint renderbuffer) OVERRIDE; +virtual void FramebufferTexture2D(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level) OVERRIDE; virtual void FrontFace(GLenum mode) OVERRIDE; virtual void GenBuffers(GLsizei n, GLuint* buffers) OVERRIDE; virtual void GenerateMipmap(GLenum target) OVERRIDE; virtual void GenFramebuffers(GLsizei n, GLuint* framebuffers) OVERRIDE; virtual void GenRenderbuffers(GLsizei n, GLuint* renderbuffers) OVERRIDE; virtual void GenTextures(GLsizei n, GLuint* textures) OVERRIDE; -virtual void GetActiveAttrib( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) OVERRIDE; -virtual void GetActiveUniform( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) OVERRIDE; -virtual void GetAttachedShaders( - GLuint program, GLsizei maxcount, GLsizei* count, - GLuint* shaders) OVERRIDE; +virtual void GetActiveAttrib(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) OVERRIDE; +virtual void GetActiveUniform(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) OVERRIDE; +virtual void GetAttachedShaders(GLuint program, + GLsizei maxcount, + GLsizei* count, + GLuint* shaders) OVERRIDE; virtual GLint GetAttribLocation(GLuint program, const char* name) OVERRIDE; virtual void GetBooleanv(GLenum pname, GLboolean* params) OVERRIDE; -virtual void GetBufferParameteriv( - GLenum target, GLenum pname, GLint* params) OVERRIDE; +virtual void GetBufferParameteriv(GLenum target, + GLenum pname, + GLint* params) OVERRIDE; virtual GLenum GetError() OVERRIDE; virtual void GetFloatv(GLenum pname, GLfloat* params) OVERRIDE; -virtual void GetFramebufferAttachmentParameteriv( - GLenum target, GLenum attachment, GLenum pname, GLint* params) OVERRIDE; +virtual void GetFramebufferAttachmentParameteriv(GLenum target, + GLenum attachment, + GLenum pname, + GLint* params) OVERRIDE; virtual void GetIntegerv(GLenum pname, GLint* params) OVERRIDE; -virtual void GetProgramiv( - GLuint program, GLenum pname, GLint* params) OVERRIDE; -virtual void GetProgramInfoLog( - GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) OVERRIDE; -virtual void GetRenderbufferParameteriv( - GLenum target, GLenum pname, GLint* params) OVERRIDE; +virtual void GetProgramiv(GLuint program, GLenum pname, GLint* params) OVERRIDE; +virtual void GetProgramInfoLog(GLuint program, + GLsizei bufsize, + GLsizei* length, + char* infolog) OVERRIDE; +virtual void GetRenderbufferParameteriv(GLenum target, + GLenum pname, + GLint* params) OVERRIDE; virtual void GetShaderiv(GLuint shader, GLenum pname, GLint* params) OVERRIDE; -virtual void GetShaderInfoLog( - GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) OVERRIDE; -virtual void GetShaderPrecisionFormat( - GLenum shadertype, GLenum precisiontype, GLint* range, - GLint* precision) OVERRIDE; -virtual void GetShaderSource( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) OVERRIDE; +virtual void GetShaderInfoLog(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* infolog) OVERRIDE; +virtual void GetShaderPrecisionFormat(GLenum shadertype, + GLenum precisiontype, + GLint* range, + GLint* precision) OVERRIDE; +virtual void GetShaderSource(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) OVERRIDE; virtual const GLubyte* GetString(GLenum name) OVERRIDE; -virtual void GetTexParameterfv( - GLenum target, GLenum pname, GLfloat* params) OVERRIDE; -virtual void GetTexParameteriv( - GLenum target, GLenum pname, GLint* params) OVERRIDE; -virtual void GetUniformfv( - GLuint program, GLint location, GLfloat* params) OVERRIDE; -virtual void GetUniformiv( - GLuint program, GLint location, GLint* params) OVERRIDE; +virtual void GetTexParameterfv(GLenum target, + GLenum pname, + GLfloat* params) OVERRIDE; +virtual void GetTexParameteriv(GLenum target, + GLenum pname, + GLint* params) OVERRIDE; +virtual void GetUniformfv(GLuint program, + GLint location, + GLfloat* params) OVERRIDE; +virtual void GetUniformiv(GLuint program, + GLint location, + GLint* params) OVERRIDE; virtual GLint GetUniformLocation(GLuint program, const char* name) OVERRIDE; -virtual void GetVertexAttribfv( - GLuint index, GLenum pname, GLfloat* params) OVERRIDE; -virtual void GetVertexAttribiv( - GLuint index, GLenum pname, GLint* params) OVERRIDE; -virtual void GetVertexAttribPointerv( - GLuint index, GLenum pname, void** pointer) OVERRIDE; +virtual void GetVertexAttribfv(GLuint index, + GLenum pname, + GLfloat* params) OVERRIDE; +virtual void GetVertexAttribiv(GLuint index, + GLenum pname, + GLint* params) OVERRIDE; +virtual void GetVertexAttribPointerv(GLuint index, + GLenum pname, + void** pointer) OVERRIDE; virtual void Hint(GLenum target, GLenum mode) OVERRIDE; virtual GLboolean IsBuffer(GLuint buffer) OVERRIDE; virtual GLboolean IsEnabled(GLenum cap) OVERRIDE; @@ -149,125 +212,182 @@ virtual void LineWidth(GLfloat width) OVERRIDE; virtual void LinkProgram(GLuint program) OVERRIDE; virtual void PixelStorei(GLenum pname, GLint param) OVERRIDE; virtual void PolygonOffset(GLfloat factor, GLfloat units) OVERRIDE; -virtual void ReadPixels( - GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, - void* pixels) OVERRIDE; +virtual void ReadPixels(GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + void* pixels) OVERRIDE; virtual void ReleaseShaderCompiler() OVERRIDE; -virtual void RenderbufferStorage( - GLenum target, GLenum internalformat, GLsizei width, - GLsizei height) OVERRIDE; +virtual void RenderbufferStorage(GLenum target, + GLenum internalformat, + GLsizei width, + GLsizei height) OVERRIDE; virtual void SampleCoverage(GLclampf value, GLboolean invert) OVERRIDE; virtual void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) OVERRIDE; -virtual void ShaderBinary( - GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, - GLsizei length) OVERRIDE; -virtual void ShaderSource( - GLuint shader, GLsizei count, const GLchar* const* str, - const GLint* length) OVERRIDE; +virtual void ShaderBinary(GLsizei n, + const GLuint* shaders, + GLenum binaryformat, + const void* binary, + GLsizei length) OVERRIDE; +virtual void ShaderSource(GLuint shader, + GLsizei count, + const GLchar* const* str, + const GLint* length) OVERRIDE; virtual void ShallowFinishCHROMIUM() OVERRIDE; virtual void ShallowFlushCHROMIUM() OVERRIDE; virtual void StencilFunc(GLenum func, GLint ref, GLuint mask) OVERRIDE; -virtual void StencilFuncSeparate( - GLenum face, GLenum func, GLint ref, GLuint mask) OVERRIDE; +virtual void StencilFuncSeparate(GLenum face, + GLenum func, + GLint ref, + GLuint mask) OVERRIDE; virtual void StencilMask(GLuint mask) OVERRIDE; virtual void StencilMaskSeparate(GLenum face, GLuint mask) OVERRIDE; virtual void StencilOp(GLenum fail, GLenum zfail, GLenum zpass) OVERRIDE; -virtual void StencilOpSeparate( - GLenum face, GLenum fail, GLenum zfail, GLenum zpass) OVERRIDE; -virtual void TexImage2D( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) OVERRIDE; -virtual void TexParameterf( - GLenum target, GLenum pname, GLfloat param) OVERRIDE; -virtual void TexParameterfv( - GLenum target, GLenum pname, const GLfloat* params) OVERRIDE; +virtual void StencilOpSeparate(GLenum face, + GLenum fail, + GLenum zfail, + GLenum zpass) OVERRIDE; +virtual void TexImage2D(GLenum target, + GLint level, + GLint internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) OVERRIDE; +virtual void TexParameterf(GLenum target, GLenum pname, GLfloat param) OVERRIDE; +virtual void TexParameterfv(GLenum target, + GLenum pname, + const GLfloat* params) OVERRIDE; virtual void TexParameteri(GLenum target, GLenum pname, GLint param) OVERRIDE; -virtual void TexParameteriv( - GLenum target, GLenum pname, const GLint* params) OVERRIDE; -virtual void TexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* pixels) OVERRIDE; +virtual void TexParameteriv(GLenum target, + GLenum pname, + const GLint* params) OVERRIDE; +virtual void TexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* pixels) OVERRIDE; virtual void Uniform1f(GLint location, GLfloat x) OVERRIDE; -virtual void Uniform1fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; +virtual void Uniform1fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; virtual void Uniform1i(GLint location, GLint x) OVERRIDE; -virtual void Uniform1iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void Uniform1iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; virtual void Uniform2f(GLint location, GLfloat x, GLfloat y) OVERRIDE; -virtual void Uniform2fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; +virtual void Uniform2fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; virtual void Uniform2i(GLint location, GLint x, GLint y) OVERRIDE; -virtual void Uniform2iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; -virtual void Uniform3f( - GLint location, GLfloat x, GLfloat y, GLfloat z) OVERRIDE; -virtual void Uniform3fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; +virtual void Uniform2iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void Uniform3f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z) OVERRIDE; +virtual void Uniform3fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; virtual void Uniform3i(GLint location, GLint x, GLint y, GLint z) OVERRIDE; -virtual void Uniform3iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; -virtual void Uniform4f( - GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) OVERRIDE; -virtual void Uniform4fv( - GLint location, GLsizei count, const GLfloat* v) OVERRIDE; -virtual void Uniform4i( - GLint location, GLint x, GLint y, GLint z, GLint w) OVERRIDE; -virtual void Uniform4iv( - GLint location, GLsizei count, const GLint* v) OVERRIDE; -virtual void UniformMatrix2fv( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) OVERRIDE; -virtual void UniformMatrix3fv( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) OVERRIDE; -virtual void UniformMatrix4fv( - GLint location, GLsizei count, GLboolean transpose, - const GLfloat* value) OVERRIDE; +virtual void Uniform3iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void Uniform4f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) OVERRIDE; +virtual void Uniform4fv(GLint location, + GLsizei count, + const GLfloat* v) OVERRIDE; +virtual void Uniform4i(GLint location, + GLint x, + GLint y, + GLint z, + GLint w) OVERRIDE; +virtual void Uniform4iv(GLint location, GLsizei count, const GLint* v) OVERRIDE; +virtual void UniformMatrix2fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) OVERRIDE; +virtual void UniformMatrix3fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) OVERRIDE; +virtual void UniformMatrix4fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) OVERRIDE; virtual void UseProgram(GLuint program) OVERRIDE; virtual void ValidateProgram(GLuint program) OVERRIDE; virtual void VertexAttrib1f(GLuint indx, GLfloat x) OVERRIDE; virtual void VertexAttrib1fv(GLuint indx, const GLfloat* values) OVERRIDE; virtual void VertexAttrib2f(GLuint indx, GLfloat x, GLfloat y) OVERRIDE; virtual void VertexAttrib2fv(GLuint indx, const GLfloat* values) OVERRIDE; -virtual void VertexAttrib3f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z) OVERRIDE; +virtual void VertexAttrib3f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z) OVERRIDE; virtual void VertexAttrib3fv(GLuint indx, const GLfloat* values) OVERRIDE; -virtual void VertexAttrib4f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) OVERRIDE; +virtual void VertexAttrib4f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) OVERRIDE; virtual void VertexAttrib4fv(GLuint indx, const GLfloat* values) OVERRIDE; -virtual void VertexAttribPointer( - GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, - const void* ptr) OVERRIDE; -virtual void Viewport( - GLint x, GLint y, GLsizei width, GLsizei height) OVERRIDE; -virtual void BlitFramebufferCHROMIUM( - GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, - GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, - GLenum filter) OVERRIDE; -virtual void RenderbufferStorageMultisampleCHROMIUM( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) OVERRIDE; -virtual void RenderbufferStorageMultisampleEXT( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, - GLsizei height) OVERRIDE; -virtual void FramebufferTexture2DMultisampleEXT( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level, GLsizei samples) OVERRIDE; -virtual void TexStorage2DEXT( - GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, - GLsizei height) OVERRIDE; +virtual void VertexAttribPointer(GLuint indx, + GLint size, + GLenum type, + GLboolean normalized, + GLsizei stride, + const void* ptr) OVERRIDE; +virtual void Viewport(GLint x, GLint y, GLsizei width, GLsizei height) OVERRIDE; +virtual void BlitFramebufferCHROMIUM(GLint srcX0, + GLint srcY0, + GLint srcX1, + GLint srcY1, + GLint dstX0, + GLint dstY0, + GLint dstX1, + GLint dstY1, + GLbitfield mask, + GLenum filter) OVERRIDE; +virtual void RenderbufferStorageMultisampleCHROMIUM(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) OVERRIDE; +virtual void RenderbufferStorageMultisampleEXT(GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, + GLsizei height) OVERRIDE; +virtual void FramebufferTexture2DMultisampleEXT(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level, + GLsizei samples) OVERRIDE; +virtual void TexStorage2DEXT(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height) OVERRIDE; virtual void GenQueriesEXT(GLsizei n, GLuint* queries) OVERRIDE; virtual void DeleteQueriesEXT(GLsizei n, const GLuint* queries) OVERRIDE; virtual GLboolean IsQueryEXT(GLuint id) OVERRIDE; virtual void BeginQueryEXT(GLenum target, GLuint id) OVERRIDE; virtual void EndQueryEXT(GLenum target) OVERRIDE; -virtual void GetQueryivEXT( - GLenum target, GLenum pname, GLint* params) OVERRIDE; -virtual void GetQueryObjectuivEXT( - GLuint id, GLenum pname, GLuint* params) OVERRIDE; -virtual void InsertEventMarkerEXT( - GLsizei length, const GLchar* marker) OVERRIDE; +virtual void GetQueryivEXT(GLenum target, GLenum pname, GLint* params) OVERRIDE; +virtual void GetQueryObjectuivEXT(GLuint id, + GLenum pname, + GLuint* params) OVERRIDE; +virtual void InsertEventMarkerEXT(GLsizei length, + const GLchar* marker) OVERRIDE; virtual void PushGroupMarkerEXT(GLsizei length, const GLchar* marker) OVERRIDE; virtual void PopGroupMarkerEXT() OVERRIDE; virtual void GenVertexArraysOES(GLsizei n, GLuint* arrays) OVERRIDE; @@ -275,84 +395,146 @@ virtual void DeleteVertexArraysOES(GLsizei n, const GLuint* arrays) OVERRIDE; virtual GLboolean IsVertexArrayOES(GLuint array) OVERRIDE; virtual void BindVertexArrayOES(GLuint array) OVERRIDE; virtual void SwapBuffers() OVERRIDE; -virtual GLuint GetMaxValueInBufferCHROMIUM( - GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) OVERRIDE; -virtual void GenSharedIdsCHROMIUM( - GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) OVERRIDE; -virtual void DeleteSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) OVERRIDE; -virtual void RegisterSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) OVERRIDE; +virtual GLuint GetMaxValueInBufferCHROMIUM(GLuint buffer_id, + GLsizei count, + GLenum type, + GLuint offset) OVERRIDE; +virtual void GenSharedIdsCHROMIUM(GLuint namespace_id, + GLuint id_offset, + GLsizei n, + GLuint* ids) OVERRIDE; +virtual void DeleteSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) OVERRIDE; +virtual void RegisterSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) OVERRIDE; virtual GLboolean EnableFeatureCHROMIUM(const char* feature) OVERRIDE; virtual void* MapBufferCHROMIUM(GLuint target, GLenum access) OVERRIDE; virtual GLboolean UnmapBufferCHROMIUM(GLuint target) OVERRIDE; -virtual void* MapImageCHROMIUM(GLuint image_id, GLenum access) OVERRIDE; +virtual void* MapImageCHROMIUM(GLuint image_id) OVERRIDE; virtual void UnmapImageCHROMIUM(GLuint image_id) OVERRIDE; -virtual void* MapBufferSubDataCHROMIUM( - GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) OVERRIDE; +virtual void* MapBufferSubDataCHROMIUM(GLuint target, + GLintptr offset, + GLsizeiptr size, + GLenum access) OVERRIDE; virtual void UnmapBufferSubDataCHROMIUM(const void* mem) OVERRIDE; -virtual void* MapTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, GLenum access) OVERRIDE; +virtual void* MapTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + GLenum access) OVERRIDE; virtual void UnmapTexSubImage2DCHROMIUM(const void* mem) OVERRIDE; -virtual void ResizeCHROMIUM( - GLuint width, GLuint height, GLfloat scale_factor) OVERRIDE; +virtual void ResizeCHROMIUM(GLuint width, + GLuint height, + GLfloat scale_factor) OVERRIDE; virtual const GLchar* GetRequestableExtensionsCHROMIUM() OVERRIDE; virtual void RequestExtensionCHROMIUM(const char* extension) OVERRIDE; virtual void RateLimitOffscreenContextCHROMIUM() OVERRIDE; -virtual void GetMultipleIntegervCHROMIUM( - const GLenum* pnames, GLuint count, GLint* results, - GLsizeiptr size) OVERRIDE; -virtual void GetProgramInfoCHROMIUM( - GLuint program, GLsizei bufsize, GLsizei* size, void* info) OVERRIDE; +virtual void GetMultipleIntegervCHROMIUM(const GLenum* pnames, + GLuint count, + GLint* results, + GLsizeiptr size) OVERRIDE; +virtual void GetProgramInfoCHROMIUM(GLuint program, + GLsizei bufsize, + GLsizei* size, + void* info) OVERRIDE; virtual GLuint CreateStreamTextureCHROMIUM(GLuint texture) OVERRIDE; -virtual void DestroyStreamTextureCHROMIUM(GLuint texture) OVERRIDE; -virtual GLuint CreateImageCHROMIUM( - GLsizei width, GLsizei height, GLenum internalformat) OVERRIDE; +virtual GLuint CreateImageCHROMIUM(GLsizei width, + GLsizei height, + GLenum internalformat, + GLenum usage) OVERRIDE; virtual void DestroyImageCHROMIUM(GLuint image_id) OVERRIDE; -virtual void GetImageParameterivCHROMIUM( - GLuint image_id, GLenum pname, GLint* params) OVERRIDE; -virtual void GetTranslatedShaderSourceANGLE( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) OVERRIDE; -virtual void PostSubBufferCHROMIUM( - GLint x, GLint y, GLint width, GLint height) OVERRIDE; -virtual void TexImageIOSurface2DCHROMIUM( - GLenum target, GLsizei width, GLsizei height, GLuint ioSurfaceId, - GLuint plane) OVERRIDE; -virtual void CopyTextureCHROMIUM( - GLenum target, GLenum source_id, GLenum dest_id, GLint level, - GLint internalformat, GLenum dest_type) OVERRIDE; -virtual void DrawArraysInstancedANGLE( - GLenum mode, GLint first, GLsizei count, GLsizei primcount) OVERRIDE; -virtual void DrawElementsInstancedANGLE( - GLenum mode, GLsizei count, GLenum type, const void* indices, - GLsizei primcount) OVERRIDE; +virtual void GetImageParameterivCHROMIUM(GLuint image_id, + GLenum pname, + GLint* params) OVERRIDE; +virtual void GetTranslatedShaderSourceANGLE(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) OVERRIDE; +virtual void PostSubBufferCHROMIUM(GLint x, + GLint y, + GLint width, + GLint height) OVERRIDE; +virtual void TexImageIOSurface2DCHROMIUM(GLenum target, + GLsizei width, + GLsizei height, + GLuint ioSurfaceId, + GLuint plane) OVERRIDE; +virtual void CopyTextureCHROMIUM(GLenum target, + GLenum source_id, + GLenum dest_id, + GLint level, + GLint internalformat, + GLenum dest_type) OVERRIDE; +virtual void DrawArraysInstancedANGLE(GLenum mode, + GLint first, + GLsizei count, + GLsizei primcount) OVERRIDE; +virtual void DrawElementsInstancedANGLE(GLenum mode, + GLsizei count, + GLenum type, + const void* indices, + GLsizei primcount) OVERRIDE; virtual void VertexAttribDivisorANGLE(GLuint index, GLuint divisor) OVERRIDE; virtual void GenMailboxCHROMIUM(GLbyte* mailbox) OVERRIDE; -virtual void ProduceTextureCHROMIUM( - GLenum target, const GLbyte* mailbox) OVERRIDE; -virtual void ConsumeTextureCHROMIUM( - GLenum target, const GLbyte* mailbox) OVERRIDE; -virtual void BindUniformLocationCHROMIUM( - GLuint program, GLint location, const char* name) OVERRIDE; +virtual void ProduceTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) OVERRIDE; +virtual void ProduceTextureDirectCHROMIUM(GLuint texture, + GLenum target, + const GLbyte* mailbox) OVERRIDE; +virtual void ConsumeTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) OVERRIDE; +virtual GLuint CreateAndConsumeTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) OVERRIDE; +virtual void BindUniformLocationCHROMIUM(GLuint program, + GLint location, + const char* name) OVERRIDE; virtual void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) OVERRIDE; virtual void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) OVERRIDE; virtual void TraceBeginCHROMIUM(const char* name) OVERRIDE; virtual void TraceEndCHROMIUM() OVERRIDE; -virtual void AsyncTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* data) OVERRIDE; -virtual void AsyncTexImage2DCHROMIUM( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) OVERRIDE; +virtual void AsyncTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* data) OVERRIDE; +virtual void AsyncTexImage2DCHROMIUM(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) OVERRIDE; virtual void WaitAsyncTexImage2DCHROMIUM(GLenum target) OVERRIDE; -virtual void DiscardFramebufferEXT( - GLenum target, GLsizei count, const GLenum* attachments) OVERRIDE; +virtual void WaitAllAsyncTexImage2DCHROMIUM() OVERRIDE; +virtual void DiscardFramebufferEXT(GLenum target, + GLsizei count, + const GLenum* attachments) OVERRIDE; virtual void LoseContextCHROMIUM(GLenum current, GLenum other) OVERRIDE; virtual GLuint InsertSyncPointCHROMIUM() OVERRIDE; virtual void WaitSyncPointCHROMIUM(GLuint sync_point) OVERRIDE; virtual void DrawBuffersEXT(GLsizei count, const GLenum* bufs) OVERRIDE; virtual void DiscardBackbufferCHROMIUM() OVERRIDE; +virtual void ScheduleOverlayPlaneCHROMIUM(GLint plane_z_order, + GLenum plane_transform, + GLuint overlay_texture_id, + GLint bounds_x, + GLint bounds_y, + GLint bounds_width, + GLint bounds_height, + GLfloat uv_x, + GLfloat uv_y, + GLfloat uv_width, + GLfloat uv_height) OVERRIDE; #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_TRACE_IMPLEMENTATION_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/chromium/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h index 49d7ab2a947..ec4a365b7a3 100644 --- a/chromium/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h +++ b/chromium/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // This file is included by gles2_trace_implementation.cc @@ -20,8 +22,9 @@ void GLES2TraceImplementation::AttachShader(GLuint program, GLuint shader) { gl_->AttachShader(program, shader); } -void GLES2TraceImplementation::BindAttribLocation( - GLuint program, GLuint index, const char* name) { +void GLES2TraceImplementation::BindAttribLocation(GLuint program, + GLuint index, + const char* name) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BindAttribLocation"); gl_->BindAttribLocation(program, index, name); } @@ -31,14 +34,14 @@ void GLES2TraceImplementation::BindBuffer(GLenum target, GLuint buffer) { gl_->BindBuffer(target, buffer); } -void GLES2TraceImplementation::BindFramebuffer( - GLenum target, GLuint framebuffer) { +void GLES2TraceImplementation::BindFramebuffer(GLenum target, + GLuint framebuffer) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BindFramebuffer"); gl_->BindFramebuffer(target, framebuffer); } -void GLES2TraceImplementation::BindRenderbuffer( - GLenum target, GLuint renderbuffer) { +void GLES2TraceImplementation::BindRenderbuffer(GLenum target, + GLuint renderbuffer) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BindRenderbuffer"); gl_->BindRenderbuffer(target, renderbuffer); } @@ -48,8 +51,10 @@ void GLES2TraceImplementation::BindTexture(GLenum target, GLuint texture) { gl_->BindTexture(target, texture); } -void GLES2TraceImplementation::BlendColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { +void GLES2TraceImplementation::BlendColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BlendColor"); gl_->BlendColor(red, green, blue, alpha); } @@ -59,8 +64,8 @@ void GLES2TraceImplementation::BlendEquation(GLenum mode) { gl_->BlendEquation(mode); } -void GLES2TraceImplementation::BlendEquationSeparate( - GLenum modeRGB, GLenum modeAlpha) { +void GLES2TraceImplementation::BlendEquationSeparate(GLenum modeRGB, + GLenum modeAlpha) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BlendEquationSeparate"); gl_->BlendEquationSeparate(modeRGB, modeAlpha); } @@ -70,20 +75,26 @@ void GLES2TraceImplementation::BlendFunc(GLenum sfactor, GLenum dfactor) { gl_->BlendFunc(sfactor, dfactor); } -void GLES2TraceImplementation::BlendFuncSeparate( - GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) { +void GLES2TraceImplementation::BlendFuncSeparate(GLenum srcRGB, + GLenum dstRGB, + GLenum srcAlpha, + GLenum dstAlpha) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BlendFuncSeparate"); gl_->BlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha); } -void GLES2TraceImplementation::BufferData( - GLenum target, GLsizeiptr size, const void* data, GLenum usage) { +void GLES2TraceImplementation::BufferData(GLenum target, + GLsizeiptr size, + const void* data, + GLenum usage) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BufferData"); gl_->BufferData(target, size, data, usage); } -void GLES2TraceImplementation::BufferSubData( - GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { +void GLES2TraceImplementation::BufferSubData(GLenum target, + GLintptr offset, + GLsizeiptr size, + const void* data) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BufferSubData"); gl_->BufferSubData(target, offset, size, data); } @@ -98,8 +109,10 @@ void GLES2TraceImplementation::Clear(GLbitfield mask) { gl_->Clear(mask); } -void GLES2TraceImplementation::ClearColor( - GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) { +void GLES2TraceImplementation::ClearColor(GLclampf red, + GLclampf green, + GLclampf blue, + GLclampf alpha) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ClearColor"); gl_->ClearColor(red, green, blue, alpha); } @@ -114,8 +127,10 @@ void GLES2TraceImplementation::ClearStencil(GLint s) { gl_->ClearStencil(s); } -void GLES2TraceImplementation::ColorMask( - GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) { +void GLES2TraceImplementation::ColorMask(GLboolean red, + GLboolean green, + GLboolean blue, + GLboolean alpha) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ColorMask"); gl_->ColorMask(red, green, blue, alpha); } @@ -125,33 +140,54 @@ void GLES2TraceImplementation::CompileShader(GLuint shader) { gl_->CompileShader(shader); } -void GLES2TraceImplementation::CompressedTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLsizei width, - GLsizei height, GLint border, GLsizei imageSize, const void* data) { +void GLES2TraceImplementation::CompressedTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLsizei imageSize, + const void* data) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::CompressedTexImage2D"); gl_->CompressedTexImage2D( target, level, internalformat, width, height, border, imageSize, data); } -void GLES2TraceImplementation::CompressedTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLsizei imageSize, const void* data) { +void GLES2TraceImplementation::CompressedTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLsizei imageSize, + const void* data) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::CompressedTexSubImage2D"); gl_->CompressedTexSubImage2D( target, level, xoffset, yoffset, width, height, format, imageSize, data); } -void GLES2TraceImplementation::CopyTexImage2D( - GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, - GLsizei width, GLsizei height, GLint border) { +void GLES2TraceImplementation::CopyTexImage2D(GLenum target, + GLint level, + GLenum internalformat, + GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLint border) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::CopyTexImage2D"); gl_->CopyTexImage2D( target, level, internalformat, x, y, width, height, border); } -void GLES2TraceImplementation::CopyTexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, - GLsizei width, GLsizei height) { +void GLES2TraceImplementation::CopyTexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLint x, + GLint y, + GLsizei width, + GLsizei height) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::CopyTexSubImage2D"); gl_->CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height); } @@ -171,14 +207,13 @@ void GLES2TraceImplementation::CullFace(GLenum mode) { gl_->CullFace(mode); } -void GLES2TraceImplementation::DeleteBuffers( - GLsizei n, const GLuint* buffers) { +void GLES2TraceImplementation::DeleteBuffers(GLsizei n, const GLuint* buffers) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DeleteBuffers"); gl_->DeleteBuffers(n, buffers); } -void GLES2TraceImplementation::DeleteFramebuffers( - GLsizei n, const GLuint* framebuffers) { +void GLES2TraceImplementation::DeleteFramebuffers(GLsizei n, + const GLuint* framebuffers) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DeleteFramebuffers"); gl_->DeleteFramebuffers(n, framebuffers); } @@ -189,7 +224,8 @@ void GLES2TraceImplementation::DeleteProgram(GLuint program) { } void GLES2TraceImplementation::DeleteRenderbuffers( - GLsizei n, const GLuint* renderbuffers) { + GLsizei n, + const GLuint* renderbuffers) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DeleteRenderbuffers"); gl_->DeleteRenderbuffers(n, renderbuffers); } @@ -199,8 +235,8 @@ void GLES2TraceImplementation::DeleteShader(GLuint shader) { gl_->DeleteShader(shader); } -void GLES2TraceImplementation::DeleteTextures( - GLsizei n, const GLuint* textures) { +void GLES2TraceImplementation::DeleteTextures(GLsizei n, + const GLuint* textures) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DeleteTextures"); gl_->DeleteTextures(n, textures); } @@ -235,14 +271,17 @@ void GLES2TraceImplementation::DisableVertexAttribArray(GLuint index) { gl_->DisableVertexAttribArray(index); } -void GLES2TraceImplementation::DrawArrays( - GLenum mode, GLint first, GLsizei count) { +void GLES2TraceImplementation::DrawArrays(GLenum mode, + GLint first, + GLsizei count) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DrawArrays"); gl_->DrawArrays(mode, first, count); } -void GLES2TraceImplementation::DrawElements( - GLenum mode, GLsizei count, GLenum type, const void* indices) { +void GLES2TraceImplementation::DrawElements(GLenum mode, + GLsizei count, + GLenum type, + const void* indices) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DrawElements"); gl_->DrawElements(mode, count, type, indices); } @@ -268,16 +307,20 @@ void GLES2TraceImplementation::Flush() { } void GLES2TraceImplementation::FramebufferRenderbuffer( - GLenum target, GLenum attachment, GLenum renderbuffertarget, + GLenum target, + GLenum attachment, + GLenum renderbuffertarget, GLuint renderbuffer) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::FramebufferRenderbuffer"); gl_->FramebufferRenderbuffer( target, attachment, renderbuffertarget, renderbuffer); } -void GLES2TraceImplementation::FramebufferTexture2D( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level) { +void GLES2TraceImplementation::FramebufferTexture2D(GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::FramebufferTexture2D"); gl_->FramebufferTexture2D(target, attachment, textarget, texture, level); } @@ -297,14 +340,14 @@ void GLES2TraceImplementation::GenerateMipmap(GLenum target) { gl_->GenerateMipmap(target); } -void GLES2TraceImplementation::GenFramebuffers( - GLsizei n, GLuint* framebuffers) { +void GLES2TraceImplementation::GenFramebuffers(GLsizei n, + GLuint* framebuffers) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GenFramebuffers"); gl_->GenFramebuffers(n, framebuffers); } -void GLES2TraceImplementation::GenRenderbuffers( - GLsizei n, GLuint* renderbuffers) { +void GLES2TraceImplementation::GenRenderbuffers(GLsizei n, + GLuint* renderbuffers) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GenRenderbuffers"); gl_->GenRenderbuffers(n, renderbuffers); } @@ -314,28 +357,38 @@ void GLES2TraceImplementation::GenTextures(GLsizei n, GLuint* textures) { gl_->GenTextures(n, textures); } -void GLES2TraceImplementation::GetActiveAttrib( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) { +void GLES2TraceImplementation::GetActiveAttrib(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetActiveAttrib"); gl_->GetActiveAttrib(program, index, bufsize, length, size, type, name); } -void GLES2TraceImplementation::GetActiveUniform( - GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, - GLenum* type, char* name) { +void GLES2TraceImplementation::GetActiveUniform(GLuint program, + GLuint index, + GLsizei bufsize, + GLsizei* length, + GLint* size, + GLenum* type, + char* name) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetActiveUniform"); gl_->GetActiveUniform(program, index, bufsize, length, size, type, name); } -void GLES2TraceImplementation::GetAttachedShaders( - GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) { +void GLES2TraceImplementation::GetAttachedShaders(GLuint program, + GLsizei maxcount, + GLsizei* count, + GLuint* shaders) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetAttachedShaders"); gl_->GetAttachedShaders(program, maxcount, count, shaders); } -GLint GLES2TraceImplementation::GetAttribLocation( - GLuint program, const char* name) { +GLint GLES2TraceImplementation::GetAttribLocation(GLuint program, + const char* name) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetAttribLocation"); return gl_->GetAttribLocation(program, name); } @@ -345,8 +398,9 @@ void GLES2TraceImplementation::GetBooleanv(GLenum pname, GLboolean* params) { gl_->GetBooleanv(pname, params); } -void GLES2TraceImplementation::GetBufferParameteriv( - GLenum target, GLenum pname, GLint* params) { +void GLES2TraceImplementation::GetBufferParameteriv(GLenum target, + GLenum pname, + GLint* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetBufferParameteriv"); gl_->GetBufferParameteriv(target, pname, params); } @@ -362,8 +416,12 @@ void GLES2TraceImplementation::GetFloatv(GLenum pname, GLfloat* params) { } void GLES2TraceImplementation::GetFramebufferAttachmentParameteriv( - GLenum target, GLenum attachment, GLenum pname, GLint* params) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetFramebufferAttachmentParameteriv"); // NOLINT + GLenum target, + GLenum attachment, + GLenum pname, + GLint* params) { + TRACE_EVENT_BINARY_EFFICIENT0( + "gpu", "GLES2Trace::GetFramebufferAttachmentParameteriv"); gl_->GetFramebufferAttachmentParameteriv(target, attachment, pname, params); } @@ -372,44 +430,56 @@ void GLES2TraceImplementation::GetIntegerv(GLenum pname, GLint* params) { gl_->GetIntegerv(pname, params); } -void GLES2TraceImplementation::GetProgramiv( - GLuint program, GLenum pname, GLint* params) { +void GLES2TraceImplementation::GetProgramiv(GLuint program, + GLenum pname, + GLint* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetProgramiv"); gl_->GetProgramiv(program, pname, params); } -void GLES2TraceImplementation::GetProgramInfoLog( - GLuint program, GLsizei bufsize, GLsizei* length, char* infolog) { +void GLES2TraceImplementation::GetProgramInfoLog(GLuint program, + GLsizei bufsize, + GLsizei* length, + char* infolog) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetProgramInfoLog"); gl_->GetProgramInfoLog(program, bufsize, length, infolog); } -void GLES2TraceImplementation::GetRenderbufferParameteriv( - GLenum target, GLenum pname, GLint* params) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetRenderbufferParameteriv"); // NOLINT +void GLES2TraceImplementation::GetRenderbufferParameteriv(GLenum target, + GLenum pname, + GLint* params) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::GetRenderbufferParameteriv"); gl_->GetRenderbufferParameteriv(target, pname, params); } -void GLES2TraceImplementation::GetShaderiv( - GLuint shader, GLenum pname, GLint* params) { +void GLES2TraceImplementation::GetShaderiv(GLuint shader, + GLenum pname, + GLint* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetShaderiv"); gl_->GetShaderiv(shader, pname, params); } -void GLES2TraceImplementation::GetShaderInfoLog( - GLuint shader, GLsizei bufsize, GLsizei* length, char* infolog) { +void GLES2TraceImplementation::GetShaderInfoLog(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* infolog) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetShaderInfoLog"); gl_->GetShaderInfoLog(shader, bufsize, length, infolog); } -void GLES2TraceImplementation::GetShaderPrecisionFormat( - GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { +void GLES2TraceImplementation::GetShaderPrecisionFormat(GLenum shadertype, + GLenum precisiontype, + GLint* range, + GLint* precision) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetShaderPrecisionFormat"); gl_->GetShaderPrecisionFormat(shadertype, precisiontype, range, precision); } -void GLES2TraceImplementation::GetShaderSource( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) { +void GLES2TraceImplementation::GetShaderSource(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetShaderSource"); gl_->GetShaderSource(shader, bufsize, length, source); } @@ -419,50 +489,57 @@ const GLubyte* GLES2TraceImplementation::GetString(GLenum name) { return gl_->GetString(name); } -void GLES2TraceImplementation::GetTexParameterfv( - GLenum target, GLenum pname, GLfloat* params) { +void GLES2TraceImplementation::GetTexParameterfv(GLenum target, + GLenum pname, + GLfloat* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetTexParameterfv"); gl_->GetTexParameterfv(target, pname, params); } -void GLES2TraceImplementation::GetTexParameteriv( - GLenum target, GLenum pname, GLint* params) { +void GLES2TraceImplementation::GetTexParameteriv(GLenum target, + GLenum pname, + GLint* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetTexParameteriv"); gl_->GetTexParameteriv(target, pname, params); } -void GLES2TraceImplementation::GetUniformfv( - GLuint program, GLint location, GLfloat* params) { +void GLES2TraceImplementation::GetUniformfv(GLuint program, + GLint location, + GLfloat* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetUniformfv"); gl_->GetUniformfv(program, location, params); } -void GLES2TraceImplementation::GetUniformiv( - GLuint program, GLint location, GLint* params) { +void GLES2TraceImplementation::GetUniformiv(GLuint program, + GLint location, + GLint* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetUniformiv"); gl_->GetUniformiv(program, location, params); } -GLint GLES2TraceImplementation::GetUniformLocation( - GLuint program, const char* name) { +GLint GLES2TraceImplementation::GetUniformLocation(GLuint program, + const char* name) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetUniformLocation"); return gl_->GetUniformLocation(program, name); } -void GLES2TraceImplementation::GetVertexAttribfv( - GLuint index, GLenum pname, GLfloat* params) { +void GLES2TraceImplementation::GetVertexAttribfv(GLuint index, + GLenum pname, + GLfloat* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetVertexAttribfv"); gl_->GetVertexAttribfv(index, pname, params); } -void GLES2TraceImplementation::GetVertexAttribiv( - GLuint index, GLenum pname, GLint* params) { +void GLES2TraceImplementation::GetVertexAttribiv(GLuint index, + GLenum pname, + GLint* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetVertexAttribiv"); gl_->GetVertexAttribiv(index, pname, params); } -void GLES2TraceImplementation::GetVertexAttribPointerv( - GLuint index, GLenum pname, void** pointer) { +void GLES2TraceImplementation::GetVertexAttribPointerv(GLuint index, + GLenum pname, + void** pointer) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetVertexAttribPointerv"); gl_->GetVertexAttribPointerv(index, pname, pointer); } @@ -527,9 +604,13 @@ void GLES2TraceImplementation::PolygonOffset(GLfloat factor, GLfloat units) { gl_->PolygonOffset(factor, units); } -void GLES2TraceImplementation::ReadPixels( - GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, - void* pixels) { +void GLES2TraceImplementation::ReadPixels(GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + void* pixels) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ReadPixels"); gl_->ReadPixels(x, y, width, height, format, type, pixels); } @@ -539,34 +620,41 @@ void GLES2TraceImplementation::ReleaseShaderCompiler() { gl_->ReleaseShaderCompiler(); } -void GLES2TraceImplementation::RenderbufferStorage( - GLenum target, GLenum internalformat, GLsizei width, GLsizei height) { +void GLES2TraceImplementation::RenderbufferStorage(GLenum target, + GLenum internalformat, + GLsizei width, + GLsizei height) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::RenderbufferStorage"); gl_->RenderbufferStorage(target, internalformat, width, height); } -void GLES2TraceImplementation::SampleCoverage( - GLclampf value, GLboolean invert) { +void GLES2TraceImplementation::SampleCoverage(GLclampf value, + GLboolean invert) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::SampleCoverage"); gl_->SampleCoverage(value, invert); } -void GLES2TraceImplementation::Scissor( - GLint x, GLint y, GLsizei width, GLsizei height) { +void GLES2TraceImplementation::Scissor(GLint x, + GLint y, + GLsizei width, + GLsizei height) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Scissor"); gl_->Scissor(x, y, width, height); } -void GLES2TraceImplementation::ShaderBinary( - GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, - GLsizei length) { +void GLES2TraceImplementation::ShaderBinary(GLsizei n, + const GLuint* shaders, + GLenum binaryformat, + const void* binary, + GLsizei length) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ShaderBinary"); gl_->ShaderBinary(n, shaders, binaryformat, binary, length); } -void GLES2TraceImplementation::ShaderSource( - GLuint shader, GLsizei count, const GLchar* const* str, - const GLint* length) { +void GLES2TraceImplementation::ShaderSource(GLuint shader, + GLsizei count, + const GLchar* const* str, + const GLint* length) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ShaderSource"); gl_->ShaderSource(shader, count, str, length); } @@ -581,14 +669,17 @@ void GLES2TraceImplementation::ShallowFlushCHROMIUM() { gl_->ShallowFlushCHROMIUM(); } -void GLES2TraceImplementation::StencilFunc( - GLenum func, GLint ref, GLuint mask) { +void GLES2TraceImplementation::StencilFunc(GLenum func, + GLint ref, + GLuint mask) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::StencilFunc"); gl_->StencilFunc(func, ref, mask); } -void GLES2TraceImplementation::StencilFuncSeparate( - GLenum face, GLenum func, GLint ref, GLuint mask) { +void GLES2TraceImplementation::StencilFuncSeparate(GLenum face, + GLenum func, + GLint ref, + GLuint mask) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::StencilFuncSeparate"); gl_->StencilFuncSeparate(face, func, ref, mask); } @@ -603,55 +694,79 @@ void GLES2TraceImplementation::StencilMaskSeparate(GLenum face, GLuint mask) { gl_->StencilMaskSeparate(face, mask); } -void GLES2TraceImplementation::StencilOp( - GLenum fail, GLenum zfail, GLenum zpass) { +void GLES2TraceImplementation::StencilOp(GLenum fail, + GLenum zfail, + GLenum zpass) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::StencilOp"); gl_->StencilOp(fail, zfail, zpass); } -void GLES2TraceImplementation::StencilOpSeparate( - GLenum face, GLenum fail, GLenum zfail, GLenum zpass) { +void GLES2TraceImplementation::StencilOpSeparate(GLenum face, + GLenum fail, + GLenum zfail, + GLenum zpass) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::StencilOpSeparate"); gl_->StencilOpSeparate(face, fail, zfail, zpass); } -void GLES2TraceImplementation::TexImage2D( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) { +void GLES2TraceImplementation::TexImage2D(GLenum target, + GLint level, + GLint internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::TexImage2D"); - gl_->TexImage2D( - target, level, internalformat, width, height, border, format, type, - pixels); -} - -void GLES2TraceImplementation::TexParameterf( - GLenum target, GLenum pname, GLfloat param) { + gl_->TexImage2D(target, + level, + internalformat, + width, + height, + border, + format, + type, + pixels); +} + +void GLES2TraceImplementation::TexParameterf(GLenum target, + GLenum pname, + GLfloat param) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::TexParameterf"); gl_->TexParameterf(target, pname, param); } -void GLES2TraceImplementation::TexParameterfv( - GLenum target, GLenum pname, const GLfloat* params) { +void GLES2TraceImplementation::TexParameterfv(GLenum target, + GLenum pname, + const GLfloat* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::TexParameterfv"); gl_->TexParameterfv(target, pname, params); } -void GLES2TraceImplementation::TexParameteri( - GLenum target, GLenum pname, GLint param) { +void GLES2TraceImplementation::TexParameteri(GLenum target, + GLenum pname, + GLint param) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::TexParameteri"); gl_->TexParameteri(target, pname, param); } -void GLES2TraceImplementation::TexParameteriv( - GLenum target, GLenum pname, const GLint* params) { +void GLES2TraceImplementation::TexParameteriv(GLenum target, + GLenum pname, + const GLint* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::TexParameteriv"); gl_->TexParameteriv(target, pname, params); } -void GLES2TraceImplementation::TexSubImage2D( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* pixels) { +void GLES2TraceImplementation::TexSubImage2D(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* pixels) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::TexSubImage2D"); gl_->TexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, pixels); @@ -662,8 +777,9 @@ void GLES2TraceImplementation::Uniform1f(GLint location, GLfloat x) { gl_->Uniform1f(location, x); } -void GLES2TraceImplementation::Uniform1fv( - GLint location, GLsizei count, const GLfloat* v) { +void GLES2TraceImplementation::Uniform1fv(GLint location, + GLsizei count, + const GLfloat* v) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform1fv"); gl_->Uniform1fv(location, count, v); } @@ -673,20 +789,21 @@ void GLES2TraceImplementation::Uniform1i(GLint location, GLint x) { gl_->Uniform1i(location, x); } -void GLES2TraceImplementation::Uniform1iv( - GLint location, GLsizei count, const GLint* v) { +void GLES2TraceImplementation::Uniform1iv(GLint location, + GLsizei count, + const GLint* v) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform1iv"); gl_->Uniform1iv(location, count, v); } -void GLES2TraceImplementation::Uniform2f( - GLint location, GLfloat x, GLfloat y) { +void GLES2TraceImplementation::Uniform2f(GLint location, GLfloat x, GLfloat y) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform2f"); gl_->Uniform2f(location, x, y); } -void GLES2TraceImplementation::Uniform2fv( - GLint location, GLsizei count, const GLfloat* v) { +void GLES2TraceImplementation::Uniform2fv(GLint location, + GLsizei count, + const GLfloat* v) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform2fv"); gl_->Uniform2fv(location, count, v); } @@ -696,74 +813,95 @@ void GLES2TraceImplementation::Uniform2i(GLint location, GLint x, GLint y) { gl_->Uniform2i(location, x, y); } -void GLES2TraceImplementation::Uniform2iv( - GLint location, GLsizei count, const GLint* v) { +void GLES2TraceImplementation::Uniform2iv(GLint location, + GLsizei count, + const GLint* v) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform2iv"); gl_->Uniform2iv(location, count, v); } -void GLES2TraceImplementation::Uniform3f( - GLint location, GLfloat x, GLfloat y, GLfloat z) { +void GLES2TraceImplementation::Uniform3f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform3f"); gl_->Uniform3f(location, x, y, z); } -void GLES2TraceImplementation::Uniform3fv( - GLint location, GLsizei count, const GLfloat* v) { +void GLES2TraceImplementation::Uniform3fv(GLint location, + GLsizei count, + const GLfloat* v) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform3fv"); gl_->Uniform3fv(location, count, v); } -void GLES2TraceImplementation::Uniform3i( - GLint location, GLint x, GLint y, GLint z) { +void GLES2TraceImplementation::Uniform3i(GLint location, + GLint x, + GLint y, + GLint z) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform3i"); gl_->Uniform3i(location, x, y, z); } -void GLES2TraceImplementation::Uniform3iv( - GLint location, GLsizei count, const GLint* v) { +void GLES2TraceImplementation::Uniform3iv(GLint location, + GLsizei count, + const GLint* v) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform3iv"); gl_->Uniform3iv(location, count, v); } -void GLES2TraceImplementation::Uniform4f( - GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { +void GLES2TraceImplementation::Uniform4f(GLint location, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform4f"); gl_->Uniform4f(location, x, y, z, w); } -void GLES2TraceImplementation::Uniform4fv( - GLint location, GLsizei count, const GLfloat* v) { +void GLES2TraceImplementation::Uniform4fv(GLint location, + GLsizei count, + const GLfloat* v) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform4fv"); gl_->Uniform4fv(location, count, v); } -void GLES2TraceImplementation::Uniform4i( - GLint location, GLint x, GLint y, GLint z, GLint w) { +void GLES2TraceImplementation::Uniform4i(GLint location, + GLint x, + GLint y, + GLint z, + GLint w) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform4i"); gl_->Uniform4i(location, x, y, z, w); } -void GLES2TraceImplementation::Uniform4iv( - GLint location, GLsizei count, const GLint* v) { +void GLES2TraceImplementation::Uniform4iv(GLint location, + GLsizei count, + const GLint* v) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Uniform4iv"); gl_->Uniform4iv(location, count, v); } -void GLES2TraceImplementation::UniformMatrix2fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { +void GLES2TraceImplementation::UniformMatrix2fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UniformMatrix2fv"); gl_->UniformMatrix2fv(location, count, transpose, value); } -void GLES2TraceImplementation::UniformMatrix3fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { +void GLES2TraceImplementation::UniformMatrix3fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UniformMatrix3fv"); gl_->UniformMatrix3fv(location, count, transpose, value); } -void GLES2TraceImplementation::UniformMatrix4fv( - GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) { +void GLES2TraceImplementation::UniformMatrix4fv(GLint location, + GLsizei count, + GLboolean transpose, + const GLfloat* value) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UniformMatrix4fv"); gl_->UniformMatrix4fv(location, count, transpose, value); } @@ -783,96 +921,129 @@ void GLES2TraceImplementation::VertexAttrib1f(GLuint indx, GLfloat x) { gl_->VertexAttrib1f(indx, x); } -void GLES2TraceImplementation::VertexAttrib1fv( - GLuint indx, const GLfloat* values) { +void GLES2TraceImplementation::VertexAttrib1fv(GLuint indx, + const GLfloat* values) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttrib1fv"); gl_->VertexAttrib1fv(indx, values); } -void GLES2TraceImplementation::VertexAttrib2f( - GLuint indx, GLfloat x, GLfloat y) { +void GLES2TraceImplementation::VertexAttrib2f(GLuint indx, + GLfloat x, + GLfloat y) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttrib2f"); gl_->VertexAttrib2f(indx, x, y); } -void GLES2TraceImplementation::VertexAttrib2fv( - GLuint indx, const GLfloat* values) { +void GLES2TraceImplementation::VertexAttrib2fv(GLuint indx, + const GLfloat* values) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttrib2fv"); gl_->VertexAttrib2fv(indx, values); } -void GLES2TraceImplementation::VertexAttrib3f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z) { +void GLES2TraceImplementation::VertexAttrib3f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttrib3f"); gl_->VertexAttrib3f(indx, x, y, z); } -void GLES2TraceImplementation::VertexAttrib3fv( - GLuint indx, const GLfloat* values) { +void GLES2TraceImplementation::VertexAttrib3fv(GLuint indx, + const GLfloat* values) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttrib3fv"); gl_->VertexAttrib3fv(indx, values); } -void GLES2TraceImplementation::VertexAttrib4f( - GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { +void GLES2TraceImplementation::VertexAttrib4f(GLuint indx, + GLfloat x, + GLfloat y, + GLfloat z, + GLfloat w) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttrib4f"); gl_->VertexAttrib4f(indx, x, y, z, w); } -void GLES2TraceImplementation::VertexAttrib4fv( - GLuint indx, const GLfloat* values) { +void GLES2TraceImplementation::VertexAttrib4fv(GLuint indx, + const GLfloat* values) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttrib4fv"); gl_->VertexAttrib4fv(indx, values); } -void GLES2TraceImplementation::VertexAttribPointer( - GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, - const void* ptr) { +void GLES2TraceImplementation::VertexAttribPointer(GLuint indx, + GLint size, + GLenum type, + GLboolean normalized, + GLsizei stride, + const void* ptr) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttribPointer"); gl_->VertexAttribPointer(indx, size, type, normalized, stride, ptr); } -void GLES2TraceImplementation::Viewport( - GLint x, GLint y, GLsizei width, GLsizei height) { +void GLES2TraceImplementation::Viewport(GLint x, + GLint y, + GLsizei width, + GLsizei height) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::Viewport"); gl_->Viewport(x, y, width, height); } -void GLES2TraceImplementation::BlitFramebufferCHROMIUM( - GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, - GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { +void GLES2TraceImplementation::BlitFramebufferCHROMIUM(GLint srcX0, + GLint srcY0, + GLint srcX1, + GLint srcY1, + GLint dstX0, + GLint dstY0, + GLint dstX1, + GLint dstY1, + GLbitfield mask, + GLenum filter) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BlitFramebufferCHROMIUM"); gl_->BlitFramebufferCHROMIUM( srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); } void GLES2TraceImplementation::RenderbufferStorageMultisampleCHROMIUM( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, + GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, GLsizei height) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::RenderbufferStorageMultisampleCHROMIUM"); // NOLINT + TRACE_EVENT_BINARY_EFFICIENT0( + "gpu", "GLES2Trace::RenderbufferStorageMultisampleCHROMIUM"); gl_->RenderbufferStorageMultisampleCHROMIUM( target, samples, internalformat, width, height); } void GLES2TraceImplementation::RenderbufferStorageMultisampleEXT( - GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, + GLenum target, + GLsizei samples, + GLenum internalformat, + GLsizei width, GLsizei height) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::RenderbufferStorageMultisampleEXT"); // NOLINT + TRACE_EVENT_BINARY_EFFICIENT0( + "gpu", "GLES2Trace::RenderbufferStorageMultisampleEXT"); gl_->RenderbufferStorageMultisampleEXT( target, samples, internalformat, width, height); } void GLES2TraceImplementation::FramebufferTexture2DMultisampleEXT( - GLenum target, GLenum attachment, GLenum textarget, GLuint texture, - GLint level, GLsizei samples) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::FramebufferTexture2DMultisampleEXT"); // NOLINT + GLenum target, + GLenum attachment, + GLenum textarget, + GLuint texture, + GLint level, + GLsizei samples) { + TRACE_EVENT_BINARY_EFFICIENT0( + "gpu", "GLES2Trace::FramebufferTexture2DMultisampleEXT"); gl_->FramebufferTexture2DMultisampleEXT( target, attachment, textarget, texture, level, samples); } -void GLES2TraceImplementation::TexStorage2DEXT( - GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, - GLsizei height) { +void GLES2TraceImplementation::TexStorage2DEXT(GLenum target, + GLsizei levels, + GLenum internalFormat, + GLsizei width, + GLsizei height) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::TexStorage2DEXT"); gl_->TexStorage2DEXT(target, levels, internalFormat, width, height); } @@ -882,8 +1053,8 @@ void GLES2TraceImplementation::GenQueriesEXT(GLsizei n, GLuint* queries) { gl_->GenQueriesEXT(n, queries); } -void GLES2TraceImplementation::DeleteQueriesEXT( - GLsizei n, const GLuint* queries) { +void GLES2TraceImplementation::DeleteQueriesEXT(GLsizei n, + const GLuint* queries) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DeleteQueriesEXT"); gl_->DeleteQueriesEXT(n, queries); } @@ -903,26 +1074,28 @@ void GLES2TraceImplementation::EndQueryEXT(GLenum target) { gl_->EndQueryEXT(target); } -void GLES2TraceImplementation::GetQueryivEXT( - GLenum target, GLenum pname, GLint* params) { +void GLES2TraceImplementation::GetQueryivEXT(GLenum target, + GLenum pname, + GLint* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetQueryivEXT"); gl_->GetQueryivEXT(target, pname, params); } -void GLES2TraceImplementation::GetQueryObjectuivEXT( - GLuint id, GLenum pname, GLuint* params) { +void GLES2TraceImplementation::GetQueryObjectuivEXT(GLuint id, + GLenum pname, + GLuint* params) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetQueryObjectuivEXT"); gl_->GetQueryObjectuivEXT(id, pname, params); } -void GLES2TraceImplementation::InsertEventMarkerEXT( - GLsizei length, const GLchar* marker) { +void GLES2TraceImplementation::InsertEventMarkerEXT(GLsizei length, + const GLchar* marker) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::InsertEventMarkerEXT"); gl_->InsertEventMarkerEXT(length, marker); } -void GLES2TraceImplementation::PushGroupMarkerEXT( - GLsizei length, const GLchar* marker) { +void GLES2TraceImplementation::PushGroupMarkerEXT(GLsizei length, + const GLchar* marker) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::PushGroupMarkerEXT"); gl_->PushGroupMarkerEXT(length, marker); } @@ -937,8 +1110,8 @@ void GLES2TraceImplementation::GenVertexArraysOES(GLsizei n, GLuint* arrays) { gl_->GenVertexArraysOES(n, arrays); } -void GLES2TraceImplementation::DeleteVertexArraysOES( - GLsizei n, const GLuint* arrays) { +void GLES2TraceImplementation::DeleteVertexArraysOES(GLsizei n, + const GLuint* arrays) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DeleteVertexArraysOES"); gl_->DeleteVertexArraysOES(n, arrays); } @@ -958,38 +1131,44 @@ void GLES2TraceImplementation::SwapBuffers() { gl_->SwapBuffers(); } -GLuint GLES2TraceImplementation::GetMaxValueInBufferCHROMIUM( - GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetMaxValueInBufferCHROMIUM"); // NOLINT +GLuint GLES2TraceImplementation::GetMaxValueInBufferCHROMIUM(GLuint buffer_id, + GLsizei count, + GLenum type, + GLuint offset) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::GetMaxValueInBufferCHROMIUM"); return gl_->GetMaxValueInBufferCHROMIUM(buffer_id, count, type, offset); } -void GLES2TraceImplementation::GenSharedIdsCHROMIUM( - GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) { +void GLES2TraceImplementation::GenSharedIdsCHROMIUM(GLuint namespace_id, + GLuint id_offset, + GLsizei n, + GLuint* ids) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GenSharedIdsCHROMIUM"); gl_->GenSharedIdsCHROMIUM(namespace_id, id_offset, n, ids); } -void GLES2TraceImplementation::DeleteSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) { +void GLES2TraceImplementation::DeleteSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DeleteSharedIdsCHROMIUM"); gl_->DeleteSharedIdsCHROMIUM(namespace_id, n, ids); } -void GLES2TraceImplementation::RegisterSharedIdsCHROMIUM( - GLuint namespace_id, GLsizei n, const GLuint* ids) { +void GLES2TraceImplementation::RegisterSharedIdsCHROMIUM(GLuint namespace_id, + GLsizei n, + const GLuint* ids) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::RegisterSharedIdsCHROMIUM"); gl_->RegisterSharedIdsCHROMIUM(namespace_id, n, ids); } -GLboolean GLES2TraceImplementation::EnableFeatureCHROMIUM( - const char* feature) { +GLboolean GLES2TraceImplementation::EnableFeatureCHROMIUM(const char* feature) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::EnableFeatureCHROMIUM"); return gl_->EnableFeatureCHROMIUM(feature); } -void* GLES2TraceImplementation::MapBufferCHROMIUM( - GLuint target, GLenum access) { +void* GLES2TraceImplementation::MapBufferCHROMIUM(GLuint target, + GLenum access) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::MapBufferCHROMIUM"); return gl_->MapBufferCHROMIUM(target, access); } @@ -999,10 +1178,9 @@ GLboolean GLES2TraceImplementation::UnmapBufferCHROMIUM(GLuint target) { return gl_->UnmapBufferCHROMIUM(target); } -void* GLES2TraceImplementation::MapImageCHROMIUM( - GLuint image_id, GLenum access) { +void* GLES2TraceImplementation::MapImageCHROMIUM(GLuint image_id) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::MapImageCHROMIUM"); - return gl_->MapImageCHROMIUM(image_id, access); + return gl_->MapImageCHROMIUM(image_id); } void GLES2TraceImplementation::UnmapImageCHROMIUM(GLuint image_id) { @@ -1010,78 +1188,93 @@ void GLES2TraceImplementation::UnmapImageCHROMIUM(GLuint image_id) { gl_->UnmapImageCHROMIUM(image_id); } -void* GLES2TraceImplementation::MapBufferSubDataCHROMIUM( - GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) { +void* GLES2TraceImplementation::MapBufferSubDataCHROMIUM(GLuint target, + GLintptr offset, + GLsizeiptr size, + GLenum access) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::MapBufferSubDataCHROMIUM"); return gl_->MapBufferSubDataCHROMIUM(target, offset, size, access); } void GLES2TraceImplementation::UnmapBufferSubDataCHROMIUM(const void* mem) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UnmapBufferSubDataCHROMIUM"); // NOLINT + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::UnmapBufferSubDataCHROMIUM"); gl_->UnmapBufferSubDataCHROMIUM(mem); } -void* GLES2TraceImplementation::MapTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, GLenum access) { +void* GLES2TraceImplementation::MapTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + GLenum access) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::MapTexSubImage2DCHROMIUM"); return gl_->MapTexSubImage2DCHROMIUM( target, level, xoffset, yoffset, width, height, format, type, access); } void GLES2TraceImplementation::UnmapTexSubImage2DCHROMIUM(const void* mem) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::UnmapTexSubImage2DCHROMIUM"); // NOLINT + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::UnmapTexSubImage2DCHROMIUM"); gl_->UnmapTexSubImage2DCHROMIUM(mem); } -void GLES2TraceImplementation::ResizeCHROMIUM( - GLuint width, GLuint height, GLfloat scale_factor) { +void GLES2TraceImplementation::ResizeCHROMIUM(GLuint width, + GLuint height, + GLfloat scale_factor) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ResizeCHROMIUM"); gl_->ResizeCHROMIUM(width, height, scale_factor); } const GLchar* GLES2TraceImplementation::GetRequestableExtensionsCHROMIUM() { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetRequestableExtensionsCHROMIUM"); // NOLINT + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::GetRequestableExtensionsCHROMIUM"); return gl_->GetRequestableExtensionsCHROMIUM(); } -void GLES2TraceImplementation::RequestExtensionCHROMIUM( - const char* extension) { +void GLES2TraceImplementation::RequestExtensionCHROMIUM(const char* extension) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::RequestExtensionCHROMIUM"); gl_->RequestExtensionCHROMIUM(extension); } void GLES2TraceImplementation::RateLimitOffscreenContextCHROMIUM() { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::RateLimitOffscreenContextCHROMIUM"); // NOLINT + TRACE_EVENT_BINARY_EFFICIENT0( + "gpu", "GLES2Trace::RateLimitOffscreenContextCHROMIUM"); gl_->RateLimitOffscreenContextCHROMIUM(); } -void GLES2TraceImplementation::GetMultipleIntegervCHROMIUM( - const GLenum* pnames, GLuint count, GLint* results, GLsizeiptr size) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetMultipleIntegervCHROMIUM"); // NOLINT +void GLES2TraceImplementation::GetMultipleIntegervCHROMIUM(const GLenum* pnames, + GLuint count, + GLint* results, + GLsizeiptr size) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::GetMultipleIntegervCHROMIUM"); gl_->GetMultipleIntegervCHROMIUM(pnames, count, results, size); } -void GLES2TraceImplementation::GetProgramInfoCHROMIUM( - GLuint program, GLsizei bufsize, GLsizei* size, void* info) { +void GLES2TraceImplementation::GetProgramInfoCHROMIUM(GLuint program, + GLsizei bufsize, + GLsizei* size, + void* info) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetProgramInfoCHROMIUM"); gl_->GetProgramInfoCHROMIUM(program, bufsize, size, info); } GLuint GLES2TraceImplementation::CreateStreamTextureCHROMIUM(GLuint texture) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::CreateStreamTextureCHROMIUM"); // NOLINT + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::CreateStreamTextureCHROMIUM"); return gl_->CreateStreamTextureCHROMIUM(texture); } -void GLES2TraceImplementation::DestroyStreamTextureCHROMIUM(GLuint texture) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DestroyStreamTextureCHROMIUM"); // NOLINT - gl_->DestroyStreamTextureCHROMIUM(texture); -} - -GLuint GLES2TraceImplementation::CreateImageCHROMIUM( - GLsizei width, GLsizei height, GLenum internalformat) { +GLuint GLES2TraceImplementation::CreateImageCHROMIUM(GLsizei width, + GLsizei height, + GLenum internalformat, + GLenum usage) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::CreateImageCHROMIUM"); - return gl_->CreateImageCHROMIUM(width, height, internalformat); + return gl_->CreateImageCHROMIUM(width, height, internalformat, usage); } void GLES2TraceImplementation::DestroyImageCHROMIUM(GLuint image_id) { @@ -1089,54 +1282,72 @@ void GLES2TraceImplementation::DestroyImageCHROMIUM(GLuint image_id) { gl_->DestroyImageCHROMIUM(image_id); } -void GLES2TraceImplementation::GetImageParameterivCHROMIUM( - GLuint image_id, GLenum pname, GLint* params) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetImageParameterivCHROMIUM"); // NOLINT +void GLES2TraceImplementation::GetImageParameterivCHROMIUM(GLuint image_id, + GLenum pname, + GLint* params) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::GetImageParameterivCHROMIUM"); gl_->GetImageParameterivCHROMIUM(image_id, pname, params); } -void GLES2TraceImplementation::GetTranslatedShaderSourceANGLE( - GLuint shader, GLsizei bufsize, GLsizei* length, char* source) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetTranslatedShaderSourceANGLE"); // NOLINT +void GLES2TraceImplementation::GetTranslatedShaderSourceANGLE(GLuint shader, + GLsizei bufsize, + GLsizei* length, + char* source) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::GetTranslatedShaderSourceANGLE"); gl_->GetTranslatedShaderSourceANGLE(shader, bufsize, length, source); } -void GLES2TraceImplementation::PostSubBufferCHROMIUM( - GLint x, GLint y, GLint width, GLint height) { +void GLES2TraceImplementation::PostSubBufferCHROMIUM(GLint x, + GLint y, + GLint width, + GLint height) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::PostSubBufferCHROMIUM"); gl_->PostSubBufferCHROMIUM(x, y, width, height); } -void GLES2TraceImplementation::TexImageIOSurface2DCHROMIUM( - GLenum target, GLsizei width, GLsizei height, GLuint ioSurfaceId, - GLuint plane) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::TexImageIOSurface2DCHROMIUM"); // NOLINT +void GLES2TraceImplementation::TexImageIOSurface2DCHROMIUM(GLenum target, + GLsizei width, + GLsizei height, + GLuint ioSurfaceId, + GLuint plane) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::TexImageIOSurface2DCHROMIUM"); gl_->TexImageIOSurface2DCHROMIUM(target, width, height, ioSurfaceId, plane); } -void GLES2TraceImplementation::CopyTextureCHROMIUM( - GLenum target, GLenum source_id, GLenum dest_id, GLint level, - GLint internalformat, GLenum dest_type) { +void GLES2TraceImplementation::CopyTextureCHROMIUM(GLenum target, + GLenum source_id, + GLenum dest_id, + GLint level, + GLint internalformat, + GLenum dest_type) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::CopyTextureCHROMIUM"); gl_->CopyTextureCHROMIUM( target, source_id, dest_id, level, internalformat, dest_type); } -void GLES2TraceImplementation::DrawArraysInstancedANGLE( - GLenum mode, GLint first, GLsizei count, GLsizei primcount) { +void GLES2TraceImplementation::DrawArraysInstancedANGLE(GLenum mode, + GLint first, + GLsizei count, + GLsizei primcount) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DrawArraysInstancedANGLE"); gl_->DrawArraysInstancedANGLE(mode, first, count, primcount); } -void GLES2TraceImplementation::DrawElementsInstancedANGLE( - GLenum mode, GLsizei count, GLenum type, const void* indices, - GLsizei primcount) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DrawElementsInstancedANGLE"); // NOLINT +void GLES2TraceImplementation::DrawElementsInstancedANGLE(GLenum mode, + GLsizei count, + GLenum type, + const void* indices, + GLsizei primcount) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::DrawElementsInstancedANGLE"); gl_->DrawElementsInstancedANGLE(mode, count, type, indices, primcount); } -void GLES2TraceImplementation::VertexAttribDivisorANGLE( - GLuint index, GLuint divisor) { +void GLES2TraceImplementation::VertexAttribDivisorANGLE(GLuint index, + GLuint divisor) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::VertexAttribDivisorANGLE"); gl_->VertexAttribDivisorANGLE(index, divisor); } @@ -1146,32 +1357,51 @@ void GLES2TraceImplementation::GenMailboxCHROMIUM(GLbyte* mailbox) { gl_->GenMailboxCHROMIUM(mailbox); } -void GLES2TraceImplementation::ProduceTextureCHROMIUM( - GLenum target, const GLbyte* mailbox) { +void GLES2TraceImplementation::ProduceTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ProduceTextureCHROMIUM"); gl_->ProduceTextureCHROMIUM(target, mailbox); } -void GLES2TraceImplementation::ConsumeTextureCHROMIUM( - GLenum target, const GLbyte* mailbox) { +void GLES2TraceImplementation::ProduceTextureDirectCHROMIUM( + GLuint texture, + GLenum target, + const GLbyte* mailbox) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::ProduceTextureDirectCHROMIUM"); + gl_->ProduceTextureDirectCHROMIUM(texture, target, mailbox); +} + +void GLES2TraceImplementation::ConsumeTextureCHROMIUM(GLenum target, + const GLbyte* mailbox) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ConsumeTextureCHROMIUM"); gl_->ConsumeTextureCHROMIUM(target, mailbox); } -void GLES2TraceImplementation::BindUniformLocationCHROMIUM( - GLuint program, GLint location, const char* name) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BindUniformLocationCHROMIUM"); // NOLINT +GLuint GLES2TraceImplementation::CreateAndConsumeTextureCHROMIUM( + GLenum target, + const GLbyte* mailbox) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::CreateAndConsumeTextureCHROMIUM"); + return gl_->CreateAndConsumeTextureCHROMIUM(target, mailbox); +} + +void GLES2TraceImplementation::BindUniformLocationCHROMIUM(GLuint program, + GLint location, + const char* name) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::BindUniformLocationCHROMIUM"); gl_->BindUniformLocationCHROMIUM(program, location, name); } -void GLES2TraceImplementation::BindTexImage2DCHROMIUM( - GLenum target, GLint imageId) { +void GLES2TraceImplementation::BindTexImage2DCHROMIUM(GLenum target, + GLint imageId) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BindTexImage2DCHROMIUM"); gl_->BindTexImage2DCHROMIUM(target, imageId); } -void GLES2TraceImplementation::ReleaseTexImage2DCHROMIUM( - GLenum target, GLint imageId) { +void GLES2TraceImplementation::ReleaseTexImage2DCHROMIUM(GLenum target, + GLint imageId) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ReleaseTexImage2DCHROMIUM"); gl_->ReleaseTexImage2DCHROMIUM(target, imageId); } @@ -1186,37 +1416,64 @@ void GLES2TraceImplementation::TraceEndCHROMIUM() { gl_->TraceEndCHROMIUM(); } -void GLES2TraceImplementation::AsyncTexSubImage2DCHROMIUM( - GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, - GLsizei height, GLenum format, GLenum type, const void* data) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::AsyncTexSubImage2DCHROMIUM"); // NOLINT +void GLES2TraceImplementation::AsyncTexSubImage2DCHROMIUM(GLenum target, + GLint level, + GLint xoffset, + GLint yoffset, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + const void* data) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::AsyncTexSubImage2DCHROMIUM"); gl_->AsyncTexSubImage2DCHROMIUM( target, level, xoffset, yoffset, width, height, format, type, data); } -void GLES2TraceImplementation::AsyncTexImage2DCHROMIUM( - GLenum target, GLint level, GLint internalformat, GLsizei width, - GLsizei height, GLint border, GLenum format, GLenum type, - const void* pixels) { +void GLES2TraceImplementation::AsyncTexImage2DCHROMIUM(GLenum target, + GLint level, + GLenum internalformat, + GLsizei width, + GLsizei height, + GLint border, + GLenum format, + GLenum type, + const void* pixels) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::AsyncTexImage2DCHROMIUM"); - gl_->AsyncTexImage2DCHROMIUM( - target, level, internalformat, width, height, border, format, type, - pixels); + gl_->AsyncTexImage2DCHROMIUM(target, + level, + internalformat, + width, + height, + border, + format, + type, + pixels); } void GLES2TraceImplementation::WaitAsyncTexImage2DCHROMIUM(GLenum target) { - TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::WaitAsyncTexImage2DCHROMIUM"); // NOLINT + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::WaitAsyncTexImage2DCHROMIUM"); gl_->WaitAsyncTexImage2DCHROMIUM(target); } +void GLES2TraceImplementation::WaitAllAsyncTexImage2DCHROMIUM() { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::WaitAllAsyncTexImage2DCHROMIUM"); + gl_->WaitAllAsyncTexImage2DCHROMIUM(); +} + void GLES2TraceImplementation::DiscardFramebufferEXT( - GLenum target, GLsizei count, const GLenum* attachments) { + GLenum target, + GLsizei count, + const GLenum* attachments) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DiscardFramebufferEXT"); gl_->DiscardFramebufferEXT(target, count, attachments); } -void GLES2TraceImplementation::LoseContextCHROMIUM( - GLenum current, GLenum other) { +void GLES2TraceImplementation::LoseContextCHROMIUM(GLenum current, + GLenum other) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::LoseContextCHROMIUM"); gl_->LoseContextCHROMIUM(current, other); } @@ -1231,8 +1488,8 @@ void GLES2TraceImplementation::WaitSyncPointCHROMIUM(GLuint sync_point) { gl_->WaitSyncPointCHROMIUM(sync_point); } -void GLES2TraceImplementation::DrawBuffersEXT( - GLsizei count, const GLenum* bufs) { +void GLES2TraceImplementation::DrawBuffersEXT(GLsizei count, + const GLenum* bufs) { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DrawBuffersEXT"); gl_->DrawBuffersEXT(count, bufs); } @@ -1242,5 +1499,31 @@ void GLES2TraceImplementation::DiscardBackbufferCHROMIUM() { gl_->DiscardBackbufferCHROMIUM(); } -#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_TRACE_IMPLEMENTATION_IMPL_AUTOGEN_H_ +void GLES2TraceImplementation::ScheduleOverlayPlaneCHROMIUM( + GLint plane_z_order, + GLenum plane_transform, + GLuint overlay_texture_id, + GLint bounds_x, + GLint bounds_y, + GLint bounds_width, + GLint bounds_height, + GLfloat uv_x, + GLfloat uv_y, + GLfloat uv_width, + GLfloat uv_height) { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", + "GLES2Trace::ScheduleOverlayPlaneCHROMIUM"); + gl_->ScheduleOverlayPlaneCHROMIUM(plane_z_order, + plane_transform, + overlay_texture_id, + bounds_x, + bounds_y, + bounds_width, + bounds_height, + uv_x, + uv_y, + uv_width, + uv_height); +} +#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_TRACE_IMPLEMENTATION_IMPL_AUTOGEN_H_ diff --git a/chromium/gpu/command_buffer/common/gpu_control.h b/chromium/gpu/command_buffer/client/gpu_control.h index d9719727111..664152d6663 100644 --- a/chromium/gpu/command_buffer/common/gpu_control.h +++ b/chromium/gpu/command_buffer/client/gpu_control.h @@ -1,16 +1,18 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef GPU_COMMAND_BUFFER_COMMON_GPU_CONTROL_H_ -#define GPU_COMMAND_BUFFER_COMMON_GPU_CONTROL_H_ +#ifndef GPU_COMMAND_BUFFER_CLIENT_GPU_CONTROL_H_ +#define GPU_COMMAND_BUFFER_CLIENT_GPU_CONTROL_H_ + +#include <stdint.h> #include <vector> #include "base/callback.h" +#include "base/macros.h" #include "gpu/command_buffer/common/capabilities.h" #include "gpu/command_buffer/common/mailbox.h" -#include "gpu/command_buffer/common/types.h" #include "gpu/gpu_export.h" namespace gfx { @@ -18,7 +20,6 @@ class GpuMemoryBuffer; } namespace gpu { -struct ManagedMemoryStats; // Common interface for GpuControl implementations. class GPU_EXPORT GpuControl { @@ -34,39 +35,37 @@ class GPU_EXPORT GpuControl { size_t width, size_t height, unsigned internalformat, - int32* id) = 0; + unsigned usage, + int32_t* id) = 0; // Destroy a gpu memory buffer. The ID must be positive. - virtual void DestroyGpuMemoryBuffer(int32 id) = 0; - - // Generates n unique mailbox names that can be used with - // GL_texture_mailbox_CHROMIUM. - virtual bool GenerateMailboxNames(unsigned num, - std::vector<gpu::Mailbox>* names) = 0; + virtual void DestroyGpuMemoryBuffer(int32_t id) = 0; // Inserts a sync point, returning its ID. Sync point IDs are global and can // be used for cross-context synchronization. - virtual uint32 InsertSyncPoint() = 0; + virtual uint32_t InsertSyncPoint() = 0; // Runs |callback| when a sync point is reached. - virtual void SignalSyncPoint(uint32 sync_point, + virtual void SignalSyncPoint(uint32_t sync_point, const base::Closure& callback) = 0; // Runs |callback| when a query created via glCreateQueryEXT() has cleared // passed the glEndQueryEXT() point. - virtual void SignalQuery(uint32 query, const base::Closure& callback) = 0; + virtual void SignalQuery(uint32_t query, const base::Closure& callback) = 0; virtual void SetSurfaceVisible(bool visible) = 0; - virtual void SendManagedMemoryStats(const ManagedMemoryStats& stats) = 0; - // Invokes the callback once the context has been flushed. virtual void Echo(const base::Closure& callback) = 0; + // Attaches an external stream to the texture given by |texture_id| and + // returns a stream identifier. + virtual uint32_t CreateStreamTexture(uint32_t texture_id) = 0; + private: DISALLOW_COPY_AND_ASSIGN(GpuControl); }; } // namespace gpu -#endif // GPU_COMMAND_BUFFER_COMMON_GPU_CONTROL_H_ +#endif // GPU_COMMAND_BUFFER_CLIENT_GPU_CONTROL_H_ diff --git a/chromium/gpu/command_buffer/client/gpu_memory_buffer_factory.h b/chromium/gpu/command_buffer/client/gpu_memory_buffer_factory.h index 42dde409eaf..c7f0b4ca4e0 100644 --- a/chromium/gpu/command_buffer/client/gpu_memory_buffer_factory.h +++ b/chromium/gpu/command_buffer/client/gpu_memory_buffer_factory.h @@ -15,10 +15,10 @@ namespace gpu { class GPU_EXPORT GpuMemoryBufferFactory { public: - virtual gfx::GpuMemoryBuffer* CreateGpuMemoryBuffer( - size_t width, - size_t height, - unsigned internalformat) = 0; + virtual gfx::GpuMemoryBuffer* CreateGpuMemoryBuffer(size_t width, + size_t height, + unsigned internalformat, + unsigned usage) = 0; protected: virtual ~GpuMemoryBufferFactory() {} diff --git a/chromium/gpu/command_buffer/client/gpu_memory_buffer_tracker.cc b/chromium/gpu/command_buffer/client/gpu_memory_buffer_tracker.cc index 863028ad125..9ffe0e33e2d 100644 --- a/chromium/gpu/command_buffer/client/gpu_memory_buffer_tracker.cc +++ b/chromium/gpu/command_buffer/client/gpu_memory_buffer_tracker.cc @@ -6,7 +6,7 @@ #include "base/memory/scoped_ptr.h" #include "gpu/command_buffer/client/gles2_implementation.h" -#include "gpu/command_buffer/common/gpu_control.h" +#include "gpu/command_buffer/client/gpu_control.h" namespace gpu { namespace gles2 { @@ -21,12 +21,14 @@ GpuMemoryBufferTracker::~GpuMemoryBufferTracker() { } } -int32 GpuMemoryBufferTracker::CreateBuffer( - size_t width, size_t height, int32 internalformat) { +int32 GpuMemoryBufferTracker::CreateBuffer(size_t width, + size_t height, + int32 internalformat, + int32 usage) { int32 image_id = 0; DCHECK(gpu_control_); gfx::GpuMemoryBuffer* buffer = gpu_control_->CreateGpuMemoryBuffer( - width, height, internalformat, &image_id); + width, height, internalformat, usage, &image_id); if (!buffer) return 0; diff --git a/chromium/gpu/command_buffer/client/gpu_memory_buffer_tracker.h b/chromium/gpu/command_buffer/client/gpu_memory_buffer_tracker.h index 84158818a37..25ec9495897 100644 --- a/chromium/gpu/command_buffer/client/gpu_memory_buffer_tracker.h +++ b/chromium/gpu/command_buffer/client/gpu_memory_buffer_tracker.h @@ -24,7 +24,10 @@ class GLES2_IMPL_EXPORT GpuMemoryBufferTracker { explicit GpuMemoryBufferTracker(GpuControl* gpu_control); virtual ~GpuMemoryBufferTracker(); - int32 CreateBuffer(size_t width, size_t height, int32 internalformat); + int32 CreateBuffer(size_t width, + size_t height, + int32 internalformat, + int32 usage); gfx::GpuMemoryBuffer* GetBuffer(int32 image_id); void RemoveBuffer(int32 image_id); diff --git a/chromium/gpu/command_buffer/client/mapped_memory.cc b/chromium/gpu/command_buffer/client/mapped_memory.cc index 15584aaaf07..7166733c51c 100644 --- a/chromium/gpu/command_buffer/client/mapped_memory.cc +++ b/chromium/gpu/command_buffer/client/mapped_memory.cc @@ -13,17 +13,22 @@ namespace gpu { -MemoryChunk::MemoryChunk( - int32 shm_id, gpu::Buffer shm, CommandBufferHelper* helper) +MemoryChunk::MemoryChunk(int32 shm_id, + scoped_refptr<gpu::Buffer> shm, + CommandBufferHelper* helper, + const base::Closure& poll_callback) : shm_id_(shm_id), shm_(shm), - allocator_(shm.size, helper, shm.ptr) { -} + allocator_(shm->size(), helper, poll_callback, shm->memory()) {} + +MemoryChunk::~MemoryChunk() {} MappedMemoryManager::MappedMemoryManager(CommandBufferHelper* helper, + const base::Closure& poll_callback, size_t unused_memory_reclaim_limit) : chunk_size_multiple_(1), helper_(helper), + poll_callback_(poll_callback), allocated_memory_(0), max_free_bytes_(unused_memory_reclaim_limit) { } @@ -82,10 +87,12 @@ void* MappedMemoryManager::Alloc( ((size + chunk_size_multiple_ - 1) / chunk_size_multiple_) * chunk_size_multiple_; int32 id = -1; - gpu::Buffer shm = cmd_buf->CreateTransferBuffer(chunk_size, &id); + scoped_refptr<gpu::Buffer> shm = + cmd_buf->CreateTransferBuffer(chunk_size, &id); if (id < 0) return NULL; - MemoryChunk* mc = new MemoryChunk(id, shm, helper_); + DCHECK(shm); + MemoryChunk* mc = new MemoryChunk(id, shm, helper_, poll_callback_); allocated_memory_ += mc->GetSize(); chunks_.push_back(mc); void* mem = mc->Alloc(size); diff --git a/chromium/gpu/command_buffer/client/mapped_memory.h b/chromium/gpu/command_buffer/client/mapped_memory.h index b8f3129eb4a..789e69cf7f8 100644 --- a/chromium/gpu/command_buffer/client/mapped_memory.h +++ b/chromium/gpu/command_buffer/client/mapped_memory.h @@ -5,10 +5,13 @@ #ifndef GPU_COMMAND_BUFFER_CLIENT_MAPPED_MEMORY_H_ #define GPU_COMMAND_BUFFER_CLIENT_MAPPED_MEMORY_H_ +#include <stdint.h> + +#include "base/bind.h" +#include "base/macros.h" #include "base/memory/scoped_vector.h" #include "gpu/command_buffer/client/fenced_allocator.h" #include "gpu/command_buffer/common/buffer.h" -#include "gpu/command_buffer/common/types.h" #include "gpu/gpu_export.h" namespace gpu { @@ -18,7 +21,11 @@ class CommandBufferHelper; // Manages a shared memory segment. class GPU_EXPORT MemoryChunk { public: - MemoryChunk(int32 shm_id, gpu::Buffer shm, CommandBufferHelper* helper); + MemoryChunk(int32_t shm_id, + scoped_refptr<gpu::Buffer> shm, + CommandBufferHelper* helper, + const base::Closure& poll_callback); + ~MemoryChunk(); // Gets the size of the largest free block that is available without waiting. unsigned int GetLargestFreeSizeWithoutWaiting() { @@ -33,11 +40,11 @@ class GPU_EXPORT MemoryChunk { // Gets the size of the chunk. unsigned int GetSize() const { - return static_cast<unsigned int>(shm_.size); + return static_cast<unsigned int>(shm_->size()); } // The shared memory id for this chunk. - int32 shm_id() const { + int32_t shm_id() const { return shm_id_; } @@ -86,8 +93,9 @@ class GPU_EXPORT MemoryChunk { // Returns true if pointer is in the range of this block. bool IsInChunk(void* pointer) const { - return pointer >= shm_.ptr && - pointer < reinterpret_cast<const int8*>(shm_.ptr) + shm_.size; + return pointer >= shm_->memory() && + pointer < + reinterpret_cast<const int8_t*>(shm_->memory()) + shm_->size(); } // Returns true of any memory in this chunk is in use. @@ -100,8 +108,8 @@ class GPU_EXPORT MemoryChunk { } private: - int32 shm_id_; - gpu::Buffer shm_; + int32_t shm_id_; + scoped_refptr<gpu::Buffer> shm_; FencedAllocatorWrapper allocator_; DISALLOW_COPY_AND_ASSIGN(MemoryChunk); @@ -117,6 +125,7 @@ class GPU_EXPORT MappedMemoryManager { // |unused_memory_reclaim_limit|: When exceeded this causes pending memory // to be reclaimed before allocating more memory. MappedMemoryManager(CommandBufferHelper* helper, + const base::Closure& poll_callback, size_t unused_memory_reclaim_limit); ~MappedMemoryManager(); @@ -137,7 +146,7 @@ class GPU_EXPORT MappedMemoryManager { // Returns: // pointer to allocated block of memory. NULL if failure. void* Alloc( - unsigned int size, int32* shm_id, unsigned int* shm_offset); + unsigned int size, int32_t* shm_id, unsigned int* shm_offset); // Frees a block of memory. // @@ -151,7 +160,7 @@ class GPU_EXPORT MappedMemoryManager { // Parameters: // pointer: the pointer to the memory block to free. // token: the token value to wait for before re-using the memory. - void FreePendingToken(void* pointer, int32 token); + void FreePendingToken(void* pointer, int32_t token); // Free Any Shared memory that is not in use. void FreeUnused(); @@ -161,6 +170,15 @@ class GPU_EXPORT MappedMemoryManager { return chunks_.size(); } + size_t bytes_in_use() const { + size_t bytes_in_use = 0; + for (size_t ii = 0; ii < chunks_.size(); ++ii) { + MemoryChunk* chunk = chunks_[ii]; + bytes_in_use += chunk->bytes_in_use(); + } + return bytes_in_use; + } + // Used for testing size_t allocated_memory() const { return allocated_memory_; @@ -172,6 +190,7 @@ class GPU_EXPORT MappedMemoryManager { // size a chunk is rounded up to. unsigned int chunk_size_multiple_; CommandBufferHelper* helper_; + base::Closure poll_callback_; MemoryChunkVector chunks_; size_t allocated_memory_; size_t max_free_bytes_; diff --git a/chromium/gpu/command_buffer/client/mapped_memory_unittest.cc b/chromium/gpu/command_buffer/client/mapped_memory_unittest.cc index 90d1ce7666b..2f3a9e73c65 100644 --- a/chromium/gpu/command_buffer/client/mapped_memory_unittest.cc +++ b/chromium/gpu/command_buffer/client/mapped_memory_unittest.cc @@ -4,6 +4,7 @@ #include "gpu/command_buffer/client/mapped_memory.h" +#include <list> #include "base/bind.h" #include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" @@ -67,7 +68,7 @@ class MappedMemoryTestBase : public testing::Test { } int32 GetToken() { - return command_buffer_->GetState().token; + return command_buffer_->GetLastState().token; } #if defined(OS_MACOSX) @@ -85,6 +86,11 @@ class MappedMemoryTestBase : public testing::Test { const unsigned int MappedMemoryTestBase::kBufferSize; #endif +namespace { +void EmptyPoll() { +} +} + // Test fixture for MemoryChunk test - Creates a MemoryChunk, using a // CommandBufferHelper with a mock AsyncAPIInterface for its interface (calling // it directly, not through the RPC mechanism), making sure Noops are ignored @@ -94,11 +100,13 @@ class MemoryChunkTest : public MappedMemoryTestBase { static const int32 kShmId = 123; virtual void SetUp() { MappedMemoryTestBase::SetUp(); - buffer_.reset(new uint8[kBufferSize]); - gpu::Buffer buf; - buf.size = kBufferSize; - buf.ptr = buffer_.get(); - chunk_.reset(new MemoryChunk(kShmId, buf, helper_.get())); + scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); + shared_memory->CreateAndMapAnonymous(kBufferSize); + buffer_ = MakeBufferFromSharedMemory(shared_memory.Pass(), kBufferSize); + chunk_.reset(new MemoryChunk(kShmId, + buffer_, + helper_.get(), + base::Bind(&EmptyPoll))); } virtual void TearDown() { @@ -108,8 +116,10 @@ class MemoryChunkTest : public MappedMemoryTestBase { MappedMemoryTestBase::TearDown(); } + uint8* buffer_memory() { return static_cast<uint8*>(buffer_->memory()); } + scoped_ptr<MemoryChunk> chunk_; - scoped_ptr<uint8[]> buffer_; + scoped_refptr<gpu::Buffer> buffer_; }; #ifndef _MSC_VER @@ -124,8 +134,9 @@ TEST_F(MemoryChunkTest, Basic) { EXPECT_EQ(kBufferSize, chunk_->GetSize()); void *pointer = chunk_->Alloc(kSize); ASSERT_TRUE(pointer); - EXPECT_LE(buffer_.get(), static_cast<uint8 *>(pointer)); - EXPECT_GE(kBufferSize, static_cast<uint8 *>(pointer) - buffer_.get() + kSize); + EXPECT_LE(buffer_->memory(), static_cast<uint8*>(pointer)); + EXPECT_GE(kBufferSize, + static_cast<uint8*>(pointer) - buffer_memory() + kSize); EXPECT_EQ(kBufferSize - kSize, chunk_->GetLargestFreeSizeWithoutWaiting()); EXPECT_EQ(kBufferSize - kSize, chunk_->GetLargestFreeSizeWithWaiting()); EXPECT_EQ(kBufferSize, chunk_->GetSize()); @@ -136,8 +147,8 @@ TEST_F(MemoryChunkTest, Basic) { uint8 *pointer_char = static_cast<uint8*>(chunk_->Alloc(kSize)); ASSERT_TRUE(pointer_char); - EXPECT_LE(buffer_.get(), pointer_char); - EXPECT_GE(buffer_.get() + kBufferSize, pointer_char + kSize); + EXPECT_LE(buffer_memory(), pointer_char); + EXPECT_GE(buffer_memory() + kBufferSize, pointer_char + kSize); EXPECT_EQ(kBufferSize - kSize, chunk_->GetLargestFreeSizeWithoutWaiting()); EXPECT_EQ(kBufferSize - kSize, chunk_->GetLargestFreeSizeWithWaiting()); chunk_->Free(pointer_char); @@ -146,11 +157,16 @@ TEST_F(MemoryChunkTest, Basic) { } class MappedMemoryManagerTest : public MappedMemoryTestBase { + public: + MappedMemoryManager* manager() const { + return manager_.get(); + } + protected: virtual void SetUp() { MappedMemoryTestBase::SetUp(); manager_.reset(new MappedMemoryManager( - helper_.get(), MappedMemoryManager::kNoLimit)); + helper_.get(), base::Bind(&EmptyPoll), MappedMemoryManager::kNoLimit)); } virtual void TearDown() { @@ -252,16 +268,6 @@ TEST_F(MappedMemoryManagerTest, FreePendingToken) { } } -// Check if we don't free we don't crash. -TEST_F(MappedMemoryManagerTest, DontFree) { - const unsigned int kSize = 1024; - // Check we can alloc. - int32 id1 = -1; - unsigned int offset1 = 0xFFFFFFFFU; - void* mem1 = manager_->Alloc(kSize, &id1, &offset1); - ASSERT_TRUE(mem1); -} - TEST_F(MappedMemoryManagerTest, FreeUnused) { int32 id = -1; unsigned int offset = 0xFFFFFFFFU; @@ -305,12 +311,17 @@ TEST_F(MappedMemoryManagerTest, ChunkSizeMultiple) { EXPECT_EQ(0u, offset1); EXPECT_EQ(kSize, offset2); EXPECT_EQ(0u, offset3); + + manager_->Free(mem1); + manager_->Free(mem2); + manager_->Free(mem3); } TEST_F(MappedMemoryManagerTest, UnusedMemoryLimit) { const unsigned int kChunkSize = 2048; // Reset the manager with a memory limit. - manager_.reset(new MappedMemoryManager(helper_.get(), kChunkSize)); + manager_.reset(new MappedMemoryManager( + helper_.get(), base::Bind(&EmptyPoll), kChunkSize)); manager_->set_chunk_size_multiple(kChunkSize); // Allocate one chunk worth of memory. @@ -333,12 +344,16 @@ TEST_F(MappedMemoryManagerTest, UnusedMemoryLimit) { // Expect two chunks to be allocated, exceeding the limit, // since all memory is in use. EXPECT_EQ(2 * kChunkSize, manager_->allocated_memory()); + + manager_->Free(mem1); + manager_->Free(mem2); } TEST_F(MappedMemoryManagerTest, MemoryLimitWithReuse) { const unsigned int kSize = 1024; // Reset the manager with a memory limit. - manager_.reset(new MappedMemoryManager(helper_.get(), kSize)); + manager_.reset(new MappedMemoryManager( + helper_.get(), base::Bind(&EmptyPoll), kSize)); const unsigned int kChunkSize = 2 * 1024; manager_->set_chunk_size_multiple(kChunkSize); @@ -382,6 +397,60 @@ TEST_F(MappedMemoryManagerTest, MemoryLimitWithReuse) { // Expect one chunk to be allocated EXPECT_EQ(1 * kChunkSize, manager_->allocated_memory()); + + manager_->Free(mem1); + manager_->Free(mem3); +} + +namespace { +void Poll(MappedMemoryManagerTest *test, std::list<void*>* list) { + std::list<void*>::iterator it = list->begin(); + while (it != list->end()) { + void* address = *it; + test->manager()->Free(address); + it = list->erase(it); + } +} +} + +TEST_F(MappedMemoryManagerTest, Poll) { + std::list<void*> unmanaged_memory_list; + + const unsigned int kSize = 1024; + // Reset the manager with a memory limit. + manager_.reset(new MappedMemoryManager( + helper_.get(), + base::Bind(&Poll, this, &unmanaged_memory_list), + kSize)); + + // Allocate kSize bytes. Don't add the address to + // the unmanaged memory list, so that it won't be free:ed just yet. + int32 id1; + unsigned int offset1; + void* mem1 = manager_->Alloc(kSize, &id1, &offset1); + EXPECT_EQ(manager_->bytes_in_use(), kSize); + + // Allocate kSize more bytes, and make sure we grew. + int32 id2; + unsigned int offset2; + void* mem2 = manager_->Alloc(kSize, &id2, &offset2); + EXPECT_EQ(manager_->bytes_in_use(), kSize * 2); + + // Make the unmanaged buffer be released next time FreeUnused() is called + // in MappedMemoryManager/FencedAllocator. This happens for example when + // allocating new memory. + unmanaged_memory_list.push_back(mem1); + + // Allocate kSize more bytes. This should poll unmanaged memory, which now + // should free the previously allocated unmanaged memory. + int32 id3; + unsigned int offset3; + void* mem3 = manager_->Alloc(kSize, &id3, &offset3); + EXPECT_EQ(manager_->bytes_in_use(), kSize * 2); + + manager_->Free(mem2); + manager_->Free(mem3); + EXPECT_EQ(manager_->bytes_in_use(), static_cast<size_t>(0)); } } // namespace gpu diff --git a/chromium/gpu/command_buffer/client/program_info_manager.cc b/chromium/gpu/command_buffer/client/program_info_manager.cc index 1b5a348d6cc..d854aa01f75 100644 --- a/chromium/gpu/command_buffer/client/program_info_manager.cc +++ b/chromium/gpu/command_buffer/client/program_info_manager.cc @@ -383,6 +383,7 @@ CachedProgramInfoManager::~CachedProgramInfoManager() { CachedProgramInfoManager::Program* CachedProgramInfoManager::GetProgramInfo( GLES2Implementation* gl, GLuint program) { + lock_.AssertAcquired(); ProgramInfoMap::iterator it = program_infos_.find(program); if (it == program_infos_.end()) { return NULL; @@ -394,7 +395,7 @@ CachedProgramInfoManager::Program* void CachedProgramInfoManager::CreateInfo(GLuint program) { base::AutoLock auto_lock(lock_); - DeleteInfo(program); + program_infos_.erase(program); std::pair<ProgramInfoMap::iterator, bool> result = program_infos_.insert(std::make_pair(program, Program())); @@ -402,6 +403,7 @@ void CachedProgramInfoManager::CreateInfo(GLuint program) { } void CachedProgramInfoManager::DeleteInfo(GLuint program) { + base::AutoLock auto_lock(lock_); program_infos_.erase(program); } diff --git a/chromium/gpu/command_buffer/client/query_tracker.cc b/chromium/gpu/command_buffer/client/query_tracker.cc index 285560590b3..6395c047781 100644 --- a/chromium/gpu/command_buffer/client/query_tracker.cc +++ b/chromium/gpu/command_buffer/client/query_tracker.cc @@ -8,6 +8,7 @@ #include <GLES2/gl2ext.h> #include <GLES2/gl2extchromium.h> +#include "base/atomicops.h" #include "gpu/command_buffer/client/gles2_cmd_helper.h" #include "gpu/command_buffer/client/gles2_implementation.h" #include "gpu/command_buffer/client/mapped_memory.h" @@ -92,7 +93,7 @@ QueryTracker::Query::Query(GLuint id, GLenum target, state_(kUninitialized), submit_count_(0), token_(0), - flushed_(false), + flush_count_(0), client_begin_time_us_(0), result_(0) { } @@ -139,6 +140,7 @@ void QueryTracker::Query::End(GLES2Implementation* gl) { } } } + flush_count_ = gl->helper()->flush_generation(); gl->helper()->EndQueryEXT(target(), submit_count()); MarkAsPending(gl->helper()->InsertToken()); } @@ -146,11 +148,9 @@ void QueryTracker::Query::End(GLES2Implementation* gl) { bool QueryTracker::Query::CheckResultsAvailable( CommandBufferHelper* helper) { if (Pending()) { - if (info_.sync->process_count == submit_count_ || + if (base::subtle::Acquire_Load(&info_.sync->process_count) == + submit_count_ || helper->IsContextLost()) { - // Need a MemoryBarrier here so that sync->result read after - // sync->process_count. - base::subtle::MemoryBarrier(); switch (target()) { case GL_COMMANDS_ISSUED_CHROMIUM: result_ = std::min(info_.sync->result, @@ -169,12 +169,7 @@ bool QueryTracker::Query::CheckResultsAvailable( } state_ = kComplete; } else { - if (!flushed_) { - // TODO(gman): We could reduce the number of flushes by having a - // flush count, recording that count at the time we insert the - // EndQuery command and then only flushing here if we've have not - // passed that count yet. - flushed_ = true; + if ((helper->flush_generation() - flush_count_ - 1) >= 0x80000000) { helper->Flush(); } else { // Insert no-ops so that eventually the GPU process will see more work. @@ -249,7 +244,8 @@ void QueryTracker::FreeCompletedQueries() { while (it != removed_queries_.end()) { Query* query = *it; if (query->Pending() && - query->info_.sync->process_count != query->submit_count()) { + base::subtle::Acquire_Load(&query->info_.sync->process_count) != + query->submit_count()) { ++it; continue; } diff --git a/chromium/gpu/command_buffer/client/query_tracker.h b/chromium/gpu/command_buffer/client/query_tracker.h index 9e7f501768b..72e29e71c42 100644 --- a/chromium/gpu/command_buffer/client/query_tracker.h +++ b/chromium/gpu/command_buffer/client/query_tracker.h @@ -10,6 +10,7 @@ #include <deque> #include <list> +#include "base/atomicops.h" #include "base/containers/hash_tables.h" #include "gles2_impl_export.h" #include "gpu/command_buffer/common/gles2_cmd_format.h" @@ -105,17 +106,16 @@ class GLES2_IMPL_EXPORT QueryTracker { void MarkAsActive() { state_ = kActive; ++submit_count_; + if (submit_count_ == INT_MAX) + submit_count_ = 1; } void MarkAsPending(int32 token) { token_ = token; state_ = kPending; - flushed_ = false; } - uint32 submit_count() const { - return submit_count_; - } + base::subtle::Atomic32 submit_count() const { return submit_count_; } int32 token() const { return token_; @@ -144,9 +144,9 @@ class GLES2_IMPL_EXPORT QueryTracker { GLenum target_; QuerySyncManager::QueryInfo info_; State state_; - uint32 submit_count_; + base::subtle::Atomic32 submit_count_; int32 token_; - bool flushed_; + uint32 flush_count_; uint64 client_begin_time_us_; // Only used for latency query target. uint32 result_; }; diff --git a/chromium/gpu/command_buffer/client/query_tracker_unittest.cc b/chromium/gpu/command_buffer/client/query_tracker_unittest.cc index 800c479ec85..cd2ccf63297 100644 --- a/chromium/gpu/command_buffer/client/query_tracker_unittest.cc +++ b/chromium/gpu/command_buffer/client/query_tracker_unittest.cc @@ -18,6 +18,11 @@ namespace gpu { namespace gles2 { +namespace { +void EmptyPoll() { +} +} + class QuerySyncManagerTest : public testing::Test { protected: static const int32 kNumCommandEntries = 400; @@ -29,7 +34,7 @@ class QuerySyncManagerTest : public testing::Test { helper_.reset(new GLES2CmdHelper(command_buffer_.get())); helper_->Initialize(kCommandBufferSizeBytes); mapped_memory_.reset(new MappedMemoryManager( - helper_.get(), MappedMemoryManager::kNoLimit)); + helper_.get(), base::Bind(&EmptyPoll), MappedMemoryManager::kNoLimit)); sync_manager_.reset(new QuerySyncManager(mapped_memory_.get())); } @@ -54,7 +59,7 @@ TEST_F(QuerySyncManagerTest, Basic) { EXPECT_TRUE(sync_manager_->Alloc(&infos[ii])); EXPECT_NE(0, infos[ii].shm_id); ASSERT_TRUE(infos[ii].sync != NULL); - EXPECT_EQ(0u, infos[ii].sync->process_count); + EXPECT_EQ(0, infos[ii].sync->process_count); EXPECT_EQ(0u, infos[ii].sync->result); } @@ -83,7 +88,7 @@ class QueryTrackerTest : public testing::Test { helper_.reset(new GLES2CmdHelper(command_buffer_.get())); helper_->Initialize(kCommandBufferSizeBytes); mapped_memory_.reset(new MappedMemoryManager( - helper_.get(), MappedMemoryManager::kNoLimit)); + helper_.get(), base::Bind(&EmptyPoll), MappedMemoryManager::kNoLimit)); query_tracker_.reset(new QueryTracker(mapped_memory_.get())); } @@ -102,6 +107,8 @@ class QueryTrackerTest : public testing::Test { return query->info_.bucket; } + uint32 GetFlushGeneration() { return helper_->flush_generation(); } + scoped_ptr<CommandBuffer> command_buffer_; scoped_ptr<GLES2CmdHelper> helper_; scoped_ptr<MappedMemoryManager> mapped_memory_; @@ -138,27 +145,48 @@ TEST_F(QueryTrackerTest, Query) { EXPECT_TRUE(query->NeverUsed()); EXPECT_FALSE(query->Pending()); EXPECT_EQ(0, query->token()); - EXPECT_EQ(0u, query->submit_count()); + EXPECT_EQ(0, query->submit_count()); // Check MarkAsActive. query->MarkAsActive(); EXPECT_FALSE(query->NeverUsed()); EXPECT_FALSE(query->Pending()); EXPECT_EQ(0, query->token()); - EXPECT_EQ(1u, query->submit_count()); + EXPECT_EQ(1, query->submit_count()); // Check MarkAsPending. query->MarkAsPending(kToken); EXPECT_FALSE(query->NeverUsed()); EXPECT_TRUE(query->Pending()); EXPECT_EQ(kToken, query->token()); - EXPECT_EQ(1u, query->submit_count()); + EXPECT_EQ(1, query->submit_count()); // Check CheckResultsAvailable. EXPECT_FALSE(query->CheckResultsAvailable(helper_.get())); EXPECT_FALSE(query->NeverUsed()); EXPECT_TRUE(query->Pending()); + // Flush only once if no more flushes happened between a call to + // EndQuery command and CheckResultsAvailable + // Advance put_ so flush calls in CheckResultsAvailable go through + // and updates flush_generation count + helper_->Noop(1); + // Set Query in pending state_ to simulate EndQuery command is called + query->MarkAsPending(kToken); + EXPECT_TRUE(query->Pending()); + // Store FlushGeneration count after EndQuery is called + uint32 gen1 = GetFlushGeneration(); + EXPECT_FALSE(query->CheckResultsAvailable(helper_.get())); + uint32 gen2 = GetFlushGeneration(); + EXPECT_NE(gen1, gen2); + // Repeated calls to CheckResultsAvailable should not flush unnecessarily + EXPECT_FALSE(query->CheckResultsAvailable(helper_.get())); + gen1 = GetFlushGeneration(); + EXPECT_EQ(gen1, gen2); + EXPECT_FALSE(query->CheckResultsAvailable(helper_.get())); + gen1 = GetFlushGeneration(); + EXPECT_EQ(gen1, gen2); + // Simulate GPU process marking it as available. QuerySync* sync = GetSync(query); sync->process_count = query->submit_count(); diff --git a/chromium/gpu/command_buffer/client/ring_buffer.cc b/chromium/gpu/command_buffer/client/ring_buffer.cc index 25f63425d85..813bb348863 100644 --- a/chromium/gpu/command_buffer/client/ring_buffer.cc +++ b/chromium/gpu/command_buffer/client/ring_buffer.cc @@ -13,13 +13,16 @@ namespace gpu { -RingBuffer::RingBuffer( - Offset base_offset, unsigned int size, CommandBufferHelper* helper) +RingBuffer::RingBuffer(unsigned int alignment, Offset base_offset, + unsigned int size, CommandBufferHelper* helper, + void* base) : helper_(helper), base_offset_(base_offset), size_(size), free_offset_(0), - in_use_offset_(0) { + in_use_offset_(0), + alignment_(alignment), + base_(static_cast<int8*>(base) - base_offset) { } RingBuffer::~RingBuffer() { @@ -49,13 +52,16 @@ void RingBuffer::FreeOldestBlock() { blocks_.pop_front(); } -RingBuffer::Offset RingBuffer::Alloc(unsigned int size) { +void* RingBuffer::Alloc(unsigned int size) { DCHECK_LE(size, size_) << "attempt to allocate more than maximum memory"; DCHECK(blocks_.empty() || blocks_.back().state != IN_USE) << "Attempt to alloc another block before freeing the previous."; // Similarly to malloc, an allocation of 0 allocates at least 1 byte, to // return different pointers every time. if (size == 0) size = 1; + // Allocate rounded to alignment size so that the offsets are always + // memory-aligned. + size = RoundToAlignment(size); // Wait until there is enough room. while (size > GetLargestFreeSizeNoWaiting()) { @@ -74,11 +80,12 @@ RingBuffer::Offset RingBuffer::Alloc(unsigned int size) { if (free_offset_ == size_) { free_offset_ = 0; } - return offset + base_offset_; + return GetPointer(offset + base_offset_); } -void RingBuffer::FreePendingToken(RingBuffer::Offset offset, +void RingBuffer::FreePendingToken(void* pointer, unsigned int token) { + Offset offset = GetOffset(pointer); offset -= base_offset_; DCHECK(!blocks_.empty()) << "no allocations to free"; for (Container::reverse_iterator it = blocks_.rbegin(); diff --git a/chromium/gpu/command_buffer/client/ring_buffer.h b/chromium/gpu/command_buffer/client/ring_buffer.h index 81f1cddafa5..dfe16f7326e 100644 --- a/chromium/gpu/command_buffer/client/ring_buffer.h +++ b/chromium/gpu/command_buffer/client/ring_buffer.h @@ -10,7 +10,7 @@ #include <deque> #include "base/logging.h" -#include "gpu/command_buffer/common/types.h" +#include "base/macros.h" #include "gpu/gpu_export.h" namespace gpu { @@ -25,11 +25,13 @@ class GPU_EXPORT RingBuffer { // Creates a RingBuffer. // Parameters: + // alignment: Alignment for allocations. // base_offset: The offset of the start of the buffer. // size: The size of the buffer in bytes. // helper: A CommandBufferHelper for dealing with tokens. - RingBuffer( - Offset base_offset, unsigned int size, CommandBufferHelper* helper); + // base: The physical address that corresponds to base_offset. + RingBuffer(unsigned int alignment, Offset base_offset, + unsigned int size, CommandBufferHelper* helper, void* base); ~RingBuffer(); @@ -41,16 +43,16 @@ class GPU_EXPORT RingBuffer { // size: the size of the memory block to allocate. // // Returns: - // the offset of the allocated memory block. - Offset Alloc(unsigned int size); + // the pointer to the allocated memory block. + void* Alloc(unsigned int size); // Frees a block of memory, pending the passage of a token. That memory won't // be re-allocated until the token has passed through the command stream. // // Parameters: - // offset: the offset of the memory block to free. + // pointer: the pointer to the memory block to free. // token: the token value to wait for before re-using the memory. - void FreePendingToken(Offset offset, unsigned int token); + void FreePendingToken(void* pointer, unsigned int token); // Gets the size of the largest free block that is available without waiting. unsigned int GetLargestFreeSizeNoWaiting(); @@ -62,6 +64,22 @@ class GPU_EXPORT RingBuffer { return size_; } + // Gets a pointer to a memory block given the base memory and the offset. + void* GetPointer(RingBuffer::Offset offset) const { + return static_cast<int8*>(base_) + offset; + } + + // Gets the offset to a memory block given the base memory and the address. + RingBuffer::Offset GetOffset(void* pointer) const { + return static_cast<int8*>(pointer) - static_cast<int8*>(base_); + } + + // Rounds the given size to the alignment in use. + unsigned int RoundToAlignment(unsigned int size) { + return (size + alignment_ - 1) & ~(alignment_ - 1); + } + + private: enum State { IN_USE, @@ -105,92 +123,13 @@ class GPU_EXPORT RingBuffer { // Range between in_use_mark and free_mark is in use. Offset in_use_offset_; - DISALLOW_IMPLICIT_CONSTRUCTORS(RingBuffer); -}; - -// This class functions just like RingBuffer, but its API uses pointers -// instead of offsets. -class RingBufferWrapper { - public: - // Parameters: - // base_offset: The offset to the start of the buffer - // size: The size of the buffer in bytes. - // helper: A CommandBufferHelper for dealing with tokens. - // base: The physical address that corresponds to base_offset. - RingBufferWrapper(RingBuffer::Offset base_offset, - unsigned int size, - CommandBufferHelper* helper, - void* base) - : allocator_(base_offset, size, helper), - base_(static_cast<int8*>(base) - base_offset) { - } - - // Allocates a block of memory. If the buffer is out of directly available - // memory, this function may wait until memory that was freed "pending a - // token" can be re-used. - // - // Parameters: - // size: the size of the memory block to allocate. - // - // Returns: - // the pointer to the allocated memory block, or NULL if out of - // memory. - void* Alloc(unsigned int size) { - RingBuffer::Offset offset = allocator_.Alloc(size); - return GetPointer(offset); - } + // Alignment for allocations. + unsigned int alignment_; - // Allocates a block of memory. If the buffer is out of directly available - // memory, this function may wait until memory that was freed "pending a - // token" can be re-used. - // This is a type-safe version of Alloc, returning a typed pointer. - // - // Parameters: - // count: the number of elements to allocate. - // - // Returns: - // the pointer to the allocated memory block, or NULL if out of - // memory. - template <typename T> T* AllocTyped(unsigned int count) { - return static_cast<T*>(Alloc(count * sizeof(T))); - } - - // Frees a block of memory, pending the passage of a token. That memory won't - // be re-allocated until the token has passed through the command stream. - // - // Parameters: - // pointer: the pointer to the memory block to free. - // token: the token value to wait for before re-using the memory. - void FreePendingToken(void* pointer, unsigned int token) { - DCHECK(pointer); - allocator_.FreePendingToken(GetOffset(pointer), token); - } - - // Gets a pointer to a memory block given the base memory and the offset. - void* GetPointer(RingBuffer::Offset offset) const { - return static_cast<int8*>(base_) + offset; - } - - // Gets the offset to a memory block given the base memory and the address. - RingBuffer::Offset GetOffset(void* pointer) const { - return static_cast<int8*>(pointer) - static_cast<int8*>(base_); - } - - // Gets the size of the largest free block that is available without waiting. - unsigned int GetLargestFreeSizeNoWaiting() { - return allocator_.GetLargestFreeSizeNoWaiting(); - } - - // Gets the size of the largest free block that can be allocated if the - // caller can wait. - unsigned int GetLargestFreeOrPendingSize() { - return allocator_.GetLargestFreeOrPendingSize(); - } - - private: - RingBuffer allocator_; + // The physical address that corresponds to base_offset. void* base_; - DISALLOW_IMPLICIT_CONSTRUCTORS(RingBufferWrapper); + + DISALLOW_IMPLICIT_CONSTRUCTORS(RingBuffer); }; } // namespace gpu diff --git a/chromium/gpu/command_buffer/client/ring_buffer_test.cc b/chromium/gpu/command_buffer/client/ring_buffer_test.cc index 05014289eab..0b58e3abcbd 100644 --- a/chromium/gpu/command_buffer/client/ring_buffer_test.cc +++ b/chromium/gpu/command_buffer/client/ring_buffer_test.cc @@ -35,6 +35,7 @@ class BaseRingBufferTest : public testing::Test { protected: static const unsigned int kBaseOffset = 128; static const unsigned int kBufferSize = 1024; + static const unsigned int kAlignment = 4; void RunPendingSetToken() { for (std::vector<const void*>::iterator it = set_token_arguments_.begin(); @@ -92,7 +93,7 @@ class BaseRingBufferTest : public testing::Test { } int32 GetToken() { - return command_buffer_->GetState().token; + return command_buffer_->GetLastState().token; } #if defined(OS_MACOSX) @@ -107,6 +108,8 @@ class BaseRingBufferTest : public testing::Test { std::vector<const void*> set_token_arguments_; bool delay_set_token_; + scoped_ptr<int8[]> buffer_; + int8* buffer_start_; }; #ifndef _MSC_VER @@ -122,7 +125,11 @@ class RingBufferTest : public BaseRingBufferTest { protected: virtual void SetUp() { BaseRingBufferTest::SetUp(); - allocator_.reset(new RingBuffer(kBaseOffset, kBufferSize, helper_.get())); + + buffer_.reset(new int8[kBufferSize + kBaseOffset]); + buffer_start_ = buffer_.get() + kBaseOffset; + allocator_.reset(new RingBuffer(kAlignment, kBaseOffset, kBufferSize, + helper_.get(), buffer_start_)); } virtual void TearDown() { @@ -140,12 +147,12 @@ TEST_F(RingBufferTest, TestBasic) { const unsigned int kSize = 16; EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeOrPendingSize()); EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeSizeNoWaiting()); - RingBuffer::Offset offset = allocator_->Alloc(kSize); - EXPECT_GE(kBufferSize, offset - kBaseOffset + kSize); + void* pointer = allocator_->Alloc(kSize); + EXPECT_GE(kBufferSize, allocator_->GetOffset(pointer) - kBaseOffset + kSize); EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeOrPendingSize()); EXPECT_EQ(kBufferSize - kSize, allocator_->GetLargestFreeSizeNoWaiting()); int32 token = helper_->InsertToken(); - allocator_->FreePendingToken(offset, token); + allocator_->FreePendingToken(pointer, token); } // Checks the free-pending-token mechanism. @@ -158,10 +165,11 @@ TEST_F(RingBufferTest, TestFreePendingToken) { // Allocate several buffers to fill in the memory. int32 tokens[kAllocCount]; for (unsigned int ii = 0; ii < kAllocCount; ++ii) { - RingBuffer::Offset offset = allocator_->Alloc(kSize); - EXPECT_GE(kBufferSize, offset - kBaseOffset + kSize); + void* pointer = allocator_->Alloc(kSize); + EXPECT_GE(kBufferSize, + allocator_->GetOffset(pointer) - kBaseOffset + kSize); tokens[ii] = helper_->InsertToken(); - allocator_->FreePendingToken(offset, tokens[ii]); + allocator_->FreePendingToken(pointer, tokens[ii]); } EXPECT_EQ(kBufferSize - (kSize * kAllocCount), @@ -171,131 +179,38 @@ TEST_F(RingBufferTest, TestFreePendingToken) { // This allocation will need to reclaim the space freed above, so that should // process the commands until a token is passed. - RingBuffer::Offset offset1 = allocator_->Alloc(kSize); - EXPECT_EQ(kBaseOffset, offset1); + void* pointer1 = allocator_->Alloc(kSize); + EXPECT_EQ(kBaseOffset, allocator_->GetOffset(pointer1)); // Check that the token has indeed passed. EXPECT_LE(tokens[0], GetToken()); - allocator_->FreePendingToken(offset1, helper_->InsertToken()); + allocator_->FreePendingToken(pointer1, helper_->InsertToken()); } // Tests GetLargestFreeSizeNoWaiting TEST_F(RingBufferTest, TestGetLargestFreeSizeNoWaiting) { EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeSizeNoWaiting()); - RingBuffer::Offset offset = allocator_->Alloc(kBufferSize); + void* pointer = allocator_->Alloc(kBufferSize); EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); - allocator_->FreePendingToken(offset, helper_->InsertToken()); + allocator_->FreePendingToken(pointer, helper_->InsertToken()); } TEST_F(RingBufferTest, TestFreeBug) { // The first and second allocations must not match. - const unsigned int kAlloc1 = 10; + const unsigned int kAlloc1 = 3*kAlignment; const unsigned int kAlloc2 = 20; - RingBuffer::Offset offset = allocator_->Alloc(kAlloc1); + void* pointer = allocator_->Alloc(kAlloc1); EXPECT_EQ(kBufferSize - kAlloc1, allocator_->GetLargestFreeSizeNoWaiting()); - allocator_->FreePendingToken(offset, helper_.get()->InsertToken()); - offset = allocator_->Alloc(kAlloc2); + allocator_->FreePendingToken(pointer, helper_.get()->InsertToken()); + pointer = allocator_->Alloc(kAlloc2); EXPECT_EQ(kBufferSize - kAlloc1 - kAlloc2, allocator_->GetLargestFreeSizeNoWaiting()); - allocator_->FreePendingToken(offset, helper_.get()->InsertToken()); - offset = allocator_->Alloc(kBufferSize); + allocator_->FreePendingToken(pointer, helper_.get()->InsertToken()); + pointer = allocator_->Alloc(kBufferSize); EXPECT_EQ(0u, allocator_->GetLargestFreeSizeNoWaiting()); - allocator_->FreePendingToken(offset, helper_.get()->InsertToken()); -} - -// Test fixture for RingBufferWrapper test - Creates a -// RingBufferWrapper, using a CommandBufferHelper with a mock -// AsyncAPIInterface for its interface (calling it directly, not through the -// RPC mechanism), making sure Noops are ignored and SetToken are properly -// forwarded to the engine. -class RingBufferWrapperTest : public BaseRingBufferTest { - protected: - virtual void SetUp() { - BaseRingBufferTest::SetUp(); - - // Though allocating this buffer isn't strictly necessary, it makes - // allocations point to valid addresses, so they could be used for - // something. - buffer_.reset(new int8[kBufferSize + kBaseOffset]); - buffer_start_ = buffer_.get() + kBaseOffset; - allocator_.reset(new RingBufferWrapper( - kBaseOffset, kBufferSize, helper_.get(), buffer_start_)); - } - - virtual void TearDown() { - // If the GpuScheduler posts any tasks, this forces them to run. - base::MessageLoop::current()->RunUntilIdle(); - - BaseRingBufferTest::TearDown(); - } - - scoped_ptr<RingBufferWrapper> allocator_; - scoped_ptr<int8[]> buffer_; - int8* buffer_start_; -}; - -// Checks basic alloc and free. -TEST_F(RingBufferWrapperTest, TestBasic) { - const unsigned int kSize = 16; - void* pointer = allocator_->Alloc(kSize); - ASSERT_TRUE(pointer); - EXPECT_LE(buffer_start_, static_cast<int8*>(pointer)); - EXPECT_GE(kBufferSize, static_cast<int8*>(pointer) - buffer_start_ + kSize); - - allocator_->FreePendingToken(pointer, helper_->InsertToken()); - - int8* pointer_int8 = allocator_->AllocTyped<int8>(kSize); - ASSERT_TRUE(pointer_int8); - EXPECT_LE(buffer_start_, pointer_int8); - EXPECT_GE(buffer_start_ + kBufferSize, pointer_int8 + kSize); - allocator_->FreePendingToken(pointer_int8, helper_->InsertToken()); - - unsigned int* pointer_uint = allocator_->AllocTyped<unsigned int>(kSize); - ASSERT_TRUE(pointer_uint); - EXPECT_LE(buffer_start_, reinterpret_cast<int8*>(pointer_uint)); - EXPECT_GE(buffer_start_ + kBufferSize, - reinterpret_cast<int8* >(pointer_uint + kSize)); - - // Check that it did allocate kSize * sizeof(unsigned int). We can't tell - // directly, except from the remaining size. - EXPECT_EQ(kBufferSize - kSize - kSize - kSize * sizeof(*pointer_uint), - allocator_->GetLargestFreeSizeNoWaiting()); - allocator_->FreePendingToken(pointer_uint, helper_->InsertToken()); -} - -// Checks the free-pending-token mechanism. -TEST_F(RingBufferWrapperTest, TestFreePendingToken) { - const unsigned int kSize = 16; - const unsigned int kAllocCount = kBufferSize / kSize; - CHECK(kAllocCount * kSize == kBufferSize); - - delay_set_token_ = true; - // Allocate several buffers to fill in the memory. - int32 tokens[kAllocCount]; - for (unsigned int ii = 0; ii < kAllocCount; ++ii) { - void* pointer = allocator_->Alloc(kSize); - EXPECT_TRUE(pointer != NULL); - tokens[ii] = helper_->InsertToken(); - allocator_->FreePendingToken(pointer, helper_->InsertToken()); - } - - EXPECT_EQ(kBufferSize - (kSize * kAllocCount), - allocator_->GetLargestFreeSizeNoWaiting()); - - RunPendingSetToken(); - - // This allocation will need to reclaim the space freed above, so that should - // process the commands until the token is passed. - void* pointer1 = allocator_->Alloc(kSize); - EXPECT_EQ(buffer_start_, static_cast<int8*>(pointer1)); - - // Check that the token has indeed passed. - EXPECT_LE(tokens[0], GetToken()); - - allocator_->FreePendingToken(pointer1, helper_->InsertToken()); - EXPECT_LE(command_buffer_->GetState().token, helper_->InsertToken()); + allocator_->FreePendingToken(pointer, helper_.get()->InsertToken()); } } // namespace gpu diff --git a/chromium/gpu/command_buffer/client/share_group.cc b/chromium/gpu/command_buffer/client/share_group.cc index cb9f9bca5c6..96ab8d181be 100644 --- a/chromium/gpu/command_buffer/client/share_group.cc +++ b/chromium/gpu/command_buffer/client/share_group.cc @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <stack> +#include <vector> + #include "gpu/command_buffer/client/share_group.h" #include "base/logging.h" @@ -13,6 +16,9 @@ namespace gpu { namespace gles2 { +ShareGroupContextData::IdHandlerData::IdHandlerData() : flush_generation_(0) {} +ShareGroupContextData::IdHandlerData::~IdHandlerData() {} + COMPILE_ASSERT(gpu::kInvalidResource == 0, INVALID_RESOURCE_NOT_0_AS_GL_EXPECTS); @@ -26,6 +32,7 @@ class IdHandler : public IdHandlerInterface { virtual void MakeIds( GLES2Implementation* /* gl_impl */, GLuint id_offset, GLsizei n, GLuint* ids) OVERRIDE { + base::AutoLock auto_lock(lock_); if (id_offset == 0) { for (GLsizei ii = 0; ii < n; ++ii) { ids[ii] = id_allocator_.AllocateID(); @@ -42,35 +49,144 @@ class IdHandler : public IdHandlerInterface { virtual bool FreeIds( GLES2Implementation* gl_impl, GLsizei n, const GLuint* ids, DeleteFn delete_fn) OVERRIDE { + base::AutoLock auto_lock(lock_); + for (GLsizei ii = 0; ii < n; ++ii) { id_allocator_.FreeID(ids[ii]); } + (gl_impl->*delete_fn)(n, ids); // We need to ensure that the delete call is evaluated on the service side // before any other contexts issue commands using these client ids. + // TODO(vmiura): Can remove this by virtualizing internal ids, however + // this code only affects PPAPI for now. gl_impl->helper()->CommandBufferHelper::Flush(); return true; } // Overridden from IdHandlerInterface. virtual bool MarkAsUsedForBind(GLuint id) OVERRIDE { - return id == 0 ? true : id_allocator_.MarkAsUsed(id); + if (id == 0) + return true; + base::AutoLock auto_lock(lock_); + return id_allocator_.MarkAsUsed(id); } - protected: + + virtual void FreeContext(GLES2Implementation* gl_impl) OVERRIDE {} + + private: + base::Lock lock_; IdAllocator id_allocator_; }; -// An id handler that require Gen before Bind. -class StrictIdHandler : public IdHandler { +// An id handler that requires Gen before Bind. +class StrictIdHandler : public IdHandlerInterface { public: - StrictIdHandler() {} + explicit StrictIdHandler(int id_namespace) : id_namespace_(id_namespace) {} virtual ~StrictIdHandler() {} // Overridden from IdHandler. + virtual void MakeIds(GLES2Implementation* gl_impl, + GLuint /* id_offset */, + GLsizei n, + GLuint* ids) OVERRIDE { + base::AutoLock auto_lock(lock_); + + // Collect pending FreeIds from other flush_generation. + CollectPendingFreeIds(gl_impl); + + for (GLsizei ii = 0; ii < n; ++ii) { + if (!free_ids_.empty()) { + // Allocate a previously freed Id. + ids[ii] = free_ids_.top(); + free_ids_.pop(); + + // Record kIdInUse state. + DCHECK(id_states_[ids[ii] - 1] == kIdFree); + id_states_[ids[ii] - 1] = kIdInUse; + } else { + // Allocate a new Id. + id_states_.push_back(kIdInUse); + ids[ii] = id_states_.size(); + } + } + } + + // Overridden from IdHandler. + virtual bool FreeIds(GLES2Implementation* gl_impl, + GLsizei n, + const GLuint* ids, + DeleteFn delete_fn) OVERRIDE { + + // Delete stub must run before CollectPendingFreeIds. + (gl_impl->*delete_fn)(n, ids); + + { + base::AutoLock auto_lock(lock_); + + // Collect pending FreeIds from other flush_generation. + CollectPendingFreeIds(gl_impl); + + // Save Ids to free in a later flush_generation. + ShareGroupContextData::IdHandlerData* ctxt_data = + gl_impl->share_group_context_data()->id_handler_data(id_namespace_); + + for (GLsizei ii = 0; ii < n; ++ii) { + GLuint id = ids[ii]; + if (id != 0) { + // Save freed Id for later. + DCHECK(id_states_[id - 1] == kIdInUse); + id_states_[id - 1] = kIdPendingFree; + ctxt_data->freed_ids_.push_back(id); + } + } + } + + return true; + } + + // Overridden from IdHandler. virtual bool MarkAsUsedForBind(GLuint id) OVERRIDE { - DCHECK(id == 0 || id_allocator_.InUse(id)); - return IdHandler::MarkAsUsedForBind(id); +#ifndef NDEBUG + if (id != 0) { + base::AutoLock auto_lock(lock_); + DCHECK(id_states_[id - 1] == kIdInUse); + } +#endif + return true; + } + + // Overridden from IdHandlerInterface. + virtual void FreeContext(GLES2Implementation* gl_impl) OVERRIDE { + base::AutoLock auto_lock(lock_); + CollectPendingFreeIds(gl_impl); + } + + private: + enum IdState { kIdFree, kIdPendingFree, kIdInUse }; + + void CollectPendingFreeIds(GLES2Implementation* gl_impl) { + uint32 flush_generation = gl_impl->helper()->flush_generation(); + ShareGroupContextData::IdHandlerData* ctxt_data = + gl_impl->share_group_context_data()->id_handler_data(id_namespace_); + + if (ctxt_data->flush_generation_ != flush_generation) { + ctxt_data->flush_generation_ = flush_generation; + for (uint32 ii = 0; ii < ctxt_data->freed_ids_.size(); ++ii) { + const GLuint id = ctxt_data->freed_ids_[ii]; + DCHECK(id_states_[id - 1] == kIdPendingFree); + id_states_[id - 1] = kIdFree; + free_ids_.push(id); + } + ctxt_data->freed_ids_.clear(); + } } + + int id_namespace_; + + base::Lock lock_; + std::vector<uint8> id_states_; + std::stack<uint32> free_ids_; }; // An id handler for ids that are never reused. @@ -83,6 +199,7 @@ class NonReusedIdHandler : public IdHandlerInterface { virtual void MakeIds( GLES2Implementation* /* gl_impl */, GLuint id_offset, GLsizei n, GLuint* ids) OVERRIDE { + base::AutoLock auto_lock(lock_); for (GLsizei ii = 0; ii < n; ++ii) { ids[ii] = ++last_id_ + id_offset; } @@ -103,82 +220,11 @@ class NonReusedIdHandler : public IdHandlerInterface { return false; } - private: - GLuint last_id_; -}; - -// An id handler for shared ids. -class SharedIdHandler : public IdHandlerInterface { - public: - SharedIdHandler( - id_namespaces::IdNamespaces id_namespace) - : id_namespace_(id_namespace) { - } - - virtual ~SharedIdHandler() {} - - virtual void MakeIds(GLES2Implementation* gl_impl, - GLuint id_offset, - GLsizei n, - GLuint* ids) OVERRIDE { - gl_impl->GenSharedIdsCHROMIUM(id_namespace_, id_offset, n, ids); - } - - virtual bool FreeIds(GLES2Implementation* gl_impl, - GLsizei n, - const GLuint* ids, - DeleteFn delete_fn) OVERRIDE { - gl_impl->DeleteSharedIdsCHROMIUM(id_namespace_, n, ids); - (gl_impl->*delete_fn)(n, ids); - // We need to ensure that the delete call is evaluated on the service side - // before any other contexts issue commands using these client ids. - gl_impl->helper()->CommandBufferHelper::Flush(); - return true; - } - - virtual bool MarkAsUsedForBind(GLuint id) OVERRIDE { - // This has no meaning for shared resources. - return true; - } - - private: - id_namespaces::IdNamespaces id_namespace_; -}; - -class ThreadSafeIdHandlerWrapper : public IdHandlerInterface { - public: - ThreadSafeIdHandlerWrapper(IdHandlerInterface* id_handler) - : id_handler_(id_handler) { - } - virtual ~ThreadSafeIdHandlerWrapper() { } - - // Overridden from IdHandlerInterface. - virtual void MakeIds(GLES2Implementation* gl_impl, - GLuint id_offset, - GLsizei n, - GLuint* ids) OVERRIDE { - base::AutoLock auto_lock(lock_); - id_handler_->MakeIds(gl_impl, id_offset, n, ids); - } - - // Overridden from IdHandlerInterface. - virtual bool FreeIds(GLES2Implementation* gl_impl, - GLsizei n, - const GLuint* ids, - DeleteFn delete_fn) OVERRIDE { - base::AutoLock auto_lock(lock_); - return id_handler_->FreeIds(gl_impl, n, ids, delete_fn); - } - - // Overridden from IdHandlerInterface. - virtual bool MarkAsUsedForBind(GLuint id) OVERRIDE { - base::AutoLock auto_lock(lock_); - return id_handler_->MarkAsUsedForBind(id); - } + virtual void FreeContext(GLES2Implementation* gl_impl) OVERRIDE {} private: - scoped_ptr<IdHandlerInterface> id_handler_; - base::Lock lock_; + base::Lock lock_; + GLuint last_id_; }; ShareGroup::ShareGroup(bool bind_generates_resource) @@ -186,21 +232,17 @@ ShareGroup::ShareGroup(bool bind_generates_resource) if (bind_generates_resource) { for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) { if (i == id_namespaces::kProgramsAndShaders) { - id_handlers_[i].reset(new ThreadSafeIdHandlerWrapper( - new NonReusedIdHandler())); + id_handlers_[i].reset(new NonReusedIdHandler()); } else { - id_handlers_[i].reset(new ThreadSafeIdHandlerWrapper( - new IdHandler())); + id_handlers_[i].reset(new IdHandler()); } } } else { for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) { if (i == id_namespaces::kProgramsAndShaders) { - id_handlers_[i].reset(new ThreadSafeIdHandlerWrapper( - new NonReusedIdHandler())); + id_handlers_[i].reset(new NonReusedIdHandler()); } else { - id_handlers_[i].reset(new ThreadSafeIdHandlerWrapper( - new StrictIdHandler())); + id_handlers_[i].reset(new StrictIdHandler(i)); } } } diff --git a/chromium/gpu/command_buffer/client/share_group.h b/chromium/gpu/command_buffer/client/share_group.h index 68ea6a9895a..341dd586839 100644 --- a/chromium/gpu/command_buffer/client/share_group.h +++ b/chromium/gpu/command_buffer/client/share_group.h @@ -20,6 +20,24 @@ class ProgramInfoManager; typedef void (GLES2Implementation::*DeleteFn)(GLsizei n, const GLuint* ids); +class ShareGroupContextData { + public: + struct IdHandlerData { + IdHandlerData(); + ~IdHandlerData(); + + std::vector<GLuint> freed_ids_; + uint32 flush_generation_; + }; + + IdHandlerData* id_handler_data(int namespace_id) { + return &id_handler_data_[namespace_id]; + } + + private: + IdHandlerData id_handler_data_[id_namespaces::kNumIdNamespaces]; +}; + // Base class for IdHandlers class IdHandlerInterface { public: @@ -38,6 +56,9 @@ class IdHandlerInterface { // Marks an id as used for glBind functions. id = 0 does nothing. virtual bool MarkAsUsedForBind(GLuint id) = 0; + + // Called when a context in the share group is destructed. + virtual void FreeContext(GLES2Implementation* gl_impl) = 0; }; // ShareGroup manages shared resources for contexts that are sharing resources. @@ -60,6 +81,12 @@ class GLES2_IMPL_EXPORT ShareGroup return program_info_manager_.get(); } + void FreeContext(GLES2Implementation* gl_impl) { + for (int i = 0; i < id_namespaces::kNumIdNamespaces; ++i) { + id_handlers_[i]->FreeContext(gl_impl); + } + } + private: friend class gpu::RefCountedThreadSafe<ShareGroup>; friend class gpu::gles2::GLES2ImplementationTest; diff --git a/chromium/gpu/command_buffer/client/transfer_buffer.cc b/chromium/gpu/command_buffer/client/transfer_buffer.cc index c4b84a14f32..c5ce3d549bd 100644 --- a/chromium/gpu/command_buffer/client/transfer_buffer.cc +++ b/chromium/gpu/command_buffer/client/transfer_buffer.cc @@ -6,14 +6,13 @@ #include "gpu/command_buffer/client/transfer_buffer.h" +#include "base/bits.h" +#include "base/debug/trace_event.h" #include "base/logging.h" #include "gpu/command_buffer/client/cmd_buffer_helper.h" namespace gpu { -AlignedRingBuffer::~AlignedRingBuffer() { -} - TransferBuffer::TransferBuffer( CommandBufferHelper* helper) : helper_(helper), @@ -53,11 +52,11 @@ bool TransferBuffer::Initialize( void TransferBuffer::Free() { if (HaveBuffer()) { + TRACE_EVENT0("gpu", "TransferBuffer::Free"); helper_->Finish(); helper_->command_buffer()->DestroyTransferBuffer(buffer_id_); buffer_id_ = -1; - buffer_.ptr = NULL; - buffer_.size = 0; + buffer_ = NULL; result_buffer_ = NULL; result_shm_offset_ = 0; ring_buffer_.reset(); @@ -66,6 +65,7 @@ void TransferBuffer::Free() { } bool TransferBuffer::HaveBuffer() const { + DCHECK(buffer_id_ == -1 || buffer_); return buffer_id_ != -1; } @@ -84,19 +84,19 @@ void TransferBuffer::FreePendingToken(void* p, unsigned int token) { void TransferBuffer::AllocateRingBuffer(unsigned int size) { for (;size >= min_buffer_size_; size /= 2) { int32 id = -1; - gpu::Buffer buffer = + scoped_refptr<gpu::Buffer> buffer = helper_->command_buffer()->CreateTransferBuffer(size, &id); if (id != -1) { + DCHECK(buffer); buffer_ = buffer; - ring_buffer_.reset(new AlignedRingBuffer( + ring_buffer_.reset(new RingBuffer( alignment_, - id, result_size_, - buffer_.size - result_size_, + buffer_->size() - result_size_, helper_, - static_cast<char*>(buffer_.ptr) + result_size_)); + static_cast<char*>(buffer_->memory()) + result_size_)); buffer_id_ = id; - result_buffer_ = buffer_.ptr; + result_buffer_ = buffer_->memory(); result_shm_offset_ = 0; return; } @@ -106,36 +106,8 @@ void TransferBuffer::AllocateRingBuffer(unsigned int size) { usable_ = false; } -// Returns the integer i such as 2^i <= n < 2^(i+1) -static int Log2Floor(uint32 n) { - if (n == 0) - return -1; - int log = 0; - uint32 value = n; - for (int i = 4; i >= 0; --i) { - int shift = (1 << i); - uint32 x = value >> shift; - if (x != 0) { - value = x; - log += shift; - } - } - DCHECK_EQ(value, 1u); - return log; -} - -// Returns the integer i such as 2^(i-1) < n <= 2^i -static int Log2Ceiling(uint32 n) { - if (n == 0) { - return -1; - } else { - // Log2Floor returns -1 for 0, so the following works correctly for n=1. - return 1 + Log2Floor(n - 1); - } -} - static unsigned int ComputePOTSize(unsigned int dimension) { - return (dimension == 0) ? 0 : 1 << Log2Ceiling(dimension); + return (dimension == 0) ? 0 : 1 << base::bits::Log2Ceiling(dimension); } void TransferBuffer::ReallocateRingBuffer(unsigned int size) { @@ -145,7 +117,7 @@ void TransferBuffer::ReallocateRingBuffer(unsigned int size) { needed_buffer_size = std::max(needed_buffer_size, default_buffer_size_); needed_buffer_size = std::min(needed_buffer_size, max_buffer_size_); - if (usable_ && (!HaveBuffer() || needed_buffer_size > buffer_.size)) { + if (usable_ && (!HaveBuffer() || needed_buffer_size > buffer_->size())) { if (HaveBuffer()) { Free(); } diff --git a/chromium/gpu/command_buffer/client/transfer_buffer.h b/chromium/gpu/command_buffer/client/transfer_buffer.h index 11173985819..348ad32b200 100644 --- a/chromium/gpu/command_buffer/client/transfer_buffer.h +++ b/chromium/gpu/command_buffer/client/transfer_buffer.h @@ -16,40 +16,6 @@ namespace gpu { class CommandBufferHelper; -// Wraps RingBufferWrapper to provide aligned allocations. -class AlignedRingBuffer : public RingBufferWrapper { - public: - AlignedRingBuffer( - unsigned int alignment, - int32 shm_id, - RingBuffer::Offset base_offset, - unsigned int size, - CommandBufferHelper* helper, - void* base) - : RingBufferWrapper(base_offset, size, helper, base), - alignment_(alignment), - shm_id_(shm_id) { - } - ~AlignedRingBuffer(); - - // Hiding Alloc from RingBufferWrapper - void* Alloc(unsigned int size) { - return RingBufferWrapper::Alloc(RoundToAlignment(size)); - } - - int32 GetShmId() const { - return shm_id_; - } - - private: - unsigned int RoundToAlignment(unsigned int size) { - return (size + alignment_ - 1) & ~(alignment_ - 1); - } - - unsigned int alignment_; - int32 shm_id_; -}; - // Interface for managing the transfer buffer. class GPU_EXPORT TransferBufferInterface { public: @@ -120,7 +86,7 @@ class GPU_EXPORT TransferBuffer : public TransferBufferInterface { void AllocateRingBuffer(unsigned int size); CommandBufferHelper* helper_; - scoped_ptr<AlignedRingBuffer> ring_buffer_; + scoped_ptr<RingBuffer> ring_buffer_; // size reserved for results unsigned int result_size_; @@ -144,7 +110,7 @@ class GPU_EXPORT TransferBuffer : public TransferBufferInterface { unsigned int bytes_since_last_flush_; // the current buffer. - gpu::Buffer buffer_; + scoped_refptr<gpu::Buffer> buffer_; // id of buffer. -1 = no buffer int32 buffer_id_; diff --git a/chromium/gpu/command_buffer/client/transfer_buffer_unittest.cc b/chromium/gpu/command_buffer/client/transfer_buffer_unittest.cc index 39ce923f78c..9f3b51e4750 100644 --- a/chromium/gpu/command_buffer/client/transfer_buffer_unittest.cc +++ b/chromium/gpu/command_buffer/client/transfer_buffer_unittest.cc @@ -181,6 +181,17 @@ TEST_F(TransferBufferTest, TooLargeAllocation) { transfer_buffer_->FreePendingToken(ptr, 1); } +TEST_F(TransferBufferTest, MemoryAlignmentAfterZeroAllocation) { + Initialize(32u); + void* ptr = transfer_buffer_->Alloc(0); + EXPECT_EQ((reinterpret_cast<uintptr_t>(ptr) & (kAlignment - 1)), 0u); + transfer_buffer_->FreePendingToken(ptr, -1); + // Check that the pointer is aligned on the following allocation. + ptr = transfer_buffer_->Alloc(4); + EXPECT_EQ((reinterpret_cast<uintptr_t>(ptr) & (kAlignment - 1)), 0u); + transfer_buffer_->FreePendingToken(ptr, 1); +} + TEST_F(TransferBufferTest, Flush) { Initialize(16u); unsigned int size_allocated = 0; @@ -214,9 +225,10 @@ class MockClientCommandBufferCanFail : public MockClientCommandBufferMockFlush { virtual ~MockClientCommandBufferCanFail() { } - MOCK_METHOD2(CreateTransferBuffer, Buffer(size_t size, int32* id)); + MOCK_METHOD2(CreateTransferBuffer, + scoped_refptr<Buffer>(size_t size, int32* id)); - Buffer RealCreateTransferBuffer(size_t size, int32* id) { + scoped_refptr<gpu::Buffer> RealCreateTransferBuffer(size_t size, int32* id) { return MockCommandBufferBase::CreateTransferBuffer(size, id); } }; @@ -375,7 +387,8 @@ TEST_F(TransferBufferExpandContractTest, Contract) { // Try to allocate again, fail first request EXPECT_CALL(*command_buffer(), CreateTransferBuffer(kStartTransferBufferSize, _)) - .WillOnce(DoAll(SetArgPointee<1>(-1), Return(Buffer()))) + .WillOnce( + DoAll(SetArgPointee<1>(-1), Return(scoped_refptr<gpu::Buffer>()))) .RetiresOnSaturation(); EXPECT_CALL(*command_buffer(), CreateTransferBuffer(kMinTransferBufferSize, _)) @@ -427,9 +440,12 @@ TEST_F(TransferBufferExpandContractTest, OutOfMemory) { // Try to allocate again, fail both requests. EXPECT_CALL(*command_buffer(), CreateTransferBuffer(_, _)) - .WillOnce(DoAll(SetArgPointee<1>(-1), Return(Buffer()))) - .WillOnce(DoAll(SetArgPointee<1>(-1), Return(Buffer()))) - .WillOnce(DoAll(SetArgPointee<1>(-1), Return(Buffer()))) + .WillOnce( + DoAll(SetArgPointee<1>(-1), Return(scoped_refptr<gpu::Buffer>()))) + .WillOnce( + DoAll(SetArgPointee<1>(-1), Return(scoped_refptr<gpu::Buffer>()))) + .WillOnce( + DoAll(SetArgPointee<1>(-1), Return(scoped_refptr<gpu::Buffer>()))) .RetiresOnSaturation(); const size_t kSize1 = 512 - kStartingOffset; diff --git a/chromium/gpu/command_buffer/client/vertex_array_object_manager.h b/chromium/gpu/command_buffer/client/vertex_array_object_manager.h index d5b07ec0e88..34f630d95ae 100644 --- a/chromium/gpu/command_buffer/client/vertex_array_object_manager.h +++ b/chromium/gpu/command_buffer/client/vertex_array_object_manager.h @@ -6,10 +6,11 @@ #define GPU_COMMAND_BUFFER_CLIENT_VERTEX_ARRAY_OBJECT_MANAGER_H_ #include <GLES2/gl2.h> + #include "base/containers/hash_tables.h" +#include "base/macros.h" #include "base/memory/scoped_ptr.h" #include "gles2_impl_export.h" -#include "gpu/command_buffer/common/types.h" namespace gpu { namespace gles2 { diff --git a/chromium/gpu/command_buffer/cmd_buffer_functions.txt b/chromium/gpu/command_buffer/cmd_buffer_functions.txt index eeb47601658..05cbd123ae7 100644 --- a/chromium/gpu/command_buffer/cmd_buffer_functions.txt +++ b/chromium/gpu/command_buffer/cmd_buffer_functions.txt @@ -178,7 +178,7 @@ GL_APICALL void GL_APIENTRY glRegisterSharedIdsCHROMIUM (GLuint namespac GL_APICALL GLboolean GL_APIENTRY glEnableFeatureCHROMIUM (const char* feature); GL_APICALL void* GL_APIENTRY glMapBufferCHROMIUM (GLuint target, GLenum access); GL_APICALL GLboolean GL_APIENTRY glUnmapBufferCHROMIUM (GLuint target); -GL_APICALL void* GL_APIENTRY glMapImageCHROMIUM (GLuint image_id, GLenum access); +GL_APICALL void* GL_APIENTRY glMapImageCHROMIUM (GLuint image_id); GL_APICALL void GL_APIENTRY glUnmapImageCHROMIUM (GLuint image_id); GL_APICALL void* GL_APIENTRY glMapBufferSubDataCHROMIUM (GLuint target, GLintptrNotNegative offset, GLsizeiptr size, GLenum access); @@ -192,8 +192,7 @@ GL_APICALL void GL_APIENTRY glRateLimitOffscreenContextCHROMIUM (void); GL_APICALL void GL_APIENTRY glGetMultipleIntegervCHROMIUM (const GLenum* pnames, GLuint count, GLint* results, GLsizeiptr size); GL_APICALL void GL_APIENTRY glGetProgramInfoCHROMIUM (GLidProgram program, GLsizeiNotNegative bufsize, GLsizei* size, void* info); GL_APICALL GLuint GL_APIENTRY glCreateStreamTextureCHROMIUM (GLuint texture); -GL_APICALL void GL_APIENTRY glDestroyStreamTextureCHROMIUM (GLuint texture); -GL_APICALL GLuint GL_APIENTRY glCreateImageCHROMIUM (GLsizei width, GLsizei height, GLenum internalformat); +GL_APICALL GLuint GL_APIENTRY glCreateImageCHROMIUM (GLsizei width, GLsizei height, GLenum internalformat, GLenum usage); GL_APICALL void GL_APIENTRY glDestroyImageCHROMIUM (GLuint image_id); GL_APICALL void GL_APIENTRY glGetImageParameterivCHROMIUM (GLuint image_id, GLenum pname, GLint* params); GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLidShader shader, GLsizeiNotNegative bufsize, GLsizeiOptional* length, char* source); @@ -205,20 +204,24 @@ GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenumDrawMode GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor); GL_APICALL void GL_APIENTRY glGenMailboxCHROMIUM (GLbyte* mailbox); GL_APICALL void GL_APIENTRY glProduceTextureCHROMIUM (GLenumTextureBindTarget target, const GLbyte* mailbox); +GL_APICALL void GL_APIENTRY glProduceTextureDirectCHROMIUM (GLidBindTexture texture, GLenumTextureBindTarget target, const GLbyte* mailbox); GL_APICALL void GL_APIENTRY glConsumeTextureCHROMIUM (GLenumTextureBindTarget target, const GLbyte* mailbox); +GL_APICALL GLuint GL_APIENTRY glCreateAndConsumeTextureCHROMIUM (GLenumTextureBindTarget target, const GLbyte* mailbox); GL_APICALL void GL_APIENTRY glBindUniformLocationCHROMIUM (GLidProgram program, GLint location, const char* name); GL_APICALL void GL_APIENTRY glBindTexImage2DCHROMIUM (GLenumTextureBindTarget target, GLint imageId); GL_APICALL void GL_APIENTRY glReleaseTexImage2DCHROMIUM (GLenumTextureBindTarget target, GLint imageId); GL_APICALL void GL_APIENTRY glTraceBeginCHROMIUM (const char* name); GL_APICALL void GL_APIENTRY glTraceEndCHROMIUM (void); GL_APICALL void GL_APIENTRY glAsyncTexSubImage2DCHROMIUM (GLenumTextureTarget target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenumTextureFormat format, GLenumPixelType type, const void* data); -GL_APICALL void GL_APIENTRY glAsyncTexImage2DCHROMIUM (GLenumTextureTarget target, GLint level, GLintTextureInternalFormat internalformat, GLsizei width, GLsizei height, GLintTextureBorder border, GLenumTextureFormat format, GLenumPixelType type, const void* pixels); +GL_APICALL void GL_APIENTRY glAsyncTexImage2DCHROMIUM (GLenumTextureTarget target, GLint level, GLenumTextureInternalFormat internalformat, GLsizei width, GLsizei height, GLintTextureBorder border, GLenumTextureFormat format, GLenumPixelType type, const void* pixels); GL_APICALL void GL_APIENTRY glWaitAsyncTexImage2DCHROMIUM (GLenumTextureTarget target); +GL_APICALL void GL_APIENTRY glWaitAllAsyncTexImage2DCHROMIUM (void); GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei count, const GLenum* attachments); -GL_APICALL void GL_APIENTRY glLoseContextCHROMIUM (GLenum current, GLenum other); +GL_APICALL void GL_APIENTRY glLoseContextCHROMIUM (GLenumResetStatus current, GLenumResetStatus other); GL_APICALL GLuint GL_APIENTRY glInsertSyncPointCHROMIUM (void); GL_APICALL void GL_APIENTRY glWaitSyncPointCHROMIUM (GLuint sync_point); GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei count, const GLenum* bufs); GL_APICALL void GL_APIENTRY glDiscardBackbufferCHROMIUM (void); +GL_APICALL void GL_APIENTRY glScheduleOverlayPlaneCHROMIUM (GLint plane_z_order, GLenum plane_transform, GLuint overlay_texture_id, GLint bounds_x, GLint bounds_y, GLint bounds_width, GLint bounds_height, GLfloat uv_x, GLfloat uv_y, GLfloat uv_width, GLfloat uv_height); diff --git a/chromium/gpu/command_buffer/command_buffer_untrusted.gyp b/chromium/gpu/command_buffer/command_buffer_nacl.gyp index 0667fd859cf..aabd1c84a41 100644 --- a/chromium/gpu/command_buffer/command_buffer_untrusted.gyp +++ b/chromium/gpu/command_buffer/command_buffer_nacl.gyp @@ -14,19 +14,19 @@ ['disable_nacl==0 and disable_nacl_untrusted==0', { 'targets': [ { - 'target_name': 'gles2_utils_untrusted', + 'target_name': 'gles2_utils_nacl', 'type': 'none', 'variables': { 'gles2_utils_target': 1, 'nacl_untrusted_build': 1, - 'nlib_target': 'libgles2_utils_untrusted.a', + 'nlib_target': 'libgles2_utils_nacl.a', 'build_glibc': 0, 'build_newlib': 0, 'build_irt': 1, }, 'dependencies': [ '../../native_client/tools.gyp:prep_toolchain', - '../../base/base_untrusted.gyp:base_untrusted', + '../../base/base_nacl.gyp:base_nacl', '../../third_party/khronos/khronos.gyp:khronos_headers', ], }, diff --git a/chromium/gpu/command_buffer/common/BUILD.gn b/chromium/gpu/command_buffer/common/BUILD.gn new file mode 100644 index 00000000000..43b19402bca --- /dev/null +++ b/chromium/gpu/command_buffer/common/BUILD.gn @@ -0,0 +1,42 @@ +# Copyright (c) 2013 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("common") { + sources = [ + "bitfield_helpers.h", + "buffer.cc", + "buffer.h", + "capabilities.cc", + "capabilities.h", + "cmd_buffer_common.cc", + "cmd_buffer_common.h", + "command_buffer.h", + "constants.h", + "debug_marker_manager.cc", + "debug_marker_manager.h", + "gles2_cmd_format.cc", + "gles2_cmd_format.h", + "gles2_cmd_format.h", + "gles2_cmd_format_autogen.h", + "gles2_cmd_ids.h", + "gles2_cmd_ids_autogen.h", + "gles2_cmd_utils.cc", + "gles2_cmd_utils.h", + "gles2_utils_export.h", + "id_allocator.cc", + "id_allocator.h", + "mailbox.cc", + "mailbox.h", + "mailbox_holder.cc", + "mailbox_holder.h", + "thread_local.h", + "time.h", + ] + + all_dependent_configs = [ "//third_party/khronos:khronos_headers" ] + + deps = [ + "//base", + ] +} diff --git a/chromium/gpu/command_buffer/common/buffer.cc b/chromium/gpu/command_buffer/common/buffer.cc new file mode 100644 index 00000000000..3b3da4345d7 --- /dev/null +++ b/chromium/gpu/command_buffer/common/buffer.cc @@ -0,0 +1,42 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/common/buffer.h" + +#include "base/logging.h" + +#include "base/numerics/safe_math.h" + +namespace gpu { +SharedMemoryBufferBacking::SharedMemoryBufferBacking( + scoped_ptr<base::SharedMemory> shared_memory, + size_t size) + : shared_memory_(shared_memory.Pass()), size_(size) {} + +SharedMemoryBufferBacking::~SharedMemoryBufferBacking() {} + +void* SharedMemoryBufferBacking::GetMemory() const { + return shared_memory_->memory(); +} + +size_t SharedMemoryBufferBacking::GetSize() const { return size_; } + +Buffer::Buffer(scoped_ptr<BufferBacking> backing) + : backing_(backing.Pass()), + memory_(backing_->GetMemory()), + size_(backing_->GetSize()) { + DCHECK(memory_) << "The memory must be mapped to create a Buffer"; +} + +Buffer::~Buffer() {} + +void* Buffer::GetDataAddress(uint32 data_offset, uint32 data_size) const { + base::CheckedNumeric<uint32> end = data_offset; + end += data_size; + if (!end.IsValid() || end.ValueOrDie() > static_cast<uint32>(size_)) + return NULL; + return static_cast<uint8*>(memory_) + data_offset; +} + +} // namespace gpu diff --git a/chromium/gpu/command_buffer/common/buffer.h b/chromium/gpu/command_buffer/common/buffer.h index a2721a83590..d8a835618fa 100644 --- a/chromium/gpu/command_buffer/common/buffer.h +++ b/chromium/gpu/command_buffer/common/buffer.h @@ -1,11 +1,15 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef GPU_COMMAND_BUFFER_COMMON_BUFFER_H_ #define GPU_COMMAND_BUFFER_COMMON_BUFFER_H_ -#include "gpu/command_buffer/common/types.h" +#include "base/macros.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/memory/shared_memory.h" +#include "gpu/gpu_export.h" namespace base { class SharedMemory; @@ -13,19 +17,64 @@ namespace base { namespace gpu { -// Address and size of a buffer and optionally a shared memory object. This -// type has value semantics. -struct Buffer { - Buffer() : ptr(NULL), size(0), shared_memory(NULL) { - } +class GPU_EXPORT BufferBacking { + public: + virtual ~BufferBacking() {} + virtual void* GetMemory() const = 0; + virtual size_t GetSize() const = 0; +}; + +class GPU_EXPORT SharedMemoryBufferBacking : public BufferBacking { + public: + SharedMemoryBufferBacking(scoped_ptr<base::SharedMemory> shared_memory, + size_t size); + virtual ~SharedMemoryBufferBacking(); + virtual void* GetMemory() const OVERRIDE; + virtual size_t GetSize() const OVERRIDE; + base::SharedMemory* shared_memory() { return shared_memory_.get(); } + + private: + scoped_ptr<base::SharedMemory> shared_memory_; + size_t size_; + DISALLOW_COPY_AND_ASSIGN(SharedMemoryBufferBacking); +}; + +// Buffer owns a piece of shared-memory of a certain size. +class GPU_EXPORT Buffer : public base::RefCountedThreadSafe<Buffer> { + public: + explicit Buffer(scoped_ptr<BufferBacking> backing); + + BufferBacking* backing() const { return backing_.get(); } + void* memory() const { return memory_; } + size_t size() const { return size_; } - void* ptr; - size_t size; + // Returns NULL if the address overflows the memory. + void* GetDataAddress(uint32 data_offset, uint32 data_size) const; - // Null if the buffer is not shared memory or if it is not exposed as such. - base::SharedMemory* shared_memory; + private: + friend class base::RefCountedThreadSafe<Buffer>; + ~Buffer(); + + scoped_ptr<BufferBacking> backing_; + void* memory_; + size_t size_; + + DISALLOW_COPY_AND_ASSIGN(Buffer); }; +static inline scoped_ptr<BufferBacking> MakeBackingFromSharedMemory( + scoped_ptr<base::SharedMemory> shared_memory, + size_t size) { + return scoped_ptr<BufferBacking>( + new SharedMemoryBufferBacking(shared_memory.Pass(), size)); +} + +static inline scoped_refptr<Buffer> MakeBufferFromSharedMemory( + scoped_ptr<base::SharedMemory> shared_memory, + size_t size) { + return new Buffer(MakeBackingFromSharedMemory(shared_memory.Pass(), size)); +} + } // namespace gpu #endif // GPU_COMMAND_BUFFER_COMMON_BUFFER_H_ diff --git a/chromium/gpu/command_buffer/common/capabilities.cc b/chromium/gpu/command_buffer/common/capabilities.cc index 9f35c8258d3..efc63ebef1b 100644 --- a/chromium/gpu/command_buffer/common/capabilities.cc +++ b/chromium/gpu/command_buffer/common/capabilities.cc @@ -17,6 +17,7 @@ Capabilities::Capabilities() texture_usage(false), texture_storage(false), discard_framebuffer(false), + sync_query(false), map_image(false) {} } // namespace gpu diff --git a/chromium/gpu/command_buffer/common/capabilities.h b/chromium/gpu/command_buffer/common/capabilities.h index b6c34daeefa..ba5cf4b90d7 100644 --- a/chromium/gpu/command_buffer/common/capabilities.h +++ b/chromium/gpu/command_buffer/common/capabilities.h @@ -20,8 +20,7 @@ struct GPU_EXPORT Capabilities { bool texture_usage; bool texture_storage; bool discard_framebuffer; - - // Capabilities below are not populated by GLES2Decoder. + bool sync_query; bool map_image; Capabilities(); diff --git a/chromium/gpu/command_buffer/common/cmd_buffer_common.cc b/chromium/gpu/command_buffer/common/cmd_buffer_common.cc index 80a1e16dc3c..f337e86dbf7 100644 --- a/chromium/gpu/command_buffer/common/cmd_buffer_common.cc +++ b/chromium/gpu/command_buffer/common/cmd_buffer_common.cc @@ -31,6 +31,7 @@ const char* GetCommandName(CommandId command_id) { } // namespace cmd +#if !defined(NACL_WIN64) // TODO(apatrick): this is a temporary optimization while skia is calling // RendererGLContext::MakeCurrent prior to every GL call. It saves returning 6 // ints redundantly when only the error is needed for the CommandBufferProxy @@ -38,6 +39,7 @@ const char* GetCommandName(CommandId command_id) { error::Error CommandBuffer::GetLastError() { return GetLastState().error; } +#endif } // namespace gpu diff --git a/chromium/gpu/command_buffer/common/cmd_buffer_common.h b/chromium/gpu/command_buffer/common/cmd_buffer_common.h index cf09378e00c..828731bfee1 100644 --- a/chromium/gpu/command_buffer/common/cmd_buffer_common.h +++ b/chromium/gpu/command_buffer/common/cmd_buffer_common.h @@ -8,10 +8,11 @@ #define GPU_COMMAND_BUFFER_COMMON_CMD_BUFFER_COMMON_H_ #include <stddef.h> +#include <stdint.h> #include "base/logging.h" +#include "base/macros.h" #include "gpu/command_buffer/common/bitfield_helpers.h" -#include "gpu/command_buffer/common/types.h" #include "gpu/gpu_export.h" namespace gpu { @@ -23,26 +24,30 @@ namespace cmd { }; } // namespace cmd +// Pack & unpack Command cmd_flags +#define CMD_FLAG_SET_TRACE_LEVEL(level) ((level & 3) << 0) +#define CMD_FLAG_GET_TRACE_LEVEL(cmd_flags) ((cmd_flags >> 0) & 3) + // Computes the number of command buffer entries needed for a certain size. In // other words it rounds up to a multiple of entries. -inline uint32 ComputeNumEntries(size_t size_in_bytes) { - return static_cast<uint32>( - (size_in_bytes + sizeof(uint32) - 1) / sizeof(uint32)); // NOLINT +inline uint32_t ComputeNumEntries(size_t size_in_bytes) { + return static_cast<uint32_t>( + (size_in_bytes + sizeof(uint32_t) - 1) / sizeof(uint32_t)); // NOLINT } // Rounds up to a multiple of entries in bytes. inline size_t RoundSizeToMultipleOfEntries(size_t size_in_bytes) { - return ComputeNumEntries(size_in_bytes) * sizeof(uint32); // NOLINT + return ComputeNumEntries(size_in_bytes) * sizeof(uint32_t); // NOLINT } // Struct that defines the command header in the command buffer. struct CommandHeader { - Uint32 size:21; - Uint32 command:11; + uint32_t size:21; + uint32_t command:11; - GPU_EXPORT static const int32 kMaxSize = (1 << 21) - 1; + GPU_EXPORT static const int32_t kMaxSize = (1 << 21) - 1; - void Init(uint32 _command, int32 _size) { + void Init(uint32_t _command, int32_t _size) { DCHECK_LE(_size, kMaxSize); command = _command; size = _size; @@ -58,7 +63,7 @@ struct CommandHeader { // Sets the header by a size in bytes of the immediate data after the command. template <typename T> - void SetCmdBySize(uint32 size_of_data_in_bytes) { + void SetCmdBySize(uint32_t size_of_data_in_bytes) { COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); Init(T::kCmdId, ComputeNumEntries(sizeof(T) + size_of_data_in_bytes)); // NOLINT @@ -66,7 +71,7 @@ struct CommandHeader { // Sets the header by a size in bytes. template <typename T> - void SetCmdByTotalSize(uint32 size_in_bytes) { + void SetCmdByTotalSize(uint32_t size_in_bytes) { COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); DCHECK_GE(size_in_bytes, sizeof(T)); // NOLINT Init(T::kCmdId, ComputeNumEntries(size_in_bytes)); @@ -78,19 +83,19 @@ COMPILE_ASSERT(sizeof(CommandHeader) == 4, Sizeof_CommandHeader_is_not_4); // Union that defines possible command buffer entries. union CommandBufferEntry { CommandHeader value_header; - Uint32 value_uint32; - Int32 value_int32; + uint32_t value_uint32; + int32_t value_int32; float value_float; }; -const size_t kCommandBufferEntrySize = 4; +#define GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT 4 +const size_t kCommandBufferEntrySize = GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT; COMPILE_ASSERT(sizeof(CommandBufferEntry) == kCommandBufferEntrySize, Sizeof_CommandBufferEntry_is_not_4); -// Make sure the compiler does not add extra padding to any of the command -// structures. -#pragma pack(push, 1) +// Command buffer is GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT byte aligned. +#pragma pack(push, GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT) // Gets the address of memory just after a structure in a typesafe way. This is // used for IMMEDIATE commands to get the address of the place to put the data. @@ -119,7 +124,7 @@ void* NextCmdAddress(void* cmd) { // cmd: Address of command. // size_of_data_in_bytes: Size of the data for the command. template <typename T> -void* NextImmediateCmdAddress(void* cmd, uint32 size_of_data_in_bytes) { +void* NextImmediateCmdAddress(void* cmd, uint32_t size_of_data_in_bytes) { COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); return reinterpret_cast<char*>(cmd) + sizeof(T) + // NOLINT RoundSizeToMultipleOfEntries(size_of_data_in_bytes); @@ -131,7 +136,8 @@ void* NextImmediateCmdAddress(void* cmd, uint32 size_of_data_in_bytes) { // cmd: Address of command. // size_of_cmd_in_bytes: Size of the cmd and data. template <typename T> -void* NextImmediateCmdAddressTotalSize(void* cmd, uint32 total_size_in_bytes) { +void* NextImmediateCmdAddressTotalSize(void* cmd, + uint32_t total_size_in_bytes) { COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); DCHECK_GE(total_size_in_bytes, sizeof(T)); // NOLINT return reinterpret_cast<char*>(cmd) + @@ -177,17 +183,18 @@ struct Noop { typedef Noop ValueType; static const CommandId kCmdId = kNoop; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - void SetHeader(uint32 skip_count) { + void SetHeader(uint32_t skip_count) { DCHECK_GT(skip_count, 0u); header.Init(kCmdId, skip_count); } - void Init(uint32 skip_count) { + void Init(uint32_t skip_count) { SetHeader(skip_count); } - static void* Set(void* cmd, uint32 skip_count) { + static void* Set(void* cmd, uint32_t skip_count) { static_cast<ValueType*>(cmd)->Init(skip_count); return NextImmediateCmdAddress<ValueType>( cmd, skip_count * sizeof(CommandBufferEntry)); // NOLINT @@ -205,22 +212,23 @@ struct SetToken { typedef SetToken ValueType; static const CommandId kCmdId = kSetToken; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); void SetHeader() { header.SetCmd<ValueType>(); } - void Init(uint32 _token) { + void Init(uint32_t _token) { SetHeader(); token = _token; } - static void* Set(void* cmd, uint32 token) { + static void* Set(void* cmd, uint32_t token) { static_cast<ValueType*>(cmd)->Init(token); return NextCmdAddress<ValueType>(cmd); } CommandHeader header; - uint32 token; + uint32_t token; }; COMPILE_ASSERT(sizeof(SetToken) == 8, Sizeof_SetToken_is_not_8); @@ -245,24 +253,25 @@ struct SetBucketSize { typedef SetBucketSize ValueType; static const CommandId kCmdId = kSetBucketSize; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); void SetHeader() { header.SetCmd<ValueType>(); } - void Init(uint32 _bucket_id, uint32 _size) { + void Init(uint32_t _bucket_id, uint32_t _size) { SetHeader(); bucket_id = _bucket_id; size = _size; } - static void* Set(void* cmd, uint32 _bucket_id, uint32 _size) { + static void* Set(void* cmd, uint32_t _bucket_id, uint32_t _size) { static_cast<ValueType*>(cmd)->Init(_bucket_id, _size); return NextCmdAddress<ValueType>(cmd); } CommandHeader header; - uint32 bucket_id; - uint32 size; + uint32_t bucket_id; + uint32_t size; }; COMPILE_ASSERT(sizeof(SetBucketSize) == 12, Sizeof_SetBucketSize_is_not_8); @@ -280,16 +289,17 @@ struct SetBucketData { typedef SetBucketData ValueType; static const CommandId kCmdId = kSetBucketData; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); void SetHeader() { header.SetCmd<ValueType>(); } - void Init(uint32 _bucket_id, - uint32 _offset, - uint32 _size, - uint32 _shared_memory_id, - uint32 _shared_memory_offset) { + void Init(uint32_t _bucket_id, + uint32_t _offset, + uint32_t _size, + uint32_t _shared_memory_id, + uint32_t _shared_memory_offset) { SetHeader(); bucket_id = _bucket_id; offset = _offset; @@ -298,11 +308,11 @@ struct SetBucketData { shared_memory_offset = _shared_memory_offset; } static void* Set(void* cmd, - uint32 _bucket_id, - uint32 _offset, - uint32 _size, - uint32 _shared_memory_id, - uint32 _shared_memory_offset) { + uint32_t _bucket_id, + uint32_t _offset, + uint32_t _size, + uint32_t _shared_memory_id, + uint32_t _shared_memory_offset) { static_cast<ValueType*>(cmd)->Init( _bucket_id, _offset, @@ -313,11 +323,11 @@ struct SetBucketData { } CommandHeader header; - uint32 bucket_id; - uint32 offset; - uint32 size; - uint32 shared_memory_id; - uint32 shared_memory_offset; + uint32_t bucket_id; + uint32_t offset; + uint32_t size; + uint32_t shared_memory_id; + uint32_t shared_memory_offset; }; COMPILE_ASSERT(sizeof(SetBucketData) == 24, Sizeof_SetBucketData_is_not_24); @@ -341,23 +351,24 @@ struct SetBucketDataImmediate { typedef SetBucketDataImmediate ValueType; static const CommandId kCmdId = kSetBucketDataImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - void SetHeader(uint32 size) { + void SetHeader(uint32_t size) { header.SetCmdBySize<ValueType>(size); } - void Init(uint32 _bucket_id, - uint32 _offset, - uint32 _size) { + void Init(uint32_t _bucket_id, + uint32_t _offset, + uint32_t _size) { SetHeader(_size); bucket_id = _bucket_id; offset = _offset; size = _size; } static void* Set(void* cmd, - uint32 _bucket_id, - uint32 _offset, - uint32 _size) { + uint32_t _bucket_id, + uint32_t _offset, + uint32_t _size) { static_cast<ValueType*>(cmd)->Init( _bucket_id, _offset, @@ -366,9 +377,9 @@ struct SetBucketDataImmediate { } CommandHeader header; - uint32 bucket_id; - uint32 offset; - uint32 size; + uint32_t bucket_id; + uint32_t offset; + uint32_t size; }; COMPILE_ASSERT(sizeof(SetBucketDataImmediate) == 16, @@ -396,19 +407,20 @@ struct GetBucketStart { typedef GetBucketStart ValueType; static const CommandId kCmdId = kGetBucketStart; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - typedef uint32 Result; + typedef uint32_t Result; void SetHeader() { header.SetCmd<ValueType>(); } - void Init(uint32 _bucket_id, - uint32 _result_memory_id, - uint32 _result_memory_offset, - uint32 _data_memory_size, - uint32 _data_memory_id, - uint32 _data_memory_offset) { + void Init(uint32_t _bucket_id, + uint32_t _result_memory_id, + uint32_t _result_memory_offset, + uint32_t _data_memory_size, + uint32_t _data_memory_id, + uint32_t _data_memory_offset) { SetHeader(); bucket_id = _bucket_id; result_memory_id = _result_memory_id; @@ -418,12 +430,12 @@ struct GetBucketStart { data_memory_offset = _data_memory_offset; } static void* Set(void* cmd, - uint32 _bucket_id, - uint32 _result_memory_id, - uint32 _result_memory_offset, - uint32 _data_memory_size, - uint32 _data_memory_id, - uint32 _data_memory_offset) { + uint32_t _bucket_id, + uint32_t _result_memory_id, + uint32_t _result_memory_offset, + uint32_t _data_memory_size, + uint32_t _data_memory_id, + uint32_t _data_memory_offset) { static_cast<ValueType*>(cmd)->Init( _bucket_id, _result_memory_id, @@ -435,12 +447,12 @@ struct GetBucketStart { } CommandHeader header; - uint32 bucket_id; - uint32 result_memory_id; - uint32 result_memory_offset; - uint32 data_memory_size; - uint32 data_memory_id; - uint32 data_memory_offset; + uint32_t bucket_id; + uint32_t result_memory_id; + uint32_t result_memory_offset; + uint32_t data_memory_size; + uint32_t data_memory_id; + uint32_t data_memory_offset; }; COMPILE_ASSERT(sizeof(GetBucketStart) == 28, Sizeof_GetBucketStart_is_not_28); @@ -465,16 +477,17 @@ struct GetBucketData { typedef GetBucketData ValueType; static const CommandId kCmdId = kGetBucketData; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); void SetHeader() { header.SetCmd<ValueType>(); } - void Init(uint32 _bucket_id, - uint32 _offset, - uint32 _size, - uint32 _shared_memory_id, - uint32 _shared_memory_offset) { + void Init(uint32_t _bucket_id, + uint32_t _offset, + uint32_t _size, + uint32_t _shared_memory_id, + uint32_t _shared_memory_offset) { SetHeader(); bucket_id = _bucket_id; offset = _offset; @@ -483,11 +496,11 @@ struct GetBucketData { shared_memory_offset = _shared_memory_offset; } static void* Set(void* cmd, - uint32 _bucket_id, - uint32 _offset, - uint32 _size, - uint32 _shared_memory_id, - uint32 _shared_memory_offset) { + uint32_t _bucket_id, + uint32_t _offset, + uint32_t _size, + uint32_t _shared_memory_id, + uint32_t _shared_memory_offset) { static_cast<ValueType*>(cmd)->Init( _bucket_id, _offset, @@ -498,11 +511,11 @@ struct GetBucketData { } CommandHeader header; - uint32 bucket_id; - uint32 offset; - uint32 size; - uint32 shared_memory_id; - uint32 shared_memory_offset; + uint32_t bucket_id; + uint32_t offset; + uint32_t size; + uint32_t shared_memory_id; + uint32_t shared_memory_offset; }; COMPILE_ASSERT(sizeof(GetBucketData) == 24, Sizeof_GetBucketData_is_not_20); diff --git a/chromium/gpu/command_buffer/common/command_buffer.h b/chromium/gpu/command_buffer/common/command_buffer.h index 394ccf3c4f7..61b91428f68 100644 --- a/chromium/gpu/command_buffer/common/command_buffer.h +++ b/chromium/gpu/command_buffer/common/command_buffer.h @@ -70,12 +70,18 @@ class GPU_EXPORT CommandBuffer { virtual ~CommandBuffer() { } + // Check if a value is between a start and end value, inclusive, allowing + // for wrapping if start > end. + static bool InRange(int32 start, int32 end, int32 value) { + if (start <= end) + return start <= value && value <= end; + else + return start <= value || value <= end; + } + // Initialize the command buffer with the given size. virtual bool Initialize() = 0; - // Returns the current status. - virtual State GetState() = 0; - // Returns the last state without synchronizing with the service. virtual State GetLastState() = 0; @@ -92,40 +98,26 @@ class GPU_EXPORT CommandBuffer { // subsequent Flushes on the same GpuChannel. virtual void Flush(int32 put_offset) = 0; - // The writer calls this to update its put offset. This function returns the - // reader's most recent get offset. Does not return until all pending commands - // have been executed. - virtual State FlushSync(int32 put_offset, int32 last_known_get) = 0; + // The writer calls this to wait until the current token is within a + // specific range, inclusive. Can return early if an error is generated. + virtual void WaitForTokenInRange(int32 start, int32 end) = 0; + + // The writer calls this to wait until the current get offset is within a + // specific range, inclusive. Can return early if an error is generated. + virtual void WaitForGetOffsetInRange(int32 start, int32 end) = 0; // Sets the buffer commands are read from. // Also resets the get and put offsets to 0. virtual void SetGetBuffer(int32 transfer_buffer_id) = 0; - // Sets the current get offset. This can be called from any thread. - virtual void SetGetOffset(int32 get_offset) = 0; - // Create a transfer buffer of the given size. Returns its ID or -1 on // error. - virtual Buffer CreateTransferBuffer(size_t size, int32* id) = 0; + virtual scoped_refptr<gpu::Buffer> CreateTransferBuffer(size_t size, + int32* id) = 0; // Destroy a transfer buffer. The ID must be positive. virtual void DestroyTransferBuffer(int32 id) = 0; - // Get the transfer buffer associated with an ID. Returns a null buffer for - // ID 0. - virtual Buffer GetTransferBuffer(int32 id) = 0; - - // Allows the reader to update the current token value. - virtual void SetToken(int32 token) = 0; - - // Allows the reader to set the current parse error. - virtual void SetParseError(error::Error) = 0; - - // Allows the reader to set the current context lost reason. - // NOTE: if calling this in conjunction with SetParseError, - // call this first. - virtual void SetContextLostReason(error::ContextLostReason) = 0; - // The NaCl Win64 build only really needs the struct definitions above; having // GetLastError declared would mean we'd have to also define it, and pull more // of gpu in to the NaCl Win64 build. diff --git a/chromium/gpu/command_buffer/common/command_buffer_mock.cc b/chromium/gpu/command_buffer/common/command_buffer_mock.cc index 6ed2eee61b5..a64dc452c32 100644 --- a/chromium/gpu/command_buffer/common/command_buffer_mock.cc +++ b/chromium/gpu/command_buffer/common/command_buffer_mock.cc @@ -8,7 +8,7 @@ namespace gpu { MockCommandBuffer::MockCommandBuffer() { ON_CALL(*this, GetTransferBuffer(testing::_)) - .WillByDefault(testing::Return(Buffer())); + .WillByDefault(testing::Return(scoped_refptr<gpu::Buffer>())); } MockCommandBuffer::~MockCommandBuffer() {} diff --git a/chromium/gpu/command_buffer/common/command_buffer_mock.h b/chromium/gpu/command_buffer/common/command_buffer_mock.h index 0e78b7b8c32..1877470a091 100644 --- a/chromium/gpu/command_buffer/common/command_buffer_mock.h +++ b/chromium/gpu/command_buffer/common/command_buffer_mock.h @@ -5,7 +5,7 @@ #ifndef GPU_COMMAND_BUFFER_COMMON_COMMAND_BUFFER_MOCK_H_ #define GPU_COMMAND_BUFFER_COMMON_COMMAND_BUFFER_MOCK_H_ -#include "gpu/command_buffer/common/command_buffer.h" +#include "gpu/command_buffer/service/command_buffer_service.h" #include "testing/gmock/include/gmock/gmock.h" namespace base { @@ -16,22 +16,23 @@ namespace gpu { // An NPObject that implements a shared memory command buffer and a synchronous // API to manage the put and get pointers. -class MockCommandBuffer : public CommandBuffer { +class MockCommandBuffer : public CommandBufferServiceBase { public: MockCommandBuffer(); virtual ~MockCommandBuffer(); MOCK_METHOD0(Initialize, bool()); - MOCK_METHOD0(GetState, State()); MOCK_METHOD0(GetLastState, State()); MOCK_METHOD0(GetLastToken, int32()); MOCK_METHOD1(Flush, void(int32 put_offset)); - MOCK_METHOD2(FlushSync, State(int32 put_offset, int32 last_known_get)); + MOCK_METHOD2(WaitForTokenInRange, void(int32 start, int32 end)); + MOCK_METHOD2(WaitForGetOffsetInRange, void(int32 start, int32 end)); MOCK_METHOD1(SetGetBuffer, void(int32 transfer_buffer_id)); MOCK_METHOD1(SetGetOffset, void(int32 get_offset)); - MOCK_METHOD2(CreateTransferBuffer, Buffer(size_t size, int32* id)); + MOCK_METHOD2(CreateTransferBuffer, + scoped_refptr<gpu::Buffer>(size_t size, int32* id)); MOCK_METHOD1(DestroyTransferBuffer, void(int32 id)); - MOCK_METHOD1(GetTransferBuffer, Buffer(int32 id)); + MOCK_METHOD1(GetTransferBuffer, scoped_refptr<gpu::Buffer>(int32 id)); MOCK_METHOD1(SetToken, void(int32 token)); MOCK_METHOD1(SetParseError, void(error::Error error)); MOCK_METHOD1(SetContextLostReason, diff --git a/chromium/gpu/command_buffer/common/constants.h b/chromium/gpu/command_buffer/common/constants.h index ab25987af9d..054708f4a60 100644 --- a/chromium/gpu/command_buffer/common/constants.h +++ b/chromium/gpu/command_buffer/common/constants.h @@ -5,11 +5,12 @@ #ifndef GPU_COMMAND_BUFFER_COMMON_CONSTANTS_H_ #define GPU_COMMAND_BUFFER_COMMON_CONSTANTS_H_ -#include "gpu/command_buffer/common/types.h" +#include <stddef.h> +#include <stdint.h> namespace gpu { -typedef int32 CommandBufferOffset; +typedef int32_t CommandBufferOffset; const CommandBufferOffset kInvalidCommandBufferOffset = -1; // This enum must stay in sync with NPDeviceContext3DError. @@ -39,16 +40,17 @@ namespace error { kInnocent, // It is unknown whether this context provoked the loss of context. - kUnknown + kUnknown, + kContextLostReasonLast = kUnknown }; } // Invalid shared memory Id, returned by RegisterSharedMemory in case of // failure. -const int32 kInvalidSharedMemoryId = -1; +const int32_t kInvalidSharedMemoryId = -1; // Common Command Buffer shared memory transfer buffer ID. -const int32 kCommandBufferSharedMemoryId = 4; +const int32_t kCommandBufferSharedMemoryId = 4; // The size to set for the program cache. const size_t kDefaultMaxProgramCacheMemoryBytes = 6 * 1024 * 1024; diff --git a/chromium/gpu/command_buffer/common/debug_marker_manager.cc b/chromium/gpu/command_buffer/common/debug_marker_manager.cc index c6336f98f62..5ac37d08260 100644 --- a/chromium/gpu/command_buffer/common/debug_marker_manager.cc +++ b/chromium/gpu/command_buffer/common/debug_marker_manager.cc @@ -21,7 +21,7 @@ void DebugMarkerManager::Group::SetMarker(const std::string& marker) { DebugMarkerManager::DebugMarkerManager() { // Push root group. - group_stack_.push(Group(std::string(""))); + group_stack_.push(Group(std::string())); } DebugMarkerManager::~DebugMarkerManager() { diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_format.h b/chromium/gpu/command_buffer/common/gles2_cmd_format.h index b2ab12e7063..e8051b46899 100644 --- a/chromium/gpu/command_buffer/common/gles2_cmd_format.h +++ b/chromium/gpu/command_buffer/common/gles2_cmd_format.h @@ -10,13 +10,15 @@ #include <KHR/khrplatform.h> +#include <stdint.h> #include <string.h> -#include "base/safe_numerics.h" +#include "base/atomicops.h" +#include "base/logging.h" +#include "base/macros.h" #include "gpu/command_buffer/common/bitfield_helpers.h" #include "gpu/command_buffer/common/cmd_buffer_common.h" #include "gpu/command_buffer/common/gles2_cmd_ids.h" -#include "gpu/command_buffer/common/types.h" // GL types are forward declared to avoid including the GL headers. The problem // is determining which GL headers to include from code that is common to the @@ -43,7 +45,8 @@ typedef khronos_ssize_t GLsizeiptr; namespace gpu { namespace gles2 { -#pragma pack(push, 1) +// Command buffer is GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT byte aligned. +#pragma pack(push, GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT) namespace id_namespaces { @@ -82,19 +85,19 @@ struct SizedResult { // Returns the total size in bytes of the SizedResult for a given number of // results including the size field. static size_t ComputeSize(size_t num_results) { - return sizeof(T) * num_results + sizeof(uint32); // NOLINT + return sizeof(T) * num_results + sizeof(uint32_t); // NOLINT } // Returns the total size in bytes of the SizedResult for a given size of // results. static size_t ComputeSizeFromBytes(size_t size_of_result_in_bytes) { - return size_of_result_in_bytes + sizeof(uint32); // NOLINT + return size_of_result_in_bytes + sizeof(uint32_t); // NOLINT } // Returns the maximum number of results for a given buffer size. - static uint32 ComputeMaxResults(size_t size_of_buffer) { - return (size_of_buffer >= sizeof(uint32)) ? - ((size_of_buffer - sizeof(uint32)) / sizeof(T)) : 0; // NOLINT + static uint32_t ComputeMaxResults(size_t size_of_buffer) { + return (size_of_buffer >= sizeof(uint32_t)) ? + ((size_of_buffer - sizeof(uint32_t)) / sizeof(T)) : 0; // NOLINT } // Set the size for a given number of results. @@ -103,7 +106,7 @@ struct SizedResult { } // Get the number of elements in the result - int32 GetNumResults() const { + int32_t GetNumResults() const { return size / sizeof(T); // NOLINT } @@ -112,31 +115,31 @@ struct SizedResult { memcpy(dst, &data, size); } - uint32 size; // in bytes. - int32 data; // this is just here to get an offset. + uint32_t size; // in bytes. + int32_t data; // this is just here to get an offset. }; -COMPILE_ASSERT(sizeof(SizedResult<int8>) == 8, SizedResult_size_not_8); -COMPILE_ASSERT(offsetof(SizedResult<int8>, size) == 0, +COMPILE_ASSERT(sizeof(SizedResult<int8_t>) == 8, SizedResult_size_not_8); +COMPILE_ASSERT(offsetof(SizedResult<int8_t>, size) == 0, OffsetOf_SizedResult_size_not_0); -COMPILE_ASSERT(offsetof(SizedResult<int8>, data) == 4, +COMPILE_ASSERT(offsetof(SizedResult<int8_t>, data) == 4, OffsetOf_SizedResult_data_not_4); // The data for one attrib or uniform from GetProgramInfoCHROMIUM. struct ProgramInput { - uint32 type; // The type (GL_VEC3, GL_MAT3, GL_SAMPLER_2D, etc. - int32 size; // The size (how big the array is for uniforms) - uint32 location_offset; // offset from ProgramInfoHeader to 'size' locations - // for uniforms, 1 for attribs. - uint32 name_offset; // offset from ProgrmaInfoHeader to start of name. - uint32 name_length; // length of the name. + uint32_t type; // The type (GL_VEC3, GL_MAT3, GL_SAMPLER_2D, etc. + int32_t size; // The size (how big the array is for uniforms) + uint32_t location_offset; // offset from ProgramInfoHeader to 'size' + // locations for uniforms, 1 for attribs. + uint32_t name_offset; // offset from ProgrmaInfoHeader to start of name. + uint32_t name_length; // length of the name. }; // The format of the bucket filled out by GetProgramInfoCHROMIUM struct ProgramInfoHeader { - uint32 link_status; - uint32 num_attribs; - uint32 num_uniforms; + uint32_t link_status; + uint32_t num_attribs; + uint32_t num_uniforms; // ProgramInput inputs[num_attribs + num_uniforms]; }; @@ -147,8 +150,27 @@ struct QuerySync { result = 0; } - uint32 process_count; - uint64 result; + base::subtle::Atomic32 process_count; + uint64_t result; +}; + +struct AsyncUploadSync { + void Reset() { + base::subtle::Release_Store(&async_upload_token, 0); + } + + void SetAsyncUploadToken(uint32_t token) { + DCHECK_NE(token, 0u); + base::subtle::Release_Store(&async_upload_token, token); + } + + bool HasAsyncUploadTokenPassed(uint32_t token) { + DCHECK_NE(token, 0u); + uint32_t current_token = base::subtle::Acquire_Load(&async_upload_token); + return (current_token - token < 0x80000000); + } + + base::subtle::Atomic32 async_upload_token; }; COMPILE_ASSERT(sizeof(ProgramInput) == 20, ProgramInput_size_not_20); @@ -177,77 +199,11 @@ namespace cmds { // These are hand written commands. // TODO(gman): Attempt to make these auto-generated. - struct GetAttribLocation { typedef GetAttribLocation ValueType; static const CommandId kCmdId = kGetAttribLocation; static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - typedef GLint Result; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset, - uint32 _location_shm_id, uint32 _location_shm_offset, - uint32 _data_size) { - SetHeader(); - program = _program; - name_shm_id = _name_shm_id; - name_shm_offset = _name_shm_offset; - location_shm_id = _location_shm_id; - location_shm_offset = _location_shm_offset; - data_size = _data_size; - } - - void* Set( - void* cmd, GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset, - uint32 _location_shm_id, uint32 _location_shm_offset, - uint32 _data_size) { - static_cast<ValueType*>( - cmd)->Init( - _program, _name_shm_id, _name_shm_offset, _location_shm_id, - _location_shm_offset, _data_size); - return NextCmdAddress<ValueType>(cmd); - } - - CommandHeader header; - uint32 program; - uint32 name_shm_id; - uint32 name_shm_offset; - uint32 location_shm_id; - uint32 location_shm_offset; - uint32 data_size; -}; - -COMPILE_ASSERT(sizeof(GetAttribLocation) == 28, - Sizeof_GetAttribLocation_is_not_28); -COMPILE_ASSERT(offsetof(GetAttribLocation, header) == 0, - OffsetOf_GetAttribLocation_header_not_0); -COMPILE_ASSERT(offsetof(GetAttribLocation, program) == 4, - OffsetOf_GetAttribLocation_program_not_4); -COMPILE_ASSERT(offsetof(GetAttribLocation, name_shm_id) == 8, - OffsetOf_GetAttribLocation_name_shm_id_not_8); -COMPILE_ASSERT(offsetof(GetAttribLocation, name_shm_offset) == 12, - OffsetOf_GetAttribLocation_name_shm_offset_not_12); -COMPILE_ASSERT(offsetof(GetAttribLocation, location_shm_id) == 16, - OffsetOf_GetAttribLocation_location_shm_id_not_16); -COMPILE_ASSERT(offsetof(GetAttribLocation, location_shm_offset) == 20, - OffsetOf_GetAttribLocation_location_shm_offset_not_20); -COMPILE_ASSERT(offsetof(GetAttribLocation, data_size) == 24, - OffsetOf_GetAttribLocation_data_size_not_24); - - -struct GetAttribLocationBucket { - typedef GetAttribLocationBucket ValueType; - static const CommandId kCmdId = kGetAttribLocationBucket; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef GLint Result; @@ -286,88 +242,24 @@ struct GetAttribLocationBucket { uint32 location_shm_offset; }; -COMPILE_ASSERT(sizeof(GetAttribLocationBucket) == 20, - Sizeof_GetAttribLocationBucket_is_not_24); -COMPILE_ASSERT(offsetof(GetAttribLocationBucket, header) == 0, - OffsetOf_GetAttribLocationBucket_header_not_0); -COMPILE_ASSERT(offsetof(GetAttribLocationBucket, program) == 4, - OffsetOf_GetAttribLocationBucket_program_not_4); -COMPILE_ASSERT(offsetof(GetAttribLocationBucket, name_bucket_id) == 8, - OffsetOf_GetAttribLocationBucket_name_bucket_id_not_8); -COMPILE_ASSERT(offsetof(GetAttribLocationBucket, location_shm_id) == 12, - OffsetOf_GetAttribLocationBucket_location_shm_id_not_12); -COMPILE_ASSERT(offsetof(GetAttribLocationBucket, location_shm_offset) == 16, - OffsetOf_GetAttribLocationBucket_location_shm_offset_not_16); +COMPILE_ASSERT(sizeof(GetAttribLocation) == 20, + Sizeof_GetAttribLocation_is_not_24); +COMPILE_ASSERT(offsetof(GetAttribLocation, header) == 0, + OffsetOf_GetAttribLocation_header_not_0); +COMPILE_ASSERT(offsetof(GetAttribLocation, program) == 4, + OffsetOf_GetAttribLocation_program_not_4); +COMPILE_ASSERT(offsetof(GetAttribLocation, name_bucket_id) == 8, + OffsetOf_GetAttribLocation_name_bucket_id_not_8); +COMPILE_ASSERT(offsetof(GetAttribLocation, location_shm_id) == 12, + OffsetOf_GetAttribLocation_location_shm_id_not_12); +COMPILE_ASSERT(offsetof(GetAttribLocation, location_shm_offset) == 16, + OffsetOf_GetAttribLocation_location_shm_offset_not_16); struct GetUniformLocation { typedef GetUniformLocation ValueType; static const CommandId kCmdId = kGetUniformLocation; static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - typedef GLint Result; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset, - uint32 _location_shm_id, uint32 _location_shm_offset, - uint32 _data_size) { - SetHeader(); - program = _program; - name_shm_id = _name_shm_id; - name_shm_offset = _name_shm_offset; - location_shm_id = _location_shm_id; - location_shm_offset = _location_shm_offset; - data_size = _data_size; - } - - void* Set( - void* cmd, GLuint _program, uint32 _name_shm_id, uint32 _name_shm_offset, - uint32 _location_shm_id, uint32 _location_shm_offset, - uint32 _data_size) { - static_cast<ValueType*>( - cmd)->Init( - _program, _name_shm_id, _name_shm_offset, _location_shm_id, - _location_shm_offset, _data_size); - return NextCmdAddress<ValueType>(cmd); - } - - CommandHeader header; - uint32 program; - uint32 name_shm_id; - uint32 name_shm_offset; - uint32 location_shm_id; - uint32 location_shm_offset; - uint32 data_size; -}; - -COMPILE_ASSERT(sizeof(GetUniformLocation) == 28, - Sizeof_GetUniformLocation_is_not_28); -COMPILE_ASSERT(offsetof(GetUniformLocation, header) == 0, - OffsetOf_GetUniformLocation_header_not_0); -COMPILE_ASSERT(offsetof(GetUniformLocation, program) == 4, - OffsetOf_GetUniformLocation_program_not_4); -COMPILE_ASSERT(offsetof(GetUniformLocation, name_shm_id) == 8, - OffsetOf_GetUniformLocation_name_shm_id_not_8); -COMPILE_ASSERT(offsetof(GetUniformLocation, name_shm_offset) == 12, - OffsetOf_GetUniformLocation_name_shm_offset_not_12); -COMPILE_ASSERT(offsetof(GetUniformLocation, location_shm_id) == 16, - OffsetOf_GetUniformLocation_location_shm_id_not_16); -COMPILE_ASSERT(offsetof(GetUniformLocation, location_shm_offset) == 20, - OffsetOf_GetUniformLocation_location_shm_offset_not_20); -COMPILE_ASSERT(offsetof(GetUniformLocation, data_size) == 24, - OffsetOf_GetUniformLocation_data_size_not_24); - -struct GetUniformLocationBucket { - typedef GetUniformLocationBucket ValueType; - static const CommandId kCmdId = kGetUniformLocationBucket; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef GLint Result; @@ -406,23 +298,24 @@ struct GetUniformLocationBucket { uint32 location_shm_offset; }; -COMPILE_ASSERT(sizeof(GetUniformLocationBucket) == 20, - Sizeof_GetUniformLocationBucket_is_not_24); -COMPILE_ASSERT(offsetof(GetUniformLocationBucket, header) == 0, - OffsetOf_GetUniformLocationBucket_header_not_0); -COMPILE_ASSERT(offsetof(GetUniformLocationBucket, program) == 4, - OffsetOf_GetUniformLocationBucket_program_not_4); -COMPILE_ASSERT(offsetof(GetUniformLocationBucket, name_bucket_id) == 8, - OffsetOf_GetUniformLocationBucket_name_bucket_id_not_8); -COMPILE_ASSERT(offsetof(GetUniformLocationBucket, location_shm_id) == 12, - OffsetOf_GetUniformLocationBucket_location_shm_id_not_12); -COMPILE_ASSERT(offsetof(GetUniformLocationBucket, location_shm_offset) == 16, - OffsetOf_GetUniformLocationBucket_location_shm_offset_not_16); +COMPILE_ASSERT(sizeof(GetUniformLocation) == 20, + Sizeof_GetUniformLocation_is_not_24); +COMPILE_ASSERT(offsetof(GetUniformLocation, header) == 0, + OffsetOf_GetUniformLocation_header_not_0); +COMPILE_ASSERT(offsetof(GetUniformLocation, program) == 4, + OffsetOf_GetUniformLocation_program_not_4); +COMPILE_ASSERT(offsetof(GetUniformLocation, name_bucket_id) == 8, + OffsetOf_GetUniformLocation_name_bucket_id_not_8); +COMPILE_ASSERT(offsetof(GetUniformLocation, location_shm_id) == 12, + OffsetOf_GetUniformLocation_location_shm_id_not_12); +COMPILE_ASSERT(offsetof(GetUniformLocation, location_shm_offset) == 16, + OffsetOf_GetUniformLocation_location_shm_offset_not_16); struct GenMailboxCHROMIUM { typedef GenMailboxCHROMIUM ValueType; static const CommandId kCmdId = kGenMailboxCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); CommandHeader header; }; @@ -430,9 +323,61 @@ struct InsertSyncPointCHROMIUM { typedef InsertSyncPointCHROMIUM ValueType; static const CommandId kCmdId = kInsertSyncPointCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); CommandHeader header; }; +struct CreateAndConsumeTextureCHROMIUMImmediate { + typedef CreateAndConsumeTextureCHROMIUMImmediate ValueType; + static const CommandId kCmdId = kCreateAndConsumeTextureCHROMIUMImmediate; + static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); + + static uint32_t ComputeDataSize() { + return static_cast<uint32_t>(sizeof(GLbyte) * 64); // NOLINT + } + + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize()); // NOLINT + } + + void SetHeader(uint32_t size_in_bytes) { + header.SetCmdByTotalSize<ValueType>(size_in_bytes); + } + + void Init(GLenum _target, uint32_t _client_id, const GLbyte* _mailbox) { + SetHeader(ComputeSize()); + target = _target; + client_id = _client_id; + memcpy(ImmediateDataAddress(this), _mailbox, ComputeDataSize()); + } + + void* Set(void* cmd, + GLenum _target, + uint32_t _client_id, + const GLbyte* _mailbox) { + static_cast<ValueType*>(cmd)->Init(_target, _client_id, _mailbox); + const uint32_t size = ComputeSize(); + return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); + } + + gpu::CommandHeader header; + uint32_t target; + uint32_t client_id; +}; + +COMPILE_ASSERT(sizeof(CreateAndConsumeTextureCHROMIUMImmediate) == 12, + Sizeof_CreateAndConsumeTextureCHROMIUMImmediate_is_not_12); +COMPILE_ASSERT(offsetof(CreateAndConsumeTextureCHROMIUMImmediate, header) == 0, + OffsetOf_CreateAndConsumeTextureCHROMIUMImmediate_header_not_0); +COMPILE_ASSERT(offsetof(CreateAndConsumeTextureCHROMIUMImmediate, target) == 4, + OffsetOf_CreateAndConsumeTextureCHROMIUMImmediate_target_not_4); +COMPILE_ASSERT( + offsetof(CreateAndConsumeTextureCHROMIUMImmediate, client_id) == 8, + OffsetOf_CreateAndConsumeTextureCHROMIUMImmediate_client_id_not_8); + + #pragma pack(pop) } // namespace cmd diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/chromium/gpu/command_buffer/common/gles2_cmd_format_autogen.h index 248ad460001..35b7c8b58f8 100644 --- a/chromium/gpu/command_buffer/common/gles2_cmd_format_autogen.h +++ b/chromium/gpu/command_buffer/common/gles2_cmd_format_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! #ifndef GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_AUTOGEN_H_ @@ -13,14 +15,13 @@ struct ActiveTexture { typedef ActiveTexture ValueType; static const CommandId kCmdId = kActiveTexture; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _texture) { SetHeader(); @@ -33,11 +34,10 @@ struct ActiveTexture { } gpu::CommandHeader header; - uint32 texture; + uint32_t texture; }; -COMPILE_ASSERT(sizeof(ActiveTexture) == 8, - Sizeof_ActiveTexture_is_not_8); +COMPILE_ASSERT(sizeof(ActiveTexture) == 8, Sizeof_ActiveTexture_is_not_8); COMPILE_ASSERT(offsetof(ActiveTexture, header) == 0, OffsetOf_ActiveTexture_header_not_0); COMPILE_ASSERT(offsetof(ActiveTexture, texture) == 4, @@ -47,14 +47,13 @@ struct AttachShader { typedef AttachShader ValueType; static const CommandId kCmdId = kAttachShader; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _program, GLuint _shader) { SetHeader(); @@ -68,12 +67,11 @@ struct AttachShader { } gpu::CommandHeader header; - uint32 program; - uint32 shader; + uint32_t program; + uint32_t shader; }; -COMPILE_ASSERT(sizeof(AttachShader) == 12, - Sizeof_AttachShader_is_not_12); +COMPILE_ASSERT(sizeof(AttachShader) == 12, Sizeof_AttachShader_is_not_12); COMPILE_ASSERT(offsetof(AttachShader, header) == 0, OffsetOf_AttachShader_header_not_0); COMPILE_ASSERT(offsetof(AttachShader, program) == 4, @@ -81,92 +79,37 @@ COMPILE_ASSERT(offsetof(AttachShader, program) == 4, COMPILE_ASSERT(offsetof(AttachShader, shader) == 8, OffsetOf_AttachShader_shader_not_8); -struct BindAttribLocation { - typedef BindAttribLocation ValueType; - static const CommandId kCmdId = kBindAttribLocation; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLuint _program, GLuint _index, uint32 _name_shm_id, - uint32 _name_shm_offset, uint32 _data_size) { - SetHeader(); - program = _program; - index = _index; - name_shm_id = _name_shm_id; - name_shm_offset = _name_shm_offset; - data_size = _data_size; - } - - void* Set( - void* cmd, GLuint _program, GLuint _index, uint32 _name_shm_id, - uint32 _name_shm_offset, uint32 _data_size) { - static_cast<ValueType*>( - cmd)->Init( - _program, _index, _name_shm_id, _name_shm_offset, _data_size); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 program; - uint32 index; - uint32 name_shm_id; - uint32 name_shm_offset; - uint32 data_size; -}; - -COMPILE_ASSERT(sizeof(BindAttribLocation) == 24, - Sizeof_BindAttribLocation_is_not_24); -COMPILE_ASSERT(offsetof(BindAttribLocation, header) == 0, - OffsetOf_BindAttribLocation_header_not_0); -COMPILE_ASSERT(offsetof(BindAttribLocation, program) == 4, - OffsetOf_BindAttribLocation_program_not_4); -COMPILE_ASSERT(offsetof(BindAttribLocation, index) == 8, - OffsetOf_BindAttribLocation_index_not_8); -COMPILE_ASSERT(offsetof(BindAttribLocation, name_shm_id) == 12, - OffsetOf_BindAttribLocation_name_shm_id_not_12); -COMPILE_ASSERT(offsetof(BindAttribLocation, name_shm_offset) == 16, - OffsetOf_BindAttribLocation_name_shm_offset_not_16); -COMPILE_ASSERT(offsetof(BindAttribLocation, data_size) == 20, - OffsetOf_BindAttribLocation_data_size_not_20); - struct BindAttribLocationBucket { typedef BindAttribLocationBucket ValueType; static const CommandId kCmdId = kBindAttribLocationBucket; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLuint _program, GLuint _index, uint32 _name_bucket_id) { + void Init(GLuint _program, GLuint _index, uint32_t _name_bucket_id) { SetHeader(); program = _program; index = _index; name_bucket_id = _name_bucket_id; } - void* Set( - void* cmd, GLuint _program, GLuint _index, uint32 _name_bucket_id) { + void* Set(void* cmd, + GLuint _program, + GLuint _index, + uint32_t _name_bucket_id) { static_cast<ValueType*>(cmd)->Init(_program, _index, _name_bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 program; - uint32 index; - uint32 name_bucket_id; + uint32_t program; + uint32_t index; + uint32_t name_bucket_id; }; COMPILE_ASSERT(sizeof(BindAttribLocationBucket) == 16, @@ -184,14 +127,13 @@ struct BindBuffer { typedef BindBuffer ValueType; static const CommandId kCmdId = kBindBuffer; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target, GLuint _buffer) { SetHeader(); @@ -205,12 +147,11 @@ struct BindBuffer { } gpu::CommandHeader header; - uint32 target; - uint32 buffer; + uint32_t target; + uint32_t buffer; }; -COMPILE_ASSERT(sizeof(BindBuffer) == 12, - Sizeof_BindBuffer_is_not_12); +COMPILE_ASSERT(sizeof(BindBuffer) == 12, Sizeof_BindBuffer_is_not_12); COMPILE_ASSERT(offsetof(BindBuffer, header) == 0, OffsetOf_BindBuffer_header_not_0); COMPILE_ASSERT(offsetof(BindBuffer, target) == 4, @@ -222,14 +163,13 @@ struct BindFramebuffer { typedef BindFramebuffer ValueType; static const CommandId kCmdId = kBindFramebuffer; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target, GLuint _framebuffer) { SetHeader(); @@ -243,12 +183,11 @@ struct BindFramebuffer { } gpu::CommandHeader header; - uint32 target; - uint32 framebuffer; + uint32_t target; + uint32_t framebuffer; }; -COMPILE_ASSERT(sizeof(BindFramebuffer) == 12, - Sizeof_BindFramebuffer_is_not_12); +COMPILE_ASSERT(sizeof(BindFramebuffer) == 12, Sizeof_BindFramebuffer_is_not_12); COMPILE_ASSERT(offsetof(BindFramebuffer, header) == 0, OffsetOf_BindFramebuffer_header_not_0); COMPILE_ASSERT(offsetof(BindFramebuffer, target) == 4, @@ -260,14 +199,13 @@ struct BindRenderbuffer { typedef BindRenderbuffer ValueType; static const CommandId kCmdId = kBindRenderbuffer; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target, GLuint _renderbuffer) { SetHeader(); @@ -281,8 +219,8 @@ struct BindRenderbuffer { } gpu::CommandHeader header; - uint32 target; - uint32 renderbuffer; + uint32_t target; + uint32_t renderbuffer; }; COMPILE_ASSERT(sizeof(BindRenderbuffer) == 12, @@ -298,14 +236,13 @@ struct BindTexture { typedef BindTexture ValueType; static const CommandId kCmdId = kBindTexture; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target, GLuint _texture) { SetHeader(); @@ -319,12 +256,11 @@ struct BindTexture { } gpu::CommandHeader header; - uint32 target; - uint32 texture; + uint32_t target; + uint32_t texture; }; -COMPILE_ASSERT(sizeof(BindTexture) == 12, - Sizeof_BindTexture_is_not_12); +COMPILE_ASSERT(sizeof(BindTexture) == 12, Sizeof_BindTexture_is_not_12); COMPILE_ASSERT(offsetof(BindTexture, header) == 0, OffsetOf_BindTexture_header_not_0); COMPILE_ASSERT(offsetof(BindTexture, target) == 4, @@ -336,14 +272,13 @@ struct BlendColor { typedef BlendColor ValueType; static const CommandId kCmdId = kBlendColor; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLclampf _red, GLclampf _green, GLclampf _blue, GLclampf _alpha) { SetHeader(); @@ -353,9 +288,11 @@ struct BlendColor { alpha = _alpha; } - void* Set( - void* cmd, GLclampf _red, GLclampf _green, GLclampf _blue, - GLclampf _alpha) { + void* Set(void* cmd, + GLclampf _red, + GLclampf _green, + GLclampf _blue, + GLclampf _alpha) { static_cast<ValueType*>(cmd)->Init(_red, _green, _blue, _alpha); return NextCmdAddress<ValueType>(cmd); } @@ -367,12 +304,10 @@ struct BlendColor { float alpha; }; -COMPILE_ASSERT(sizeof(BlendColor) == 20, - Sizeof_BlendColor_is_not_20); +COMPILE_ASSERT(sizeof(BlendColor) == 20, Sizeof_BlendColor_is_not_20); COMPILE_ASSERT(offsetof(BlendColor, header) == 0, OffsetOf_BlendColor_header_not_0); -COMPILE_ASSERT(offsetof(BlendColor, red) == 4, - OffsetOf_BlendColor_red_not_4); +COMPILE_ASSERT(offsetof(BlendColor, red) == 4, OffsetOf_BlendColor_red_not_4); COMPILE_ASSERT(offsetof(BlendColor, green) == 8, OffsetOf_BlendColor_green_not_8); COMPILE_ASSERT(offsetof(BlendColor, blue) == 12, @@ -384,14 +319,13 @@ struct BlendEquation { typedef BlendEquation ValueType; static const CommandId kCmdId = kBlendEquation; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _mode) { SetHeader(); @@ -404,11 +338,10 @@ struct BlendEquation { } gpu::CommandHeader header; - uint32 mode; + uint32_t mode; }; -COMPILE_ASSERT(sizeof(BlendEquation) == 8, - Sizeof_BlendEquation_is_not_8); +COMPILE_ASSERT(sizeof(BlendEquation) == 8, Sizeof_BlendEquation_is_not_8); COMPILE_ASSERT(offsetof(BlendEquation, header) == 0, OffsetOf_BlendEquation_header_not_0); COMPILE_ASSERT(offsetof(BlendEquation, mode) == 4, @@ -418,14 +351,13 @@ struct BlendEquationSeparate { typedef BlendEquationSeparate ValueType; static const CommandId kCmdId = kBlendEquationSeparate; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _modeRGB, GLenum _modeAlpha) { SetHeader(); @@ -439,8 +371,8 @@ struct BlendEquationSeparate { } gpu::CommandHeader header; - uint32 modeRGB; - uint32 modeAlpha; + uint32_t modeRGB; + uint32_t modeAlpha; }; COMPILE_ASSERT(sizeof(BlendEquationSeparate) == 12, @@ -456,14 +388,13 @@ struct BlendFunc { typedef BlendFunc ValueType; static const CommandId kCmdId = kBlendFunc; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _sfactor, GLenum _dfactor) { SetHeader(); @@ -477,12 +408,11 @@ struct BlendFunc { } gpu::CommandHeader header; - uint32 sfactor; - uint32 dfactor; + uint32_t sfactor; + uint32_t dfactor; }; -COMPILE_ASSERT(sizeof(BlendFunc) == 12, - Sizeof_BlendFunc_is_not_12); +COMPILE_ASSERT(sizeof(BlendFunc) == 12, Sizeof_BlendFunc_is_not_12); COMPILE_ASSERT(offsetof(BlendFunc, header) == 0, OffsetOf_BlendFunc_header_not_0); COMPILE_ASSERT(offsetof(BlendFunc, sfactor) == 4, @@ -494,17 +424,18 @@ struct BlendFuncSeparate { typedef BlendFuncSeparate ValueType; static const CommandId kCmdId = kBlendFuncSeparate; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _srcRGB, GLenum _dstRGB, GLenum _srcAlpha, GLenum _dstAlpha) { + void Init(GLenum _srcRGB, + GLenum _dstRGB, + GLenum _srcAlpha, + GLenum _dstAlpha) { SetHeader(); srcRGB = _srcRGB; dstRGB = _dstRGB; @@ -512,18 +443,20 @@ struct BlendFuncSeparate { dstAlpha = _dstAlpha; } - void* Set( - void* cmd, GLenum _srcRGB, GLenum _dstRGB, GLenum _srcAlpha, - GLenum _dstAlpha) { + void* Set(void* cmd, + GLenum _srcRGB, + GLenum _dstRGB, + GLenum _srcAlpha, + GLenum _dstAlpha) { static_cast<ValueType*>(cmd)->Init(_srcRGB, _dstRGB, _srcAlpha, _dstAlpha); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 srcRGB; - uint32 dstRGB; - uint32 srcAlpha; - uint32 dstAlpha; + uint32_t srcRGB; + uint32_t dstRGB; + uint32_t srcAlpha; + uint32_t dstAlpha; }; COMPILE_ASSERT(sizeof(BlendFuncSeparate) == 20, @@ -543,18 +476,19 @@ struct BufferData { typedef BufferData ValueType; static const CommandId kCmdId = kBufferData; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLsizeiptr _size, uint32 _data_shm_id, - uint32 _data_shm_offset, GLenum _usage) { + void Init(GLenum _target, + GLsizeiptr _size, + uint32_t _data_shm_id, + uint32_t _data_shm_offset, + GLenum _usage) { SetHeader(); target = _target; size = _size; @@ -563,30 +497,31 @@ struct BufferData { usage = _usage; } - void* Set( - void* cmd, GLenum _target, GLsizeiptr _size, uint32 _data_shm_id, - uint32 _data_shm_offset, GLenum _usage) { - static_cast<ValueType*>( - cmd)->Init(_target, _size, _data_shm_id, _data_shm_offset, _usage); + void* Set(void* cmd, + GLenum _target, + GLsizeiptr _size, + uint32_t _data_shm_id, + uint32_t _data_shm_offset, + GLenum _usage) { + static_cast<ValueType*>(cmd) + ->Init(_target, _size, _data_shm_id, _data_shm_offset, _usage); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - int32 size; - uint32 data_shm_id; - uint32 data_shm_offset; - uint32 usage; + uint32_t target; + int32_t size; + uint32_t data_shm_id; + uint32_t data_shm_offset; + uint32_t usage; }; -COMPILE_ASSERT(sizeof(BufferData) == 24, - Sizeof_BufferData_is_not_24); +COMPILE_ASSERT(sizeof(BufferData) == 24, Sizeof_BufferData_is_not_24); COMPILE_ASSERT(offsetof(BufferData, header) == 0, OffsetOf_BufferData_header_not_0); COMPILE_ASSERT(offsetof(BufferData, target) == 4, OffsetOf_BufferData_target_not_4); -COMPILE_ASSERT(offsetof(BufferData, size) == 8, - OffsetOf_BufferData_size_not_8); +COMPILE_ASSERT(offsetof(BufferData, size) == 8, OffsetOf_BufferData_size_not_8); COMPILE_ASSERT(offsetof(BufferData, data_shm_id) == 12, OffsetOf_BufferData_data_shm_id_not_12); COMPILE_ASSERT(offsetof(BufferData, data_shm_offset) == 16, @@ -598,18 +533,19 @@ struct BufferSubData { typedef BufferSubData ValueType; static const CommandId kCmdId = kBufferSubData; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLintptr _offset, GLsizeiptr _size, uint32 _data_shm_id, - uint32 _data_shm_offset) { + void Init(GLenum _target, + GLintptr _offset, + GLsizeiptr _size, + uint32_t _data_shm_id, + uint32_t _data_shm_offset) { SetHeader(); target = _target; offset = _offset; @@ -618,24 +554,26 @@ struct BufferSubData { data_shm_offset = _data_shm_offset; } - void* Set( - void* cmd, GLenum _target, GLintptr _offset, GLsizeiptr _size, - uint32 _data_shm_id, uint32 _data_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_target, _offset, _size, _data_shm_id, _data_shm_offset); + void* Set(void* cmd, + GLenum _target, + GLintptr _offset, + GLsizeiptr _size, + uint32_t _data_shm_id, + uint32_t _data_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_target, _offset, _size, _data_shm_id, _data_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - int32 offset; - int32 size; - uint32 data_shm_id; - uint32 data_shm_offset; + uint32_t target; + int32_t offset; + int32_t size; + uint32_t data_shm_id; + uint32_t data_shm_offset; }; -COMPILE_ASSERT(sizeof(BufferSubData) == 24, - Sizeof_BufferSubData_is_not_24); +COMPILE_ASSERT(sizeof(BufferSubData) == 24, Sizeof_BufferSubData_is_not_24); COMPILE_ASSERT(offsetof(BufferSubData, header) == 0, OffsetOf_BufferSubData_header_not_0); COMPILE_ASSERT(offsetof(BufferSubData, target) == 4, @@ -653,36 +591,38 @@ struct CheckFramebufferStatus { typedef CheckFramebufferStatus ValueType; static const CommandId kCmdId = kCheckFramebufferStatus; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef GLenum Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLenum _target, uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLenum _target, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); target = _target; result_shm_id = _result_shm_id; result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLenum _target, uint32 _result_shm_id, - uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_target, _result_shm_id, _result_shm_offset); + void* Set(void* cmd, + GLenum _target, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_target, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t target; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; COMPILE_ASSERT(sizeof(CheckFramebufferStatus) == 16, @@ -700,14 +640,13 @@ struct Clear { typedef Clear ValueType; static const CommandId kCmdId = kClear; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLbitfield _mask) { SetHeader(); @@ -720,28 +659,24 @@ struct Clear { } gpu::CommandHeader header; - uint32 mask; + uint32_t mask; }; -COMPILE_ASSERT(sizeof(Clear) == 8, - Sizeof_Clear_is_not_8); -COMPILE_ASSERT(offsetof(Clear, header) == 0, - OffsetOf_Clear_header_not_0); -COMPILE_ASSERT(offsetof(Clear, mask) == 4, - OffsetOf_Clear_mask_not_4); +COMPILE_ASSERT(sizeof(Clear) == 8, Sizeof_Clear_is_not_8); +COMPILE_ASSERT(offsetof(Clear, header) == 0, OffsetOf_Clear_header_not_0); +COMPILE_ASSERT(offsetof(Clear, mask) == 4, OffsetOf_Clear_mask_not_4); struct ClearColor { typedef ClearColor ValueType; static const CommandId kCmdId = kClearColor; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLclampf _red, GLclampf _green, GLclampf _blue, GLclampf _alpha) { SetHeader(); @@ -751,9 +686,11 @@ struct ClearColor { alpha = _alpha; } - void* Set( - void* cmd, GLclampf _red, GLclampf _green, GLclampf _blue, - GLclampf _alpha) { + void* Set(void* cmd, + GLclampf _red, + GLclampf _green, + GLclampf _blue, + GLclampf _alpha) { static_cast<ValueType*>(cmd)->Init(_red, _green, _blue, _alpha); return NextCmdAddress<ValueType>(cmd); } @@ -765,12 +702,10 @@ struct ClearColor { float alpha; }; -COMPILE_ASSERT(sizeof(ClearColor) == 20, - Sizeof_ClearColor_is_not_20); +COMPILE_ASSERT(sizeof(ClearColor) == 20, Sizeof_ClearColor_is_not_20); COMPILE_ASSERT(offsetof(ClearColor, header) == 0, OffsetOf_ClearColor_header_not_0); -COMPILE_ASSERT(offsetof(ClearColor, red) == 4, - OffsetOf_ClearColor_red_not_4); +COMPILE_ASSERT(offsetof(ClearColor, red) == 4, OffsetOf_ClearColor_red_not_4); COMPILE_ASSERT(offsetof(ClearColor, green) == 8, OffsetOf_ClearColor_green_not_8); COMPILE_ASSERT(offsetof(ClearColor, blue) == 12, @@ -782,14 +717,13 @@ struct ClearDepthf { typedef ClearDepthf ValueType; static const CommandId kCmdId = kClearDepthf; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLclampf _depth) { SetHeader(); @@ -805,8 +739,7 @@ struct ClearDepthf { float depth; }; -COMPILE_ASSERT(sizeof(ClearDepthf) == 8, - Sizeof_ClearDepthf_is_not_8); +COMPILE_ASSERT(sizeof(ClearDepthf) == 8, Sizeof_ClearDepthf_is_not_8); COMPILE_ASSERT(offsetof(ClearDepthf, header) == 0, OffsetOf_ClearDepthf_header_not_0); COMPILE_ASSERT(offsetof(ClearDepthf, depth) == 4, @@ -816,14 +749,13 @@ struct ClearStencil { typedef ClearStencil ValueType; static const CommandId kCmdId = kClearStencil; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _s) { SetHeader(); @@ -836,31 +768,30 @@ struct ClearStencil { } gpu::CommandHeader header; - int32 s; + int32_t s; }; -COMPILE_ASSERT(sizeof(ClearStencil) == 8, - Sizeof_ClearStencil_is_not_8); +COMPILE_ASSERT(sizeof(ClearStencil) == 8, Sizeof_ClearStencil_is_not_8); COMPILE_ASSERT(offsetof(ClearStencil, header) == 0, OffsetOf_ClearStencil_header_not_0); -COMPILE_ASSERT(offsetof(ClearStencil, s) == 4, - OffsetOf_ClearStencil_s_not_4); +COMPILE_ASSERT(offsetof(ClearStencil, s) == 4, OffsetOf_ClearStencil_s_not_4); struct ColorMask { typedef ColorMask ValueType; static const CommandId kCmdId = kColorMask; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLboolean _red, GLboolean _green, GLboolean _blue, GLboolean _alpha) { + void Init(GLboolean _red, + GLboolean _green, + GLboolean _blue, + GLboolean _alpha) { SetHeader(); red = _red; green = _green; @@ -868,30 +799,28 @@ struct ColorMask { alpha = _alpha; } - void* Set( - void* cmd, GLboolean _red, GLboolean _green, GLboolean _blue, - GLboolean _alpha) { + void* Set(void* cmd, + GLboolean _red, + GLboolean _green, + GLboolean _blue, + GLboolean _alpha) { static_cast<ValueType*>(cmd)->Init(_red, _green, _blue, _alpha); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 red; - uint32 green; - uint32 blue; - uint32 alpha; + uint32_t red; + uint32_t green; + uint32_t blue; + uint32_t alpha; }; -COMPILE_ASSERT(sizeof(ColorMask) == 20, - Sizeof_ColorMask_is_not_20); +COMPILE_ASSERT(sizeof(ColorMask) == 20, Sizeof_ColorMask_is_not_20); COMPILE_ASSERT(offsetof(ColorMask, header) == 0, OffsetOf_ColorMask_header_not_0); -COMPILE_ASSERT(offsetof(ColorMask, red) == 4, - OffsetOf_ColorMask_red_not_4); -COMPILE_ASSERT(offsetof(ColorMask, green) == 8, - OffsetOf_ColorMask_green_not_8); -COMPILE_ASSERT(offsetof(ColorMask, blue) == 12, - OffsetOf_ColorMask_blue_not_12); +COMPILE_ASSERT(offsetof(ColorMask, red) == 4, OffsetOf_ColorMask_red_not_4); +COMPILE_ASSERT(offsetof(ColorMask, green) == 8, OffsetOf_ColorMask_green_not_8); +COMPILE_ASSERT(offsetof(ColorMask, blue) == 12, OffsetOf_ColorMask_blue_not_12); COMPILE_ASSERT(offsetof(ColorMask, alpha) == 16, OffsetOf_ColorMask_alpha_not_16); @@ -899,14 +828,13 @@ struct CompileShader { typedef CompileShader ValueType; static const CommandId kCmdId = kCompileShader; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _shader) { SetHeader(); @@ -919,70 +847,146 @@ struct CompileShader { } gpu::CommandHeader header; - uint32 shader; + uint32_t shader; }; -COMPILE_ASSERT(sizeof(CompileShader) == 8, - Sizeof_CompileShader_is_not_8); +COMPILE_ASSERT(sizeof(CompileShader) == 8, Sizeof_CompileShader_is_not_8); COMPILE_ASSERT(offsetof(CompileShader, header) == 0, OffsetOf_CompileShader_header_not_0); COMPILE_ASSERT(offsetof(CompileShader, shader) == 4, OffsetOf_CompileShader_shader_not_4); -struct CompressedTexImage2D { - typedef CompressedTexImage2D ValueType; - static const CommandId kCmdId = kCompressedTexImage2D; +struct CompressedTexImage2DBucket { + typedef CompressedTexImage2DBucket ValueType; + static const CommandId kCmdId = kCompressedTexImage2DBucket; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLint _level, GLenum _internalformat, GLsizei _width, - GLsizei _height, GLint _border, GLsizei _imageSize, uint32 _data_shm_id, - uint32 _data_shm_offset) { + void Init(GLenum _target, + GLint _level, + GLenum _internalformat, + GLsizei _width, + GLsizei _height, + GLuint _bucket_id) { SetHeader(); target = _target; level = _level; internalformat = _internalformat; width = _width; height = _height; - border = _border; - imageSize = _imageSize; - data_shm_id = _data_shm_id; - data_shm_offset = _data_shm_offset; + bucket_id = _bucket_id; } - void* Set( - void* cmd, GLenum _target, GLint _level, GLenum _internalformat, - GLsizei _width, GLsizei _height, GLint _border, GLsizei _imageSize, - uint32 _data_shm_id, uint32 _data_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _target, _level, _internalformat, _width, _height, _border, - _imageSize, _data_shm_id, _data_shm_offset); + void* Set(void* cmd, + GLenum _target, + GLint _level, + GLenum _internalformat, + GLsizei _width, + GLsizei _height, + GLuint _bucket_id) { + static_cast<ValueType*>(cmd) + ->Init(_target, _level, _internalformat, _width, _height, _bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - int32 level; - uint32 internalformat; - int32 width; - int32 height; - int32 border; - int32 imageSize; - uint32 data_shm_id; - uint32 data_shm_offset; + uint32_t target; + int32_t level; + uint32_t internalformat; + int32_t width; + int32_t height; + uint32_t bucket_id; + static const int32_t border = 0; }; -COMPILE_ASSERT(sizeof(CompressedTexImage2D) == 40, - Sizeof_CompressedTexImage2D_is_not_40); +COMPILE_ASSERT(sizeof(CompressedTexImage2DBucket) == 28, + Sizeof_CompressedTexImage2DBucket_is_not_28); +COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, header) == 0, + OffsetOf_CompressedTexImage2DBucket_header_not_0); +COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, target) == 4, + OffsetOf_CompressedTexImage2DBucket_target_not_4); +COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, level) == 8, + OffsetOf_CompressedTexImage2DBucket_level_not_8); +COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, internalformat) == 12, + OffsetOf_CompressedTexImage2DBucket_internalformat_not_12); +COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, width) == 16, + OffsetOf_CompressedTexImage2DBucket_width_not_16); +COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, height) == 20, + OffsetOf_CompressedTexImage2DBucket_height_not_20); +COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, bucket_id) == 24, + OffsetOf_CompressedTexImage2DBucket_bucket_id_not_24); + +struct CompressedTexImage2D { + typedef CompressedTexImage2D ValueType; + static const CommandId kCmdId = kCompressedTexImage2D; + static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); + + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT + } + + void SetHeader() { header.SetCmd<ValueType>(); } + + void Init(GLenum _target, + GLint _level, + GLenum _internalformat, + GLsizei _width, + GLsizei _height, + GLsizei _imageSize, + uint32_t _data_shm_id, + uint32_t _data_shm_offset) { + SetHeader(); + target = _target; + level = _level; + internalformat = _internalformat; + width = _width; + height = _height; + imageSize = _imageSize; + data_shm_id = _data_shm_id; + data_shm_offset = _data_shm_offset; + } + + void* Set(void* cmd, + GLenum _target, + GLint _level, + GLenum _internalformat, + GLsizei _width, + GLsizei _height, + GLsizei _imageSize, + uint32_t _data_shm_id, + uint32_t _data_shm_offset) { + static_cast<ValueType*>(cmd)->Init(_target, + _level, + _internalformat, + _width, + _height, + _imageSize, + _data_shm_id, + _data_shm_offset); + return NextCmdAddress<ValueType>(cmd); + } + + gpu::CommandHeader header; + uint32_t target; + int32_t level; + uint32_t internalformat; + int32_t width; + int32_t height; + int32_t imageSize; + uint32_t data_shm_id; + uint32_t data_shm_offset; + static const int32_t border = 0; +}; + +COMPILE_ASSERT(sizeof(CompressedTexImage2D) == 36, + Sizeof_CompressedTexImage2D_is_not_36); COMPILE_ASSERT(offsetof(CompressedTexImage2D, header) == 0, OffsetOf_CompressedTexImage2D_header_not_0); COMPILE_ASSERT(offsetof(CompressedTexImage2D, target) == 4, @@ -995,97 +999,118 @@ COMPILE_ASSERT(offsetof(CompressedTexImage2D, width) == 16, OffsetOf_CompressedTexImage2D_width_not_16); COMPILE_ASSERT(offsetof(CompressedTexImage2D, height) == 20, OffsetOf_CompressedTexImage2D_height_not_20); -COMPILE_ASSERT(offsetof(CompressedTexImage2D, border) == 24, - OffsetOf_CompressedTexImage2D_border_not_24); -COMPILE_ASSERT(offsetof(CompressedTexImage2D, imageSize) == 28, - OffsetOf_CompressedTexImage2D_imageSize_not_28); -COMPILE_ASSERT(offsetof(CompressedTexImage2D, data_shm_id) == 32, - OffsetOf_CompressedTexImage2D_data_shm_id_not_32); -COMPILE_ASSERT(offsetof(CompressedTexImage2D, data_shm_offset) == 36, - OffsetOf_CompressedTexImage2D_data_shm_offset_not_36); +COMPILE_ASSERT(offsetof(CompressedTexImage2D, imageSize) == 24, + OffsetOf_CompressedTexImage2D_imageSize_not_24); +COMPILE_ASSERT(offsetof(CompressedTexImage2D, data_shm_id) == 28, + OffsetOf_CompressedTexImage2D_data_shm_id_not_28); +COMPILE_ASSERT(offsetof(CompressedTexImage2D, data_shm_offset) == 32, + OffsetOf_CompressedTexImage2D_data_shm_offset_not_32); -struct CompressedTexImage2DBucket { - typedef CompressedTexImage2DBucket ValueType; - static const CommandId kCmdId = kCompressedTexImage2DBucket; +struct CompressedTexSubImage2DBucket { + typedef CompressedTexSubImage2DBucket ValueType; + static const CommandId kCmdId = kCompressedTexSubImage2DBucket; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLint _level, GLenum _internalformat, GLsizei _width, - GLsizei _height, GLint _border, GLuint _bucket_id) { + void Init(GLenum _target, + GLint _level, + GLint _xoffset, + GLint _yoffset, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLuint _bucket_id) { SetHeader(); target = _target; level = _level; - internalformat = _internalformat; + xoffset = _xoffset; + yoffset = _yoffset; width = _width; height = _height; - border = _border; + format = _format; bucket_id = _bucket_id; } - void* Set( - void* cmd, GLenum _target, GLint _level, GLenum _internalformat, - GLsizei _width, GLsizei _height, GLint _border, GLuint _bucket_id) { - static_cast<ValueType*>( - cmd)->Init( - _target, _level, _internalformat, _width, _height, _border, - _bucket_id); + void* Set(void* cmd, + GLenum _target, + GLint _level, + GLint _xoffset, + GLint _yoffset, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLuint _bucket_id) { + static_cast<ValueType*>(cmd)->Init(_target, + _level, + _xoffset, + _yoffset, + _width, + _height, + _format, + _bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - int32 level; - uint32 internalformat; - int32 width; - int32 height; - int32 border; - uint32 bucket_id; + uint32_t target; + int32_t level; + int32_t xoffset; + int32_t yoffset; + int32_t width; + int32_t height; + uint32_t format; + uint32_t bucket_id; }; -COMPILE_ASSERT(sizeof(CompressedTexImage2DBucket) == 32, - Sizeof_CompressedTexImage2DBucket_is_not_32); -COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, header) == 0, - OffsetOf_CompressedTexImage2DBucket_header_not_0); -COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, target) == 4, - OffsetOf_CompressedTexImage2DBucket_target_not_4); -COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, level) == 8, - OffsetOf_CompressedTexImage2DBucket_level_not_8); -COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, internalformat) == 12, - OffsetOf_CompressedTexImage2DBucket_internalformat_not_12); -COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, width) == 16, - OffsetOf_CompressedTexImage2DBucket_width_not_16); -COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, height) == 20, - OffsetOf_CompressedTexImage2DBucket_height_not_20); -COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, border) == 24, - OffsetOf_CompressedTexImage2DBucket_border_not_24); -COMPILE_ASSERT(offsetof(CompressedTexImage2DBucket, bucket_id) == 28, - OffsetOf_CompressedTexImage2DBucket_bucket_id_not_28); +COMPILE_ASSERT(sizeof(CompressedTexSubImage2DBucket) == 36, + Sizeof_CompressedTexSubImage2DBucket_is_not_36); +COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, header) == 0, + OffsetOf_CompressedTexSubImage2DBucket_header_not_0); +COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, target) == 4, + OffsetOf_CompressedTexSubImage2DBucket_target_not_4); +COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, level) == 8, + OffsetOf_CompressedTexSubImage2DBucket_level_not_8); +COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, xoffset) == 12, + OffsetOf_CompressedTexSubImage2DBucket_xoffset_not_12); +COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, yoffset) == 16, + OffsetOf_CompressedTexSubImage2DBucket_yoffset_not_16); +COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, width) == 20, + OffsetOf_CompressedTexSubImage2DBucket_width_not_20); +COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, height) == 24, + OffsetOf_CompressedTexSubImage2DBucket_height_not_24); +COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, format) == 28, + OffsetOf_CompressedTexSubImage2DBucket_format_not_28); +COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, bucket_id) == 32, + OffsetOf_CompressedTexSubImage2DBucket_bucket_id_not_32); struct CompressedTexSubImage2D { typedef CompressedTexSubImage2D ValueType; static const CommandId kCmdId = kCompressedTexSubImage2D; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, - GLsizei _width, GLsizei _height, GLenum _format, GLsizei _imageSize, - uint32 _data_shm_id, uint32 _data_shm_offset) { + void Init(GLenum _target, + GLint _level, + GLint _xoffset, + GLint _yoffset, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLsizei _imageSize, + uint32_t _data_shm_id, + uint32_t _data_shm_offset) { SetHeader(); target = _target; level = _level; @@ -1099,28 +1124,41 @@ struct CompressedTexSubImage2D { data_shm_offset = _data_shm_offset; } - void* Set( - void* cmd, GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, - GLsizei _width, GLsizei _height, GLenum _format, GLsizei _imageSize, - uint32 _data_shm_id, uint32 _data_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _target, _level, _xoffset, _yoffset, _width, _height, _format, - _imageSize, _data_shm_id, _data_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 target; - int32 level; - int32 xoffset; - int32 yoffset; - int32 width; - int32 height; - uint32 format; - int32 imageSize; - uint32 data_shm_id; - uint32 data_shm_offset; + void* Set(void* cmd, + GLenum _target, + GLint _level, + GLint _xoffset, + GLint _yoffset, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLsizei _imageSize, + uint32_t _data_shm_id, + uint32_t _data_shm_offset) { + static_cast<ValueType*>(cmd)->Init(_target, + _level, + _xoffset, + _yoffset, + _width, + _height, + _format, + _imageSize, + _data_shm_id, + _data_shm_offset); + return NextCmdAddress<ValueType>(cmd); + } + + gpu::CommandHeader header; + uint32_t target; + int32_t level; + int32_t xoffset; + int32_t yoffset; + int32_t width; + int32_t height; + uint32_t format; + int32_t imageSize; + uint32_t data_shm_id; + uint32_t data_shm_offset; }; COMPILE_ASSERT(sizeof(CompressedTexSubImage2D) == 44, @@ -1148,91 +1186,25 @@ COMPILE_ASSERT(offsetof(CompressedTexSubImage2D, data_shm_id) == 36, COMPILE_ASSERT(offsetof(CompressedTexSubImage2D, data_shm_offset) == 40, OffsetOf_CompressedTexSubImage2D_data_shm_offset_not_40); -struct CompressedTexSubImage2DBucket { - typedef CompressedTexSubImage2DBucket ValueType; - static const CommandId kCmdId = kCompressedTexSubImage2DBucket; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, - GLsizei _width, GLsizei _height, GLenum _format, GLuint _bucket_id) { - SetHeader(); - target = _target; - level = _level; - xoffset = _xoffset; - yoffset = _yoffset; - width = _width; - height = _height; - format = _format; - bucket_id = _bucket_id; - } - - void* Set( - void* cmd, GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, - GLsizei _width, GLsizei _height, GLenum _format, GLuint _bucket_id) { - static_cast<ValueType*>( - cmd)->Init( - _target, _level, _xoffset, _yoffset, _width, _height, _format, - _bucket_id); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 target; - int32 level; - int32 xoffset; - int32 yoffset; - int32 width; - int32 height; - uint32 format; - uint32 bucket_id; -}; - -COMPILE_ASSERT(sizeof(CompressedTexSubImage2DBucket) == 36, - Sizeof_CompressedTexSubImage2DBucket_is_not_36); -COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, header) == 0, - OffsetOf_CompressedTexSubImage2DBucket_header_not_0); -COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, target) == 4, - OffsetOf_CompressedTexSubImage2DBucket_target_not_4); -COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, level) == 8, - OffsetOf_CompressedTexSubImage2DBucket_level_not_8); -COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, xoffset) == 12, - OffsetOf_CompressedTexSubImage2DBucket_xoffset_not_12); -COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, yoffset) == 16, - OffsetOf_CompressedTexSubImage2DBucket_yoffset_not_16); -COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, width) == 20, - OffsetOf_CompressedTexSubImage2DBucket_width_not_20); -COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, height) == 24, - OffsetOf_CompressedTexSubImage2DBucket_height_not_24); -COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, format) == 28, - OffsetOf_CompressedTexSubImage2DBucket_format_not_28); -COMPILE_ASSERT(offsetof(CompressedTexSubImage2DBucket, bucket_id) == 32, - OffsetOf_CompressedTexSubImage2DBucket_bucket_id_not_32); - struct CopyTexImage2D { typedef CopyTexImage2D ValueType; static const CommandId kCmdId = kCopyTexImage2D; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLint _level, GLenum _internalformat, GLint _x, GLint _y, - GLsizei _width, GLsizei _height, GLint _border) { + void Init(GLenum _target, + GLint _level, + GLenum _internalformat, + GLint _x, + GLint _y, + GLsizei _width, + GLsizei _height) { SetHeader(); target = _target; level = _level; @@ -1241,32 +1213,33 @@ struct CopyTexImage2D { y = _y; width = _width; height = _height; - border = _border; } - void* Set( - void* cmd, GLenum _target, GLint _level, GLenum _internalformat, GLint _x, - GLint _y, GLsizei _width, GLsizei _height, GLint _border) { - static_cast<ValueType*>( - cmd)->Init( - _target, _level, _internalformat, _x, _y, _width, _height, - _border); + void* Set(void* cmd, + GLenum _target, + GLint _level, + GLenum _internalformat, + GLint _x, + GLint _y, + GLsizei _width, + GLsizei _height) { + static_cast<ValueType*>(cmd) + ->Init(_target, _level, _internalformat, _x, _y, _width, _height); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - int32 level; - uint32 internalformat; - int32 x; - int32 y; - int32 width; - int32 height; - int32 border; + uint32_t target; + int32_t level; + uint32_t internalformat; + int32_t x; + int32_t y; + int32_t width; + int32_t height; + static const int32_t border = 0; }; -COMPILE_ASSERT(sizeof(CopyTexImage2D) == 36, - Sizeof_CopyTexImage2D_is_not_36); +COMPILE_ASSERT(sizeof(CopyTexImage2D) == 32, Sizeof_CopyTexImage2D_is_not_32); COMPILE_ASSERT(offsetof(CopyTexImage2D, header) == 0, OffsetOf_CopyTexImage2D_header_not_0); COMPILE_ASSERT(offsetof(CopyTexImage2D, target) == 4, @@ -1283,25 +1256,27 @@ COMPILE_ASSERT(offsetof(CopyTexImage2D, width) == 24, OffsetOf_CopyTexImage2D_width_not_24); COMPILE_ASSERT(offsetof(CopyTexImage2D, height) == 28, OffsetOf_CopyTexImage2D_height_not_28); -COMPILE_ASSERT(offsetof(CopyTexImage2D, border) == 32, - OffsetOf_CopyTexImage2D_border_not_32); struct CopyTexSubImage2D { typedef CopyTexSubImage2D ValueType; static const CommandId kCmdId = kCopyTexSubImage2D; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, GLint _x, - GLint _y, GLsizei _width, GLsizei _height) { + void Init(GLenum _target, + GLint _level, + GLint _xoffset, + GLint _yoffset, + GLint _x, + GLint _y, + GLsizei _width, + GLsizei _height) { SetHeader(); target = _target; level = _level; @@ -1313,24 +1288,29 @@ struct CopyTexSubImage2D { height = _height; } - void* Set( - void* cmd, GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, - GLint _x, GLint _y, GLsizei _width, GLsizei _height) { - static_cast<ValueType*>( - cmd)->Init( - _target, _level, _xoffset, _yoffset, _x, _y, _width, _height); + void* Set(void* cmd, + GLenum _target, + GLint _level, + GLint _xoffset, + GLint _yoffset, + GLint _x, + GLint _y, + GLsizei _width, + GLsizei _height) { + static_cast<ValueType*>(cmd) + ->Init(_target, _level, _xoffset, _yoffset, _x, _y, _width, _height); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - int32 level; - int32 xoffset; - int32 yoffset; - int32 x; - int32 y; - int32 width; - int32 height; + uint32_t target; + int32_t level; + int32_t xoffset; + int32_t yoffset; + int32_t x; + int32_t y; + int32_t width; + int32_t height; }; COMPILE_ASSERT(sizeof(CopyTexSubImage2D) == 36, @@ -1358,31 +1338,29 @@ struct CreateProgram { typedef CreateProgram ValueType; static const CommandId kCmdId = kCreateProgram; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(uint32 _client_id) { + void Init(uint32_t _client_id) { SetHeader(); client_id = _client_id; } - void* Set(void* cmd, uint32 _client_id) { + void* Set(void* cmd, uint32_t _client_id) { static_cast<ValueType*>(cmd)->Init(_client_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 client_id; + uint32_t client_id; }; -COMPILE_ASSERT(sizeof(CreateProgram) == 8, - Sizeof_CreateProgram_is_not_8); +COMPILE_ASSERT(sizeof(CreateProgram) == 8, Sizeof_CreateProgram_is_not_8); COMPILE_ASSERT(offsetof(CreateProgram, header) == 0, OffsetOf_CreateProgram_header_not_0); COMPILE_ASSERT(offsetof(CreateProgram, client_id) == 4, @@ -1392,33 +1370,31 @@ struct CreateShader { typedef CreateShader ValueType; static const CommandId kCmdId = kCreateShader; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLenum _type, uint32 _client_id) { + void Init(GLenum _type, uint32_t _client_id) { SetHeader(); type = _type; client_id = _client_id; } - void* Set(void* cmd, GLenum _type, uint32 _client_id) { + void* Set(void* cmd, GLenum _type, uint32_t _client_id) { static_cast<ValueType*>(cmd)->Init(_type, _client_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 type; - uint32 client_id; + uint32_t type; + uint32_t client_id; }; -COMPILE_ASSERT(sizeof(CreateShader) == 12, - Sizeof_CreateShader_is_not_12); +COMPILE_ASSERT(sizeof(CreateShader) == 12, Sizeof_CreateShader_is_not_12); COMPILE_ASSERT(offsetof(CreateShader, header) == 0, OffsetOf_CreateShader_header_not_0); COMPILE_ASSERT(offsetof(CreateShader, type) == 4, @@ -1430,14 +1406,13 @@ struct CullFace { typedef CullFace ValueType; static const CommandId kCmdId = kCullFace; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _mode) { SetHeader(); @@ -1450,73 +1425,26 @@ struct CullFace { } gpu::CommandHeader header; - uint32 mode; -}; - -COMPILE_ASSERT(sizeof(CullFace) == 8, - Sizeof_CullFace_is_not_8); -COMPILE_ASSERT(offsetof(CullFace, header) == 0, - OffsetOf_CullFace_header_not_0); -COMPILE_ASSERT(offsetof(CullFace, mode) == 4, - OffsetOf_CullFace_mode_not_4); - -struct DeleteBuffers { - typedef DeleteBuffers ValueType; - static const CommandId kCmdId = kDeleteBuffers; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLsizei _n, uint32 _buffers_shm_id, uint32 _buffers_shm_offset) { - SetHeader(); - n = _n; - buffers_shm_id = _buffers_shm_id; - buffers_shm_offset = _buffers_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _buffers_shm_id, - uint32 _buffers_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_n, _buffers_shm_id, _buffers_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 buffers_shm_id; - uint32 buffers_shm_offset; + uint32_t mode; }; -COMPILE_ASSERT(sizeof(DeleteBuffers) == 16, - Sizeof_DeleteBuffers_is_not_16); -COMPILE_ASSERT(offsetof(DeleteBuffers, header) == 0, - OffsetOf_DeleteBuffers_header_not_0); -COMPILE_ASSERT(offsetof(DeleteBuffers, n) == 4, - OffsetOf_DeleteBuffers_n_not_4); -COMPILE_ASSERT(offsetof(DeleteBuffers, buffers_shm_id) == 8, - OffsetOf_DeleteBuffers_buffers_shm_id_not_8); -COMPILE_ASSERT(offsetof(DeleteBuffers, buffers_shm_offset) == 12, - OffsetOf_DeleteBuffers_buffers_shm_offset_not_12); +COMPILE_ASSERT(sizeof(CullFace) == 8, Sizeof_CullFace_is_not_8); +COMPILE_ASSERT(offsetof(CullFace, header) == 0, OffsetOf_CullFace_header_not_0); +COMPILE_ASSERT(offsetof(CullFace, mode) == 4, OffsetOf_CullFace_mode_not_4); struct DeleteBuffersImmediate { typedef DeleteBuffersImmediate ValueType; static const CommandId kCmdId = kDeleteBuffersImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -1526,18 +1454,17 @@ struct DeleteBuffersImmediate { void Init(GLsizei _n, const GLuint* _buffers) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _buffers, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _buffers, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, const GLuint* _buffers) { static_cast<ValueType*>(cmd)->Init(_n, _buffers); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(DeleteBuffersImmediate) == 8, @@ -1547,65 +1474,19 @@ COMPILE_ASSERT(offsetof(DeleteBuffersImmediate, header) == 0, COMPILE_ASSERT(offsetof(DeleteBuffersImmediate, n) == 4, OffsetOf_DeleteBuffersImmediate_n_not_4); -struct DeleteFramebuffers { - typedef DeleteFramebuffers ValueType; - static const CommandId kCmdId = kDeleteFramebuffers; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLsizei _n, uint32 _framebuffers_shm_id, - uint32 _framebuffers_shm_offset) { - SetHeader(); - n = _n; - framebuffers_shm_id = _framebuffers_shm_id; - framebuffers_shm_offset = _framebuffers_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _framebuffers_shm_id, - uint32 _framebuffers_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_n, _framebuffers_shm_id, _framebuffers_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 framebuffers_shm_id; - uint32 framebuffers_shm_offset; -}; - -COMPILE_ASSERT(sizeof(DeleteFramebuffers) == 16, - Sizeof_DeleteFramebuffers_is_not_16); -COMPILE_ASSERT(offsetof(DeleteFramebuffers, header) == 0, - OffsetOf_DeleteFramebuffers_header_not_0); -COMPILE_ASSERT(offsetof(DeleteFramebuffers, n) == 4, - OffsetOf_DeleteFramebuffers_n_not_4); -COMPILE_ASSERT(offsetof(DeleteFramebuffers, framebuffers_shm_id) == 8, - OffsetOf_DeleteFramebuffers_framebuffers_shm_id_not_8); -COMPILE_ASSERT(offsetof(DeleteFramebuffers, framebuffers_shm_offset) == 12, - OffsetOf_DeleteFramebuffers_framebuffers_shm_offset_not_12); - struct DeleteFramebuffersImmediate { typedef DeleteFramebuffersImmediate ValueType; static const CommandId kCmdId = kDeleteFramebuffersImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -1615,18 +1496,17 @@ struct DeleteFramebuffersImmediate { void Init(GLsizei _n, const GLuint* _framebuffers) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _framebuffers, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _framebuffers, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, const GLuint* _framebuffers) { static_cast<ValueType*>(cmd)->Init(_n, _framebuffers); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(DeleteFramebuffersImmediate) == 8, @@ -1640,14 +1520,13 @@ struct DeleteProgram { typedef DeleteProgram ValueType; static const CommandId kCmdId = kDeleteProgram; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _program) { SetHeader(); @@ -1660,75 +1539,28 @@ struct DeleteProgram { } gpu::CommandHeader header; - uint32 program; + uint32_t program; }; -COMPILE_ASSERT(sizeof(DeleteProgram) == 8, - Sizeof_DeleteProgram_is_not_8); +COMPILE_ASSERT(sizeof(DeleteProgram) == 8, Sizeof_DeleteProgram_is_not_8); COMPILE_ASSERT(offsetof(DeleteProgram, header) == 0, OffsetOf_DeleteProgram_header_not_0); COMPILE_ASSERT(offsetof(DeleteProgram, program) == 4, OffsetOf_DeleteProgram_program_not_4); -struct DeleteRenderbuffers { - typedef DeleteRenderbuffers ValueType; - static const CommandId kCmdId = kDeleteRenderbuffers; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLsizei _n, uint32 _renderbuffers_shm_id, - uint32 _renderbuffers_shm_offset) { - SetHeader(); - n = _n; - renderbuffers_shm_id = _renderbuffers_shm_id; - renderbuffers_shm_offset = _renderbuffers_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _renderbuffers_shm_id, - uint32 _renderbuffers_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_n, _renderbuffers_shm_id, _renderbuffers_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 renderbuffers_shm_id; - uint32 renderbuffers_shm_offset; -}; - -COMPILE_ASSERT(sizeof(DeleteRenderbuffers) == 16, - Sizeof_DeleteRenderbuffers_is_not_16); -COMPILE_ASSERT(offsetof(DeleteRenderbuffers, header) == 0, - OffsetOf_DeleteRenderbuffers_header_not_0); -COMPILE_ASSERT(offsetof(DeleteRenderbuffers, n) == 4, - OffsetOf_DeleteRenderbuffers_n_not_4); -COMPILE_ASSERT(offsetof(DeleteRenderbuffers, renderbuffers_shm_id) == 8, - OffsetOf_DeleteRenderbuffers_renderbuffers_shm_id_not_8); -COMPILE_ASSERT(offsetof(DeleteRenderbuffers, renderbuffers_shm_offset) == 12, - OffsetOf_DeleteRenderbuffers_renderbuffers_shm_offset_not_12); - struct DeleteRenderbuffersImmediate { typedef DeleteRenderbuffersImmediate ValueType; static const CommandId kCmdId = kDeleteRenderbuffersImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -1738,18 +1570,17 @@ struct DeleteRenderbuffersImmediate { void Init(GLsizei _n, const GLuint* _renderbuffers) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _renderbuffers, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _renderbuffers, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, const GLuint* _renderbuffers) { static_cast<ValueType*>(cmd)->Init(_n, _renderbuffers); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(DeleteRenderbuffersImmediate) == 8, @@ -1763,14 +1594,13 @@ struct DeleteShader { typedef DeleteShader ValueType; static const CommandId kCmdId = kDeleteShader; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _shader) { SetHeader(); @@ -1783,73 +1613,28 @@ struct DeleteShader { } gpu::CommandHeader header; - uint32 shader; + uint32_t shader; }; -COMPILE_ASSERT(sizeof(DeleteShader) == 8, - Sizeof_DeleteShader_is_not_8); +COMPILE_ASSERT(sizeof(DeleteShader) == 8, Sizeof_DeleteShader_is_not_8); COMPILE_ASSERT(offsetof(DeleteShader, header) == 0, OffsetOf_DeleteShader_header_not_0); COMPILE_ASSERT(offsetof(DeleteShader, shader) == 4, OffsetOf_DeleteShader_shader_not_4); -struct DeleteTextures { - typedef DeleteTextures ValueType; - static const CommandId kCmdId = kDeleteTextures; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLsizei _n, uint32 _textures_shm_id, uint32 _textures_shm_offset) { - SetHeader(); - n = _n; - textures_shm_id = _textures_shm_id; - textures_shm_offset = _textures_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _textures_shm_id, - uint32 _textures_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_n, _textures_shm_id, _textures_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 textures_shm_id; - uint32 textures_shm_offset; -}; - -COMPILE_ASSERT(sizeof(DeleteTextures) == 16, - Sizeof_DeleteTextures_is_not_16); -COMPILE_ASSERT(offsetof(DeleteTextures, header) == 0, - OffsetOf_DeleteTextures_header_not_0); -COMPILE_ASSERT(offsetof(DeleteTextures, n) == 4, - OffsetOf_DeleteTextures_n_not_4); -COMPILE_ASSERT(offsetof(DeleteTextures, textures_shm_id) == 8, - OffsetOf_DeleteTextures_textures_shm_id_not_8); -COMPILE_ASSERT(offsetof(DeleteTextures, textures_shm_offset) == 12, - OffsetOf_DeleteTextures_textures_shm_offset_not_12); - struct DeleteTexturesImmediate { typedef DeleteTexturesImmediate ValueType; static const CommandId kCmdId = kDeleteTexturesImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -1859,18 +1644,17 @@ struct DeleteTexturesImmediate { void Init(GLsizei _n, const GLuint* _textures) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _textures, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _textures, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, const GLuint* _textures) { static_cast<ValueType*>(cmd)->Init(_n, _textures); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(DeleteTexturesImmediate) == 8, @@ -1884,14 +1668,13 @@ struct DepthFunc { typedef DepthFunc ValueType; static const CommandId kCmdId = kDepthFunc; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _func) { SetHeader(); @@ -1904,28 +1687,25 @@ struct DepthFunc { } gpu::CommandHeader header; - uint32 func; + uint32_t func; }; -COMPILE_ASSERT(sizeof(DepthFunc) == 8, - Sizeof_DepthFunc_is_not_8); +COMPILE_ASSERT(sizeof(DepthFunc) == 8, Sizeof_DepthFunc_is_not_8); COMPILE_ASSERT(offsetof(DepthFunc, header) == 0, OffsetOf_DepthFunc_header_not_0); -COMPILE_ASSERT(offsetof(DepthFunc, func) == 4, - OffsetOf_DepthFunc_func_not_4); +COMPILE_ASSERT(offsetof(DepthFunc, func) == 4, OffsetOf_DepthFunc_func_not_4); struct DepthMask { typedef DepthMask ValueType; static const CommandId kCmdId = kDepthMask; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLboolean _flag) { SetHeader(); @@ -1938,28 +1718,25 @@ struct DepthMask { } gpu::CommandHeader header; - uint32 flag; + uint32_t flag; }; -COMPILE_ASSERT(sizeof(DepthMask) == 8, - Sizeof_DepthMask_is_not_8); +COMPILE_ASSERT(sizeof(DepthMask) == 8, Sizeof_DepthMask_is_not_8); COMPILE_ASSERT(offsetof(DepthMask, header) == 0, OffsetOf_DepthMask_header_not_0); -COMPILE_ASSERT(offsetof(DepthMask, flag) == 4, - OffsetOf_DepthMask_flag_not_4); +COMPILE_ASSERT(offsetof(DepthMask, flag) == 4, OffsetOf_DepthMask_flag_not_4); struct DepthRangef { typedef DepthRangef ValueType; static const CommandId kCmdId = kDepthRangef; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLclampf _zNear, GLclampf _zFar) { SetHeader(); @@ -1977,8 +1754,7 @@ struct DepthRangef { float zFar; }; -COMPILE_ASSERT(sizeof(DepthRangef) == 12, - Sizeof_DepthRangef_is_not_12); +COMPILE_ASSERT(sizeof(DepthRangef) == 12, Sizeof_DepthRangef_is_not_12); COMPILE_ASSERT(offsetof(DepthRangef, header) == 0, OffsetOf_DepthRangef_header_not_0); COMPILE_ASSERT(offsetof(DepthRangef, zNear) == 4, @@ -1990,14 +1766,13 @@ struct DetachShader { typedef DetachShader ValueType; static const CommandId kCmdId = kDetachShader; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _program, GLuint _shader) { SetHeader(); @@ -2011,12 +1786,11 @@ struct DetachShader { } gpu::CommandHeader header; - uint32 program; - uint32 shader; + uint32_t program; + uint32_t shader; }; -COMPILE_ASSERT(sizeof(DetachShader) == 12, - Sizeof_DetachShader_is_not_12); +COMPILE_ASSERT(sizeof(DetachShader) == 12, Sizeof_DetachShader_is_not_12); COMPILE_ASSERT(offsetof(DetachShader, header) == 0, OffsetOf_DetachShader_header_not_0); COMPILE_ASSERT(offsetof(DetachShader, program) == 4, @@ -2028,14 +1802,13 @@ struct Disable { typedef Disable ValueType; static const CommandId kCmdId = kDisable; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _cap) { SetHeader(); @@ -2048,28 +1821,24 @@ struct Disable { } gpu::CommandHeader header; - uint32 cap; + uint32_t cap; }; -COMPILE_ASSERT(sizeof(Disable) == 8, - Sizeof_Disable_is_not_8); -COMPILE_ASSERT(offsetof(Disable, header) == 0, - OffsetOf_Disable_header_not_0); -COMPILE_ASSERT(offsetof(Disable, cap) == 4, - OffsetOf_Disable_cap_not_4); +COMPILE_ASSERT(sizeof(Disable) == 8, Sizeof_Disable_is_not_8); +COMPILE_ASSERT(offsetof(Disable, header) == 0, OffsetOf_Disable_header_not_0); +COMPILE_ASSERT(offsetof(Disable, cap) == 4, OffsetOf_Disable_cap_not_4); struct DisableVertexAttribArray { typedef DisableVertexAttribArray ValueType; static const CommandId kCmdId = kDisableVertexAttribArray; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _index) { SetHeader(); @@ -2082,7 +1851,7 @@ struct DisableVertexAttribArray { } gpu::CommandHeader header; - uint32 index; + uint32_t index; }; COMPILE_ASSERT(sizeof(DisableVertexAttribArray) == 8, @@ -2096,14 +1865,13 @@ struct DrawArrays { typedef DrawArrays ValueType; static const CommandId kCmdId = kDrawArrays; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(2); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _mode, GLint _first, GLsizei _count) { SetHeader(); @@ -2118,17 +1886,15 @@ struct DrawArrays { } gpu::CommandHeader header; - uint32 mode; - int32 first; - int32 count; + uint32_t mode; + int32_t first; + int32_t count; }; -COMPILE_ASSERT(sizeof(DrawArrays) == 16, - Sizeof_DrawArrays_is_not_16); +COMPILE_ASSERT(sizeof(DrawArrays) == 16, Sizeof_DrawArrays_is_not_16); COMPILE_ASSERT(offsetof(DrawArrays, header) == 0, OffsetOf_DrawArrays_header_not_0); -COMPILE_ASSERT(offsetof(DrawArrays, mode) == 4, - OffsetOf_DrawArrays_mode_not_4); +COMPILE_ASSERT(offsetof(DrawArrays, mode) == 4, OffsetOf_DrawArrays_mode_not_4); COMPILE_ASSERT(offsetof(DrawArrays, first) == 8, OffsetOf_DrawArrays_first_not_8); COMPILE_ASSERT(offsetof(DrawArrays, count) == 12, @@ -2138,14 +1904,13 @@ struct DrawElements { typedef DrawElements ValueType; static const CommandId kCmdId = kDrawElements; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(2); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _mode, GLsizei _count, GLenum _type, GLuint _index_offset) { SetHeader(); @@ -2155,22 +1920,23 @@ struct DrawElements { index_offset = _index_offset; } - void* Set( - void* cmd, GLenum _mode, GLsizei _count, GLenum _type, - GLuint _index_offset) { + void* Set(void* cmd, + GLenum _mode, + GLsizei _count, + GLenum _type, + GLuint _index_offset) { static_cast<ValueType*>(cmd)->Init(_mode, _count, _type, _index_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 mode; - int32 count; - uint32 type; - uint32 index_offset; + uint32_t mode; + int32_t count; + uint32_t type; + uint32_t index_offset; }; -COMPILE_ASSERT(sizeof(DrawElements) == 20, - Sizeof_DrawElements_is_not_20); +COMPILE_ASSERT(sizeof(DrawElements) == 20, Sizeof_DrawElements_is_not_20); COMPILE_ASSERT(offsetof(DrawElements, header) == 0, OffsetOf_DrawElements_header_not_0); COMPILE_ASSERT(offsetof(DrawElements, mode) == 4, @@ -2186,14 +1952,13 @@ struct Enable { typedef Enable ValueType; static const CommandId kCmdId = kEnable; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _cap) { SetHeader(); @@ -2206,28 +1971,24 @@ struct Enable { } gpu::CommandHeader header; - uint32 cap; + uint32_t cap; }; -COMPILE_ASSERT(sizeof(Enable) == 8, - Sizeof_Enable_is_not_8); -COMPILE_ASSERT(offsetof(Enable, header) == 0, - OffsetOf_Enable_header_not_0); -COMPILE_ASSERT(offsetof(Enable, cap) == 4, - OffsetOf_Enable_cap_not_4); +COMPILE_ASSERT(sizeof(Enable) == 8, Sizeof_Enable_is_not_8); +COMPILE_ASSERT(offsetof(Enable, header) == 0, OffsetOf_Enable_header_not_0); +COMPILE_ASSERT(offsetof(Enable, cap) == 4, OffsetOf_Enable_cap_not_4); struct EnableVertexAttribArray { typedef EnableVertexAttribArray ValueType; static const CommandId kCmdId = kEnableVertexAttribArray; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _index) { SetHeader(); @@ -2240,7 +2001,7 @@ struct EnableVertexAttribArray { } gpu::CommandHeader header; - uint32 index; + uint32_t index; }; COMPILE_ASSERT(sizeof(EnableVertexAttribArray) == 8, @@ -2254,18 +2015,15 @@ struct Finish { typedef Finish ValueType; static const CommandId kCmdId = kFinish; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init() { - SetHeader(); - } + void Init() { SetHeader(); } void* Set(void* cmd) { static_cast<ValueType*>(cmd)->Init(); @@ -2275,27 +2033,22 @@ struct Finish { gpu::CommandHeader header; }; -COMPILE_ASSERT(sizeof(Finish) == 4, - Sizeof_Finish_is_not_4); -COMPILE_ASSERT(offsetof(Finish, header) == 0, - OffsetOf_Finish_header_not_0); +COMPILE_ASSERT(sizeof(Finish) == 4, Sizeof_Finish_is_not_4); +COMPILE_ASSERT(offsetof(Finish, header) == 0, OffsetOf_Finish_header_not_0); struct Flush { typedef Flush ValueType; static const CommandId kCmdId = kFlush; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init() { - SetHeader(); - } + void Init() { SetHeader(); } void* Set(void* cmd) { static_cast<ValueType*>(cmd)->Init(); @@ -2305,27 +2058,25 @@ struct Flush { gpu::CommandHeader header; }; -COMPILE_ASSERT(sizeof(Flush) == 4, - Sizeof_Flush_is_not_4); -COMPILE_ASSERT(offsetof(Flush, header) == 0, - OffsetOf_Flush_header_not_0); +COMPILE_ASSERT(sizeof(Flush) == 4, Sizeof_Flush_is_not_4); +COMPILE_ASSERT(offsetof(Flush, header) == 0, OffsetOf_Flush_header_not_0); struct FramebufferRenderbuffer { typedef FramebufferRenderbuffer ValueType; static const CommandId kCmdId = kFramebufferRenderbuffer; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLenum _attachment, GLenum _renderbuffertarget, - GLuint _renderbuffer) { + void Init(GLenum _target, + GLenum _attachment, + GLenum _renderbuffertarget, + GLuint _renderbuffer) { SetHeader(); target = _target; attachment = _attachment; @@ -2333,19 +2084,21 @@ struct FramebufferRenderbuffer { renderbuffer = _renderbuffer; } - void* Set( - void* cmd, GLenum _target, GLenum _attachment, GLenum _renderbuffertarget, - GLuint _renderbuffer) { - static_cast<ValueType*>( - cmd)->Init(_target, _attachment, _renderbuffertarget, _renderbuffer); + void* Set(void* cmd, + GLenum _target, + GLenum _attachment, + GLenum _renderbuffertarget, + GLuint _renderbuffer) { + static_cast<ValueType*>(cmd) + ->Init(_target, _attachment, _renderbuffertarget, _renderbuffer); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 attachment; - uint32 renderbuffertarget; - uint32 renderbuffer; + uint32_t target; + uint32_t attachment; + uint32_t renderbuffertarget; + uint32_t renderbuffer; }; COMPILE_ASSERT(sizeof(FramebufferRenderbuffer) == 20, @@ -2365,44 +2118,45 @@ struct FramebufferTexture2D { typedef FramebufferTexture2D ValueType; static const CommandId kCmdId = kFramebufferTexture2D; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLenum _attachment, GLenum _textarget, GLuint _texture, - GLint _level) { + void Init(GLenum _target, + GLenum _attachment, + GLenum _textarget, + GLuint _texture) { SetHeader(); target = _target; attachment = _attachment; textarget = _textarget; texture = _texture; - level = _level; } - void* Set( - void* cmd, GLenum _target, GLenum _attachment, GLenum _textarget, - GLuint _texture, GLint _level) { - static_cast<ValueType*>( - cmd)->Init(_target, _attachment, _textarget, _texture, _level); + void* Set(void* cmd, + GLenum _target, + GLenum _attachment, + GLenum _textarget, + GLuint _texture) { + static_cast<ValueType*>(cmd) + ->Init(_target, _attachment, _textarget, _texture); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 attachment; - uint32 textarget; - uint32 texture; - int32 level; + uint32_t target; + uint32_t attachment; + uint32_t textarget; + uint32_t texture; + static const int32_t level = 0; }; -COMPILE_ASSERT(sizeof(FramebufferTexture2D) == 24, - Sizeof_FramebufferTexture2D_is_not_24); +COMPILE_ASSERT(sizeof(FramebufferTexture2D) == 20, + Sizeof_FramebufferTexture2D_is_not_20); COMPILE_ASSERT(offsetof(FramebufferTexture2D, header) == 0, OffsetOf_FramebufferTexture2D_header_not_0); COMPILE_ASSERT(offsetof(FramebufferTexture2D, target) == 4, @@ -2413,21 +2167,18 @@ COMPILE_ASSERT(offsetof(FramebufferTexture2D, textarget) == 12, OffsetOf_FramebufferTexture2D_textarget_not_12); COMPILE_ASSERT(offsetof(FramebufferTexture2D, texture) == 16, OffsetOf_FramebufferTexture2D_texture_not_16); -COMPILE_ASSERT(offsetof(FramebufferTexture2D, level) == 20, - OffsetOf_FramebufferTexture2D_level_not_20); struct FrontFace { typedef FrontFace ValueType; static const CommandId kCmdId = kFrontFace; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _mode) { SetHeader(); @@ -2440,73 +2191,27 @@ struct FrontFace { } gpu::CommandHeader header; - uint32 mode; + uint32_t mode; }; -COMPILE_ASSERT(sizeof(FrontFace) == 8, - Sizeof_FrontFace_is_not_8); +COMPILE_ASSERT(sizeof(FrontFace) == 8, Sizeof_FrontFace_is_not_8); COMPILE_ASSERT(offsetof(FrontFace, header) == 0, OffsetOf_FrontFace_header_not_0); -COMPILE_ASSERT(offsetof(FrontFace, mode) == 4, - OffsetOf_FrontFace_mode_not_4); - -struct GenBuffers { - typedef GenBuffers ValueType; - static const CommandId kCmdId = kGenBuffers; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLsizei _n, uint32 _buffers_shm_id, uint32 _buffers_shm_offset) { - SetHeader(); - n = _n; - buffers_shm_id = _buffers_shm_id; - buffers_shm_offset = _buffers_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _buffers_shm_id, - uint32 _buffers_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_n, _buffers_shm_id, _buffers_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 buffers_shm_id; - uint32 buffers_shm_offset; -}; - -COMPILE_ASSERT(sizeof(GenBuffers) == 16, - Sizeof_GenBuffers_is_not_16); -COMPILE_ASSERT(offsetof(GenBuffers, header) == 0, - OffsetOf_GenBuffers_header_not_0); -COMPILE_ASSERT(offsetof(GenBuffers, n) == 4, - OffsetOf_GenBuffers_n_not_4); -COMPILE_ASSERT(offsetof(GenBuffers, buffers_shm_id) == 8, - OffsetOf_GenBuffers_buffers_shm_id_not_8); -COMPILE_ASSERT(offsetof(GenBuffers, buffers_shm_offset) == 12, - OffsetOf_GenBuffers_buffers_shm_offset_not_12); +COMPILE_ASSERT(offsetof(FrontFace, mode) == 4, OffsetOf_FrontFace_mode_not_4); struct GenBuffersImmediate { typedef GenBuffersImmediate ValueType; static const CommandId kCmdId = kGenBuffersImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -2516,18 +2221,17 @@ struct GenBuffersImmediate { void Init(GLsizei _n, GLuint* _buffers) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _buffers, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _buffers, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, GLuint* _buffers) { static_cast<ValueType*>(cmd)->Init(_n, _buffers); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(GenBuffersImmediate) == 8, @@ -2541,14 +2245,13 @@ struct GenerateMipmap { typedef GenerateMipmap ValueType; static const CommandId kCmdId = kGenerateMipmap; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target) { SetHeader(); @@ -2561,75 +2264,28 @@ struct GenerateMipmap { } gpu::CommandHeader header; - uint32 target; + uint32_t target; }; -COMPILE_ASSERT(sizeof(GenerateMipmap) == 8, - Sizeof_GenerateMipmap_is_not_8); +COMPILE_ASSERT(sizeof(GenerateMipmap) == 8, Sizeof_GenerateMipmap_is_not_8); COMPILE_ASSERT(offsetof(GenerateMipmap, header) == 0, OffsetOf_GenerateMipmap_header_not_0); COMPILE_ASSERT(offsetof(GenerateMipmap, target) == 4, OffsetOf_GenerateMipmap_target_not_4); -struct GenFramebuffers { - typedef GenFramebuffers ValueType; - static const CommandId kCmdId = kGenFramebuffers; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLsizei _n, uint32 _framebuffers_shm_id, - uint32 _framebuffers_shm_offset) { - SetHeader(); - n = _n; - framebuffers_shm_id = _framebuffers_shm_id; - framebuffers_shm_offset = _framebuffers_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _framebuffers_shm_id, - uint32 _framebuffers_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_n, _framebuffers_shm_id, _framebuffers_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 framebuffers_shm_id; - uint32 framebuffers_shm_offset; -}; - -COMPILE_ASSERT(sizeof(GenFramebuffers) == 16, - Sizeof_GenFramebuffers_is_not_16); -COMPILE_ASSERT(offsetof(GenFramebuffers, header) == 0, - OffsetOf_GenFramebuffers_header_not_0); -COMPILE_ASSERT(offsetof(GenFramebuffers, n) == 4, - OffsetOf_GenFramebuffers_n_not_4); -COMPILE_ASSERT(offsetof(GenFramebuffers, framebuffers_shm_id) == 8, - OffsetOf_GenFramebuffers_framebuffers_shm_id_not_8); -COMPILE_ASSERT(offsetof(GenFramebuffers, framebuffers_shm_offset) == 12, - OffsetOf_GenFramebuffers_framebuffers_shm_offset_not_12); - struct GenFramebuffersImmediate { typedef GenFramebuffersImmediate ValueType; static const CommandId kCmdId = kGenFramebuffersImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -2639,18 +2295,17 @@ struct GenFramebuffersImmediate { void Init(GLsizei _n, GLuint* _framebuffers) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _framebuffers, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _framebuffers, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, GLuint* _framebuffers) { static_cast<ValueType*>(cmd)->Init(_n, _framebuffers); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(GenFramebuffersImmediate) == 8, @@ -2660,65 +2315,19 @@ COMPILE_ASSERT(offsetof(GenFramebuffersImmediate, header) == 0, COMPILE_ASSERT(offsetof(GenFramebuffersImmediate, n) == 4, OffsetOf_GenFramebuffersImmediate_n_not_4); -struct GenRenderbuffers { - typedef GenRenderbuffers ValueType; - static const CommandId kCmdId = kGenRenderbuffers; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLsizei _n, uint32 _renderbuffers_shm_id, - uint32 _renderbuffers_shm_offset) { - SetHeader(); - n = _n; - renderbuffers_shm_id = _renderbuffers_shm_id; - renderbuffers_shm_offset = _renderbuffers_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _renderbuffers_shm_id, - uint32 _renderbuffers_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_n, _renderbuffers_shm_id, _renderbuffers_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 renderbuffers_shm_id; - uint32 renderbuffers_shm_offset; -}; - -COMPILE_ASSERT(sizeof(GenRenderbuffers) == 16, - Sizeof_GenRenderbuffers_is_not_16); -COMPILE_ASSERT(offsetof(GenRenderbuffers, header) == 0, - OffsetOf_GenRenderbuffers_header_not_0); -COMPILE_ASSERT(offsetof(GenRenderbuffers, n) == 4, - OffsetOf_GenRenderbuffers_n_not_4); -COMPILE_ASSERT(offsetof(GenRenderbuffers, renderbuffers_shm_id) == 8, - OffsetOf_GenRenderbuffers_renderbuffers_shm_id_not_8); -COMPILE_ASSERT(offsetof(GenRenderbuffers, renderbuffers_shm_offset) == 12, - OffsetOf_GenRenderbuffers_renderbuffers_shm_offset_not_12); - struct GenRenderbuffersImmediate { typedef GenRenderbuffersImmediate ValueType; static const CommandId kCmdId = kGenRenderbuffersImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -2728,18 +2337,17 @@ struct GenRenderbuffersImmediate { void Init(GLsizei _n, GLuint* _renderbuffers) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _renderbuffers, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _renderbuffers, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, GLuint* _renderbuffers) { static_cast<ValueType*>(cmd)->Init(_n, _renderbuffers); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(GenRenderbuffersImmediate) == 8, @@ -2749,63 +2357,19 @@ COMPILE_ASSERT(offsetof(GenRenderbuffersImmediate, header) == 0, COMPILE_ASSERT(offsetof(GenRenderbuffersImmediate, n) == 4, OffsetOf_GenRenderbuffersImmediate_n_not_4); -struct GenTextures { - typedef GenTextures ValueType; - static const CommandId kCmdId = kGenTextures; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLsizei _n, uint32 _textures_shm_id, uint32 _textures_shm_offset) { - SetHeader(); - n = _n; - textures_shm_id = _textures_shm_id; - textures_shm_offset = _textures_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _textures_shm_id, - uint32 _textures_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_n, _textures_shm_id, _textures_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 textures_shm_id; - uint32 textures_shm_offset; -}; - -COMPILE_ASSERT(sizeof(GenTextures) == 16, - Sizeof_GenTextures_is_not_16); -COMPILE_ASSERT(offsetof(GenTextures, header) == 0, - OffsetOf_GenTextures_header_not_0); -COMPILE_ASSERT(offsetof(GenTextures, n) == 4, - OffsetOf_GenTextures_n_not_4); -COMPILE_ASSERT(offsetof(GenTextures, textures_shm_id) == 8, - OffsetOf_GenTextures_textures_shm_id_not_8); -COMPILE_ASSERT(offsetof(GenTextures, textures_shm_offset) == 12, - OffsetOf_GenTextures_textures_shm_offset_not_12); - struct GenTexturesImmediate { typedef GenTexturesImmediate ValueType; static const CommandId kCmdId = kGenTexturesImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -2815,18 +2379,17 @@ struct GenTexturesImmediate { void Init(GLsizei _n, GLuint* _textures) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _textures, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _textures, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, GLuint* _textures) { static_cast<ValueType*>(cmd)->Init(_n, _textures); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(GenTexturesImmediate) == 8, @@ -2840,24 +2403,25 @@ struct GetActiveAttrib { typedef GetActiveAttrib ValueType; static const CommandId kCmdId = kGetActiveAttrib; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); struct Result { - int32 success; - int32 size; - uint32 type; + int32_t success; + int32_t size; + uint32_t type; }; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _program, GLuint _index, uint32 _name_bucket_id, - uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLuint _program, + GLuint _index, + uint32_t _name_bucket_id, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); program = _program; index = _index; @@ -2866,26 +2430,26 @@ struct GetActiveAttrib { result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLuint _program, GLuint _index, uint32 _name_bucket_id, - uint32 _result_shm_id, uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _program, _index, _name_bucket_id, _result_shm_id, - _result_shm_offset); + void* Set(void* cmd, + GLuint _program, + GLuint _index, + uint32_t _name_bucket_id, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd)->Init( + _program, _index, _name_bucket_id, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 program; - uint32 index; - uint32 name_bucket_id; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t program; + uint32_t index; + uint32_t name_bucket_id; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; -COMPILE_ASSERT(sizeof(GetActiveAttrib) == 24, - Sizeof_GetActiveAttrib_is_not_24); +COMPILE_ASSERT(sizeof(GetActiveAttrib) == 24, Sizeof_GetActiveAttrib_is_not_24); COMPILE_ASSERT(offsetof(GetActiveAttrib, header) == 0, OffsetOf_GetActiveAttrib_header_not_0); COMPILE_ASSERT(offsetof(GetActiveAttrib, program) == 4, @@ -2909,24 +2473,25 @@ struct GetActiveUniform { typedef GetActiveUniform ValueType; static const CommandId kCmdId = kGetActiveUniform; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); struct Result { - int32 success; - int32 size; - uint32 type; + int32_t success; + int32_t size; + uint32_t type; }; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _program, GLuint _index, uint32 _name_bucket_id, - uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLuint _program, + GLuint _index, + uint32_t _name_bucket_id, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); program = _program; index = _index; @@ -2935,22 +2500,23 @@ struct GetActiveUniform { result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLuint _program, GLuint _index, uint32 _name_bucket_id, - uint32 _result_shm_id, uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _program, _index, _name_bucket_id, _result_shm_id, - _result_shm_offset); + void* Set(void* cmd, + GLuint _program, + GLuint _index, + uint32_t _name_bucket_id, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd)->Init( + _program, _index, _name_bucket_id, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 program; - uint32 index; - uint32 name_bucket_id; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t program; + uint32_t index; + uint32_t name_bucket_id; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; COMPILE_ASSERT(sizeof(GetActiveUniform) == 24, @@ -2978,20 +2544,20 @@ struct GetAttachedShaders { typedef GetAttachedShaders ValueType; static const CommandId kCmdId = kGetAttachedShaders; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLuint> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _program, uint32 _result_shm_id, uint32 _result_shm_offset, - uint32 _result_size) { + void Init(GLuint _program, + uint32_t _result_shm_id, + uint32_t _result_shm_offset, + uint32_t _result_size) { SetHeader(); program = _program; result_shm_id = _result_shm_id; @@ -2999,19 +2565,21 @@ struct GetAttachedShaders { result_size = _result_size; } - void* Set( - void* cmd, GLuint _program, uint32 _result_shm_id, - uint32 _result_shm_offset, uint32 _result_size) { - static_cast<ValueType*>( - cmd)->Init(_program, _result_shm_id, _result_shm_offset, _result_size); + void* Set(void* cmd, + GLuint _program, + uint32_t _result_shm_id, + uint32_t _result_shm_offset, + uint32_t _result_size) { + static_cast<ValueType*>(cmd) + ->Init(_program, _result_shm_id, _result_shm_offset, _result_size); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 program; - uint32 result_shm_id; - uint32 result_shm_offset; - uint32 result_size; + uint32_t program; + uint32_t result_shm_id; + uint32_t result_shm_offset; + uint32_t result_size; }; COMPILE_ASSERT(sizeof(GetAttachedShaders) == 20, @@ -3031,40 +2599,41 @@ struct GetBooleanv { typedef GetBooleanv ValueType; static const CommandId kCmdId = kGetBooleanv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLboolean> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLenum _pname, uint32 _params_shm_id, uint32 _params_shm_offset) { + void Init(GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); pname = _pname; params_shm_id = _params_shm_id; params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; -COMPILE_ASSERT(sizeof(GetBooleanv) == 16, - Sizeof_GetBooleanv_is_not_16); +COMPILE_ASSERT(sizeof(GetBooleanv) == 16, Sizeof_GetBooleanv_is_not_16); COMPILE_ASSERT(offsetof(GetBooleanv, header) == 0, OffsetOf_GetBooleanv_header_not_0); COMPILE_ASSERT(offsetof(GetBooleanv, pname) == 4, @@ -3078,20 +2647,20 @@ struct GetBufferParameteriv { typedef GetBufferParameteriv ValueType; static const CommandId kCmdId = kGetBufferParameteriv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLint> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { + void Init(GLenum _target, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); target = _target; pname = _pname; @@ -3099,19 +2668,21 @@ struct GetBufferParameteriv { params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_target, _pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLenum _target, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_target, _pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t target; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; COMPILE_ASSERT(sizeof(GetBufferParameteriv) == 20, @@ -3131,37 +2702,34 @@ struct GetError { typedef GetError ValueType; static const CommandId kCmdId = kGetError; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef GLenum Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(uint32_t _result_shm_id, uint32_t _result_shm_offset) { SetHeader(); result_shm_id = _result_shm_id; result_shm_offset = _result_shm_offset; } - void* Set(void* cmd, uint32 _result_shm_id, uint32 _result_shm_offset) { + void* Set(void* cmd, uint32_t _result_shm_id, uint32_t _result_shm_offset) { static_cast<ValueType*>(cmd)->Init(_result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; -COMPILE_ASSERT(sizeof(GetError) == 12, - Sizeof_GetError_is_not_12); -COMPILE_ASSERT(offsetof(GetError, header) == 0, - OffsetOf_GetError_header_not_0); +COMPILE_ASSERT(sizeof(GetError) == 12, Sizeof_GetError_is_not_12); +COMPILE_ASSERT(offsetof(GetError, header) == 0, OffsetOf_GetError_header_not_0); COMPILE_ASSERT(offsetof(GetError, result_shm_id) == 4, OffsetOf_GetError_result_shm_id_not_4); COMPILE_ASSERT(offsetof(GetError, result_shm_offset) == 8, @@ -3171,44 +2739,44 @@ struct GetFloatv { typedef GetFloatv ValueType; static const CommandId kCmdId = kGetFloatv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLfloat> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLenum _pname, uint32 _params_shm_id, uint32 _params_shm_offset) { + void Init(GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); pname = _pname; params_shm_id = _params_shm_id; params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; -COMPILE_ASSERT(sizeof(GetFloatv) == 16, - Sizeof_GetFloatv_is_not_16); +COMPILE_ASSERT(sizeof(GetFloatv) == 16, Sizeof_GetFloatv_is_not_16); COMPILE_ASSERT(offsetof(GetFloatv, header) == 0, OffsetOf_GetFloatv_header_not_0); -COMPILE_ASSERT(offsetof(GetFloatv, pname) == 4, - OffsetOf_GetFloatv_pname_not_4); +COMPILE_ASSERT(offsetof(GetFloatv, pname) == 4, OffsetOf_GetFloatv_pname_not_4); COMPILE_ASSERT(offsetof(GetFloatv, params_shm_id) == 8, OffsetOf_GetFloatv_params_shm_id_not_8); COMPILE_ASSERT(offsetof(GetFloatv, params_shm_offset) == 12, @@ -3218,20 +2786,21 @@ struct GetFramebufferAttachmentParameteriv { typedef GetFramebufferAttachmentParameteriv ValueType; static const CommandId kCmdId = kGetFramebufferAttachmentParameteriv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLint> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLenum _attachment, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { + void Init(GLenum _target, + GLenum _attachment, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); target = _target; attachment = _attachment; @@ -3240,21 +2809,23 @@ struct GetFramebufferAttachmentParameteriv { params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLenum _target, GLenum _attachment, GLenum _pname, - uint32 _params_shm_id, uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _target, _attachment, _pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLenum _target, + GLenum _attachment, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd)->Init( + _target, _attachment, _pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 attachment; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t target; + uint32_t attachment; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; COMPILE_ASSERT(sizeof(GetFramebufferAttachmentParameteriv) == 24, @@ -3269,49 +2840,50 @@ COMPILE_ASSERT(offsetof(GetFramebufferAttachmentParameteriv, pname) == 12, OffsetOf_GetFramebufferAttachmentParameteriv_pname_not_12); COMPILE_ASSERT( offsetof(GetFramebufferAttachmentParameteriv, params_shm_id) == 16, - OffsetOf_GetFramebufferAttachmentParameteriv_params_shm_id_not_16); // NOLINT + OffsetOf_GetFramebufferAttachmentParameteriv_params_shm_id_not_16); COMPILE_ASSERT( offsetof(GetFramebufferAttachmentParameteriv, params_shm_offset) == 20, - OffsetOf_GetFramebufferAttachmentParameteriv_params_shm_offset_not_20); // NOLINT + OffsetOf_GetFramebufferAttachmentParameteriv_params_shm_offset_not_20); struct GetIntegerv { typedef GetIntegerv ValueType; static const CommandId kCmdId = kGetIntegerv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLint> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLenum _pname, uint32 _params_shm_id, uint32 _params_shm_offset) { + void Init(GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); pname = _pname; params_shm_id = _params_shm_id; params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; -COMPILE_ASSERT(sizeof(GetIntegerv) == 16, - Sizeof_GetIntegerv_is_not_16); +COMPILE_ASSERT(sizeof(GetIntegerv) == 16, Sizeof_GetIntegerv_is_not_16); COMPILE_ASSERT(offsetof(GetIntegerv, header) == 0, OffsetOf_GetIntegerv_header_not_0); COMPILE_ASSERT(offsetof(GetIntegerv, pname) == 4, @@ -3325,20 +2897,20 @@ struct GetProgramiv { typedef GetProgramiv ValueType; static const CommandId kCmdId = kGetProgramiv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLint> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _program, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { + void Init(GLuint _program, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); program = _program; pname = _pname; @@ -3346,23 +2918,24 @@ struct GetProgramiv { params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLuint _program, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_program, _pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLuint _program, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_program, _pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 program; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t program; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; -COMPILE_ASSERT(sizeof(GetProgramiv) == 20, - Sizeof_GetProgramiv_is_not_20); +COMPILE_ASSERT(sizeof(GetProgramiv) == 20, Sizeof_GetProgramiv_is_not_20); COMPILE_ASSERT(offsetof(GetProgramiv, header) == 0, OffsetOf_GetProgramiv_header_not_0); COMPILE_ASSERT(offsetof(GetProgramiv, program) == 4, @@ -3378,29 +2951,28 @@ struct GetProgramInfoLog { typedef GetProgramInfoLog ValueType; static const CommandId kCmdId = kGetProgramInfoLog; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLuint _program, uint32 _bucket_id) { + void Init(GLuint _program, uint32_t _bucket_id) { SetHeader(); program = _program; bucket_id = _bucket_id; } - void* Set(void* cmd, GLuint _program, uint32 _bucket_id) { + void* Set(void* cmd, GLuint _program, uint32_t _bucket_id) { static_cast<ValueType*>(cmd)->Init(_program, _bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 program; - uint32 bucket_id; + uint32_t program; + uint32_t bucket_id; }; COMPILE_ASSERT(sizeof(GetProgramInfoLog) == 12, @@ -3416,20 +2988,20 @@ struct GetRenderbufferParameteriv { typedef GetRenderbufferParameteriv ValueType; static const CommandId kCmdId = kGetRenderbufferParameteriv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLint> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { + void Init(GLenum _target, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); target = _target; pname = _pname; @@ -3437,19 +3009,21 @@ struct GetRenderbufferParameteriv { params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_target, _pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLenum _target, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_target, _pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t target; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; COMPILE_ASSERT(sizeof(GetRenderbufferParameteriv) == 20, @@ -3469,20 +3043,20 @@ struct GetShaderiv { typedef GetShaderiv ValueType; static const CommandId kCmdId = kGetShaderiv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLint> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _shader, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { + void Init(GLuint _shader, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); shader = _shader; pname = _pname; @@ -3490,23 +3064,24 @@ struct GetShaderiv { params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLuint _shader, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_shader, _pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLuint _shader, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_shader, _pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 shader; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t shader; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; -COMPILE_ASSERT(sizeof(GetShaderiv) == 20, - Sizeof_GetShaderiv_is_not_20); +COMPILE_ASSERT(sizeof(GetShaderiv) == 20, Sizeof_GetShaderiv_is_not_20); COMPILE_ASSERT(offsetof(GetShaderiv, header) == 0, OffsetOf_GetShaderiv_header_not_0); COMPILE_ASSERT(offsetof(GetShaderiv, shader) == 4, @@ -3522,29 +3097,28 @@ struct GetShaderInfoLog { typedef GetShaderInfoLog ValueType; static const CommandId kCmdId = kGetShaderInfoLog; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLuint _shader, uint32 _bucket_id) { + void Init(GLuint _shader, uint32_t _bucket_id) { SetHeader(); shader = _shader; bucket_id = _bucket_id; } - void* Set(void* cmd, GLuint _shader, uint32 _bucket_id) { + void* Set(void* cmd, GLuint _shader, uint32_t _bucket_id) { static_cast<ValueType*>(cmd)->Init(_shader, _bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 shader; - uint32 bucket_id; + uint32_t shader; + uint32_t bucket_id; }; COMPILE_ASSERT(sizeof(GetShaderInfoLog) == 12, @@ -3560,25 +3134,25 @@ struct GetShaderPrecisionFormat { typedef GetShaderPrecisionFormat ValueType; static const CommandId kCmdId = kGetShaderPrecisionFormat; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); struct Result { - int32 success; - int32 min_range; - int32 max_range; - int32 precision; + int32_t success; + int32_t min_range; + int32_t max_range; + int32_t precision; }; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _shadertype, GLenum _precisiontype, uint32 _result_shm_id, - uint32 _result_shm_offset) { + void Init(GLenum _shadertype, + GLenum _precisiontype, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); shadertype = _shadertype; precisiontype = _precisiontype; @@ -3586,20 +3160,21 @@ struct GetShaderPrecisionFormat { result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLenum _shadertype, GLenum _precisiontype, - uint32 _result_shm_id, uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _shadertype, _precisiontype, _result_shm_id, _result_shm_offset); + void* Set(void* cmd, + GLenum _shadertype, + GLenum _precisiontype, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_shadertype, _precisiontype, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 shadertype; - uint32 precisiontype; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t shadertype; + uint32_t precisiontype; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; COMPILE_ASSERT(sizeof(GetShaderPrecisionFormat) == 20, @@ -3627,33 +3202,31 @@ struct GetShaderSource { typedef GetShaderSource ValueType; static const CommandId kCmdId = kGetShaderSource; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLuint _shader, uint32 _bucket_id) { + void Init(GLuint _shader, uint32_t _bucket_id) { SetHeader(); shader = _shader; bucket_id = _bucket_id; } - void* Set(void* cmd, GLuint _shader, uint32 _bucket_id) { + void* Set(void* cmd, GLuint _shader, uint32_t _bucket_id) { static_cast<ValueType*>(cmd)->Init(_shader, _bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 shader; - uint32 bucket_id; + uint32_t shader; + uint32_t bucket_id; }; -COMPILE_ASSERT(sizeof(GetShaderSource) == 12, - Sizeof_GetShaderSource_is_not_12); +COMPILE_ASSERT(sizeof(GetShaderSource) == 12, Sizeof_GetShaderSource_is_not_12); COMPILE_ASSERT(offsetof(GetShaderSource, header) == 0, OffsetOf_GetShaderSource_header_not_0); COMPILE_ASSERT(offsetof(GetShaderSource, shader) == 4, @@ -3665,37 +3238,34 @@ struct GetString { typedef GetString ValueType; static const CommandId kCmdId = kGetString; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLenum _name, uint32 _bucket_id) { + void Init(GLenum _name, uint32_t _bucket_id) { SetHeader(); name = _name; bucket_id = _bucket_id; } - void* Set(void* cmd, GLenum _name, uint32 _bucket_id) { + void* Set(void* cmd, GLenum _name, uint32_t _bucket_id) { static_cast<ValueType*>(cmd)->Init(_name, _bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 name; - uint32 bucket_id; + uint32_t name; + uint32_t bucket_id; }; -COMPILE_ASSERT(sizeof(GetString) == 12, - Sizeof_GetString_is_not_12); +COMPILE_ASSERT(sizeof(GetString) == 12, Sizeof_GetString_is_not_12); COMPILE_ASSERT(offsetof(GetString, header) == 0, OffsetOf_GetString_header_not_0); -COMPILE_ASSERT(offsetof(GetString, name) == 4, - OffsetOf_GetString_name_not_4); +COMPILE_ASSERT(offsetof(GetString, name) == 4, OffsetOf_GetString_name_not_4); COMPILE_ASSERT(offsetof(GetString, bucket_id) == 8, OffsetOf_GetString_bucket_id_not_8); @@ -3703,20 +3273,20 @@ struct GetTexParameterfv { typedef GetTexParameterfv ValueType; static const CommandId kCmdId = kGetTexParameterfv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLfloat> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { + void Init(GLenum _target, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); target = _target; pname = _pname; @@ -3724,19 +3294,21 @@ struct GetTexParameterfv { params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_target, _pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLenum _target, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_target, _pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t target; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; COMPILE_ASSERT(sizeof(GetTexParameterfv) == 20, @@ -3756,20 +3328,20 @@ struct GetTexParameteriv { typedef GetTexParameteriv ValueType; static const CommandId kCmdId = kGetTexParameteriv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLint> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { + void Init(GLenum _target, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); target = _target; pname = _pname; @@ -3777,19 +3349,21 @@ struct GetTexParameteriv { params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_target, _pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLenum _target, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_target, _pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t target; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; COMPILE_ASSERT(sizeof(GetTexParameteriv) == 20, @@ -3809,20 +3383,20 @@ struct GetUniformfv { typedef GetUniformfv ValueType; static const CommandId kCmdId = kGetUniformfv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLfloat> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _program, GLint _location, uint32 _params_shm_id, - uint32 _params_shm_offset) { + void Init(GLuint _program, + GLint _location, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); program = _program; location = _location; @@ -3830,23 +3404,24 @@ struct GetUniformfv { params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLuint _program, GLint _location, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_program, _location, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLuint _program, + GLint _location, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_program, _location, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 program; - int32 location; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t program; + int32_t location; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; -COMPILE_ASSERT(sizeof(GetUniformfv) == 20, - Sizeof_GetUniformfv_is_not_20); +COMPILE_ASSERT(sizeof(GetUniformfv) == 20, Sizeof_GetUniformfv_is_not_20); COMPILE_ASSERT(offsetof(GetUniformfv, header) == 0, OffsetOf_GetUniformfv_header_not_0); COMPILE_ASSERT(offsetof(GetUniformfv, program) == 4, @@ -3862,20 +3437,20 @@ struct GetUniformiv { typedef GetUniformiv ValueType; static const CommandId kCmdId = kGetUniformiv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLint> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _program, GLint _location, uint32 _params_shm_id, - uint32 _params_shm_offset) { + void Init(GLuint _program, + GLint _location, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); program = _program; location = _location; @@ -3883,23 +3458,24 @@ struct GetUniformiv { params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLuint _program, GLint _location, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_program, _location, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLuint _program, + GLint _location, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_program, _location, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 program; - int32 location; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t program; + int32_t location; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; -COMPILE_ASSERT(sizeof(GetUniformiv) == 20, - Sizeof_GetUniformiv_is_not_20); +COMPILE_ASSERT(sizeof(GetUniformiv) == 20, Sizeof_GetUniformiv_is_not_20); COMPILE_ASSERT(offsetof(GetUniformiv, header) == 0, OffsetOf_GetUniformiv_header_not_0); COMPILE_ASSERT(offsetof(GetUniformiv, program) == 4, @@ -3915,20 +3491,20 @@ struct GetVertexAttribfv { typedef GetVertexAttribfv ValueType; static const CommandId kCmdId = kGetVertexAttribfv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLfloat> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _index, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { + void Init(GLuint _index, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); index = _index; pname = _pname; @@ -3936,19 +3512,21 @@ struct GetVertexAttribfv { params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLuint _index, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_index, _pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLuint _index, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_index, _pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 index; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t index; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; COMPILE_ASSERT(sizeof(GetVertexAttribfv) == 20, @@ -3968,20 +3546,20 @@ struct GetVertexAttribiv { typedef GetVertexAttribiv ValueType; static const CommandId kCmdId = kGetVertexAttribiv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLint> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _index, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { + void Init(GLuint _index, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { SetHeader(); index = _index; pname = _pname; @@ -3989,19 +3567,21 @@ struct GetVertexAttribiv { params_shm_offset = _params_shm_offset; } - void* Set( - void* cmd, GLuint _index, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_index, _pname, _params_shm_id, _params_shm_offset); + void* Set(void* cmd, + GLuint _index, + GLenum _pname, + uint32_t _params_shm_id, + uint32_t _params_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_index, _pname, _params_shm_id, _params_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 index; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; + uint32_t index; + uint32_t pname; + uint32_t params_shm_id; + uint32_t params_shm_offset; }; COMPILE_ASSERT(sizeof(GetVertexAttribiv) == 20, @@ -4021,20 +3601,20 @@ struct GetVertexAttribPointerv { typedef GetVertexAttribPointerv ValueType; static const CommandId kCmdId = kGetVertexAttribPointerv; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef SizedResult<GLuint> Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _index, GLenum _pname, uint32 _pointer_shm_id, - uint32 _pointer_shm_offset) { + void Init(GLuint _index, + GLenum _pname, + uint32_t _pointer_shm_id, + uint32_t _pointer_shm_offset) { SetHeader(); index = _index; pname = _pname; @@ -4042,19 +3622,21 @@ struct GetVertexAttribPointerv { pointer_shm_offset = _pointer_shm_offset; } - void* Set( - void* cmd, GLuint _index, GLenum _pname, uint32 _pointer_shm_id, - uint32 _pointer_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_index, _pname, _pointer_shm_id, _pointer_shm_offset); + void* Set(void* cmd, + GLuint _index, + GLenum _pname, + uint32_t _pointer_shm_id, + uint32_t _pointer_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_index, _pname, _pointer_shm_id, _pointer_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 index; - uint32 pname; - uint32 pointer_shm_id; - uint32 pointer_shm_offset; + uint32_t index; + uint32_t pname; + uint32_t pointer_shm_id; + uint32_t pointer_shm_offset; }; COMPILE_ASSERT(sizeof(GetVertexAttribPointerv) == 20, @@ -4074,14 +3656,13 @@ struct Hint { typedef Hint ValueType; static const CommandId kCmdId = kHint; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target, GLenum _mode) { SetHeader(); @@ -4095,61 +3676,56 @@ struct Hint { } gpu::CommandHeader header; - uint32 target; - uint32 mode; + uint32_t target; + uint32_t mode; }; -COMPILE_ASSERT(sizeof(Hint) == 12, - Sizeof_Hint_is_not_12); -COMPILE_ASSERT(offsetof(Hint, header) == 0, - OffsetOf_Hint_header_not_0); -COMPILE_ASSERT(offsetof(Hint, target) == 4, - OffsetOf_Hint_target_not_4); -COMPILE_ASSERT(offsetof(Hint, mode) == 8, - OffsetOf_Hint_mode_not_8); +COMPILE_ASSERT(sizeof(Hint) == 12, Sizeof_Hint_is_not_12); +COMPILE_ASSERT(offsetof(Hint, header) == 0, OffsetOf_Hint_header_not_0); +COMPILE_ASSERT(offsetof(Hint, target) == 4, OffsetOf_Hint_target_not_4); +COMPILE_ASSERT(offsetof(Hint, mode) == 8, OffsetOf_Hint_mode_not_8); struct IsBuffer { typedef IsBuffer ValueType; static const CommandId kCmdId = kIsBuffer; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - typedef uint32 Result; + typedef uint32_t Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLuint _buffer, uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLuint _buffer, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); buffer = _buffer; result_shm_id = _result_shm_id; result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLuint _buffer, uint32 _result_shm_id, - uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_buffer, _result_shm_id, _result_shm_offset); + void* Set(void* cmd, + GLuint _buffer, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_buffer, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 buffer; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t buffer; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; -COMPILE_ASSERT(sizeof(IsBuffer) == 16, - Sizeof_IsBuffer_is_not_16); -COMPILE_ASSERT(offsetof(IsBuffer, header) == 0, - OffsetOf_IsBuffer_header_not_0); -COMPILE_ASSERT(offsetof(IsBuffer, buffer) == 4, - OffsetOf_IsBuffer_buffer_not_4); +COMPILE_ASSERT(sizeof(IsBuffer) == 16, Sizeof_IsBuffer_is_not_16); +COMPILE_ASSERT(offsetof(IsBuffer, header) == 0, OffsetOf_IsBuffer_header_not_0); +COMPILE_ASSERT(offsetof(IsBuffer, buffer) == 4, OffsetOf_IsBuffer_buffer_not_4); COMPILE_ASSERT(offsetof(IsBuffer, result_shm_id) == 8, OffsetOf_IsBuffer_result_shm_id_not_8); COMPILE_ASSERT(offsetof(IsBuffer, result_shm_offset) == 12, @@ -4159,44 +3735,42 @@ struct IsEnabled { typedef IsEnabled ValueType; static const CommandId kCmdId = kIsEnabled; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - typedef uint32 Result; + typedef uint32_t Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLenum _cap, uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLenum _cap, uint32_t _result_shm_id, uint32_t _result_shm_offset) { SetHeader(); cap = _cap; result_shm_id = _result_shm_id; result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLenum _cap, uint32 _result_shm_id, - uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_cap, _result_shm_id, _result_shm_offset); + void* Set(void* cmd, + GLenum _cap, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_cap, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 cap; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t cap; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; -COMPILE_ASSERT(sizeof(IsEnabled) == 16, - Sizeof_IsEnabled_is_not_16); +COMPILE_ASSERT(sizeof(IsEnabled) == 16, Sizeof_IsEnabled_is_not_16); COMPILE_ASSERT(offsetof(IsEnabled, header) == 0, OffsetOf_IsEnabled_header_not_0); -COMPILE_ASSERT(offsetof(IsEnabled, cap) == 4, - OffsetOf_IsEnabled_cap_not_4); +COMPILE_ASSERT(offsetof(IsEnabled, cap) == 4, OffsetOf_IsEnabled_cap_not_4); COMPILE_ASSERT(offsetof(IsEnabled, result_shm_id) == 8, OffsetOf_IsEnabled_result_shm_id_not_8); COMPILE_ASSERT(offsetof(IsEnabled, result_shm_offset) == 12, @@ -4206,41 +3780,41 @@ struct IsFramebuffer { typedef IsFramebuffer ValueType; static const CommandId kCmdId = kIsFramebuffer; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - typedef uint32 Result; + typedef uint32_t Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _framebuffer, uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLuint _framebuffer, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); framebuffer = _framebuffer; result_shm_id = _result_shm_id; result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLuint _framebuffer, uint32 _result_shm_id, - uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_framebuffer, _result_shm_id, _result_shm_offset); + void* Set(void* cmd, + GLuint _framebuffer, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_framebuffer, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 framebuffer; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t framebuffer; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; -COMPILE_ASSERT(sizeof(IsFramebuffer) == 16, - Sizeof_IsFramebuffer_is_not_16); +COMPILE_ASSERT(sizeof(IsFramebuffer) == 16, Sizeof_IsFramebuffer_is_not_16); COMPILE_ASSERT(offsetof(IsFramebuffer, header) == 0, OffsetOf_IsFramebuffer_header_not_0); COMPILE_ASSERT(offsetof(IsFramebuffer, framebuffer) == 4, @@ -4254,41 +3828,41 @@ struct IsProgram { typedef IsProgram ValueType; static const CommandId kCmdId = kIsProgram; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - typedef uint32 Result; + typedef uint32_t Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _program, uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLuint _program, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); program = _program; result_shm_id = _result_shm_id; result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLuint _program, uint32 _result_shm_id, - uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_program, _result_shm_id, _result_shm_offset); + void* Set(void* cmd, + GLuint _program, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_program, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 program; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t program; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; -COMPILE_ASSERT(sizeof(IsProgram) == 16, - Sizeof_IsProgram_is_not_16); +COMPILE_ASSERT(sizeof(IsProgram) == 16, Sizeof_IsProgram_is_not_16); COMPILE_ASSERT(offsetof(IsProgram, header) == 0, OffsetOf_IsProgram_header_not_0); COMPILE_ASSERT(offsetof(IsProgram, program) == 4, @@ -4302,41 +3876,41 @@ struct IsRenderbuffer { typedef IsRenderbuffer ValueType; static const CommandId kCmdId = kIsRenderbuffer; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - typedef uint32 Result; + typedef uint32_t Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _renderbuffer, uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLuint _renderbuffer, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); renderbuffer = _renderbuffer; result_shm_id = _result_shm_id; result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLuint _renderbuffer, uint32 _result_shm_id, - uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_renderbuffer, _result_shm_id, _result_shm_offset); + void* Set(void* cmd, + GLuint _renderbuffer, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_renderbuffer, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 renderbuffer; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t renderbuffer; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; -COMPILE_ASSERT(sizeof(IsRenderbuffer) == 16, - Sizeof_IsRenderbuffer_is_not_16); +COMPILE_ASSERT(sizeof(IsRenderbuffer) == 16, Sizeof_IsRenderbuffer_is_not_16); COMPILE_ASSERT(offsetof(IsRenderbuffer, header) == 0, OffsetOf_IsRenderbuffer_header_not_0); COMPILE_ASSERT(offsetof(IsRenderbuffer, renderbuffer) == 4, @@ -4350,44 +3924,43 @@ struct IsShader { typedef IsShader ValueType; static const CommandId kCmdId = kIsShader; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - typedef uint32 Result; + typedef uint32_t Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLuint _shader, uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLuint _shader, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); shader = _shader; result_shm_id = _result_shm_id; result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLuint _shader, uint32 _result_shm_id, - uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_shader, _result_shm_id, _result_shm_offset); + void* Set(void* cmd, + GLuint _shader, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_shader, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 shader; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t shader; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; -COMPILE_ASSERT(sizeof(IsShader) == 16, - Sizeof_IsShader_is_not_16); -COMPILE_ASSERT(offsetof(IsShader, header) == 0, - OffsetOf_IsShader_header_not_0); -COMPILE_ASSERT(offsetof(IsShader, shader) == 4, - OffsetOf_IsShader_shader_not_4); +COMPILE_ASSERT(sizeof(IsShader) == 16, Sizeof_IsShader_is_not_16); +COMPILE_ASSERT(offsetof(IsShader, header) == 0, OffsetOf_IsShader_header_not_0); +COMPILE_ASSERT(offsetof(IsShader, shader) == 4, OffsetOf_IsShader_shader_not_4); COMPILE_ASSERT(offsetof(IsShader, result_shm_id) == 8, OffsetOf_IsShader_result_shm_id_not_8); COMPILE_ASSERT(offsetof(IsShader, result_shm_offset) == 12, @@ -4397,41 +3970,41 @@ struct IsTexture { typedef IsTexture ValueType; static const CommandId kCmdId = kIsTexture; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - typedef uint32 Result; + typedef uint32_t Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _texture, uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLuint _texture, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); texture = _texture; result_shm_id = _result_shm_id; result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLuint _texture, uint32 _result_shm_id, - uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_texture, _result_shm_id, _result_shm_offset); + void* Set(void* cmd, + GLuint _texture, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_texture, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 texture; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t texture; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; -COMPILE_ASSERT(sizeof(IsTexture) == 16, - Sizeof_IsTexture_is_not_16); +COMPILE_ASSERT(sizeof(IsTexture) == 16, Sizeof_IsTexture_is_not_16); COMPILE_ASSERT(offsetof(IsTexture, header) == 0, OffsetOf_IsTexture_header_not_0); COMPILE_ASSERT(offsetof(IsTexture, texture) == 4, @@ -4445,14 +4018,13 @@ struct LineWidth { typedef LineWidth ValueType; static const CommandId kCmdId = kLineWidth; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLfloat _width) { SetHeader(); @@ -4468,25 +4040,22 @@ struct LineWidth { float width; }; -COMPILE_ASSERT(sizeof(LineWidth) == 8, - Sizeof_LineWidth_is_not_8); +COMPILE_ASSERT(sizeof(LineWidth) == 8, Sizeof_LineWidth_is_not_8); COMPILE_ASSERT(offsetof(LineWidth, header) == 0, OffsetOf_LineWidth_header_not_0); -COMPILE_ASSERT(offsetof(LineWidth, width) == 4, - OffsetOf_LineWidth_width_not_4); +COMPILE_ASSERT(offsetof(LineWidth, width) == 4, OffsetOf_LineWidth_width_not_4); struct LinkProgram { typedef LinkProgram ValueType; static const CommandId kCmdId = kLinkProgram; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _program) { SetHeader(); @@ -4499,11 +4068,10 @@ struct LinkProgram { } gpu::CommandHeader header; - uint32 program; + uint32_t program; }; -COMPILE_ASSERT(sizeof(LinkProgram) == 8, - Sizeof_LinkProgram_is_not_8); +COMPILE_ASSERT(sizeof(LinkProgram) == 8, Sizeof_LinkProgram_is_not_8); COMPILE_ASSERT(offsetof(LinkProgram, header) == 0, OffsetOf_LinkProgram_header_not_0); COMPILE_ASSERT(offsetof(LinkProgram, program) == 4, @@ -4513,14 +4081,13 @@ struct PixelStorei { typedef PixelStorei ValueType; static const CommandId kCmdId = kPixelStorei; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _pname, GLint _param) { SetHeader(); @@ -4534,12 +4101,11 @@ struct PixelStorei { } gpu::CommandHeader header; - uint32 pname; - int32 param; + uint32_t pname; + int32_t param; }; -COMPILE_ASSERT(sizeof(PixelStorei) == 12, - Sizeof_PixelStorei_is_not_12); +COMPILE_ASSERT(sizeof(PixelStorei) == 12, Sizeof_PixelStorei_is_not_12); COMPILE_ASSERT(offsetof(PixelStorei, header) == 0, OffsetOf_PixelStorei_header_not_0); COMPILE_ASSERT(offsetof(PixelStorei, pname) == 4, @@ -4551,14 +4117,13 @@ struct PolygonOffset { typedef PolygonOffset ValueType; static const CommandId kCmdId = kPolygonOffset; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLfloat _factor, GLfloat _units) { SetHeader(); @@ -4576,8 +4141,7 @@ struct PolygonOffset { float units; }; -COMPILE_ASSERT(sizeof(PolygonOffset) == 12, - Sizeof_PolygonOffset_is_not_12); +COMPILE_ASSERT(sizeof(PolygonOffset) == 12, Sizeof_PolygonOffset_is_not_12); COMPILE_ASSERT(offsetof(PolygonOffset, header) == 0, OffsetOf_PolygonOffset_header_not_0); COMPILE_ASSERT(offsetof(PolygonOffset, factor) == 4, @@ -4592,21 +4156,27 @@ struct ReadPixels { typedef ReadPixels ValueType; static const CommandId kCmdId = kReadPixels; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - typedef uint32 Result; + typedef uint32_t Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLint _x, GLint _y, GLsizei _width, GLsizei _height, GLenum _format, - GLenum _type, uint32 _pixels_shm_id, uint32 _pixels_shm_offset, - uint32 _result_shm_id, uint32 _result_shm_offset, GLboolean _async) { + void Init(GLint _x, + GLint _y, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLenum _type, + uint32_t _pixels_shm_id, + uint32_t _pixels_shm_offset, + uint32_t _result_shm_id, + uint32_t _result_shm_offset, + GLboolean _async) { SetHeader(); x = _x; y = _y; @@ -4621,40 +4191,51 @@ struct ReadPixels { async = _async; } - void* Set( - void* cmd, GLint _x, GLint _y, GLsizei _width, GLsizei _height, - GLenum _format, GLenum _type, uint32 _pixels_shm_id, - uint32 _pixels_shm_offset, uint32 _result_shm_id, - uint32 _result_shm_offset, GLboolean _async) { - static_cast<ValueType*>( - cmd)->Init( - _x, _y, _width, _height, _format, _type, _pixels_shm_id, - _pixels_shm_offset, _result_shm_id, _result_shm_offset, _async); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 x; - int32 y; - int32 width; - int32 height; - uint32 format; - uint32 type; - uint32 pixels_shm_id; - uint32 pixels_shm_offset; - uint32 result_shm_id; - uint32 result_shm_offset; - uint32 async; -}; - -COMPILE_ASSERT(sizeof(ReadPixels) == 48, - Sizeof_ReadPixels_is_not_48); + void* Set(void* cmd, + GLint _x, + GLint _y, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLenum _type, + uint32_t _pixels_shm_id, + uint32_t _pixels_shm_offset, + uint32_t _result_shm_id, + uint32_t _result_shm_offset, + GLboolean _async) { + static_cast<ValueType*>(cmd)->Init(_x, + _y, + _width, + _height, + _format, + _type, + _pixels_shm_id, + _pixels_shm_offset, + _result_shm_id, + _result_shm_offset, + _async); + return NextCmdAddress<ValueType>(cmd); + } + + gpu::CommandHeader header; + int32_t x; + int32_t y; + int32_t width; + int32_t height; + uint32_t format; + uint32_t type; + uint32_t pixels_shm_id; + uint32_t pixels_shm_offset; + uint32_t result_shm_id; + uint32_t result_shm_offset; + uint32_t async; +}; + +COMPILE_ASSERT(sizeof(ReadPixels) == 48, Sizeof_ReadPixels_is_not_48); COMPILE_ASSERT(offsetof(ReadPixels, header) == 0, OffsetOf_ReadPixels_header_not_0); -COMPILE_ASSERT(offsetof(ReadPixels, x) == 4, - OffsetOf_ReadPixels_x_not_4); -COMPILE_ASSERT(offsetof(ReadPixels, y) == 8, - OffsetOf_ReadPixels_y_not_8); +COMPILE_ASSERT(offsetof(ReadPixels, x) == 4, OffsetOf_ReadPixels_x_not_4); +COMPILE_ASSERT(offsetof(ReadPixels, y) == 8, OffsetOf_ReadPixels_y_not_8); COMPILE_ASSERT(offsetof(ReadPixels, width) == 12, OffsetOf_ReadPixels_width_not_12); COMPILE_ASSERT(offsetof(ReadPixels, height) == 16, @@ -4678,18 +4259,15 @@ struct ReleaseShaderCompiler { typedef ReleaseShaderCompiler ValueType; static const CommandId kCmdId = kReleaseShaderCompiler; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init() { - SetHeader(); - } + void Init() { SetHeader(); } void* Set(void* cmd) { static_cast<ValueType*>(cmd)->Init(); @@ -4708,18 +4286,18 @@ struct RenderbufferStorage { typedef RenderbufferStorage ValueType; static const CommandId kCmdId = kRenderbufferStorage; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLenum _internalformat, GLsizei _width, - GLsizei _height) { + void Init(GLenum _target, + GLenum _internalformat, + GLsizei _width, + GLsizei _height) { SetHeader(); target = _target; internalformat = _internalformat; @@ -4727,19 +4305,21 @@ struct RenderbufferStorage { height = _height; } - void* Set( - void* cmd, GLenum _target, GLenum _internalformat, GLsizei _width, - GLsizei _height) { - static_cast<ValueType*>( - cmd)->Init(_target, _internalformat, _width, _height); + void* Set(void* cmd, + GLenum _target, + GLenum _internalformat, + GLsizei _width, + GLsizei _height) { + static_cast<ValueType*>(cmd) + ->Init(_target, _internalformat, _width, _height); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 internalformat; - int32 width; - int32 height; + uint32_t target; + uint32_t internalformat; + int32_t width; + int32_t height; }; COMPILE_ASSERT(sizeof(RenderbufferStorage) == 20, @@ -4759,14 +4339,13 @@ struct SampleCoverage { typedef SampleCoverage ValueType; static const CommandId kCmdId = kSampleCoverage; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLclampf _value, GLboolean _invert) { SetHeader(); @@ -4781,11 +4360,10 @@ struct SampleCoverage { gpu::CommandHeader header; float value; - uint32 invert; + uint32_t invert; }; -COMPILE_ASSERT(sizeof(SampleCoverage) == 12, - Sizeof_SampleCoverage_is_not_12); +COMPILE_ASSERT(sizeof(SampleCoverage) == 12, Sizeof_SampleCoverage_is_not_12); COMPILE_ASSERT(offsetof(SampleCoverage, header) == 0, OffsetOf_SampleCoverage_header_not_0); COMPILE_ASSERT(offsetof(SampleCoverage, value) == 4, @@ -4797,14 +4375,13 @@ struct Scissor { typedef Scissor ValueType; static const CommandId kCmdId = kScissor; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _x, GLint _y, GLsizei _width, GLsizei _height) { SetHeader(); @@ -4820,42 +4397,38 @@ struct Scissor { } gpu::CommandHeader header; - int32 x; - int32 y; - int32 width; - int32 height; + int32_t x; + int32_t y; + int32_t width; + int32_t height; }; -COMPILE_ASSERT(sizeof(Scissor) == 20, - Sizeof_Scissor_is_not_20); -COMPILE_ASSERT(offsetof(Scissor, header) == 0, - OffsetOf_Scissor_header_not_0); -COMPILE_ASSERT(offsetof(Scissor, x) == 4, - OffsetOf_Scissor_x_not_4); -COMPILE_ASSERT(offsetof(Scissor, y) == 8, - OffsetOf_Scissor_y_not_8); -COMPILE_ASSERT(offsetof(Scissor, width) == 12, - OffsetOf_Scissor_width_not_12); -COMPILE_ASSERT(offsetof(Scissor, height) == 16, - OffsetOf_Scissor_height_not_16); +COMPILE_ASSERT(sizeof(Scissor) == 20, Sizeof_Scissor_is_not_20); +COMPILE_ASSERT(offsetof(Scissor, header) == 0, OffsetOf_Scissor_header_not_0); +COMPILE_ASSERT(offsetof(Scissor, x) == 4, OffsetOf_Scissor_x_not_4); +COMPILE_ASSERT(offsetof(Scissor, y) == 8, OffsetOf_Scissor_y_not_8); +COMPILE_ASSERT(offsetof(Scissor, width) == 12, OffsetOf_Scissor_width_not_12); +COMPILE_ASSERT(offsetof(Scissor, height) == 16, OffsetOf_Scissor_height_not_16); struct ShaderBinary { typedef ShaderBinary ValueType; static const CommandId kCmdId = kShaderBinary; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLsizei _n, uint32 _shaders_shm_id, uint32 _shaders_shm_offset, - GLenum _binaryformat, uint32 _binary_shm_id, uint32 _binary_shm_offset, - GLsizei _length) { + void Init(GLsizei _n, + uint32_t _shaders_shm_id, + uint32_t _shaders_shm_offset, + GLenum _binaryformat, + uint32_t _binary_shm_id, + uint32_t _binary_shm_offset, + GLsizei _length) { SetHeader(); n = _n; shaders_shm_id = _shaders_shm_id; @@ -4866,33 +4439,38 @@ struct ShaderBinary { length = _length; } - void* Set( - void* cmd, GLsizei _n, uint32 _shaders_shm_id, uint32 _shaders_shm_offset, - GLenum _binaryformat, uint32 _binary_shm_id, uint32 _binary_shm_offset, - GLsizei _length) { - static_cast<ValueType*>( - cmd)->Init( - _n, _shaders_shm_id, _shaders_shm_offset, _binaryformat, - _binary_shm_id, _binary_shm_offset, _length); + void* Set(void* cmd, + GLsizei _n, + uint32_t _shaders_shm_id, + uint32_t _shaders_shm_offset, + GLenum _binaryformat, + uint32_t _binary_shm_id, + uint32_t _binary_shm_offset, + GLsizei _length) { + static_cast<ValueType*>(cmd)->Init(_n, + _shaders_shm_id, + _shaders_shm_offset, + _binaryformat, + _binary_shm_id, + _binary_shm_offset, + _length); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - int32 n; - uint32 shaders_shm_id; - uint32 shaders_shm_offset; - uint32 binaryformat; - uint32 binary_shm_id; - uint32 binary_shm_offset; - int32 length; + int32_t n; + uint32_t shaders_shm_id; + uint32_t shaders_shm_offset; + uint32_t binaryformat; + uint32_t binary_shm_id; + uint32_t binary_shm_offset; + int32_t length; }; -COMPILE_ASSERT(sizeof(ShaderBinary) == 32, - Sizeof_ShaderBinary_is_not_32); +COMPILE_ASSERT(sizeof(ShaderBinary) == 32, Sizeof_ShaderBinary_is_not_32); COMPILE_ASSERT(offsetof(ShaderBinary, header) == 0, OffsetOf_ShaderBinary_header_not_0); -COMPILE_ASSERT(offsetof(ShaderBinary, n) == 4, - OffsetOf_ShaderBinary_n_not_4); +COMPILE_ASSERT(offsetof(ShaderBinary, n) == 4, OffsetOf_ShaderBinary_n_not_4); COMPILE_ASSERT(offsetof(ShaderBinary, shaders_shm_id) == 8, OffsetOf_ShaderBinary_shaders_shm_id_not_8); COMPILE_ASSERT(offsetof(ShaderBinary, shaders_shm_offset) == 12, @@ -4906,84 +4484,32 @@ COMPILE_ASSERT(offsetof(ShaderBinary, binary_shm_offset) == 24, COMPILE_ASSERT(offsetof(ShaderBinary, length) == 28, OffsetOf_ShaderBinary_length_not_28); -struct ShaderSource { - typedef ShaderSource ValueType; - static const CommandId kCmdId = kShaderSource; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLuint _shader, uint32 _data_shm_id, uint32 _data_shm_offset, - uint32 _data_size) { - SetHeader(); - shader = _shader; - data_shm_id = _data_shm_id; - data_shm_offset = _data_shm_offset; - data_size = _data_size; - } - - void* Set( - void* cmd, GLuint _shader, uint32 _data_shm_id, uint32 _data_shm_offset, - uint32 _data_size) { - static_cast<ValueType*>( - cmd)->Init(_shader, _data_shm_id, _data_shm_offset, _data_size); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 shader; - uint32 data_shm_id; - uint32 data_shm_offset; - uint32 data_size; -}; - -COMPILE_ASSERT(sizeof(ShaderSource) == 20, - Sizeof_ShaderSource_is_not_20); -COMPILE_ASSERT(offsetof(ShaderSource, header) == 0, - OffsetOf_ShaderSource_header_not_0); -COMPILE_ASSERT(offsetof(ShaderSource, shader) == 4, - OffsetOf_ShaderSource_shader_not_4); -COMPILE_ASSERT(offsetof(ShaderSource, data_shm_id) == 8, - OffsetOf_ShaderSource_data_shm_id_not_8); -COMPILE_ASSERT(offsetof(ShaderSource, data_shm_offset) == 12, - OffsetOf_ShaderSource_data_shm_offset_not_12); -COMPILE_ASSERT(offsetof(ShaderSource, data_size) == 16, - OffsetOf_ShaderSource_data_size_not_16); - struct ShaderSourceBucket { typedef ShaderSourceBucket ValueType; static const CommandId kCmdId = kShaderSourceBucket; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLuint _shader, uint32 _data_bucket_id) { + void Init(GLuint _shader, uint32_t _data_bucket_id) { SetHeader(); shader = _shader; data_bucket_id = _data_bucket_id; } - void* Set(void* cmd, GLuint _shader, uint32 _data_bucket_id) { + void* Set(void* cmd, GLuint _shader, uint32_t _data_bucket_id) { static_cast<ValueType*>(cmd)->Init(_shader, _data_bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 shader; - uint32 data_bucket_id; + uint32_t shader; + uint32_t data_bucket_id; }; COMPILE_ASSERT(sizeof(ShaderSourceBucket) == 12, @@ -4999,14 +4525,13 @@ struct StencilFunc { typedef StencilFunc ValueType; static const CommandId kCmdId = kStencilFunc; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _func, GLint _ref, GLuint _mask) { SetHeader(); @@ -5021,19 +4546,17 @@ struct StencilFunc { } gpu::CommandHeader header; - uint32 func; - int32 ref; - uint32 mask; + uint32_t func; + int32_t ref; + uint32_t mask; }; -COMPILE_ASSERT(sizeof(StencilFunc) == 16, - Sizeof_StencilFunc_is_not_16); +COMPILE_ASSERT(sizeof(StencilFunc) == 16, Sizeof_StencilFunc_is_not_16); COMPILE_ASSERT(offsetof(StencilFunc, header) == 0, OffsetOf_StencilFunc_header_not_0); COMPILE_ASSERT(offsetof(StencilFunc, func) == 4, OffsetOf_StencilFunc_func_not_4); -COMPILE_ASSERT(offsetof(StencilFunc, ref) == 8, - OffsetOf_StencilFunc_ref_not_8); +COMPILE_ASSERT(offsetof(StencilFunc, ref) == 8, OffsetOf_StencilFunc_ref_not_8); COMPILE_ASSERT(offsetof(StencilFunc, mask) == 12, OffsetOf_StencilFunc_mask_not_12); @@ -5041,14 +4564,13 @@ struct StencilFuncSeparate { typedef StencilFuncSeparate ValueType; static const CommandId kCmdId = kStencilFuncSeparate; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _face, GLenum _func, GLint _ref, GLuint _mask) { SetHeader(); @@ -5064,10 +4586,10 @@ struct StencilFuncSeparate { } gpu::CommandHeader header; - uint32 face; - uint32 func; - int32 ref; - uint32 mask; + uint32_t face; + uint32_t func; + int32_t ref; + uint32_t mask; }; COMPILE_ASSERT(sizeof(StencilFuncSeparate) == 20, @@ -5087,14 +4609,13 @@ struct StencilMask { typedef StencilMask ValueType; static const CommandId kCmdId = kStencilMask; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _mask) { SetHeader(); @@ -5107,11 +4628,10 @@ struct StencilMask { } gpu::CommandHeader header; - uint32 mask; + uint32_t mask; }; -COMPILE_ASSERT(sizeof(StencilMask) == 8, - Sizeof_StencilMask_is_not_8); +COMPILE_ASSERT(sizeof(StencilMask) == 8, Sizeof_StencilMask_is_not_8); COMPILE_ASSERT(offsetof(StencilMask, header) == 0, OffsetOf_StencilMask_header_not_0); COMPILE_ASSERT(offsetof(StencilMask, mask) == 4, @@ -5121,14 +4641,13 @@ struct StencilMaskSeparate { typedef StencilMaskSeparate ValueType; static const CommandId kCmdId = kStencilMaskSeparate; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _face, GLuint _mask) { SetHeader(); @@ -5142,8 +4661,8 @@ struct StencilMaskSeparate { } gpu::CommandHeader header; - uint32 face; - uint32 mask; + uint32_t face; + uint32_t mask; }; COMPILE_ASSERT(sizeof(StencilMaskSeparate) == 12, @@ -5159,14 +4678,13 @@ struct StencilOp { typedef StencilOp ValueType; static const CommandId kCmdId = kStencilOp; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _fail, GLenum _zfail, GLenum _zpass) { SetHeader(); @@ -5181,19 +4699,16 @@ struct StencilOp { } gpu::CommandHeader header; - uint32 fail; - uint32 zfail; - uint32 zpass; + uint32_t fail; + uint32_t zfail; + uint32_t zpass; }; -COMPILE_ASSERT(sizeof(StencilOp) == 16, - Sizeof_StencilOp_is_not_16); +COMPILE_ASSERT(sizeof(StencilOp) == 16, Sizeof_StencilOp_is_not_16); COMPILE_ASSERT(offsetof(StencilOp, header) == 0, OffsetOf_StencilOp_header_not_0); -COMPILE_ASSERT(offsetof(StencilOp, fail) == 4, - OffsetOf_StencilOp_fail_not_4); -COMPILE_ASSERT(offsetof(StencilOp, zfail) == 8, - OffsetOf_StencilOp_zfail_not_8); +COMPILE_ASSERT(offsetof(StencilOp, fail) == 4, OffsetOf_StencilOp_fail_not_4); +COMPILE_ASSERT(offsetof(StencilOp, zfail) == 8, OffsetOf_StencilOp_zfail_not_8); COMPILE_ASSERT(offsetof(StencilOp, zpass) == 12, OffsetOf_StencilOp_zpass_not_12); @@ -5201,14 +4716,13 @@ struct StencilOpSeparate { typedef StencilOpSeparate ValueType; static const CommandId kCmdId = kStencilOpSeparate; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _face, GLenum _fail, GLenum _zfail, GLenum _zpass) { SetHeader(); @@ -5218,17 +4732,20 @@ struct StencilOpSeparate { zpass = _zpass; } - void* Set( - void* cmd, GLenum _face, GLenum _fail, GLenum _zfail, GLenum _zpass) { + void* Set(void* cmd, + GLenum _face, + GLenum _fail, + GLenum _zfail, + GLenum _zpass) { static_cast<ValueType*>(cmd)->Init(_face, _fail, _zfail, _zpass); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 face; - uint32 fail; - uint32 zfail; - uint32 zpass; + uint32_t face; + uint32_t fail; + uint32_t zfail; + uint32_t zpass; }; COMPILE_ASSERT(sizeof(StencilOpSeparate) == 20, @@ -5248,58 +4765,71 @@ struct TexImage2D { typedef TexImage2D ValueType; static const CommandId kCmdId = kTexImage2D; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLint _level, GLint _internalformat, GLsizei _width, - GLsizei _height, GLint _border, GLenum _format, GLenum _type, - uint32 _pixels_shm_id, uint32 _pixels_shm_offset) { + void Init(GLenum _target, + GLint _level, + GLint _internalformat, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLenum _type, + uint32_t _pixels_shm_id, + uint32_t _pixels_shm_offset) { SetHeader(); target = _target; level = _level; internalformat = _internalformat; width = _width; height = _height; - border = _border; format = _format; type = _type; pixels_shm_id = _pixels_shm_id; pixels_shm_offset = _pixels_shm_offset; } - void* Set( - void* cmd, GLenum _target, GLint _level, GLint _internalformat, - GLsizei _width, GLsizei _height, GLint _border, GLenum _format, - GLenum _type, uint32 _pixels_shm_id, uint32 _pixels_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _target, _level, _internalformat, _width, _height, _border, _format, - _type, _pixels_shm_id, _pixels_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 target; - int32 level; - int32 internalformat; - int32 width; - int32 height; - int32 border; - uint32 format; - uint32 type; - uint32 pixels_shm_id; - uint32 pixels_shm_offset; -}; - -COMPILE_ASSERT(sizeof(TexImage2D) == 44, - Sizeof_TexImage2D_is_not_44); + void* Set(void* cmd, + GLenum _target, + GLint _level, + GLint _internalformat, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLenum _type, + uint32_t _pixels_shm_id, + uint32_t _pixels_shm_offset) { + static_cast<ValueType*>(cmd)->Init(_target, + _level, + _internalformat, + _width, + _height, + _format, + _type, + _pixels_shm_id, + _pixels_shm_offset); + return NextCmdAddress<ValueType>(cmd); + } + + gpu::CommandHeader header; + uint32_t target; + int32_t level; + int32_t internalformat; + int32_t width; + int32_t height; + uint32_t format; + uint32_t type; + uint32_t pixels_shm_id; + uint32_t pixels_shm_offset; + static const int32_t border = 0; +}; + +COMPILE_ASSERT(sizeof(TexImage2D) == 40, Sizeof_TexImage2D_is_not_40); COMPILE_ASSERT(offsetof(TexImage2D, header) == 0, OffsetOf_TexImage2D_header_not_0); COMPILE_ASSERT(offsetof(TexImage2D, target) == 4, @@ -5312,29 +4842,26 @@ COMPILE_ASSERT(offsetof(TexImage2D, width) == 16, OffsetOf_TexImage2D_width_not_16); COMPILE_ASSERT(offsetof(TexImage2D, height) == 20, OffsetOf_TexImage2D_height_not_20); -COMPILE_ASSERT(offsetof(TexImage2D, border) == 24, - OffsetOf_TexImage2D_border_not_24); -COMPILE_ASSERT(offsetof(TexImage2D, format) == 28, - OffsetOf_TexImage2D_format_not_28); -COMPILE_ASSERT(offsetof(TexImage2D, type) == 32, - OffsetOf_TexImage2D_type_not_32); -COMPILE_ASSERT(offsetof(TexImage2D, pixels_shm_id) == 36, - OffsetOf_TexImage2D_pixels_shm_id_not_36); -COMPILE_ASSERT(offsetof(TexImage2D, pixels_shm_offset) == 40, - OffsetOf_TexImage2D_pixels_shm_offset_not_40); +COMPILE_ASSERT(offsetof(TexImage2D, format) == 24, + OffsetOf_TexImage2D_format_not_24); +COMPILE_ASSERT(offsetof(TexImage2D, type) == 28, + OffsetOf_TexImage2D_type_not_28); +COMPILE_ASSERT(offsetof(TexImage2D, pixels_shm_id) == 32, + OffsetOf_TexImage2D_pixels_shm_id_not_32); +COMPILE_ASSERT(offsetof(TexImage2D, pixels_shm_offset) == 36, + OffsetOf_TexImage2D_pixels_shm_offset_not_36); struct TexParameterf { typedef TexParameterf ValueType; static const CommandId kCmdId = kTexParameterf; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target, GLenum _pname, GLfloat _param) { SetHeader(); @@ -5349,13 +4876,12 @@ struct TexParameterf { } gpu::CommandHeader header; - uint32 target; - uint32 pname; + uint32_t target; + uint32_t pname; float param; }; -COMPILE_ASSERT(sizeof(TexParameterf) == 16, - Sizeof_TexParameterf_is_not_16); +COMPILE_ASSERT(sizeof(TexParameterf) == 16, Sizeof_TexParameterf_is_not_16); COMPILE_ASSERT(offsetof(TexParameterf, header) == 0, OffsetOf_TexParameterf_header_not_0); COMPILE_ASSERT(offsetof(TexParameterf, target) == 4, @@ -5365,93 +4891,39 @@ COMPILE_ASSERT(offsetof(TexParameterf, pname) == 8, COMPILE_ASSERT(offsetof(TexParameterf, param) == 12, OffsetOf_TexParameterf_param_not_12); -struct TexParameterfv { - typedef TexParameterfv ValueType; - static const CommandId kCmdId = kTexParameterfv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - SetHeader(); - target = _target; - pname = _pname; - params_shm_id = _params_shm_id; - params_shm_offset = _params_shm_offset; - } - - void* Set( - void* cmd, GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_target, _pname, _params_shm_id, _params_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 target; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; -}; - -COMPILE_ASSERT(sizeof(TexParameterfv) == 20, - Sizeof_TexParameterfv_is_not_20); -COMPILE_ASSERT(offsetof(TexParameterfv, header) == 0, - OffsetOf_TexParameterfv_header_not_0); -COMPILE_ASSERT(offsetof(TexParameterfv, target) == 4, - OffsetOf_TexParameterfv_target_not_4); -COMPILE_ASSERT(offsetof(TexParameterfv, pname) == 8, - OffsetOf_TexParameterfv_pname_not_8); -COMPILE_ASSERT(offsetof(TexParameterfv, params_shm_id) == 12, - OffsetOf_TexParameterfv_params_shm_id_not_12); -COMPILE_ASSERT(offsetof(TexParameterfv, params_shm_offset) == 16, - OffsetOf_TexParameterfv_params_shm_offset_not_16); - struct TexParameterfvImmediate { typedef TexParameterfvImmediate ValueType; static const CommandId kCmdId = kTexParameterfvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize() { - return static_cast<uint32>( - sizeof(GLfloat) * 1); // NOLINT + static uint32_t ComputeDataSize() { + return static_cast<uint32_t>(sizeof(GLfloat) * 1); // NOLINT } - static uint32 ComputeSize() { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize()); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize()); // NOLINT } - void SetHeader() { - header.SetCmdByTotalSize<ValueType>(ComputeSize()); - } + void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } void Init(GLenum _target, GLenum _pname, const GLfloat* _params) { SetHeader(); target = _target; pname = _pname; - memcpy(ImmediateDataAddress(this), - _params, ComputeDataSize()); + memcpy(ImmediateDataAddress(this), _params, ComputeDataSize()); } void* Set(void* cmd, GLenum _target, GLenum _pname, const GLfloat* _params) { static_cast<ValueType*>(cmd)->Init(_target, _pname, _params); - const uint32 size = ComputeSize(); + const uint32_t size = ComputeSize(); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - uint32 target; - uint32 pname; + uint32_t target; + uint32_t pname; }; COMPILE_ASSERT(sizeof(TexParameterfvImmediate) == 12, @@ -5467,14 +4939,13 @@ struct TexParameteri { typedef TexParameteri ValueType; static const CommandId kCmdId = kTexParameteri; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target, GLenum _pname, GLint _param) { SetHeader(); @@ -5489,13 +4960,12 @@ struct TexParameteri { } gpu::CommandHeader header; - uint32 target; - uint32 pname; - int32 param; + uint32_t target; + uint32_t pname; + int32_t param; }; -COMPILE_ASSERT(sizeof(TexParameteri) == 16, - Sizeof_TexParameteri_is_not_16); +COMPILE_ASSERT(sizeof(TexParameteri) == 16, Sizeof_TexParameteri_is_not_16); COMPILE_ASSERT(offsetof(TexParameteri, header) == 0, OffsetOf_TexParameteri_header_not_0); COMPILE_ASSERT(offsetof(TexParameteri, target) == 4, @@ -5505,93 +4975,39 @@ COMPILE_ASSERT(offsetof(TexParameteri, pname) == 8, COMPILE_ASSERT(offsetof(TexParameteri, param) == 12, OffsetOf_TexParameteri_param_not_12); -struct TexParameteriv { - typedef TexParameteriv ValueType; - static const CommandId kCmdId = kTexParameteriv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - SetHeader(); - target = _target; - pname = _pname; - params_shm_id = _params_shm_id; - params_shm_offset = _params_shm_offset; - } - - void* Set( - void* cmd, GLenum _target, GLenum _pname, uint32 _params_shm_id, - uint32 _params_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_target, _pname, _params_shm_id, _params_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 target; - uint32 pname; - uint32 params_shm_id; - uint32 params_shm_offset; -}; - -COMPILE_ASSERT(sizeof(TexParameteriv) == 20, - Sizeof_TexParameteriv_is_not_20); -COMPILE_ASSERT(offsetof(TexParameteriv, header) == 0, - OffsetOf_TexParameteriv_header_not_0); -COMPILE_ASSERT(offsetof(TexParameteriv, target) == 4, - OffsetOf_TexParameteriv_target_not_4); -COMPILE_ASSERT(offsetof(TexParameteriv, pname) == 8, - OffsetOf_TexParameteriv_pname_not_8); -COMPILE_ASSERT(offsetof(TexParameteriv, params_shm_id) == 12, - OffsetOf_TexParameteriv_params_shm_id_not_12); -COMPILE_ASSERT(offsetof(TexParameteriv, params_shm_offset) == 16, - OffsetOf_TexParameteriv_params_shm_offset_not_16); - struct TexParameterivImmediate { typedef TexParameterivImmediate ValueType; static const CommandId kCmdId = kTexParameterivImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize() { - return static_cast<uint32>( - sizeof(GLint) * 1); // NOLINT + static uint32_t ComputeDataSize() { + return static_cast<uint32_t>(sizeof(GLint) * 1); // NOLINT } - static uint32 ComputeSize() { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize()); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize()); // NOLINT } - void SetHeader() { - header.SetCmdByTotalSize<ValueType>(ComputeSize()); - } + void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } void Init(GLenum _target, GLenum _pname, const GLint* _params) { SetHeader(); target = _target; pname = _pname; - memcpy(ImmediateDataAddress(this), - _params, ComputeDataSize()); + memcpy(ImmediateDataAddress(this), _params, ComputeDataSize()); } void* Set(void* cmd, GLenum _target, GLenum _pname, const GLint* _params) { static_cast<ValueType*>(cmd)->Init(_target, _pname, _params); - const uint32 size = ComputeSize(); + const uint32_t size = ComputeSize(); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - uint32 target; - uint32 pname; + uint32_t target; + uint32_t pname; }; COMPILE_ASSERT(sizeof(TexParameterivImmediate) == 12, @@ -5607,19 +5023,25 @@ struct TexSubImage2D { typedef TexSubImage2D ValueType; static const CommandId kCmdId = kTexSubImage2D; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, - GLsizei _width, GLsizei _height, GLenum _format, GLenum _type, - uint32 _pixels_shm_id, uint32 _pixels_shm_offset, GLboolean _internal) { + void Init(GLenum _target, + GLint _level, + GLint _xoffset, + GLint _yoffset, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLenum _type, + uint32_t _pixels_shm_id, + uint32_t _pixels_shm_offset, + GLboolean _internal) { SetHeader(); target = _target; level = _level; @@ -5634,33 +5056,47 @@ struct TexSubImage2D { internal = _internal; } - void* Set( - void* cmd, GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, - GLsizei _width, GLsizei _height, GLenum _format, GLenum _type, - uint32 _pixels_shm_id, uint32 _pixels_shm_offset, GLboolean _internal) { - static_cast<ValueType*>( - cmd)->Init( - _target, _level, _xoffset, _yoffset, _width, _height, _format, - _type, _pixels_shm_id, _pixels_shm_offset, _internal); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 target; - int32 level; - int32 xoffset; - int32 yoffset; - int32 width; - int32 height; - uint32 format; - uint32 type; - uint32 pixels_shm_id; - uint32 pixels_shm_offset; - uint32 internal; -}; - -COMPILE_ASSERT(sizeof(TexSubImage2D) == 48, - Sizeof_TexSubImage2D_is_not_48); + void* Set(void* cmd, + GLenum _target, + GLint _level, + GLint _xoffset, + GLint _yoffset, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLenum _type, + uint32_t _pixels_shm_id, + uint32_t _pixels_shm_offset, + GLboolean _internal) { + static_cast<ValueType*>(cmd)->Init(_target, + _level, + _xoffset, + _yoffset, + _width, + _height, + _format, + _type, + _pixels_shm_id, + _pixels_shm_offset, + _internal); + return NextCmdAddress<ValueType>(cmd); + } + + gpu::CommandHeader header; + uint32_t target; + int32_t level; + int32_t xoffset; + int32_t yoffset; + int32_t width; + int32_t height; + uint32_t format; + uint32_t type; + uint32_t pixels_shm_id; + uint32_t pixels_shm_offset; + uint32_t internal; +}; + +COMPILE_ASSERT(sizeof(TexSubImage2D) == 48, Sizeof_TexSubImage2D_is_not_48); COMPILE_ASSERT(offsetof(TexSubImage2D, header) == 0, OffsetOf_TexSubImage2D_header_not_0); COMPILE_ASSERT(offsetof(TexSubImage2D, target) == 4, @@ -5690,14 +5126,13 @@ struct Uniform1f { typedef Uniform1f ValueType; static const CommandId kCmdId = kUniform1f; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _location, GLfloat _x) { SetHeader(); @@ -5711,83 +5146,30 @@ struct Uniform1f { } gpu::CommandHeader header; - int32 location; + int32_t location; float x; }; -COMPILE_ASSERT(sizeof(Uniform1f) == 12, - Sizeof_Uniform1f_is_not_12); +COMPILE_ASSERT(sizeof(Uniform1f) == 12, Sizeof_Uniform1f_is_not_12); COMPILE_ASSERT(offsetof(Uniform1f, header) == 0, OffsetOf_Uniform1f_header_not_0); COMPILE_ASSERT(offsetof(Uniform1f, location) == 4, OffsetOf_Uniform1f_location_not_4); -COMPILE_ASSERT(offsetof(Uniform1f, x) == 8, - OffsetOf_Uniform1f_x_not_8); - -struct Uniform1fv { - typedef Uniform1fv ValueType; - static const CommandId kCmdId = kUniform1fv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - SetHeader(); - location = _location; - count = _count; - v_shm_id = _v_shm_id; - v_shm_offset = _v_shm_offset; - } - - void* Set( - void* cmd, GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_location, _count, _v_shm_id, _v_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 location; - int32 count; - uint32 v_shm_id; - uint32 v_shm_offset; -}; - -COMPILE_ASSERT(sizeof(Uniform1fv) == 20, - Sizeof_Uniform1fv_is_not_20); -COMPILE_ASSERT(offsetof(Uniform1fv, header) == 0, - OffsetOf_Uniform1fv_header_not_0); -COMPILE_ASSERT(offsetof(Uniform1fv, location) == 4, - OffsetOf_Uniform1fv_location_not_4); -COMPILE_ASSERT(offsetof(Uniform1fv, count) == 8, - OffsetOf_Uniform1fv_count_not_8); -COMPILE_ASSERT(offsetof(Uniform1fv, v_shm_id) == 12, - OffsetOf_Uniform1fv_v_shm_id_not_12); -COMPILE_ASSERT(offsetof(Uniform1fv, v_shm_offset) == 16, - OffsetOf_Uniform1fv_v_shm_offset_not_16); +COMPILE_ASSERT(offsetof(Uniform1f, x) == 8, OffsetOf_Uniform1f_x_not_8); struct Uniform1fvImmediate { typedef Uniform1fvImmediate ValueType; static const CommandId kCmdId = kUniform1fvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLfloat) * 1 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLfloat) * 1 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { @@ -5798,19 +5180,18 @@ struct Uniform1fvImmediate { SetHeader(_count); location = _location; count = _count; - memcpy(ImmediateDataAddress(this), - _v, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count)); } void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _v) { static_cast<ValueType*>(cmd)->Init(_location, _count, _v); - const uint32 size = ComputeSize(_count); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 location; - int32 count; + int32_t location; + int32_t count; }; COMPILE_ASSERT(sizeof(Uniform1fvImmediate) == 12, @@ -5826,14 +5207,13 @@ struct Uniform1i { typedef Uniform1i ValueType; static const CommandId kCmdId = kUniform1i; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _location, GLint _x) { SetHeader(); @@ -5847,83 +5227,30 @@ struct Uniform1i { } gpu::CommandHeader header; - int32 location; - int32 x; + int32_t location; + int32_t x; }; -COMPILE_ASSERT(sizeof(Uniform1i) == 12, - Sizeof_Uniform1i_is_not_12); +COMPILE_ASSERT(sizeof(Uniform1i) == 12, Sizeof_Uniform1i_is_not_12); COMPILE_ASSERT(offsetof(Uniform1i, header) == 0, OffsetOf_Uniform1i_header_not_0); COMPILE_ASSERT(offsetof(Uniform1i, location) == 4, OffsetOf_Uniform1i_location_not_4); -COMPILE_ASSERT(offsetof(Uniform1i, x) == 8, - OffsetOf_Uniform1i_x_not_8); - -struct Uniform1iv { - typedef Uniform1iv ValueType; - static const CommandId kCmdId = kUniform1iv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - SetHeader(); - location = _location; - count = _count; - v_shm_id = _v_shm_id; - v_shm_offset = _v_shm_offset; - } - - void* Set( - void* cmd, GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_location, _count, _v_shm_id, _v_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 location; - int32 count; - uint32 v_shm_id; - uint32 v_shm_offset; -}; - -COMPILE_ASSERT(sizeof(Uniform1iv) == 20, - Sizeof_Uniform1iv_is_not_20); -COMPILE_ASSERT(offsetof(Uniform1iv, header) == 0, - OffsetOf_Uniform1iv_header_not_0); -COMPILE_ASSERT(offsetof(Uniform1iv, location) == 4, - OffsetOf_Uniform1iv_location_not_4); -COMPILE_ASSERT(offsetof(Uniform1iv, count) == 8, - OffsetOf_Uniform1iv_count_not_8); -COMPILE_ASSERT(offsetof(Uniform1iv, v_shm_id) == 12, - OffsetOf_Uniform1iv_v_shm_id_not_12); -COMPILE_ASSERT(offsetof(Uniform1iv, v_shm_offset) == 16, - OffsetOf_Uniform1iv_v_shm_offset_not_16); +COMPILE_ASSERT(offsetof(Uniform1i, x) == 8, OffsetOf_Uniform1i_x_not_8); struct Uniform1ivImmediate { typedef Uniform1ivImmediate ValueType; static const CommandId kCmdId = kUniform1ivImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLint) * 1 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLint) * 1 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { @@ -5934,19 +5261,18 @@ struct Uniform1ivImmediate { SetHeader(_count); location = _location; count = _count; - memcpy(ImmediateDataAddress(this), - _v, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count)); } void* Set(void* cmd, GLint _location, GLsizei _count, const GLint* _v) { static_cast<ValueType*>(cmd)->Init(_location, _count, _v); - const uint32 size = ComputeSize(_count); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 location; - int32 count; + int32_t location; + int32_t count; }; COMPILE_ASSERT(sizeof(Uniform1ivImmediate) == 12, @@ -5962,14 +5288,13 @@ struct Uniform2f { typedef Uniform2f ValueType; static const CommandId kCmdId = kUniform2f; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _location, GLfloat _x, GLfloat _y) { SetHeader(); @@ -5984,86 +5309,32 @@ struct Uniform2f { } gpu::CommandHeader header; - int32 location; + int32_t location; float x; float y; }; -COMPILE_ASSERT(sizeof(Uniform2f) == 16, - Sizeof_Uniform2f_is_not_16); +COMPILE_ASSERT(sizeof(Uniform2f) == 16, Sizeof_Uniform2f_is_not_16); COMPILE_ASSERT(offsetof(Uniform2f, header) == 0, OffsetOf_Uniform2f_header_not_0); COMPILE_ASSERT(offsetof(Uniform2f, location) == 4, OffsetOf_Uniform2f_location_not_4); -COMPILE_ASSERT(offsetof(Uniform2f, x) == 8, - OffsetOf_Uniform2f_x_not_8); -COMPILE_ASSERT(offsetof(Uniform2f, y) == 12, - OffsetOf_Uniform2f_y_not_12); - -struct Uniform2fv { - typedef Uniform2fv ValueType; - static const CommandId kCmdId = kUniform2fv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - SetHeader(); - location = _location; - count = _count; - v_shm_id = _v_shm_id; - v_shm_offset = _v_shm_offset; - } - - void* Set( - void* cmd, GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_location, _count, _v_shm_id, _v_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 location; - int32 count; - uint32 v_shm_id; - uint32 v_shm_offset; -}; - -COMPILE_ASSERT(sizeof(Uniform2fv) == 20, - Sizeof_Uniform2fv_is_not_20); -COMPILE_ASSERT(offsetof(Uniform2fv, header) == 0, - OffsetOf_Uniform2fv_header_not_0); -COMPILE_ASSERT(offsetof(Uniform2fv, location) == 4, - OffsetOf_Uniform2fv_location_not_4); -COMPILE_ASSERT(offsetof(Uniform2fv, count) == 8, - OffsetOf_Uniform2fv_count_not_8); -COMPILE_ASSERT(offsetof(Uniform2fv, v_shm_id) == 12, - OffsetOf_Uniform2fv_v_shm_id_not_12); -COMPILE_ASSERT(offsetof(Uniform2fv, v_shm_offset) == 16, - OffsetOf_Uniform2fv_v_shm_offset_not_16); +COMPILE_ASSERT(offsetof(Uniform2f, x) == 8, OffsetOf_Uniform2f_x_not_8); +COMPILE_ASSERT(offsetof(Uniform2f, y) == 12, OffsetOf_Uniform2f_y_not_12); struct Uniform2fvImmediate { typedef Uniform2fvImmediate ValueType; static const CommandId kCmdId = kUniform2fvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLfloat) * 2 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLfloat) * 2 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { @@ -6074,19 +5345,18 @@ struct Uniform2fvImmediate { SetHeader(_count); location = _location; count = _count; - memcpy(ImmediateDataAddress(this), - _v, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count)); } void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _v) { static_cast<ValueType*>(cmd)->Init(_location, _count, _v); - const uint32 size = ComputeSize(_count); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 location; - int32 count; + int32_t location; + int32_t count; }; COMPILE_ASSERT(sizeof(Uniform2fvImmediate) == 12, @@ -6102,14 +5372,13 @@ struct Uniform2i { typedef Uniform2i ValueType; static const CommandId kCmdId = kUniform2i; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _location, GLint _x, GLint _y) { SetHeader(); @@ -6124,86 +5393,32 @@ struct Uniform2i { } gpu::CommandHeader header; - int32 location; - int32 x; - int32 y; + int32_t location; + int32_t x; + int32_t y; }; -COMPILE_ASSERT(sizeof(Uniform2i) == 16, - Sizeof_Uniform2i_is_not_16); +COMPILE_ASSERT(sizeof(Uniform2i) == 16, Sizeof_Uniform2i_is_not_16); COMPILE_ASSERT(offsetof(Uniform2i, header) == 0, OffsetOf_Uniform2i_header_not_0); COMPILE_ASSERT(offsetof(Uniform2i, location) == 4, OffsetOf_Uniform2i_location_not_4); -COMPILE_ASSERT(offsetof(Uniform2i, x) == 8, - OffsetOf_Uniform2i_x_not_8); -COMPILE_ASSERT(offsetof(Uniform2i, y) == 12, - OffsetOf_Uniform2i_y_not_12); - -struct Uniform2iv { - typedef Uniform2iv ValueType; - static const CommandId kCmdId = kUniform2iv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - SetHeader(); - location = _location; - count = _count; - v_shm_id = _v_shm_id; - v_shm_offset = _v_shm_offset; - } - - void* Set( - void* cmd, GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_location, _count, _v_shm_id, _v_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 location; - int32 count; - uint32 v_shm_id; - uint32 v_shm_offset; -}; - -COMPILE_ASSERT(sizeof(Uniform2iv) == 20, - Sizeof_Uniform2iv_is_not_20); -COMPILE_ASSERT(offsetof(Uniform2iv, header) == 0, - OffsetOf_Uniform2iv_header_not_0); -COMPILE_ASSERT(offsetof(Uniform2iv, location) == 4, - OffsetOf_Uniform2iv_location_not_4); -COMPILE_ASSERT(offsetof(Uniform2iv, count) == 8, - OffsetOf_Uniform2iv_count_not_8); -COMPILE_ASSERT(offsetof(Uniform2iv, v_shm_id) == 12, - OffsetOf_Uniform2iv_v_shm_id_not_12); -COMPILE_ASSERT(offsetof(Uniform2iv, v_shm_offset) == 16, - OffsetOf_Uniform2iv_v_shm_offset_not_16); +COMPILE_ASSERT(offsetof(Uniform2i, x) == 8, OffsetOf_Uniform2i_x_not_8); +COMPILE_ASSERT(offsetof(Uniform2i, y) == 12, OffsetOf_Uniform2i_y_not_12); struct Uniform2ivImmediate { typedef Uniform2ivImmediate ValueType; static const CommandId kCmdId = kUniform2ivImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLint) * 2 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLint) * 2 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { @@ -6214,19 +5429,18 @@ struct Uniform2ivImmediate { SetHeader(_count); location = _location; count = _count; - memcpy(ImmediateDataAddress(this), - _v, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count)); } void* Set(void* cmd, GLint _location, GLsizei _count, const GLint* _v) { static_cast<ValueType*>(cmd)->Init(_location, _count, _v); - const uint32 size = ComputeSize(_count); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 location; - int32 count; + int32_t location; + int32_t count; }; COMPILE_ASSERT(sizeof(Uniform2ivImmediate) == 12, @@ -6242,14 +5456,13 @@ struct Uniform3f { typedef Uniform3f ValueType; static const CommandId kCmdId = kUniform3f; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _location, GLfloat _x, GLfloat _y, GLfloat _z) { SetHeader(); @@ -6265,89 +5478,34 @@ struct Uniform3f { } gpu::CommandHeader header; - int32 location; + int32_t location; float x; float y; float z; }; -COMPILE_ASSERT(sizeof(Uniform3f) == 20, - Sizeof_Uniform3f_is_not_20); +COMPILE_ASSERT(sizeof(Uniform3f) == 20, Sizeof_Uniform3f_is_not_20); COMPILE_ASSERT(offsetof(Uniform3f, header) == 0, OffsetOf_Uniform3f_header_not_0); COMPILE_ASSERT(offsetof(Uniform3f, location) == 4, OffsetOf_Uniform3f_location_not_4); -COMPILE_ASSERT(offsetof(Uniform3f, x) == 8, - OffsetOf_Uniform3f_x_not_8); -COMPILE_ASSERT(offsetof(Uniform3f, y) == 12, - OffsetOf_Uniform3f_y_not_12); -COMPILE_ASSERT(offsetof(Uniform3f, z) == 16, - OffsetOf_Uniform3f_z_not_16); - -struct Uniform3fv { - typedef Uniform3fv ValueType; - static const CommandId kCmdId = kUniform3fv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - SetHeader(); - location = _location; - count = _count; - v_shm_id = _v_shm_id; - v_shm_offset = _v_shm_offset; - } - - void* Set( - void* cmd, GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_location, _count, _v_shm_id, _v_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 location; - int32 count; - uint32 v_shm_id; - uint32 v_shm_offset; -}; - -COMPILE_ASSERT(sizeof(Uniform3fv) == 20, - Sizeof_Uniform3fv_is_not_20); -COMPILE_ASSERT(offsetof(Uniform3fv, header) == 0, - OffsetOf_Uniform3fv_header_not_0); -COMPILE_ASSERT(offsetof(Uniform3fv, location) == 4, - OffsetOf_Uniform3fv_location_not_4); -COMPILE_ASSERT(offsetof(Uniform3fv, count) == 8, - OffsetOf_Uniform3fv_count_not_8); -COMPILE_ASSERT(offsetof(Uniform3fv, v_shm_id) == 12, - OffsetOf_Uniform3fv_v_shm_id_not_12); -COMPILE_ASSERT(offsetof(Uniform3fv, v_shm_offset) == 16, - OffsetOf_Uniform3fv_v_shm_offset_not_16); +COMPILE_ASSERT(offsetof(Uniform3f, x) == 8, OffsetOf_Uniform3f_x_not_8); +COMPILE_ASSERT(offsetof(Uniform3f, y) == 12, OffsetOf_Uniform3f_y_not_12); +COMPILE_ASSERT(offsetof(Uniform3f, z) == 16, OffsetOf_Uniform3f_z_not_16); struct Uniform3fvImmediate { typedef Uniform3fvImmediate ValueType; static const CommandId kCmdId = kUniform3fvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLfloat) * 3 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLfloat) * 3 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { @@ -6358,19 +5516,18 @@ struct Uniform3fvImmediate { SetHeader(_count); location = _location; count = _count; - memcpy(ImmediateDataAddress(this), - _v, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count)); } void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _v) { static_cast<ValueType*>(cmd)->Init(_location, _count, _v); - const uint32 size = ComputeSize(_count); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 location; - int32 count; + int32_t location; + int32_t count; }; COMPILE_ASSERT(sizeof(Uniform3fvImmediate) == 12, @@ -6386,14 +5543,13 @@ struct Uniform3i { typedef Uniform3i ValueType; static const CommandId kCmdId = kUniform3i; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _location, GLint _x, GLint _y, GLint _z) { SetHeader(); @@ -6409,89 +5565,34 @@ struct Uniform3i { } gpu::CommandHeader header; - int32 location; - int32 x; - int32 y; - int32 z; + int32_t location; + int32_t x; + int32_t y; + int32_t z; }; -COMPILE_ASSERT(sizeof(Uniform3i) == 20, - Sizeof_Uniform3i_is_not_20); +COMPILE_ASSERT(sizeof(Uniform3i) == 20, Sizeof_Uniform3i_is_not_20); COMPILE_ASSERT(offsetof(Uniform3i, header) == 0, OffsetOf_Uniform3i_header_not_0); COMPILE_ASSERT(offsetof(Uniform3i, location) == 4, OffsetOf_Uniform3i_location_not_4); -COMPILE_ASSERT(offsetof(Uniform3i, x) == 8, - OffsetOf_Uniform3i_x_not_8); -COMPILE_ASSERT(offsetof(Uniform3i, y) == 12, - OffsetOf_Uniform3i_y_not_12); -COMPILE_ASSERT(offsetof(Uniform3i, z) == 16, - OffsetOf_Uniform3i_z_not_16); - -struct Uniform3iv { - typedef Uniform3iv ValueType; - static const CommandId kCmdId = kUniform3iv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - SetHeader(); - location = _location; - count = _count; - v_shm_id = _v_shm_id; - v_shm_offset = _v_shm_offset; - } - - void* Set( - void* cmd, GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_location, _count, _v_shm_id, _v_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 location; - int32 count; - uint32 v_shm_id; - uint32 v_shm_offset; -}; - -COMPILE_ASSERT(sizeof(Uniform3iv) == 20, - Sizeof_Uniform3iv_is_not_20); -COMPILE_ASSERT(offsetof(Uniform3iv, header) == 0, - OffsetOf_Uniform3iv_header_not_0); -COMPILE_ASSERT(offsetof(Uniform3iv, location) == 4, - OffsetOf_Uniform3iv_location_not_4); -COMPILE_ASSERT(offsetof(Uniform3iv, count) == 8, - OffsetOf_Uniform3iv_count_not_8); -COMPILE_ASSERT(offsetof(Uniform3iv, v_shm_id) == 12, - OffsetOf_Uniform3iv_v_shm_id_not_12); -COMPILE_ASSERT(offsetof(Uniform3iv, v_shm_offset) == 16, - OffsetOf_Uniform3iv_v_shm_offset_not_16); +COMPILE_ASSERT(offsetof(Uniform3i, x) == 8, OffsetOf_Uniform3i_x_not_8); +COMPILE_ASSERT(offsetof(Uniform3i, y) == 12, OffsetOf_Uniform3i_y_not_12); +COMPILE_ASSERT(offsetof(Uniform3i, z) == 16, OffsetOf_Uniform3i_z_not_16); struct Uniform3ivImmediate { typedef Uniform3ivImmediate ValueType; static const CommandId kCmdId = kUniform3ivImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLint) * 3 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLint) * 3 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { @@ -6502,19 +5603,18 @@ struct Uniform3ivImmediate { SetHeader(_count); location = _location; count = _count; - memcpy(ImmediateDataAddress(this), - _v, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count)); } void* Set(void* cmd, GLint _location, GLsizei _count, const GLint* _v) { static_cast<ValueType*>(cmd)->Init(_location, _count, _v); - const uint32 size = ComputeSize(_count); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 location; - int32 count; + int32_t location; + int32_t count; }; COMPILE_ASSERT(sizeof(Uniform3ivImmediate) == 12, @@ -6530,14 +5630,13 @@ struct Uniform4f { typedef Uniform4f ValueType; static const CommandId kCmdId = kUniform4f; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _location, GLfloat _x, GLfloat _y, GLfloat _z, GLfloat _w) { SetHeader(); @@ -6548,100 +5647,47 @@ struct Uniform4f { w = _w; } - void* Set( - void* cmd, GLint _location, GLfloat _x, GLfloat _y, GLfloat _z, - GLfloat _w) { + void* Set(void* cmd, + GLint _location, + GLfloat _x, + GLfloat _y, + GLfloat _z, + GLfloat _w) { static_cast<ValueType*>(cmd)->Init(_location, _x, _y, _z, _w); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - int32 location; + int32_t location; float x; float y; float z; float w; }; -COMPILE_ASSERT(sizeof(Uniform4f) == 24, - Sizeof_Uniform4f_is_not_24); +COMPILE_ASSERT(sizeof(Uniform4f) == 24, Sizeof_Uniform4f_is_not_24); COMPILE_ASSERT(offsetof(Uniform4f, header) == 0, OffsetOf_Uniform4f_header_not_0); COMPILE_ASSERT(offsetof(Uniform4f, location) == 4, OffsetOf_Uniform4f_location_not_4); -COMPILE_ASSERT(offsetof(Uniform4f, x) == 8, - OffsetOf_Uniform4f_x_not_8); -COMPILE_ASSERT(offsetof(Uniform4f, y) == 12, - OffsetOf_Uniform4f_y_not_12); -COMPILE_ASSERT(offsetof(Uniform4f, z) == 16, - OffsetOf_Uniform4f_z_not_16); -COMPILE_ASSERT(offsetof(Uniform4f, w) == 20, - OffsetOf_Uniform4f_w_not_20); - -struct Uniform4fv { - typedef Uniform4fv ValueType; - static const CommandId kCmdId = kUniform4fv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - SetHeader(); - location = _location; - count = _count; - v_shm_id = _v_shm_id; - v_shm_offset = _v_shm_offset; - } - - void* Set( - void* cmd, GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_location, _count, _v_shm_id, _v_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 location; - int32 count; - uint32 v_shm_id; - uint32 v_shm_offset; -}; - -COMPILE_ASSERT(sizeof(Uniform4fv) == 20, - Sizeof_Uniform4fv_is_not_20); -COMPILE_ASSERT(offsetof(Uniform4fv, header) == 0, - OffsetOf_Uniform4fv_header_not_0); -COMPILE_ASSERT(offsetof(Uniform4fv, location) == 4, - OffsetOf_Uniform4fv_location_not_4); -COMPILE_ASSERT(offsetof(Uniform4fv, count) == 8, - OffsetOf_Uniform4fv_count_not_8); -COMPILE_ASSERT(offsetof(Uniform4fv, v_shm_id) == 12, - OffsetOf_Uniform4fv_v_shm_id_not_12); -COMPILE_ASSERT(offsetof(Uniform4fv, v_shm_offset) == 16, - OffsetOf_Uniform4fv_v_shm_offset_not_16); +COMPILE_ASSERT(offsetof(Uniform4f, x) == 8, OffsetOf_Uniform4f_x_not_8); +COMPILE_ASSERT(offsetof(Uniform4f, y) == 12, OffsetOf_Uniform4f_y_not_12); +COMPILE_ASSERT(offsetof(Uniform4f, z) == 16, OffsetOf_Uniform4f_z_not_16); +COMPILE_ASSERT(offsetof(Uniform4f, w) == 20, OffsetOf_Uniform4f_w_not_20); struct Uniform4fvImmediate { typedef Uniform4fvImmediate ValueType; static const CommandId kCmdId = kUniform4fvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLfloat) * 4 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLfloat) * 4 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { @@ -6652,19 +5698,18 @@ struct Uniform4fvImmediate { SetHeader(_count); location = _location; count = _count; - memcpy(ImmediateDataAddress(this), - _v, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count)); } void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _v) { static_cast<ValueType*>(cmd)->Init(_location, _count, _v); - const uint32 size = ComputeSize(_count); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 location; - int32 count; + int32_t location; + int32_t count; }; COMPILE_ASSERT(sizeof(Uniform4fvImmediate) == 12, @@ -6680,14 +5725,13 @@ struct Uniform4i { typedef Uniform4i ValueType; static const CommandId kCmdId = kUniform4i; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _location, GLint _x, GLint _y, GLint _z, GLint _w) { SetHeader(); @@ -6698,99 +5742,47 @@ struct Uniform4i { w = _w; } - void* Set( - void* cmd, GLint _location, GLint _x, GLint _y, GLint _z, GLint _w) { + void* Set(void* cmd, + GLint _location, + GLint _x, + GLint _y, + GLint _z, + GLint _w) { static_cast<ValueType*>(cmd)->Init(_location, _x, _y, _z, _w); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - int32 location; - int32 x; - int32 y; - int32 z; - int32 w; + int32_t location; + int32_t x; + int32_t y; + int32_t z; + int32_t w; }; -COMPILE_ASSERT(sizeof(Uniform4i) == 24, - Sizeof_Uniform4i_is_not_24); +COMPILE_ASSERT(sizeof(Uniform4i) == 24, Sizeof_Uniform4i_is_not_24); COMPILE_ASSERT(offsetof(Uniform4i, header) == 0, OffsetOf_Uniform4i_header_not_0); COMPILE_ASSERT(offsetof(Uniform4i, location) == 4, OffsetOf_Uniform4i_location_not_4); -COMPILE_ASSERT(offsetof(Uniform4i, x) == 8, - OffsetOf_Uniform4i_x_not_8); -COMPILE_ASSERT(offsetof(Uniform4i, y) == 12, - OffsetOf_Uniform4i_y_not_12); -COMPILE_ASSERT(offsetof(Uniform4i, z) == 16, - OffsetOf_Uniform4i_z_not_16); -COMPILE_ASSERT(offsetof(Uniform4i, w) == 20, - OffsetOf_Uniform4i_w_not_20); - -struct Uniform4iv { - typedef Uniform4iv ValueType; - static const CommandId kCmdId = kUniform4iv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - SetHeader(); - location = _location; - count = _count; - v_shm_id = _v_shm_id; - v_shm_offset = _v_shm_offset; - } - - void* Set( - void* cmd, GLint _location, GLsizei _count, uint32 _v_shm_id, - uint32 _v_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_location, _count, _v_shm_id, _v_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 location; - int32 count; - uint32 v_shm_id; - uint32 v_shm_offset; -}; - -COMPILE_ASSERT(sizeof(Uniform4iv) == 20, - Sizeof_Uniform4iv_is_not_20); -COMPILE_ASSERT(offsetof(Uniform4iv, header) == 0, - OffsetOf_Uniform4iv_header_not_0); -COMPILE_ASSERT(offsetof(Uniform4iv, location) == 4, - OffsetOf_Uniform4iv_location_not_4); -COMPILE_ASSERT(offsetof(Uniform4iv, count) == 8, - OffsetOf_Uniform4iv_count_not_8); -COMPILE_ASSERT(offsetof(Uniform4iv, v_shm_id) == 12, - OffsetOf_Uniform4iv_v_shm_id_not_12); -COMPILE_ASSERT(offsetof(Uniform4iv, v_shm_offset) == 16, - OffsetOf_Uniform4iv_v_shm_offset_not_16); +COMPILE_ASSERT(offsetof(Uniform4i, x) == 8, OffsetOf_Uniform4i_x_not_8); +COMPILE_ASSERT(offsetof(Uniform4i, y) == 12, OffsetOf_Uniform4i_y_not_12); +COMPILE_ASSERT(offsetof(Uniform4i, z) == 16, OffsetOf_Uniform4i_z_not_16); +COMPILE_ASSERT(offsetof(Uniform4i, w) == 20, OffsetOf_Uniform4i_w_not_20); struct Uniform4ivImmediate { typedef Uniform4ivImmediate ValueType; static const CommandId kCmdId = kUniform4ivImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLint) * 4 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLint) * 4 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { @@ -6801,19 +5793,18 @@ struct Uniform4ivImmediate { SetHeader(_count); location = _location; count = _count; - memcpy(ImmediateDataAddress(this), - _v, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _v, ComputeDataSize(_count)); } void* Set(void* cmd, GLint _location, GLsizei _count, const GLint* _v) { static_cast<ValueType*>(cmd)->Init(_location, _count, _v); - const uint32 size = ComputeSize(_count); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 location; - int32 count; + int32_t location; + int32_t count; }; COMPILE_ASSERT(sizeof(Uniform4ivImmediate) == 12, @@ -6825,351 +5816,158 @@ COMPILE_ASSERT(offsetof(Uniform4ivImmediate, location) == 4, COMPILE_ASSERT(offsetof(Uniform4ivImmediate, count) == 8, OffsetOf_Uniform4ivImmediate_count_not_8); -struct UniformMatrix2fv { - typedef UniformMatrix2fv ValueType; - static const CommandId kCmdId = kUniformMatrix2fv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLint _location, GLsizei _count, GLboolean _transpose, - uint32 _value_shm_id, uint32 _value_shm_offset) { - SetHeader(); - location = _location; - count = _count; - transpose = _transpose; - value_shm_id = _value_shm_id; - value_shm_offset = _value_shm_offset; - } - - void* Set( - void* cmd, GLint _location, GLsizei _count, GLboolean _transpose, - uint32 _value_shm_id, uint32 _value_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _location, _count, _transpose, _value_shm_id, _value_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 location; - int32 count; - uint32 transpose; - uint32 value_shm_id; - uint32 value_shm_offset; -}; - -COMPILE_ASSERT(sizeof(UniformMatrix2fv) == 24, - Sizeof_UniformMatrix2fv_is_not_24); -COMPILE_ASSERT(offsetof(UniformMatrix2fv, header) == 0, - OffsetOf_UniformMatrix2fv_header_not_0); -COMPILE_ASSERT(offsetof(UniformMatrix2fv, location) == 4, - OffsetOf_UniformMatrix2fv_location_not_4); -COMPILE_ASSERT(offsetof(UniformMatrix2fv, count) == 8, - OffsetOf_UniformMatrix2fv_count_not_8); -COMPILE_ASSERT(offsetof(UniformMatrix2fv, transpose) == 12, - OffsetOf_UniformMatrix2fv_transpose_not_12); -COMPILE_ASSERT(offsetof(UniformMatrix2fv, value_shm_id) == 16, - OffsetOf_UniformMatrix2fv_value_shm_id_not_16); -COMPILE_ASSERT(offsetof(UniformMatrix2fv, value_shm_offset) == 20, - OffsetOf_UniformMatrix2fv_value_shm_offset_not_20); - struct UniformMatrix2fvImmediate { typedef UniformMatrix2fvImmediate ValueType; static const CommandId kCmdId = kUniformMatrix2fvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLfloat) * 4 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLfloat) * 4 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { header.SetCmdByTotalSize<ValueType>(ComputeSize(count)); } - void Init( - GLint _location, GLsizei _count, GLboolean _transpose, - const GLfloat* _value) { + void Init(GLint _location, GLsizei _count, const GLfloat* _value) { SetHeader(_count); location = _location; count = _count; - transpose = _transpose; - memcpy(ImmediateDataAddress(this), - _value, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _value, ComputeDataSize(_count)); } - void* Set( - void* cmd, GLint _location, GLsizei _count, GLboolean _transpose, - const GLfloat* _value) { - static_cast<ValueType*>(cmd)->Init(_location, _count, _transpose, _value); - const uint32 size = ComputeSize(_count); + void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _value) { + static_cast<ValueType*>(cmd)->Init(_location, _count, _value); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 location; - int32 count; - uint32 transpose; + int32_t location; + int32_t count; + static const uint32_t transpose = false; }; -COMPILE_ASSERT(sizeof(UniformMatrix2fvImmediate) == 16, - Sizeof_UniformMatrix2fvImmediate_is_not_16); +COMPILE_ASSERT(sizeof(UniformMatrix2fvImmediate) == 12, + Sizeof_UniformMatrix2fvImmediate_is_not_12); COMPILE_ASSERT(offsetof(UniformMatrix2fvImmediate, header) == 0, OffsetOf_UniformMatrix2fvImmediate_header_not_0); COMPILE_ASSERT(offsetof(UniformMatrix2fvImmediate, location) == 4, OffsetOf_UniformMatrix2fvImmediate_location_not_4); COMPILE_ASSERT(offsetof(UniformMatrix2fvImmediate, count) == 8, OffsetOf_UniformMatrix2fvImmediate_count_not_8); -COMPILE_ASSERT(offsetof(UniformMatrix2fvImmediate, transpose) == 12, - OffsetOf_UniformMatrix2fvImmediate_transpose_not_12); - -struct UniformMatrix3fv { - typedef UniformMatrix3fv ValueType; - static const CommandId kCmdId = kUniformMatrix3fv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLint _location, GLsizei _count, GLboolean _transpose, - uint32 _value_shm_id, uint32 _value_shm_offset) { - SetHeader(); - location = _location; - count = _count; - transpose = _transpose; - value_shm_id = _value_shm_id; - value_shm_offset = _value_shm_offset; - } - - void* Set( - void* cmd, GLint _location, GLsizei _count, GLboolean _transpose, - uint32 _value_shm_id, uint32 _value_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _location, _count, _transpose, _value_shm_id, _value_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 location; - int32 count; - uint32 transpose; - uint32 value_shm_id; - uint32 value_shm_offset; -}; - -COMPILE_ASSERT(sizeof(UniformMatrix3fv) == 24, - Sizeof_UniformMatrix3fv_is_not_24); -COMPILE_ASSERT(offsetof(UniformMatrix3fv, header) == 0, - OffsetOf_UniformMatrix3fv_header_not_0); -COMPILE_ASSERT(offsetof(UniformMatrix3fv, location) == 4, - OffsetOf_UniformMatrix3fv_location_not_4); -COMPILE_ASSERT(offsetof(UniformMatrix3fv, count) == 8, - OffsetOf_UniformMatrix3fv_count_not_8); -COMPILE_ASSERT(offsetof(UniformMatrix3fv, transpose) == 12, - OffsetOf_UniformMatrix3fv_transpose_not_12); -COMPILE_ASSERT(offsetof(UniformMatrix3fv, value_shm_id) == 16, - OffsetOf_UniformMatrix3fv_value_shm_id_not_16); -COMPILE_ASSERT(offsetof(UniformMatrix3fv, value_shm_offset) == 20, - OffsetOf_UniformMatrix3fv_value_shm_offset_not_20); struct UniformMatrix3fvImmediate { typedef UniformMatrix3fvImmediate ValueType; static const CommandId kCmdId = kUniformMatrix3fvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLfloat) * 9 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLfloat) * 9 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { header.SetCmdByTotalSize<ValueType>(ComputeSize(count)); } - void Init( - GLint _location, GLsizei _count, GLboolean _transpose, - const GLfloat* _value) { + void Init(GLint _location, GLsizei _count, const GLfloat* _value) { SetHeader(_count); location = _location; count = _count; - transpose = _transpose; - memcpy(ImmediateDataAddress(this), - _value, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _value, ComputeDataSize(_count)); } - void* Set( - void* cmd, GLint _location, GLsizei _count, GLboolean _transpose, - const GLfloat* _value) { - static_cast<ValueType*>(cmd)->Init(_location, _count, _transpose, _value); - const uint32 size = ComputeSize(_count); + void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _value) { + static_cast<ValueType*>(cmd)->Init(_location, _count, _value); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 location; - int32 count; - uint32 transpose; + int32_t location; + int32_t count; + static const uint32_t transpose = false; }; -COMPILE_ASSERT(sizeof(UniformMatrix3fvImmediate) == 16, - Sizeof_UniformMatrix3fvImmediate_is_not_16); +COMPILE_ASSERT(sizeof(UniformMatrix3fvImmediate) == 12, + Sizeof_UniformMatrix3fvImmediate_is_not_12); COMPILE_ASSERT(offsetof(UniformMatrix3fvImmediate, header) == 0, OffsetOf_UniformMatrix3fvImmediate_header_not_0); COMPILE_ASSERT(offsetof(UniformMatrix3fvImmediate, location) == 4, OffsetOf_UniformMatrix3fvImmediate_location_not_4); COMPILE_ASSERT(offsetof(UniformMatrix3fvImmediate, count) == 8, OffsetOf_UniformMatrix3fvImmediate_count_not_8); -COMPILE_ASSERT(offsetof(UniformMatrix3fvImmediate, transpose) == 12, - OffsetOf_UniformMatrix3fvImmediate_transpose_not_12); - -struct UniformMatrix4fv { - typedef UniformMatrix4fv ValueType; - static const CommandId kCmdId = kUniformMatrix4fv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLint _location, GLsizei _count, GLboolean _transpose, - uint32 _value_shm_id, uint32 _value_shm_offset) { - SetHeader(); - location = _location; - count = _count; - transpose = _transpose; - value_shm_id = _value_shm_id; - value_shm_offset = _value_shm_offset; - } - - void* Set( - void* cmd, GLint _location, GLsizei _count, GLboolean _transpose, - uint32 _value_shm_id, uint32 _value_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _location, _count, _transpose, _value_shm_id, _value_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 location; - int32 count; - uint32 transpose; - uint32 value_shm_id; - uint32 value_shm_offset; -}; - -COMPILE_ASSERT(sizeof(UniformMatrix4fv) == 24, - Sizeof_UniformMatrix4fv_is_not_24); -COMPILE_ASSERT(offsetof(UniformMatrix4fv, header) == 0, - OffsetOf_UniformMatrix4fv_header_not_0); -COMPILE_ASSERT(offsetof(UniformMatrix4fv, location) == 4, - OffsetOf_UniformMatrix4fv_location_not_4); -COMPILE_ASSERT(offsetof(UniformMatrix4fv, count) == 8, - OffsetOf_UniformMatrix4fv_count_not_8); -COMPILE_ASSERT(offsetof(UniformMatrix4fv, transpose) == 12, - OffsetOf_UniformMatrix4fv_transpose_not_12); -COMPILE_ASSERT(offsetof(UniformMatrix4fv, value_shm_id) == 16, - OffsetOf_UniformMatrix4fv_value_shm_id_not_16); -COMPILE_ASSERT(offsetof(UniformMatrix4fv, value_shm_offset) == 20, - OffsetOf_UniformMatrix4fv_value_shm_offset_not_20); struct UniformMatrix4fvImmediate { typedef UniformMatrix4fvImmediate ValueType; static const CommandId kCmdId = kUniformMatrix4fvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLfloat) * 16 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLfloat) * 16 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { header.SetCmdByTotalSize<ValueType>(ComputeSize(count)); } - void Init( - GLint _location, GLsizei _count, GLboolean _transpose, - const GLfloat* _value) { + void Init(GLint _location, GLsizei _count, const GLfloat* _value) { SetHeader(_count); location = _location; count = _count; - transpose = _transpose; - memcpy(ImmediateDataAddress(this), - _value, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _value, ComputeDataSize(_count)); } - void* Set( - void* cmd, GLint _location, GLsizei _count, GLboolean _transpose, - const GLfloat* _value) { - static_cast<ValueType*>(cmd)->Init(_location, _count, _transpose, _value); - const uint32 size = ComputeSize(_count); + void* Set(void* cmd, GLint _location, GLsizei _count, const GLfloat* _value) { + static_cast<ValueType*>(cmd)->Init(_location, _count, _value); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 location; - int32 count; - uint32 transpose; + int32_t location; + int32_t count; + static const uint32_t transpose = false; }; -COMPILE_ASSERT(sizeof(UniformMatrix4fvImmediate) == 16, - Sizeof_UniformMatrix4fvImmediate_is_not_16); +COMPILE_ASSERT(sizeof(UniformMatrix4fvImmediate) == 12, + Sizeof_UniformMatrix4fvImmediate_is_not_12); COMPILE_ASSERT(offsetof(UniformMatrix4fvImmediate, header) == 0, OffsetOf_UniformMatrix4fvImmediate_header_not_0); COMPILE_ASSERT(offsetof(UniformMatrix4fvImmediate, location) == 4, OffsetOf_UniformMatrix4fvImmediate_location_not_4); COMPILE_ASSERT(offsetof(UniformMatrix4fvImmediate, count) == 8, OffsetOf_UniformMatrix4fvImmediate_count_not_8); -COMPILE_ASSERT(offsetof(UniformMatrix4fvImmediate, transpose) == 12, - OffsetOf_UniformMatrix4fvImmediate_transpose_not_12); struct UseProgram { typedef UseProgram ValueType; static const CommandId kCmdId = kUseProgram; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _program) { SetHeader(); @@ -7182,11 +5980,10 @@ struct UseProgram { } gpu::CommandHeader header; - uint32 program; + uint32_t program; }; -COMPILE_ASSERT(sizeof(UseProgram) == 8, - Sizeof_UseProgram_is_not_8); +COMPILE_ASSERT(sizeof(UseProgram) == 8, Sizeof_UseProgram_is_not_8); COMPILE_ASSERT(offsetof(UseProgram, header) == 0, OffsetOf_UseProgram_header_not_0); COMPILE_ASSERT(offsetof(UseProgram, program) == 4, @@ -7196,14 +5993,13 @@ struct ValidateProgram { typedef ValidateProgram ValueType; static const CommandId kCmdId = kValidateProgram; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _program) { SetHeader(); @@ -7216,11 +6012,10 @@ struct ValidateProgram { } gpu::CommandHeader header; - uint32 program; + uint32_t program; }; -COMPILE_ASSERT(sizeof(ValidateProgram) == 8, - Sizeof_ValidateProgram_is_not_8); +COMPILE_ASSERT(sizeof(ValidateProgram) == 8, Sizeof_ValidateProgram_is_not_8); COMPILE_ASSERT(offsetof(ValidateProgram, header) == 0, OffsetOf_ValidateProgram_header_not_0); COMPILE_ASSERT(offsetof(ValidateProgram, program) == 4, @@ -7230,14 +6025,13 @@ struct VertexAttrib1f { typedef VertexAttrib1f ValueType; static const CommandId kCmdId = kVertexAttrib1f; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _indx, GLfloat _x) { SetHeader(); @@ -7251,12 +6045,11 @@ struct VertexAttrib1f { } gpu::CommandHeader header; - uint32 indx; + uint32_t indx; float x; }; -COMPILE_ASSERT(sizeof(VertexAttrib1f) == 12, - Sizeof_VertexAttrib1f_is_not_12); +COMPILE_ASSERT(sizeof(VertexAttrib1f) == 12, Sizeof_VertexAttrib1f_is_not_12); COMPILE_ASSERT(offsetof(VertexAttrib1f, header) == 0, OffsetOf_VertexAttrib1f_header_not_0); COMPILE_ASSERT(offsetof(VertexAttrib1f, indx) == 4, @@ -7264,85 +6057,37 @@ COMPILE_ASSERT(offsetof(VertexAttrib1f, indx) == 4, COMPILE_ASSERT(offsetof(VertexAttrib1f, x) == 8, OffsetOf_VertexAttrib1f_x_not_8); -struct VertexAttrib1fv { - typedef VertexAttrib1fv ValueType; - static const CommandId kCmdId = kVertexAttrib1fv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLuint _indx, uint32 _values_shm_id, uint32 _values_shm_offset) { - SetHeader(); - indx = _indx; - values_shm_id = _values_shm_id; - values_shm_offset = _values_shm_offset; - } - - void* Set( - void* cmd, GLuint _indx, uint32 _values_shm_id, - uint32 _values_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_indx, _values_shm_id, _values_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 indx; - uint32 values_shm_id; - uint32 values_shm_offset; -}; - -COMPILE_ASSERT(sizeof(VertexAttrib1fv) == 16, - Sizeof_VertexAttrib1fv_is_not_16); -COMPILE_ASSERT(offsetof(VertexAttrib1fv, header) == 0, - OffsetOf_VertexAttrib1fv_header_not_0); -COMPILE_ASSERT(offsetof(VertexAttrib1fv, indx) == 4, - OffsetOf_VertexAttrib1fv_indx_not_4); -COMPILE_ASSERT(offsetof(VertexAttrib1fv, values_shm_id) == 8, - OffsetOf_VertexAttrib1fv_values_shm_id_not_8); -COMPILE_ASSERT(offsetof(VertexAttrib1fv, values_shm_offset) == 12, - OffsetOf_VertexAttrib1fv_values_shm_offset_not_12); - struct VertexAttrib1fvImmediate { typedef VertexAttrib1fvImmediate ValueType; static const CommandId kCmdId = kVertexAttrib1fvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize() { - return static_cast<uint32>( - sizeof(GLfloat) * 1); // NOLINT + static uint32_t ComputeDataSize() { + return static_cast<uint32_t>(sizeof(GLfloat) * 1); // NOLINT } - static uint32 ComputeSize() { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize()); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize()); // NOLINT } - void SetHeader() { - header.SetCmdByTotalSize<ValueType>(ComputeSize()); - } + void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } void Init(GLuint _indx, const GLfloat* _values) { SetHeader(); indx = _indx; - memcpy(ImmediateDataAddress(this), - _values, ComputeDataSize()); + memcpy(ImmediateDataAddress(this), _values, ComputeDataSize()); } void* Set(void* cmd, GLuint _indx, const GLfloat* _values) { static_cast<ValueType*>(cmd)->Init(_indx, _values); - const uint32 size = ComputeSize(); + const uint32_t size = ComputeSize(); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - uint32 indx; + uint32_t indx; }; COMPILE_ASSERT(sizeof(VertexAttrib1fvImmediate) == 8, @@ -7356,14 +6101,13 @@ struct VertexAttrib2f { typedef VertexAttrib2f ValueType; static const CommandId kCmdId = kVertexAttrib2f; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _indx, GLfloat _x, GLfloat _y) { SetHeader(); @@ -7378,13 +6122,12 @@ struct VertexAttrib2f { } gpu::CommandHeader header; - uint32 indx; + uint32_t indx; float x; float y; }; -COMPILE_ASSERT(sizeof(VertexAttrib2f) == 16, - Sizeof_VertexAttrib2f_is_not_16); +COMPILE_ASSERT(sizeof(VertexAttrib2f) == 16, Sizeof_VertexAttrib2f_is_not_16); COMPILE_ASSERT(offsetof(VertexAttrib2f, header) == 0, OffsetOf_VertexAttrib2f_header_not_0); COMPILE_ASSERT(offsetof(VertexAttrib2f, indx) == 4, @@ -7394,85 +6137,37 @@ COMPILE_ASSERT(offsetof(VertexAttrib2f, x) == 8, COMPILE_ASSERT(offsetof(VertexAttrib2f, y) == 12, OffsetOf_VertexAttrib2f_y_not_12); -struct VertexAttrib2fv { - typedef VertexAttrib2fv ValueType; - static const CommandId kCmdId = kVertexAttrib2fv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLuint _indx, uint32 _values_shm_id, uint32 _values_shm_offset) { - SetHeader(); - indx = _indx; - values_shm_id = _values_shm_id; - values_shm_offset = _values_shm_offset; - } - - void* Set( - void* cmd, GLuint _indx, uint32 _values_shm_id, - uint32 _values_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_indx, _values_shm_id, _values_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 indx; - uint32 values_shm_id; - uint32 values_shm_offset; -}; - -COMPILE_ASSERT(sizeof(VertexAttrib2fv) == 16, - Sizeof_VertexAttrib2fv_is_not_16); -COMPILE_ASSERT(offsetof(VertexAttrib2fv, header) == 0, - OffsetOf_VertexAttrib2fv_header_not_0); -COMPILE_ASSERT(offsetof(VertexAttrib2fv, indx) == 4, - OffsetOf_VertexAttrib2fv_indx_not_4); -COMPILE_ASSERT(offsetof(VertexAttrib2fv, values_shm_id) == 8, - OffsetOf_VertexAttrib2fv_values_shm_id_not_8); -COMPILE_ASSERT(offsetof(VertexAttrib2fv, values_shm_offset) == 12, - OffsetOf_VertexAttrib2fv_values_shm_offset_not_12); - struct VertexAttrib2fvImmediate { typedef VertexAttrib2fvImmediate ValueType; static const CommandId kCmdId = kVertexAttrib2fvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize() { - return static_cast<uint32>( - sizeof(GLfloat) * 2); // NOLINT + static uint32_t ComputeDataSize() { + return static_cast<uint32_t>(sizeof(GLfloat) * 2); // NOLINT } - static uint32 ComputeSize() { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize()); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize()); // NOLINT } - void SetHeader() { - header.SetCmdByTotalSize<ValueType>(ComputeSize()); - } + void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } void Init(GLuint _indx, const GLfloat* _values) { SetHeader(); indx = _indx; - memcpy(ImmediateDataAddress(this), - _values, ComputeDataSize()); + memcpy(ImmediateDataAddress(this), _values, ComputeDataSize()); } void* Set(void* cmd, GLuint _indx, const GLfloat* _values) { static_cast<ValueType*>(cmd)->Init(_indx, _values); - const uint32 size = ComputeSize(); + const uint32_t size = ComputeSize(); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - uint32 indx; + uint32_t indx; }; COMPILE_ASSERT(sizeof(VertexAttrib2fvImmediate) == 8, @@ -7486,14 +6181,13 @@ struct VertexAttrib3f { typedef VertexAttrib3f ValueType; static const CommandId kCmdId = kVertexAttrib3f; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _indx, GLfloat _x, GLfloat _y, GLfloat _z) { SetHeader(); @@ -7509,14 +6203,13 @@ struct VertexAttrib3f { } gpu::CommandHeader header; - uint32 indx; + uint32_t indx; float x; float y; float z; }; -COMPILE_ASSERT(sizeof(VertexAttrib3f) == 20, - Sizeof_VertexAttrib3f_is_not_20); +COMPILE_ASSERT(sizeof(VertexAttrib3f) == 20, Sizeof_VertexAttrib3f_is_not_20); COMPILE_ASSERT(offsetof(VertexAttrib3f, header) == 0, OffsetOf_VertexAttrib3f_header_not_0); COMPILE_ASSERT(offsetof(VertexAttrib3f, indx) == 4, @@ -7528,85 +6221,37 @@ COMPILE_ASSERT(offsetof(VertexAttrib3f, y) == 12, COMPILE_ASSERT(offsetof(VertexAttrib3f, z) == 16, OffsetOf_VertexAttrib3f_z_not_16); -struct VertexAttrib3fv { - typedef VertexAttrib3fv ValueType; - static const CommandId kCmdId = kVertexAttrib3fv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLuint _indx, uint32 _values_shm_id, uint32 _values_shm_offset) { - SetHeader(); - indx = _indx; - values_shm_id = _values_shm_id; - values_shm_offset = _values_shm_offset; - } - - void* Set( - void* cmd, GLuint _indx, uint32 _values_shm_id, - uint32 _values_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_indx, _values_shm_id, _values_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 indx; - uint32 values_shm_id; - uint32 values_shm_offset; -}; - -COMPILE_ASSERT(sizeof(VertexAttrib3fv) == 16, - Sizeof_VertexAttrib3fv_is_not_16); -COMPILE_ASSERT(offsetof(VertexAttrib3fv, header) == 0, - OffsetOf_VertexAttrib3fv_header_not_0); -COMPILE_ASSERT(offsetof(VertexAttrib3fv, indx) == 4, - OffsetOf_VertexAttrib3fv_indx_not_4); -COMPILE_ASSERT(offsetof(VertexAttrib3fv, values_shm_id) == 8, - OffsetOf_VertexAttrib3fv_values_shm_id_not_8); -COMPILE_ASSERT(offsetof(VertexAttrib3fv, values_shm_offset) == 12, - OffsetOf_VertexAttrib3fv_values_shm_offset_not_12); - struct VertexAttrib3fvImmediate { typedef VertexAttrib3fvImmediate ValueType; static const CommandId kCmdId = kVertexAttrib3fvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize() { - return static_cast<uint32>( - sizeof(GLfloat) * 3); // NOLINT + static uint32_t ComputeDataSize() { + return static_cast<uint32_t>(sizeof(GLfloat) * 3); // NOLINT } - static uint32 ComputeSize() { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize()); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize()); // NOLINT } - void SetHeader() { - header.SetCmdByTotalSize<ValueType>(ComputeSize()); - } + void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } void Init(GLuint _indx, const GLfloat* _values) { SetHeader(); indx = _indx; - memcpy(ImmediateDataAddress(this), - _values, ComputeDataSize()); + memcpy(ImmediateDataAddress(this), _values, ComputeDataSize()); } void* Set(void* cmd, GLuint _indx, const GLfloat* _values) { static_cast<ValueType*>(cmd)->Init(_indx, _values); - const uint32 size = ComputeSize(); + const uint32_t size = ComputeSize(); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - uint32 indx; + uint32_t indx; }; COMPILE_ASSERT(sizeof(VertexAttrib3fvImmediate) == 8, @@ -7620,14 +6265,13 @@ struct VertexAttrib4f { typedef VertexAttrib4f ValueType; static const CommandId kCmdId = kVertexAttrib4f; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _indx, GLfloat _x, GLfloat _y, GLfloat _z, GLfloat _w) { SetHeader(); @@ -7638,23 +6282,25 @@ struct VertexAttrib4f { w = _w; } - void* Set( - void* cmd, GLuint _indx, GLfloat _x, GLfloat _y, GLfloat _z, - GLfloat _w) { + void* Set(void* cmd, + GLuint _indx, + GLfloat _x, + GLfloat _y, + GLfloat _z, + GLfloat _w) { static_cast<ValueType*>(cmd)->Init(_indx, _x, _y, _z, _w); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 indx; + uint32_t indx; float x; float y; float z; float w; }; -COMPILE_ASSERT(sizeof(VertexAttrib4f) == 24, - Sizeof_VertexAttrib4f_is_not_24); +COMPILE_ASSERT(sizeof(VertexAttrib4f) == 24, Sizeof_VertexAttrib4f_is_not_24); COMPILE_ASSERT(offsetof(VertexAttrib4f, header) == 0, OffsetOf_VertexAttrib4f_header_not_0); COMPILE_ASSERT(offsetof(VertexAttrib4f, indx) == 4, @@ -7668,85 +6314,37 @@ COMPILE_ASSERT(offsetof(VertexAttrib4f, z) == 16, COMPILE_ASSERT(offsetof(VertexAttrib4f, w) == 20, OffsetOf_VertexAttrib4f_w_not_20); -struct VertexAttrib4fv { - typedef VertexAttrib4fv ValueType; - static const CommandId kCmdId = kVertexAttrib4fv; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLuint _indx, uint32 _values_shm_id, uint32 _values_shm_offset) { - SetHeader(); - indx = _indx; - values_shm_id = _values_shm_id; - values_shm_offset = _values_shm_offset; - } - - void* Set( - void* cmd, GLuint _indx, uint32 _values_shm_id, - uint32 _values_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_indx, _values_shm_id, _values_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 indx; - uint32 values_shm_id; - uint32 values_shm_offset; -}; - -COMPILE_ASSERT(sizeof(VertexAttrib4fv) == 16, - Sizeof_VertexAttrib4fv_is_not_16); -COMPILE_ASSERT(offsetof(VertexAttrib4fv, header) == 0, - OffsetOf_VertexAttrib4fv_header_not_0); -COMPILE_ASSERT(offsetof(VertexAttrib4fv, indx) == 4, - OffsetOf_VertexAttrib4fv_indx_not_4); -COMPILE_ASSERT(offsetof(VertexAttrib4fv, values_shm_id) == 8, - OffsetOf_VertexAttrib4fv_values_shm_id_not_8); -COMPILE_ASSERT(offsetof(VertexAttrib4fv, values_shm_offset) == 12, - OffsetOf_VertexAttrib4fv_values_shm_offset_not_12); - struct VertexAttrib4fvImmediate { typedef VertexAttrib4fvImmediate ValueType; static const CommandId kCmdId = kVertexAttrib4fvImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize() { - return static_cast<uint32>( - sizeof(GLfloat) * 4); // NOLINT + static uint32_t ComputeDataSize() { + return static_cast<uint32_t>(sizeof(GLfloat) * 4); // NOLINT } - static uint32 ComputeSize() { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize()); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize()); // NOLINT } - void SetHeader() { - header.SetCmdByTotalSize<ValueType>(ComputeSize()); - } + void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } void Init(GLuint _indx, const GLfloat* _values) { SetHeader(); indx = _indx; - memcpy(ImmediateDataAddress(this), - _values, ComputeDataSize()); + memcpy(ImmediateDataAddress(this), _values, ComputeDataSize()); } void* Set(void* cmd, GLuint _indx, const GLfloat* _values) { static_cast<ValueType*>(cmd)->Init(_indx, _values); - const uint32 size = ComputeSize(); + const uint32_t size = ComputeSize(); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - uint32 indx; + uint32_t indx; }; COMPILE_ASSERT(sizeof(VertexAttrib4fvImmediate) == 8, @@ -7760,18 +6358,20 @@ struct VertexAttribPointer { typedef VertexAttribPointer ValueType; static const CommandId kCmdId = kVertexAttribPointer; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _indx, GLint _size, GLenum _type, GLboolean _normalized, - GLsizei _stride, GLuint _offset) { + void Init(GLuint _indx, + GLint _size, + GLenum _type, + GLboolean _normalized, + GLsizei _stride, + GLuint _offset) { SetHeader(); indx = _indx; size = _size; @@ -7781,21 +6381,25 @@ struct VertexAttribPointer { offset = _offset; } - void* Set( - void* cmd, GLuint _indx, GLint _size, GLenum _type, GLboolean _normalized, - GLsizei _stride, GLuint _offset) { - static_cast<ValueType*>( - cmd)->Init(_indx, _size, _type, _normalized, _stride, _offset); + void* Set(void* cmd, + GLuint _indx, + GLint _size, + GLenum _type, + GLboolean _normalized, + GLsizei _stride, + GLuint _offset) { + static_cast<ValueType*>(cmd) + ->Init(_indx, _size, _type, _normalized, _stride, _offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 indx; - int32 size; - uint32 type; - uint32 normalized; - int32 stride; - uint32 offset; + uint32_t indx; + int32_t size; + uint32_t type; + uint32_t normalized; + int32_t stride; + uint32_t offset; }; COMPILE_ASSERT(sizeof(VertexAttribPointer) == 28, @@ -7819,14 +6423,13 @@ struct Viewport { typedef Viewport ValueType; static const CommandId kCmdId = kViewport; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _x, GLint _y, GLsizei _width, GLsizei _height) { SetHeader(); @@ -7842,22 +6445,17 @@ struct Viewport { } gpu::CommandHeader header; - int32 x; - int32 y; - int32 width; - int32 height; + int32_t x; + int32_t y; + int32_t width; + int32_t height; }; -COMPILE_ASSERT(sizeof(Viewport) == 20, - Sizeof_Viewport_is_not_20); -COMPILE_ASSERT(offsetof(Viewport, header) == 0, - OffsetOf_Viewport_header_not_0); -COMPILE_ASSERT(offsetof(Viewport, x) == 4, - OffsetOf_Viewport_x_not_4); -COMPILE_ASSERT(offsetof(Viewport, y) == 8, - OffsetOf_Viewport_y_not_8); -COMPILE_ASSERT(offsetof(Viewport, width) == 12, - OffsetOf_Viewport_width_not_12); +COMPILE_ASSERT(sizeof(Viewport) == 20, Sizeof_Viewport_is_not_20); +COMPILE_ASSERT(offsetof(Viewport, header) == 0, OffsetOf_Viewport_header_not_0); +COMPILE_ASSERT(offsetof(Viewport, x) == 4, OffsetOf_Viewport_x_not_4); +COMPILE_ASSERT(offsetof(Viewport, y) == 8, OffsetOf_Viewport_y_not_8); +COMPILE_ASSERT(offsetof(Viewport, width) == 12, OffsetOf_Viewport_width_not_12); COMPILE_ASSERT(offsetof(Viewport, height) == 16, OffsetOf_Viewport_height_not_16); @@ -7865,19 +6463,24 @@ struct BlitFramebufferCHROMIUM { typedef BlitFramebufferCHROMIUM ValueType; static const CommandId kCmdId = kBlitFramebufferCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLint _srcX0, GLint _srcY0, GLint _srcX1, GLint _srcY1, GLint _dstX0, - GLint _dstY0, GLint _dstX1, GLint _dstY1, GLbitfield _mask, - GLenum _filter) { + void Init(GLint _srcX0, + GLint _srcY0, + GLint _srcX1, + GLint _srcY1, + GLint _dstX0, + GLint _dstY0, + GLint _dstX1, + GLint _dstY1, + GLbitfield _mask, + GLenum _filter) { SetHeader(); srcX0 = _srcX0; srcY0 = _srcY0; @@ -7891,28 +6494,41 @@ struct BlitFramebufferCHROMIUM { filter = _filter; } - void* Set( - void* cmd, GLint _srcX0, GLint _srcY0, GLint _srcX1, GLint _srcY1, - GLint _dstX0, GLint _dstY0, GLint _dstX1, GLint _dstY1, GLbitfield _mask, - GLenum _filter) { - static_cast<ValueType*>( - cmd)->Init( - _srcX0, _srcY0, _srcX1, _srcY1, _dstX0, _dstY0, _dstX1, _dstY1, - _mask, _filter); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 srcX0; - int32 srcY0; - int32 srcX1; - int32 srcY1; - int32 dstX0; - int32 dstY0; - int32 dstX1; - int32 dstY1; - uint32 mask; - uint32 filter; + void* Set(void* cmd, + GLint _srcX0, + GLint _srcY0, + GLint _srcX1, + GLint _srcY1, + GLint _dstX0, + GLint _dstY0, + GLint _dstX1, + GLint _dstY1, + GLbitfield _mask, + GLenum _filter) { + static_cast<ValueType*>(cmd)->Init(_srcX0, + _srcY0, + _srcX1, + _srcY1, + _dstX0, + _dstY0, + _dstX1, + _dstY1, + _mask, + _filter); + return NextCmdAddress<ValueType>(cmd); + } + + gpu::CommandHeader header; + int32_t srcX0; + int32_t srcY0; + int32_t srcX1; + int32_t srcY1; + int32_t dstX0; + int32_t dstY0; + int32_t dstX1; + int32_t dstY1; + uint32_t mask; + uint32_t filter; }; COMPILE_ASSERT(sizeof(BlitFramebufferCHROMIUM) == 44, @@ -7945,18 +6561,19 @@ struct RenderbufferStorageMultisampleCHROMIUM { typedef RenderbufferStorageMultisampleCHROMIUM ValueType; static const CommandId kCmdId = kRenderbufferStorageMultisampleCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLsizei _samples, GLenum _internalformat, GLsizei _width, - GLsizei _height) { + void Init(GLenum _target, + GLsizei _samples, + GLenum _internalformat, + GLsizei _width, + GLsizei _height) { SetHeader(); target = _target; samples = _samples; @@ -7965,20 +6582,23 @@ struct RenderbufferStorageMultisampleCHROMIUM { height = _height; } - void* Set( - void* cmd, GLenum _target, GLsizei _samples, GLenum _internalformat, - GLsizei _width, GLsizei _height) { - static_cast<ValueType*>( - cmd)->Init(_target, _samples, _internalformat, _width, _height); + void* Set(void* cmd, + GLenum _target, + GLsizei _samples, + GLenum _internalformat, + GLsizei _width, + GLsizei _height) { + static_cast<ValueType*>(cmd) + ->Init(_target, _samples, _internalformat, _width, _height); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - int32 samples; - uint32 internalformat; - int32 width; - int32 height; + uint32_t target; + int32_t samples; + uint32_t internalformat; + int32_t width; + int32_t height; }; COMPILE_ASSERT(sizeof(RenderbufferStorageMultisampleCHROMIUM) == 24, @@ -7991,7 +6611,7 @@ COMPILE_ASSERT(offsetof(RenderbufferStorageMultisampleCHROMIUM, samples) == 8, OffsetOf_RenderbufferStorageMultisampleCHROMIUM_samples_not_8); COMPILE_ASSERT( offsetof(RenderbufferStorageMultisampleCHROMIUM, internalformat) == 12, - OffsetOf_RenderbufferStorageMultisampleCHROMIUM_internalformat_not_12); // NOLINT + OffsetOf_RenderbufferStorageMultisampleCHROMIUM_internalformat_not_12); COMPILE_ASSERT(offsetof(RenderbufferStorageMultisampleCHROMIUM, width) == 16, OffsetOf_RenderbufferStorageMultisampleCHROMIUM_width_not_16); COMPILE_ASSERT(offsetof(RenderbufferStorageMultisampleCHROMIUM, height) == 20, @@ -8002,18 +6622,19 @@ struct RenderbufferStorageMultisampleEXT { typedef RenderbufferStorageMultisampleEXT ValueType; static const CommandId kCmdId = kRenderbufferStorageMultisampleEXT; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLsizei _samples, GLenum _internalformat, GLsizei _width, - GLsizei _height) { + void Init(GLenum _target, + GLsizei _samples, + GLenum _internalformat, + GLsizei _width, + GLsizei _height) { SetHeader(); target = _target; samples = _samples; @@ -8022,20 +6643,23 @@ struct RenderbufferStorageMultisampleEXT { height = _height; } - void* Set( - void* cmd, GLenum _target, GLsizei _samples, GLenum _internalformat, - GLsizei _width, GLsizei _height) { - static_cast<ValueType*>( - cmd)->Init(_target, _samples, _internalformat, _width, _height); + void* Set(void* cmd, + GLenum _target, + GLsizei _samples, + GLenum _internalformat, + GLsizei _width, + GLsizei _height) { + static_cast<ValueType*>(cmd) + ->Init(_target, _samples, _internalformat, _width, _height); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - int32 samples; - uint32 internalformat; - int32 width; - int32 height; + uint32_t target; + int32_t samples; + uint32_t internalformat; + int32_t width; + int32_t height; }; COMPILE_ASSERT(sizeof(RenderbufferStorageMultisampleEXT) == 24, @@ -8048,7 +6672,7 @@ COMPILE_ASSERT(offsetof(RenderbufferStorageMultisampleEXT, samples) == 8, OffsetOf_RenderbufferStorageMultisampleEXT_samples_not_8); COMPILE_ASSERT( offsetof(RenderbufferStorageMultisampleEXT, internalformat) == 12, - OffsetOf_RenderbufferStorageMultisampleEXT_internalformat_not_12); // NOLINT + OffsetOf_RenderbufferStorageMultisampleEXT_internalformat_not_12); COMPILE_ASSERT(offsetof(RenderbufferStorageMultisampleEXT, width) == 16, OffsetOf_RenderbufferStorageMultisampleEXT_width_not_16); COMPILE_ASSERT(offsetof(RenderbufferStorageMultisampleEXT, height) == 20, @@ -8058,47 +6682,49 @@ struct FramebufferTexture2DMultisampleEXT { typedef FramebufferTexture2DMultisampleEXT ValueType; static const CommandId kCmdId = kFramebufferTexture2DMultisampleEXT; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLenum _attachment, GLenum _textarget, GLuint _texture, - GLint _level, GLsizei _samples) { + void Init(GLenum _target, + GLenum _attachment, + GLenum _textarget, + GLuint _texture, + GLsizei _samples) { SetHeader(); target = _target; attachment = _attachment; textarget = _textarget; texture = _texture; - level = _level; samples = _samples; } - void* Set( - void* cmd, GLenum _target, GLenum _attachment, GLenum _textarget, - GLuint _texture, GLint _level, GLsizei _samples) { - static_cast<ValueType*>( - cmd)->Init( - _target, _attachment, _textarget, _texture, _level, _samples); + void* Set(void* cmd, + GLenum _target, + GLenum _attachment, + GLenum _textarget, + GLuint _texture, + GLsizei _samples) { + static_cast<ValueType*>(cmd) + ->Init(_target, _attachment, _textarget, _texture, _samples); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 attachment; - uint32 textarget; - uint32 texture; - int32 level; - int32 samples; + uint32_t target; + uint32_t attachment; + uint32_t textarget; + uint32_t texture; + int32_t samples; + static const int32_t level = 0; }; -COMPILE_ASSERT(sizeof(FramebufferTexture2DMultisampleEXT) == 28, - Sizeof_FramebufferTexture2DMultisampleEXT_is_not_28); +COMPILE_ASSERT(sizeof(FramebufferTexture2DMultisampleEXT) == 24, + Sizeof_FramebufferTexture2DMultisampleEXT_is_not_24); COMPILE_ASSERT(offsetof(FramebufferTexture2DMultisampleEXT, header) == 0, OffsetOf_FramebufferTexture2DMultisampleEXT_header_not_0); COMPILE_ASSERT(offsetof(FramebufferTexture2DMultisampleEXT, target) == 4, @@ -8109,27 +6735,26 @@ COMPILE_ASSERT(offsetof(FramebufferTexture2DMultisampleEXT, textarget) == 12, OffsetOf_FramebufferTexture2DMultisampleEXT_textarget_not_12); COMPILE_ASSERT(offsetof(FramebufferTexture2DMultisampleEXT, texture) == 16, OffsetOf_FramebufferTexture2DMultisampleEXT_texture_not_16); -COMPILE_ASSERT(offsetof(FramebufferTexture2DMultisampleEXT, level) == 20, - OffsetOf_FramebufferTexture2DMultisampleEXT_level_not_20); -COMPILE_ASSERT(offsetof(FramebufferTexture2DMultisampleEXT, samples) == 24, - OffsetOf_FramebufferTexture2DMultisampleEXT_samples_not_24); +COMPILE_ASSERT(offsetof(FramebufferTexture2DMultisampleEXT, samples) == 20, + OffsetOf_FramebufferTexture2DMultisampleEXT_samples_not_20); struct TexStorage2DEXT { typedef TexStorage2DEXT ValueType; static const CommandId kCmdId = kTexStorage2DEXT; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLsizei _levels, GLenum _internalFormat, GLsizei _width, - GLsizei _height) { + void Init(GLenum _target, + GLsizei _levels, + GLenum _internalFormat, + GLsizei _width, + GLsizei _height) { SetHeader(); target = _target; levels = _levels; @@ -8138,24 +6763,26 @@ struct TexStorage2DEXT { height = _height; } - void* Set( - void* cmd, GLenum _target, GLsizei _levels, GLenum _internalFormat, - GLsizei _width, GLsizei _height) { - static_cast<ValueType*>( - cmd)->Init(_target, _levels, _internalFormat, _width, _height); + void* Set(void* cmd, + GLenum _target, + GLsizei _levels, + GLenum _internalFormat, + GLsizei _width, + GLsizei _height) { + static_cast<ValueType*>(cmd) + ->Init(_target, _levels, _internalFormat, _width, _height); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - int32 levels; - uint32 internalFormat; - int32 width; - int32 height; + uint32_t target; + int32_t levels; + uint32_t internalFormat; + int32_t width; + int32_t height; }; -COMPILE_ASSERT(sizeof(TexStorage2DEXT) == 24, - Sizeof_TexStorage2DEXT_is_not_24); +COMPILE_ASSERT(sizeof(TexStorage2DEXT) == 24, Sizeof_TexStorage2DEXT_is_not_24); COMPILE_ASSERT(offsetof(TexStorage2DEXT, header) == 0, OffsetOf_TexStorage2DEXT_header_not_0); COMPILE_ASSERT(offsetof(TexStorage2DEXT, target) == 4, @@ -8169,63 +6796,19 @@ COMPILE_ASSERT(offsetof(TexStorage2DEXT, width) == 16, COMPILE_ASSERT(offsetof(TexStorage2DEXT, height) == 20, OffsetOf_TexStorage2DEXT_height_not_20); -struct GenQueriesEXT { - typedef GenQueriesEXT ValueType; - static const CommandId kCmdId = kGenQueriesEXT; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLsizei _n, uint32 _queries_shm_id, uint32 _queries_shm_offset) { - SetHeader(); - n = _n; - queries_shm_id = _queries_shm_id; - queries_shm_offset = _queries_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _queries_shm_id, - uint32 _queries_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_n, _queries_shm_id, _queries_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 queries_shm_id; - uint32 queries_shm_offset; -}; - -COMPILE_ASSERT(sizeof(GenQueriesEXT) == 16, - Sizeof_GenQueriesEXT_is_not_16); -COMPILE_ASSERT(offsetof(GenQueriesEXT, header) == 0, - OffsetOf_GenQueriesEXT_header_not_0); -COMPILE_ASSERT(offsetof(GenQueriesEXT, n) == 4, - OffsetOf_GenQueriesEXT_n_not_4); -COMPILE_ASSERT(offsetof(GenQueriesEXT, queries_shm_id) == 8, - OffsetOf_GenQueriesEXT_queries_shm_id_not_8); -COMPILE_ASSERT(offsetof(GenQueriesEXT, queries_shm_offset) == 12, - OffsetOf_GenQueriesEXT_queries_shm_offset_not_12); - struct GenQueriesEXTImmediate { typedef GenQueriesEXTImmediate ValueType; static const CommandId kCmdId = kGenQueriesEXTImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -8235,18 +6818,17 @@ struct GenQueriesEXTImmediate { void Init(GLsizei _n, GLuint* _queries) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _queries, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _queries, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, GLuint* _queries) { static_cast<ValueType*>(cmd)->Init(_n, _queries); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(GenQueriesEXTImmediate) == 8, @@ -8256,63 +6838,19 @@ COMPILE_ASSERT(offsetof(GenQueriesEXTImmediate, header) == 0, COMPILE_ASSERT(offsetof(GenQueriesEXTImmediate, n) == 4, OffsetOf_GenQueriesEXTImmediate_n_not_4); -struct DeleteQueriesEXT { - typedef DeleteQueriesEXT ValueType; - static const CommandId kCmdId = kDeleteQueriesEXT; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLsizei _n, uint32 _queries_shm_id, uint32 _queries_shm_offset) { - SetHeader(); - n = _n; - queries_shm_id = _queries_shm_id; - queries_shm_offset = _queries_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _queries_shm_id, - uint32 _queries_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_n, _queries_shm_id, _queries_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 queries_shm_id; - uint32 queries_shm_offset; -}; - -COMPILE_ASSERT(sizeof(DeleteQueriesEXT) == 16, - Sizeof_DeleteQueriesEXT_is_not_16); -COMPILE_ASSERT(offsetof(DeleteQueriesEXT, header) == 0, - OffsetOf_DeleteQueriesEXT_header_not_0); -COMPILE_ASSERT(offsetof(DeleteQueriesEXT, n) == 4, - OffsetOf_DeleteQueriesEXT_n_not_4); -COMPILE_ASSERT(offsetof(DeleteQueriesEXT, queries_shm_id) == 8, - OffsetOf_DeleteQueriesEXT_queries_shm_id_not_8); -COMPILE_ASSERT(offsetof(DeleteQueriesEXT, queries_shm_offset) == 12, - OffsetOf_DeleteQueriesEXT_queries_shm_offset_not_12); - struct DeleteQueriesEXTImmediate { typedef DeleteQueriesEXTImmediate ValueType; static const CommandId kCmdId = kDeleteQueriesEXTImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -8322,18 +6860,17 @@ struct DeleteQueriesEXTImmediate { void Init(GLsizei _n, const GLuint* _queries) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _queries, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _queries, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, const GLuint* _queries) { static_cast<ValueType*>(cmd)->Init(_n, _queries); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(DeleteQueriesEXTImmediate) == 8, @@ -8347,18 +6884,18 @@ struct BeginQueryEXT { typedef BeginQueryEXT ValueType; static const CommandId kCmdId = kBeginQueryEXT; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLuint _id, uint32 _sync_data_shm_id, - uint32 _sync_data_shm_offset) { + void Init(GLenum _target, + GLuint _id, + uint32_t _sync_data_shm_id, + uint32_t _sync_data_shm_offset) { SetHeader(); target = _target; id = _id; @@ -8366,23 +6903,24 @@ struct BeginQueryEXT { sync_data_shm_offset = _sync_data_shm_offset; } - void* Set( - void* cmd, GLenum _target, GLuint _id, uint32 _sync_data_shm_id, - uint32 _sync_data_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_target, _id, _sync_data_shm_id, _sync_data_shm_offset); + void* Set(void* cmd, + GLenum _target, + GLuint _id, + uint32_t _sync_data_shm_id, + uint32_t _sync_data_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_target, _id, _sync_data_shm_id, _sync_data_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 id; - uint32 sync_data_shm_id; - uint32 sync_data_shm_offset; + uint32_t target; + uint32_t id; + uint32_t sync_data_shm_id; + uint32_t sync_data_shm_offset; }; -COMPILE_ASSERT(sizeof(BeginQueryEXT) == 20, - Sizeof_BeginQueryEXT_is_not_20); +COMPILE_ASSERT(sizeof(BeginQueryEXT) == 20, Sizeof_BeginQueryEXT_is_not_20); COMPILE_ASSERT(offsetof(BeginQueryEXT, header) == 0, OffsetOf_BeginQueryEXT_header_not_0); COMPILE_ASSERT(offsetof(BeginQueryEXT, target) == 4, @@ -8398,14 +6936,13 @@ struct EndQueryEXT { typedef EndQueryEXT ValueType; static const CommandId kCmdId = kEndQueryEXT; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target, GLuint _submit_count) { SetHeader(); @@ -8419,12 +6956,11 @@ struct EndQueryEXT { } gpu::CommandHeader header; - uint32 target; - uint32 submit_count; + uint32_t target; + uint32_t submit_count; }; -COMPILE_ASSERT(sizeof(EndQueryEXT) == 12, - Sizeof_EndQueryEXT_is_not_12); +COMPILE_ASSERT(sizeof(EndQueryEXT) == 12, Sizeof_EndQueryEXT_is_not_12); COMPILE_ASSERT(offsetof(EndQueryEXT, header) == 0, OffsetOf_EndQueryEXT_header_not_0); COMPILE_ASSERT(offsetof(EndQueryEXT, target) == 4, @@ -8436,14 +6972,13 @@ struct InsertEventMarkerEXT { typedef InsertEventMarkerEXT ValueType; static const CommandId kCmdId = kInsertEventMarkerEXT; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _bucket_id) { SetHeader(); @@ -8456,7 +6991,7 @@ struct InsertEventMarkerEXT { } gpu::CommandHeader header; - uint32 bucket_id; + uint32_t bucket_id; }; COMPILE_ASSERT(sizeof(InsertEventMarkerEXT) == 8, @@ -8470,14 +7005,13 @@ struct PushGroupMarkerEXT { typedef PushGroupMarkerEXT ValueType; static const CommandId kCmdId = kPushGroupMarkerEXT; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _bucket_id) { SetHeader(); @@ -8490,7 +7024,7 @@ struct PushGroupMarkerEXT { } gpu::CommandHeader header; - uint32 bucket_id; + uint32_t bucket_id; }; COMPILE_ASSERT(sizeof(PushGroupMarkerEXT) == 8, @@ -8504,18 +7038,15 @@ struct PopGroupMarkerEXT { typedef PopGroupMarkerEXT ValueType; static const CommandId kCmdId = kPopGroupMarkerEXT; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init() { - SetHeader(); - } + void Init() { SetHeader(); } void* Set(void* cmd) { static_cast<ValueType*>(cmd)->Init(); @@ -8530,62 +7061,19 @@ COMPILE_ASSERT(sizeof(PopGroupMarkerEXT) == 4, COMPILE_ASSERT(offsetof(PopGroupMarkerEXT, header) == 0, OffsetOf_PopGroupMarkerEXT_header_not_0); -struct GenVertexArraysOES { - typedef GenVertexArraysOES ValueType; - static const CommandId kCmdId = kGenVertexArraysOES; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLsizei _n, uint32 _arrays_shm_id, uint32 _arrays_shm_offset) { - SetHeader(); - n = _n; - arrays_shm_id = _arrays_shm_id; - arrays_shm_offset = _arrays_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _arrays_shm_id, - uint32 _arrays_shm_offset) { - static_cast<ValueType*>(cmd)->Init(_n, _arrays_shm_id, _arrays_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 arrays_shm_id; - uint32 arrays_shm_offset; -}; - -COMPILE_ASSERT(sizeof(GenVertexArraysOES) == 16, - Sizeof_GenVertexArraysOES_is_not_16); -COMPILE_ASSERT(offsetof(GenVertexArraysOES, header) == 0, - OffsetOf_GenVertexArraysOES_header_not_0); -COMPILE_ASSERT(offsetof(GenVertexArraysOES, n) == 4, - OffsetOf_GenVertexArraysOES_n_not_4); -COMPILE_ASSERT(offsetof(GenVertexArraysOES, arrays_shm_id) == 8, - OffsetOf_GenVertexArraysOES_arrays_shm_id_not_8); -COMPILE_ASSERT(offsetof(GenVertexArraysOES, arrays_shm_offset) == 12, - OffsetOf_GenVertexArraysOES_arrays_shm_offset_not_12); - struct GenVertexArraysOESImmediate { typedef GenVertexArraysOESImmediate ValueType; static const CommandId kCmdId = kGenVertexArraysOESImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -8595,18 +7083,17 @@ struct GenVertexArraysOESImmediate { void Init(GLsizei _n, GLuint* _arrays) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _arrays, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _arrays, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, GLuint* _arrays) { static_cast<ValueType*>(cmd)->Init(_n, _arrays); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(GenVertexArraysOESImmediate) == 8, @@ -8616,62 +7103,19 @@ COMPILE_ASSERT(offsetof(GenVertexArraysOESImmediate, header) == 0, COMPILE_ASSERT(offsetof(GenVertexArraysOESImmediate, n) == 4, OffsetOf_GenVertexArraysOESImmediate_n_not_4); -struct DeleteVertexArraysOES { - typedef DeleteVertexArraysOES ValueType; - static const CommandId kCmdId = kDeleteVertexArraysOES; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLsizei _n, uint32 _arrays_shm_id, uint32 _arrays_shm_offset) { - SetHeader(); - n = _n; - arrays_shm_id = _arrays_shm_id; - arrays_shm_offset = _arrays_shm_offset; - } - - void* Set( - void* cmd, GLsizei _n, uint32 _arrays_shm_id, - uint32 _arrays_shm_offset) { - static_cast<ValueType*>(cmd)->Init(_n, _arrays_shm_id, _arrays_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 n; - uint32 arrays_shm_id; - uint32 arrays_shm_offset; -}; - -COMPILE_ASSERT(sizeof(DeleteVertexArraysOES) == 16, - Sizeof_DeleteVertexArraysOES_is_not_16); -COMPILE_ASSERT(offsetof(DeleteVertexArraysOES, header) == 0, - OffsetOf_DeleteVertexArraysOES_header_not_0); -COMPILE_ASSERT(offsetof(DeleteVertexArraysOES, n) == 4, - OffsetOf_DeleteVertexArraysOES_n_not_4); -COMPILE_ASSERT(offsetof(DeleteVertexArraysOES, arrays_shm_id) == 8, - OffsetOf_DeleteVertexArraysOES_arrays_shm_id_not_8); -COMPILE_ASSERT(offsetof(DeleteVertexArraysOES, arrays_shm_offset) == 12, - OffsetOf_DeleteVertexArraysOES_arrays_shm_offset_not_12); - struct DeleteVertexArraysOESImmediate { typedef DeleteVertexArraysOESImmediate ValueType; static const CommandId kCmdId = kDeleteVertexArraysOESImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei n) { - return static_cast<uint32>(sizeof(GLuint) * n); // NOLINT + static uint32_t ComputeDataSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(GLuint) * n); // NOLINT } - static uint32 ComputeSize(GLsizei n) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(n)); // NOLINT + static uint32_t ComputeSize(GLsizei n) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(n)); // NOLINT } void SetHeader(GLsizei n) { @@ -8681,18 +7125,17 @@ struct DeleteVertexArraysOESImmediate { void Init(GLsizei _n, const GLuint* _arrays) { SetHeader(_n); n = _n; - memcpy(ImmediateDataAddress(this), - _arrays, ComputeDataSize(_n)); + memcpy(ImmediateDataAddress(this), _arrays, ComputeDataSize(_n)); } void* Set(void* cmd, GLsizei _n, const GLuint* _arrays) { static_cast<ValueType*>(cmd)->Init(_n, _arrays); - const uint32 size = ComputeSize(_n); + const uint32_t size = ComputeSize(_n); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 n; + int32_t n; }; COMPILE_ASSERT(sizeof(DeleteVertexArraysOESImmediate) == 8, @@ -8706,36 +7149,38 @@ struct IsVertexArrayOES { typedef IsVertexArrayOES ValueType; static const CommandId kCmdId = kIsVertexArrayOES; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - typedef uint32 Result; + typedef uint32_t Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLuint _array, uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLuint _array, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); array = _array; result_shm_id = _result_shm_id; result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLuint _array, uint32 _result_shm_id, - uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_array, _result_shm_id, _result_shm_offset); + void* Set(void* cmd, + GLuint _array, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_array, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 array; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t array; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; COMPILE_ASSERT(sizeof(IsVertexArrayOES) == 16, @@ -8753,14 +7198,13 @@ struct BindVertexArrayOES { typedef BindVertexArrayOES ValueType; static const CommandId kCmdId = kBindVertexArrayOES; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _array) { SetHeader(); @@ -8773,7 +7217,7 @@ struct BindVertexArrayOES { } gpu::CommandHeader header; - uint32 array; + uint32_t array; }; COMPILE_ASSERT(sizeof(BindVertexArrayOES) == 8, @@ -8787,18 +7231,15 @@ struct SwapBuffers { typedef SwapBuffers ValueType; static const CommandId kCmdId = kSwapBuffers; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init() { - SetHeader(); - } + void Init() { SetHeader(); } void* Set(void* cmd) { static_cast<ValueType*>(cmd)->Init(); @@ -8808,8 +7249,7 @@ struct SwapBuffers { gpu::CommandHeader header; }; -COMPILE_ASSERT(sizeof(SwapBuffers) == 4, - Sizeof_SwapBuffers_is_not_4); +COMPILE_ASSERT(sizeof(SwapBuffers) == 4, Sizeof_SwapBuffers_is_not_4); COMPILE_ASSERT(offsetof(SwapBuffers, header) == 0, OffsetOf_SwapBuffers_header_not_0); @@ -8817,20 +7257,22 @@ struct GetMaxValueInBufferCHROMIUM { typedef GetMaxValueInBufferCHROMIUM ValueType; static const CommandId kCmdId = kGetMaxValueInBufferCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef GLuint Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _buffer_id, GLsizei _count, GLenum _type, GLuint _offset, - uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLuint _buffer_id, + GLsizei _count, + GLenum _type, + GLuint _offset, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); buffer_id = _buffer_id; count = _count; @@ -8840,23 +7282,25 @@ struct GetMaxValueInBufferCHROMIUM { result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLuint _buffer_id, GLsizei _count, GLenum _type, - GLuint _offset, uint32 _result_shm_id, uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _buffer_id, _count, _type, _offset, _result_shm_id, - _result_shm_offset); + void* Set(void* cmd, + GLuint _buffer_id, + GLsizei _count, + GLenum _type, + GLuint _offset, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd)->Init( + _buffer_id, _count, _type, _offset, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 buffer_id; - int32 count; - uint32 type; - uint32 offset; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t buffer_id; + int32_t count; + uint32_t type; + uint32_t offset; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; COMPILE_ASSERT(sizeof(GetMaxValueInBufferCHROMIUM) == 28, @@ -8880,18 +7324,19 @@ struct GenSharedIdsCHROMIUM { typedef GenSharedIdsCHROMIUM ValueType; static const CommandId kCmdId = kGenSharedIdsCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _namespace_id, GLuint _id_offset, GLsizei _n, uint32 _ids_shm_id, - uint32 _ids_shm_offset) { + void Init(GLuint _namespace_id, + GLuint _id_offset, + GLsizei _n, + uint32_t _ids_shm_id, + uint32_t _ids_shm_offset) { SetHeader(); namespace_id = _namespace_id; id_offset = _id_offset; @@ -8900,21 +7345,23 @@ struct GenSharedIdsCHROMIUM { ids_shm_offset = _ids_shm_offset; } - void* Set( - void* cmd, GLuint _namespace_id, GLuint _id_offset, GLsizei _n, - uint32 _ids_shm_id, uint32 _ids_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _namespace_id, _id_offset, _n, _ids_shm_id, _ids_shm_offset); + void* Set(void* cmd, + GLuint _namespace_id, + GLuint _id_offset, + GLsizei _n, + uint32_t _ids_shm_id, + uint32_t _ids_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_namespace_id, _id_offset, _n, _ids_shm_id, _ids_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 namespace_id; - uint32 id_offset; - int32 n; - uint32 ids_shm_id; - uint32 ids_shm_offset; + uint32_t namespace_id; + uint32_t id_offset; + int32_t n; + uint32_t ids_shm_id; + uint32_t ids_shm_offset; }; COMPILE_ASSERT(sizeof(GenSharedIdsCHROMIUM) == 24, @@ -8936,18 +7383,18 @@ struct DeleteSharedIdsCHROMIUM { typedef DeleteSharedIdsCHROMIUM ValueType; static const CommandId kCmdId = kDeleteSharedIdsCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _namespace_id, GLsizei _n, uint32 _ids_shm_id, - uint32 _ids_shm_offset) { + void Init(GLuint _namespace_id, + GLsizei _n, + uint32_t _ids_shm_id, + uint32_t _ids_shm_offset) { SetHeader(); namespace_id = _namespace_id; n = _n; @@ -8955,19 +7402,21 @@ struct DeleteSharedIdsCHROMIUM { ids_shm_offset = _ids_shm_offset; } - void* Set( - void* cmd, GLuint _namespace_id, GLsizei _n, uint32 _ids_shm_id, - uint32 _ids_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_namespace_id, _n, _ids_shm_id, _ids_shm_offset); + void* Set(void* cmd, + GLuint _namespace_id, + GLsizei _n, + uint32_t _ids_shm_id, + uint32_t _ids_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_namespace_id, _n, _ids_shm_id, _ids_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 namespace_id; - int32 n; - uint32 ids_shm_id; - uint32 ids_shm_offset; + uint32_t namespace_id; + int32_t n; + uint32_t ids_shm_id; + uint32_t ids_shm_offset; }; COMPILE_ASSERT(sizeof(DeleteSharedIdsCHROMIUM) == 20, @@ -8987,18 +7436,18 @@ struct RegisterSharedIdsCHROMIUM { typedef RegisterSharedIdsCHROMIUM ValueType; static const CommandId kCmdId = kRegisterSharedIdsCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _namespace_id, GLsizei _n, uint32 _ids_shm_id, - uint32 _ids_shm_offset) { + void Init(GLuint _namespace_id, + GLsizei _n, + uint32_t _ids_shm_id, + uint32_t _ids_shm_offset) { SetHeader(); namespace_id = _namespace_id; n = _n; @@ -9006,19 +7455,21 @@ struct RegisterSharedIdsCHROMIUM { ids_shm_offset = _ids_shm_offset; } - void* Set( - void* cmd, GLuint _namespace_id, GLsizei _n, uint32 _ids_shm_id, - uint32 _ids_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_namespace_id, _n, _ids_shm_id, _ids_shm_offset); + void* Set(void* cmd, + GLuint _namespace_id, + GLsizei _n, + uint32_t _ids_shm_id, + uint32_t _ids_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_namespace_id, _n, _ids_shm_id, _ids_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 namespace_id; - int32 n; - uint32 ids_shm_id; - uint32 ids_shm_offset; + uint32_t namespace_id; + int32_t n; + uint32_t ids_shm_id; + uint32_t ids_shm_offset; }; COMPILE_ASSERT(sizeof(RegisterSharedIdsCHROMIUM) == 20, @@ -9038,37 +7489,38 @@ struct EnableFeatureCHROMIUM { typedef EnableFeatureCHROMIUM ValueType; static const CommandId kCmdId = kEnableFeatureCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); typedef GLint Result; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLuint _bucket_id, uint32 _result_shm_id, uint32 _result_shm_offset) { + void Init(GLuint _bucket_id, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { SetHeader(); bucket_id = _bucket_id; result_shm_id = _result_shm_id; result_shm_offset = _result_shm_offset; } - void* Set( - void* cmd, GLuint _bucket_id, uint32 _result_shm_id, - uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_bucket_id, _result_shm_id, _result_shm_offset); + void* Set(void* cmd, + GLuint _bucket_id, + uint32_t _result_shm_id, + uint32_t _result_shm_offset) { + static_cast<ValueType*>(cmd) + ->Init(_bucket_id, _result_shm_id, _result_shm_offset); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 bucket_id; - uint32 result_shm_id; - uint32 result_shm_offset; + uint32_t bucket_id; + uint32_t result_shm_id; + uint32_t result_shm_offset; }; COMPILE_ASSERT(sizeof(EnableFeatureCHROMIUM) == 16, @@ -9086,14 +7538,13 @@ struct ResizeCHROMIUM { typedef ResizeCHROMIUM ValueType; static const CommandId kCmdId = kResizeCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _width, GLuint _height, GLfloat _scale_factor) { SetHeader(); @@ -9108,13 +7559,12 @@ struct ResizeCHROMIUM { } gpu::CommandHeader header; - uint32 width; - uint32 height; + uint32_t width; + uint32_t height; float scale_factor; }; -COMPILE_ASSERT(sizeof(ResizeCHROMIUM) == 16, - Sizeof_ResizeCHROMIUM_is_not_16); +COMPILE_ASSERT(sizeof(ResizeCHROMIUM) == 16, Sizeof_ResizeCHROMIUM_is_not_16); COMPILE_ASSERT(offsetof(ResizeCHROMIUM, header) == 0, OffsetOf_ResizeCHROMIUM_header_not_0); COMPILE_ASSERT(offsetof(ResizeCHROMIUM, width) == 4, @@ -9128,27 +7578,26 @@ struct GetRequestableExtensionsCHROMIUM { typedef GetRequestableExtensionsCHROMIUM ValueType; static const CommandId kCmdId = kGetRequestableExtensionsCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(uint32 _bucket_id) { + void Init(uint32_t _bucket_id) { SetHeader(); bucket_id = _bucket_id; } - void* Set(void* cmd, uint32 _bucket_id) { + void* Set(void* cmd, uint32_t _bucket_id) { static_cast<ValueType*>(cmd)->Init(_bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 bucket_id; + uint32_t bucket_id; }; COMPILE_ASSERT(sizeof(GetRequestableExtensionsCHROMIUM) == 8, @@ -9162,27 +7611,26 @@ struct RequestExtensionCHROMIUM { typedef RequestExtensionCHROMIUM ValueType; static const CommandId kCmdId = kRequestExtensionCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(uint32 _bucket_id) { + void Init(uint32_t _bucket_id) { SetHeader(); bucket_id = _bucket_id; } - void* Set(void* cmd, uint32 _bucket_id) { + void* Set(void* cmd, uint32_t _bucket_id) { static_cast<ValueType*>(cmd)->Init(_bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 bucket_id; + uint32_t bucket_id; }; COMPILE_ASSERT(sizeof(RequestExtensionCHROMIUM) == 8, @@ -9196,18 +7644,20 @@ struct GetMultipleIntegervCHROMIUM { typedef GetMultipleIntegervCHROMIUM ValueType; static const CommandId kCmdId = kGetMultipleIntegervCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - uint32 _pnames_shm_id, uint32 _pnames_shm_offset, GLuint _count, - uint32 _results_shm_id, uint32 _results_shm_offset, GLsizeiptr _size) { + void Init(uint32_t _pnames_shm_id, + uint32_t _pnames_shm_offset, + GLuint _count, + uint32_t _results_shm_id, + uint32_t _results_shm_offset, + GLsizeiptr _size) { SetHeader(); pnames_shm_id = _pnames_shm_id; pnames_shm_offset = _pnames_shm_offset; @@ -9217,24 +7667,29 @@ struct GetMultipleIntegervCHROMIUM { size = _size; } - void* Set( - void* cmd, uint32 _pnames_shm_id, uint32 _pnames_shm_offset, - GLuint _count, uint32 _results_shm_id, uint32 _results_shm_offset, - GLsizeiptr _size) { - static_cast<ValueType*>( - cmd)->Init( - _pnames_shm_id, _pnames_shm_offset, _count, _results_shm_id, - _results_shm_offset, _size); + void* Set(void* cmd, + uint32_t _pnames_shm_id, + uint32_t _pnames_shm_offset, + GLuint _count, + uint32_t _results_shm_id, + uint32_t _results_shm_offset, + GLsizeiptr _size) { + static_cast<ValueType*>(cmd)->Init(_pnames_shm_id, + _pnames_shm_offset, + _count, + _results_shm_id, + _results_shm_offset, + _size); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 pnames_shm_id; - uint32 pnames_shm_offset; - uint32 count; - uint32 results_shm_id; - uint32 results_shm_offset; - int32 size; + uint32_t pnames_shm_id; + uint32_t pnames_shm_offset; + uint32_t count; + uint32_t results_shm_id; + uint32_t results_shm_offset; + int32_t size; }; COMPILE_ASSERT(sizeof(GetMultipleIntegervCHROMIUM) == 28, @@ -9258,35 +7713,34 @@ struct GetProgramInfoCHROMIUM { typedef GetProgramInfoCHROMIUM ValueType; static const CommandId kCmdId = kGetProgramInfoCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); struct Result { - uint32 link_status; - uint32 num_attribs; - uint32 num_uniforms; + uint32_t link_status; + uint32_t num_attribs; + uint32_t num_uniforms; }; - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLuint _program, uint32 _bucket_id) { + void Init(GLuint _program, uint32_t _bucket_id) { SetHeader(); program = _program; bucket_id = _bucket_id; } - void* Set(void* cmd, GLuint _program, uint32 _bucket_id) { + void* Set(void* cmd, GLuint _program, uint32_t _bucket_id) { static_cast<ValueType*>(cmd)->Init(_program, _bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 program; - uint32 bucket_id; + uint32_t program; + uint32_t bucket_id; }; COMPILE_ASSERT(sizeof(GetProgramInfoCHROMIUM) == 12, @@ -9304,115 +7758,32 @@ COMPILE_ASSERT(offsetof(GetProgramInfoCHROMIUM::Result, num_attribs) == 4, COMPILE_ASSERT(offsetof(GetProgramInfoCHROMIUM::Result, num_uniforms) == 8, OffsetOf_GetProgramInfoCHROMIUM_Result_num_uniforms_not_8); -struct CreateStreamTextureCHROMIUM { - typedef CreateStreamTextureCHROMIUM ValueType; - static const CommandId kCmdId = kCreateStreamTextureCHROMIUM; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - typedef GLuint Result; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLuint _client_id, uint32 _result_shm_id, uint32 _result_shm_offset) { - SetHeader(); - client_id = _client_id; - result_shm_id = _result_shm_id; - result_shm_offset = _result_shm_offset; - } - - void* Set( - void* cmd, GLuint _client_id, uint32 _result_shm_id, - uint32 _result_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_client_id, _result_shm_id, _result_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 client_id; - uint32 result_shm_id; - uint32 result_shm_offset; -}; - -COMPILE_ASSERT(sizeof(CreateStreamTextureCHROMIUM) == 16, - Sizeof_CreateStreamTextureCHROMIUM_is_not_16); -COMPILE_ASSERT(offsetof(CreateStreamTextureCHROMIUM, header) == 0, - OffsetOf_CreateStreamTextureCHROMIUM_header_not_0); -COMPILE_ASSERT(offsetof(CreateStreamTextureCHROMIUM, client_id) == 4, - OffsetOf_CreateStreamTextureCHROMIUM_client_id_not_4); -COMPILE_ASSERT(offsetof(CreateStreamTextureCHROMIUM, result_shm_id) == 8, - OffsetOf_CreateStreamTextureCHROMIUM_result_shm_id_not_8); -COMPILE_ASSERT(offsetof(CreateStreamTextureCHROMIUM, result_shm_offset) == 12, - OffsetOf_CreateStreamTextureCHROMIUM_result_shm_offset_not_12); - -struct DestroyStreamTextureCHROMIUM { - typedef DestroyStreamTextureCHROMIUM ValueType; - static const CommandId kCmdId = kDestroyStreamTextureCHROMIUM; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLuint _texture) { - SetHeader(); - texture = _texture; - } - - void* Set(void* cmd, GLuint _texture) { - static_cast<ValueType*>(cmd)->Init(_texture); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 texture; -}; - -COMPILE_ASSERT(sizeof(DestroyStreamTextureCHROMIUM) == 8, - Sizeof_DestroyStreamTextureCHROMIUM_is_not_8); -COMPILE_ASSERT(offsetof(DestroyStreamTextureCHROMIUM, header) == 0, - OffsetOf_DestroyStreamTextureCHROMIUM_header_not_0); -COMPILE_ASSERT(offsetof(DestroyStreamTextureCHROMIUM, texture) == 4, - OffsetOf_DestroyStreamTextureCHROMIUM_texture_not_4); - struct GetTranslatedShaderSourceANGLE { typedef GetTranslatedShaderSourceANGLE ValueType; static const CommandId kCmdId = kGetTranslatedShaderSourceANGLE; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLuint _shader, uint32 _bucket_id) { + void Init(GLuint _shader, uint32_t _bucket_id) { SetHeader(); shader = _shader; bucket_id = _bucket_id; } - void* Set(void* cmd, GLuint _shader, uint32 _bucket_id) { + void* Set(void* cmd, GLuint _shader, uint32_t _bucket_id) { static_cast<ValueType*>(cmd)->Init(_shader, _bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 shader; - uint32 bucket_id; + uint32_t shader; + uint32_t bucket_id; }; COMPILE_ASSERT(sizeof(GetTranslatedShaderSourceANGLE) == 12, @@ -9428,14 +7799,13 @@ struct PostSubBufferCHROMIUM { typedef PostSubBufferCHROMIUM ValueType; static const CommandId kCmdId = kPostSubBufferCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLint _x, GLint _y, GLint _width, GLint _height) { SetHeader(); @@ -9451,10 +7821,10 @@ struct PostSubBufferCHROMIUM { } gpu::CommandHeader header; - int32 x; - int32 y; - int32 width; - int32 height; + int32_t x; + int32_t y; + int32_t width; + int32_t height; }; COMPILE_ASSERT(sizeof(PostSubBufferCHROMIUM) == 20, @@ -9474,18 +7844,19 @@ struct TexImageIOSurface2DCHROMIUM { typedef TexImageIOSurface2DCHROMIUM ValueType; static const CommandId kCmdId = kTexImageIOSurface2DCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLsizei _width, GLsizei _height, GLuint _ioSurfaceId, - GLuint _plane) { + void Init(GLenum _target, + GLsizei _width, + GLsizei _height, + GLuint _ioSurfaceId, + GLuint _plane) { SetHeader(); target = _target; width = _width; @@ -9494,20 +7865,23 @@ struct TexImageIOSurface2DCHROMIUM { plane = _plane; } - void* Set( - void* cmd, GLenum _target, GLsizei _width, GLsizei _height, - GLuint _ioSurfaceId, GLuint _plane) { - static_cast<ValueType*>( - cmd)->Init(_target, _width, _height, _ioSurfaceId, _plane); + void* Set(void* cmd, + GLenum _target, + GLsizei _width, + GLsizei _height, + GLuint _ioSurfaceId, + GLuint _plane) { + static_cast<ValueType*>(cmd) + ->Init(_target, _width, _height, _ioSurfaceId, _plane); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - int32 width; - int32 height; - uint32 ioSurfaceId; - uint32 plane; + uint32_t target; + int32_t width; + int32_t height; + uint32_t ioSurfaceId; + uint32_t plane; }; COMPILE_ASSERT(sizeof(TexImageIOSurface2DCHROMIUM) == 24, @@ -9529,18 +7903,20 @@ struct CopyTextureCHROMIUM { typedef CopyTextureCHROMIUM ValueType; static const CommandId kCmdId = kCopyTextureCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLenum _source_id, GLenum _dest_id, GLint _level, - GLint _internalformat, GLenum _dest_type) { + void Init(GLenum _target, + GLenum _source_id, + GLenum _dest_id, + GLint _level, + GLint _internalformat, + GLenum _dest_type) { SetHeader(); target = _target; source_id = _source_id; @@ -9550,23 +7926,25 @@ struct CopyTextureCHROMIUM { dest_type = _dest_type; } - void* Set( - void* cmd, GLenum _target, GLenum _source_id, GLenum _dest_id, - GLint _level, GLint _internalformat, GLenum _dest_type) { - static_cast<ValueType*>( - cmd)->Init( - _target, _source_id, _dest_id, _level, _internalformat, - _dest_type); + void* Set(void* cmd, + GLenum _target, + GLenum _source_id, + GLenum _dest_id, + GLint _level, + GLint _internalformat, + GLenum _dest_type) { + static_cast<ValueType*>(cmd)->Init( + _target, _source_id, _dest_id, _level, _internalformat, _dest_type); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - uint32 source_id; - uint32 dest_id; - int32 level; - int32 internalformat; - uint32 dest_type; + uint32_t target; + uint32_t source_id; + uint32_t dest_id; + int32_t level; + int32_t internalformat; + uint32_t dest_type; }; COMPILE_ASSERT(sizeof(CopyTextureCHROMIUM) == 28, @@ -9590,14 +7968,13 @@ struct DrawArraysInstancedANGLE { typedef DrawArraysInstancedANGLE ValueType; static const CommandId kCmdId = kDrawArraysInstancedANGLE; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _mode, GLint _first, GLsizei _count, GLsizei _primcount) { SetHeader(); @@ -9607,18 +7984,20 @@ struct DrawArraysInstancedANGLE { primcount = _primcount; } - void* Set( - void* cmd, GLenum _mode, GLint _first, GLsizei _count, - GLsizei _primcount) { + void* Set(void* cmd, + GLenum _mode, + GLint _first, + GLsizei _count, + GLsizei _primcount) { static_cast<ValueType*>(cmd)->Init(_mode, _first, _count, _primcount); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 mode; - int32 first; - int32 count; - int32 primcount; + uint32_t mode; + int32_t first; + int32_t count; + int32_t primcount; }; COMPILE_ASSERT(sizeof(DrawArraysInstancedANGLE) == 20, @@ -9638,18 +8017,19 @@ struct DrawElementsInstancedANGLE { typedef DrawElementsInstancedANGLE ValueType; static const CommandId kCmdId = kDrawElementsInstancedANGLE; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _mode, GLsizei _count, GLenum _type, GLuint _index_offset, - GLsizei _primcount) { + void Init(GLenum _mode, + GLsizei _count, + GLenum _type, + GLuint _index_offset, + GLsizei _primcount) { SetHeader(); mode = _mode; count = _count; @@ -9658,20 +8038,23 @@ struct DrawElementsInstancedANGLE { primcount = _primcount; } - void* Set( - void* cmd, GLenum _mode, GLsizei _count, GLenum _type, - GLuint _index_offset, GLsizei _primcount) { - static_cast<ValueType*>( - cmd)->Init(_mode, _count, _type, _index_offset, _primcount); + void* Set(void* cmd, + GLenum _mode, + GLsizei _count, + GLenum _type, + GLuint _index_offset, + GLsizei _primcount) { + static_cast<ValueType*>(cmd) + ->Init(_mode, _count, _type, _index_offset, _primcount); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 mode; - int32 count; - uint32 type; - uint32 index_offset; - int32 primcount; + uint32_t mode; + int32_t count; + uint32_t type; + uint32_t index_offset; + int32_t primcount; }; COMPILE_ASSERT(sizeof(DrawElementsInstancedANGLE) == 24, @@ -9693,14 +8076,13 @@ struct VertexAttribDivisorANGLE { typedef VertexAttribDivisorANGLE ValueType; static const CommandId kCmdId = kVertexAttribDivisorANGLE; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _index, GLuint _divisor) { SetHeader(); @@ -9714,8 +8096,8 @@ struct VertexAttribDivisorANGLE { } gpu::CommandHeader header; - uint32 index; - uint32 divisor; + uint32_t index; + uint32_t divisor; }; COMPILE_ASSERT(sizeof(VertexAttribDivisorANGLE) == 12, @@ -9727,86 +8109,37 @@ COMPILE_ASSERT(offsetof(VertexAttribDivisorANGLE, index) == 4, COMPILE_ASSERT(offsetof(VertexAttribDivisorANGLE, divisor) == 8, OffsetOf_VertexAttribDivisorANGLE_divisor_not_8); -struct ProduceTextureCHROMIUM { - typedef ProduceTextureCHROMIUM ValueType; - static const CommandId kCmdId = kProduceTextureCHROMIUM; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLenum _target, uint32 _mailbox_shm_id, uint32 _mailbox_shm_offset) { - SetHeader(); - target = _target; - mailbox_shm_id = _mailbox_shm_id; - mailbox_shm_offset = _mailbox_shm_offset; - } - - void* Set( - void* cmd, GLenum _target, uint32 _mailbox_shm_id, - uint32 _mailbox_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_target, _mailbox_shm_id, _mailbox_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 target; - uint32 mailbox_shm_id; - uint32 mailbox_shm_offset; -}; - -COMPILE_ASSERT(sizeof(ProduceTextureCHROMIUM) == 16, - Sizeof_ProduceTextureCHROMIUM_is_not_16); -COMPILE_ASSERT(offsetof(ProduceTextureCHROMIUM, header) == 0, - OffsetOf_ProduceTextureCHROMIUM_header_not_0); -COMPILE_ASSERT(offsetof(ProduceTextureCHROMIUM, target) == 4, - OffsetOf_ProduceTextureCHROMIUM_target_not_4); -COMPILE_ASSERT(offsetof(ProduceTextureCHROMIUM, mailbox_shm_id) == 8, - OffsetOf_ProduceTextureCHROMIUM_mailbox_shm_id_not_8); -COMPILE_ASSERT(offsetof(ProduceTextureCHROMIUM, mailbox_shm_offset) == 12, - OffsetOf_ProduceTextureCHROMIUM_mailbox_shm_offset_not_12); - struct ProduceTextureCHROMIUMImmediate { typedef ProduceTextureCHROMIUMImmediate ValueType; static const CommandId kCmdId = kProduceTextureCHROMIUMImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); - static uint32 ComputeDataSize() { - return static_cast<uint32>( - sizeof(GLbyte) * 64); // NOLINT + static uint32_t ComputeDataSize() { + return static_cast<uint32_t>(sizeof(GLbyte) * 64); // NOLINT } - static uint32 ComputeSize() { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize()); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize()); // NOLINT } - void SetHeader() { - header.SetCmdByTotalSize<ValueType>(ComputeSize()); - } + void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } void Init(GLenum _target, const GLbyte* _mailbox) { SetHeader(); target = _target; - memcpy(ImmediateDataAddress(this), - _mailbox, ComputeDataSize()); + memcpy(ImmediateDataAddress(this), _mailbox, ComputeDataSize()); } void* Set(void* cmd, GLenum _target, const GLbyte* _mailbox) { static_cast<ValueType*>(cmd)->Init(_target, _mailbox); - const uint32 size = ComputeSize(); + const uint32_t size = ComputeSize(); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - uint32 target; + uint32_t target; }; COMPILE_ASSERT(sizeof(ProduceTextureCHROMIUMImmediate) == 8, @@ -9816,86 +8149,84 @@ COMPILE_ASSERT(offsetof(ProduceTextureCHROMIUMImmediate, header) == 0, COMPILE_ASSERT(offsetof(ProduceTextureCHROMIUMImmediate, target) == 4, OffsetOf_ProduceTextureCHROMIUMImmediate_target_not_4); -struct ConsumeTextureCHROMIUM { - typedef ConsumeTextureCHROMIUM ValueType; - static const CommandId kCmdId = kConsumeTextureCHROMIUM; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; +struct ProduceTextureDirectCHROMIUMImmediate { + typedef ProduceTextureDirectCHROMIUMImmediate ValueType; + static const CommandId kCmdId = kProduceTextureDirectCHROMIUMImmediate; + static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeDataSize() { + return static_cast<uint32_t>(sizeof(GLbyte) * 64); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize()); // NOLINT } - void Init( - GLenum _target, uint32 _mailbox_shm_id, uint32 _mailbox_shm_offset) { + void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } + + void Init(GLuint _texture, GLenum _target, const GLbyte* _mailbox) { SetHeader(); + texture = _texture; target = _target; - mailbox_shm_id = _mailbox_shm_id; - mailbox_shm_offset = _mailbox_shm_offset; + memcpy(ImmediateDataAddress(this), _mailbox, ComputeDataSize()); } - void* Set( - void* cmd, GLenum _target, uint32 _mailbox_shm_id, - uint32 _mailbox_shm_offset) { - static_cast<ValueType*>( - cmd)->Init(_target, _mailbox_shm_id, _mailbox_shm_offset); - return NextCmdAddress<ValueType>(cmd); + void* Set(void* cmd, + GLuint _texture, + GLenum _target, + const GLbyte* _mailbox) { + static_cast<ValueType*>(cmd)->Init(_texture, _target, _mailbox); + const uint32_t size = ComputeSize(); + return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - uint32 target; - uint32 mailbox_shm_id; - uint32 mailbox_shm_offset; + uint32_t texture; + uint32_t target; }; -COMPILE_ASSERT(sizeof(ConsumeTextureCHROMIUM) == 16, - Sizeof_ConsumeTextureCHROMIUM_is_not_16); -COMPILE_ASSERT(offsetof(ConsumeTextureCHROMIUM, header) == 0, - OffsetOf_ConsumeTextureCHROMIUM_header_not_0); -COMPILE_ASSERT(offsetof(ConsumeTextureCHROMIUM, target) == 4, - OffsetOf_ConsumeTextureCHROMIUM_target_not_4); -COMPILE_ASSERT(offsetof(ConsumeTextureCHROMIUM, mailbox_shm_id) == 8, - OffsetOf_ConsumeTextureCHROMIUM_mailbox_shm_id_not_8); -COMPILE_ASSERT(offsetof(ConsumeTextureCHROMIUM, mailbox_shm_offset) == 12, - OffsetOf_ConsumeTextureCHROMIUM_mailbox_shm_offset_not_12); +COMPILE_ASSERT(sizeof(ProduceTextureDirectCHROMIUMImmediate) == 12, + Sizeof_ProduceTextureDirectCHROMIUMImmediate_is_not_12); +COMPILE_ASSERT(offsetof(ProduceTextureDirectCHROMIUMImmediate, header) == 0, + OffsetOf_ProduceTextureDirectCHROMIUMImmediate_header_not_0); +COMPILE_ASSERT(offsetof(ProduceTextureDirectCHROMIUMImmediate, texture) == 4, + OffsetOf_ProduceTextureDirectCHROMIUMImmediate_texture_not_4); +COMPILE_ASSERT(offsetof(ProduceTextureDirectCHROMIUMImmediate, target) == 8, + OffsetOf_ProduceTextureDirectCHROMIUMImmediate_target_not_8); struct ConsumeTextureCHROMIUMImmediate { typedef ConsumeTextureCHROMIUMImmediate ValueType; static const CommandId kCmdId = kConsumeTextureCHROMIUMImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); - static uint32 ComputeDataSize() { - return static_cast<uint32>( - sizeof(GLbyte) * 64); // NOLINT + static uint32_t ComputeDataSize() { + return static_cast<uint32_t>(sizeof(GLbyte) * 64); // NOLINT } - static uint32 ComputeSize() { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize()); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize()); // NOLINT } - void SetHeader() { - header.SetCmdByTotalSize<ValueType>(ComputeSize()); - } + void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } void Init(GLenum _target, const GLbyte* _mailbox) { SetHeader(); target = _target; - memcpy(ImmediateDataAddress(this), - _mailbox, ComputeDataSize()); + memcpy(ImmediateDataAddress(this), _mailbox, ComputeDataSize()); } void* Set(void* cmd, GLenum _target, const GLbyte* _mailbox) { static_cast<ValueType*>(cmd)->Init(_target, _mailbox); - const uint32 size = ComputeSize(); + const uint32_t size = ComputeSize(); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - uint32 target; + uint32_t target; }; COMPILE_ASSERT(sizeof(ConsumeTextureCHROMIUMImmediate) == 8, @@ -9905,92 +8236,37 @@ COMPILE_ASSERT(offsetof(ConsumeTextureCHROMIUMImmediate, header) == 0, COMPILE_ASSERT(offsetof(ConsumeTextureCHROMIUMImmediate, target) == 4, OffsetOf_ConsumeTextureCHROMIUMImmediate_target_not_4); -struct BindUniformLocationCHROMIUM { - typedef BindUniformLocationCHROMIUM ValueType; - static const CommandId kCmdId = kBindUniformLocationCHROMIUM; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init( - GLuint _program, GLint _location, uint32 _name_shm_id, - uint32 _name_shm_offset, uint32 _data_size) { - SetHeader(); - program = _program; - location = _location; - name_shm_id = _name_shm_id; - name_shm_offset = _name_shm_offset; - data_size = _data_size; - } - - void* Set( - void* cmd, GLuint _program, GLint _location, uint32 _name_shm_id, - uint32 _name_shm_offset, uint32 _data_size) { - static_cast<ValueType*>( - cmd)->Init( - _program, _location, _name_shm_id, _name_shm_offset, _data_size); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 program; - int32 location; - uint32 name_shm_id; - uint32 name_shm_offset; - uint32 data_size; -}; - -COMPILE_ASSERT(sizeof(BindUniformLocationCHROMIUM) == 24, - Sizeof_BindUniformLocationCHROMIUM_is_not_24); -COMPILE_ASSERT(offsetof(BindUniformLocationCHROMIUM, header) == 0, - OffsetOf_BindUniformLocationCHROMIUM_header_not_0); -COMPILE_ASSERT(offsetof(BindUniformLocationCHROMIUM, program) == 4, - OffsetOf_BindUniformLocationCHROMIUM_program_not_4); -COMPILE_ASSERT(offsetof(BindUniformLocationCHROMIUM, location) == 8, - OffsetOf_BindUniformLocationCHROMIUM_location_not_8); -COMPILE_ASSERT(offsetof(BindUniformLocationCHROMIUM, name_shm_id) == 12, - OffsetOf_BindUniformLocationCHROMIUM_name_shm_id_not_12); -COMPILE_ASSERT(offsetof(BindUniformLocationCHROMIUM, name_shm_offset) == 16, - OffsetOf_BindUniformLocationCHROMIUM_name_shm_offset_not_16); -COMPILE_ASSERT(offsetof(BindUniformLocationCHROMIUM, data_size) == 20, - OffsetOf_BindUniformLocationCHROMIUM_data_size_not_20); - struct BindUniformLocationCHROMIUMBucket { typedef BindUniformLocationCHROMIUMBucket ValueType; static const CommandId kCmdId = kBindUniformLocationCHROMIUMBucket; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init(GLuint _program, GLint _location, uint32 _name_bucket_id) { + void Init(GLuint _program, GLint _location, uint32_t _name_bucket_id) { SetHeader(); program = _program; location = _location; name_bucket_id = _name_bucket_id; } - void* Set( - void* cmd, GLuint _program, GLint _location, uint32 _name_bucket_id) { + void* Set(void* cmd, + GLuint _program, + GLint _location, + uint32_t _name_bucket_id) { static_cast<ValueType*>(cmd)->Init(_program, _location, _name_bucket_id); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 program; - int32 location; - uint32 name_bucket_id; + uint32_t program; + int32_t location; + uint32_t name_bucket_id; }; COMPILE_ASSERT(sizeof(BindUniformLocationCHROMIUMBucket) == 16, @@ -10003,20 +8279,19 @@ COMPILE_ASSERT(offsetof(BindUniformLocationCHROMIUMBucket, location) == 8, OffsetOf_BindUniformLocationCHROMIUMBucket_location_not_8); COMPILE_ASSERT( offsetof(BindUniformLocationCHROMIUMBucket, name_bucket_id) == 12, - OffsetOf_BindUniformLocationCHROMIUMBucket_name_bucket_id_not_12); // NOLINT + OffsetOf_BindUniformLocationCHROMIUMBucket_name_bucket_id_not_12); struct BindTexImage2DCHROMIUM { typedef BindTexImage2DCHROMIUM ValueType; static const CommandId kCmdId = kBindTexImage2DCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target, GLint _imageId) { SetHeader(); @@ -10030,8 +8305,8 @@ struct BindTexImage2DCHROMIUM { } gpu::CommandHeader header; - uint32 target; - int32 imageId; + uint32_t target; + int32_t imageId; }; COMPILE_ASSERT(sizeof(BindTexImage2DCHROMIUM) == 12, @@ -10047,14 +8322,13 @@ struct ReleaseTexImage2DCHROMIUM { typedef ReleaseTexImage2DCHROMIUM ValueType; static const CommandId kCmdId = kReleaseTexImage2DCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target, GLint _imageId) { SetHeader(); @@ -10068,8 +8342,8 @@ struct ReleaseTexImage2DCHROMIUM { } gpu::CommandHeader header; - uint32 target; - int32 imageId; + uint32_t target; + int32_t imageId; }; COMPILE_ASSERT(sizeof(ReleaseTexImage2DCHROMIUM) == 12, @@ -10085,14 +8359,13 @@ struct TraceBeginCHROMIUM { typedef TraceBeginCHROMIUM ValueType; static const CommandId kCmdId = kTraceBeginCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _bucket_id) { SetHeader(); @@ -10105,7 +8378,7 @@ struct TraceBeginCHROMIUM { } gpu::CommandHeader header; - uint32 bucket_id; + uint32_t bucket_id; }; COMPILE_ASSERT(sizeof(TraceBeginCHROMIUM) == 8, @@ -10119,18 +8392,15 @@ struct TraceEndCHROMIUM { typedef TraceEndCHROMIUM ValueType; static const CommandId kCmdId = kTraceEndCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init() { - SetHeader(); - } + void Init() { SetHeader(); } void* Set(void* cmd) { static_cast<ValueType*>(cmd)->Init(); @@ -10140,8 +8410,7 @@ struct TraceEndCHROMIUM { gpu::CommandHeader header; }; -COMPILE_ASSERT(sizeof(TraceEndCHROMIUM) == 4, - Sizeof_TraceEndCHROMIUM_is_not_4); +COMPILE_ASSERT(sizeof(TraceEndCHROMIUM) == 4, Sizeof_TraceEndCHROMIUM_is_not_4); COMPILE_ASSERT(offsetof(TraceEndCHROMIUM, header) == 0, OffsetOf_TraceEndCHROMIUM_header_not_0); @@ -10149,19 +8418,27 @@ struct AsyncTexSubImage2DCHROMIUM { typedef AsyncTexSubImage2DCHROMIUM ValueType; static const CommandId kCmdId = kAsyncTexSubImage2DCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, - GLsizei _width, GLsizei _height, GLenum _format, GLenum _type, - uint32 _data_shm_id, uint32 _data_shm_offset) { + void Init(GLenum _target, + GLint _level, + GLint _xoffset, + GLint _yoffset, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLenum _type, + uint32_t _data_shm_id, + uint32_t _data_shm_offset, + uint32_t _async_upload_token, + uint32_t _sync_data_shm_id, + uint32_t _sync_data_shm_offset) { SetHeader(); target = _target; level = _level; @@ -10173,34 +8450,59 @@ struct AsyncTexSubImage2DCHROMIUM { type = _type; data_shm_id = _data_shm_id; data_shm_offset = _data_shm_offset; + async_upload_token = _async_upload_token; + sync_data_shm_id = _sync_data_shm_id; + sync_data_shm_offset = _sync_data_shm_offset; } - void* Set( - void* cmd, GLenum _target, GLint _level, GLint _xoffset, GLint _yoffset, - GLsizei _width, GLsizei _height, GLenum _format, GLenum _type, - uint32 _data_shm_id, uint32 _data_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _target, _level, _xoffset, _yoffset, _width, _height, _format, - _type, _data_shm_id, _data_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 target; - int32 level; - int32 xoffset; - int32 yoffset; - int32 width; - int32 height; - uint32 format; - uint32 type; - uint32 data_shm_id; - uint32 data_shm_offset; -}; - -COMPILE_ASSERT(sizeof(AsyncTexSubImage2DCHROMIUM) == 44, - Sizeof_AsyncTexSubImage2DCHROMIUM_is_not_44); + void* Set(void* cmd, + GLenum _target, + GLint _level, + GLint _xoffset, + GLint _yoffset, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLenum _type, + uint32_t _data_shm_id, + uint32_t _data_shm_offset, + uint32_t _async_upload_token, + uint32_t _sync_data_shm_id, + uint32_t _sync_data_shm_offset) { + static_cast<ValueType*>(cmd)->Init(_target, + _level, + _xoffset, + _yoffset, + _width, + _height, + _format, + _type, + _data_shm_id, + _data_shm_offset, + _async_upload_token, + _sync_data_shm_id, + _sync_data_shm_offset); + return NextCmdAddress<ValueType>(cmd); + } + + gpu::CommandHeader header; + uint32_t target; + int32_t level; + int32_t xoffset; + int32_t yoffset; + int32_t width; + int32_t height; + uint32_t format; + uint32_t type; + uint32_t data_shm_id; + uint32_t data_shm_offset; + uint32_t async_upload_token; + uint32_t sync_data_shm_id; + uint32_t sync_data_shm_offset; +}; + +COMPILE_ASSERT(sizeof(AsyncTexSubImage2DCHROMIUM) == 56, + Sizeof_AsyncTexSubImage2DCHROMIUM_is_not_56); COMPILE_ASSERT(offsetof(AsyncTexSubImage2DCHROMIUM, header) == 0, OffsetOf_AsyncTexSubImage2DCHROMIUM_header_not_0); COMPILE_ASSERT(offsetof(AsyncTexSubImage2DCHROMIUM, target) == 4, @@ -10223,63 +8525,98 @@ COMPILE_ASSERT(offsetof(AsyncTexSubImage2DCHROMIUM, data_shm_id) == 36, OffsetOf_AsyncTexSubImage2DCHROMIUM_data_shm_id_not_36); COMPILE_ASSERT(offsetof(AsyncTexSubImage2DCHROMIUM, data_shm_offset) == 40, OffsetOf_AsyncTexSubImage2DCHROMIUM_data_shm_offset_not_40); +COMPILE_ASSERT(offsetof(AsyncTexSubImage2DCHROMIUM, async_upload_token) == 44, + OffsetOf_AsyncTexSubImage2DCHROMIUM_async_upload_token_not_44); +COMPILE_ASSERT(offsetof(AsyncTexSubImage2DCHROMIUM, sync_data_shm_id) == 48, + OffsetOf_AsyncTexSubImage2DCHROMIUM_sync_data_shm_id_not_48); +COMPILE_ASSERT(offsetof(AsyncTexSubImage2DCHROMIUM, sync_data_shm_offset) == 52, + OffsetOf_AsyncTexSubImage2DCHROMIUM_sync_data_shm_offset_not_52); struct AsyncTexImage2DCHROMIUM { typedef AsyncTexImage2DCHROMIUM ValueType; static const CommandId kCmdId = kAsyncTexImage2DCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLint _level, GLint _internalformat, GLsizei _width, - GLsizei _height, GLint _border, GLenum _format, GLenum _type, - uint32 _pixels_shm_id, uint32 _pixels_shm_offset) { + void Init(GLenum _target, + GLint _level, + GLint _internalformat, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLenum _type, + uint32_t _pixels_shm_id, + uint32_t _pixels_shm_offset, + uint32_t _async_upload_token, + uint32_t _sync_data_shm_id, + uint32_t _sync_data_shm_offset) { SetHeader(); target = _target; level = _level; internalformat = _internalformat; width = _width; height = _height; - border = _border; format = _format; type = _type; pixels_shm_id = _pixels_shm_id; pixels_shm_offset = _pixels_shm_offset; + async_upload_token = _async_upload_token; + sync_data_shm_id = _sync_data_shm_id; + sync_data_shm_offset = _sync_data_shm_offset; } - void* Set( - void* cmd, GLenum _target, GLint _level, GLint _internalformat, - GLsizei _width, GLsizei _height, GLint _border, GLenum _format, - GLenum _type, uint32 _pixels_shm_id, uint32 _pixels_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _target, _level, _internalformat, _width, _height, _border, _format, - _type, _pixels_shm_id, _pixels_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - uint32 target; - int32 level; - int32 internalformat; - int32 width; - int32 height; - int32 border; - uint32 format; - uint32 type; - uint32 pixels_shm_id; - uint32 pixels_shm_offset; -}; - -COMPILE_ASSERT(sizeof(AsyncTexImage2DCHROMIUM) == 44, - Sizeof_AsyncTexImage2DCHROMIUM_is_not_44); + void* Set(void* cmd, + GLenum _target, + GLint _level, + GLint _internalformat, + GLsizei _width, + GLsizei _height, + GLenum _format, + GLenum _type, + uint32_t _pixels_shm_id, + uint32_t _pixels_shm_offset, + uint32_t _async_upload_token, + uint32_t _sync_data_shm_id, + uint32_t _sync_data_shm_offset) { + static_cast<ValueType*>(cmd)->Init(_target, + _level, + _internalformat, + _width, + _height, + _format, + _type, + _pixels_shm_id, + _pixels_shm_offset, + _async_upload_token, + _sync_data_shm_id, + _sync_data_shm_offset); + return NextCmdAddress<ValueType>(cmd); + } + + gpu::CommandHeader header; + uint32_t target; + int32_t level; + int32_t internalformat; + int32_t width; + int32_t height; + uint32_t format; + uint32_t type; + uint32_t pixels_shm_id; + uint32_t pixels_shm_offset; + uint32_t async_upload_token; + uint32_t sync_data_shm_id; + uint32_t sync_data_shm_offset; + static const int32_t border = 0; +}; + +COMPILE_ASSERT(sizeof(AsyncTexImage2DCHROMIUM) == 52, + Sizeof_AsyncTexImage2DCHROMIUM_is_not_52); COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, header) == 0, OffsetOf_AsyncTexImage2DCHROMIUM_header_not_0); COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, target) == 4, @@ -10292,29 +8629,32 @@ COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, width) == 16, OffsetOf_AsyncTexImage2DCHROMIUM_width_not_16); COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, height) == 20, OffsetOf_AsyncTexImage2DCHROMIUM_height_not_20); -COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, border) == 24, - OffsetOf_AsyncTexImage2DCHROMIUM_border_not_24); -COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, format) == 28, - OffsetOf_AsyncTexImage2DCHROMIUM_format_not_28); -COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, type) == 32, - OffsetOf_AsyncTexImage2DCHROMIUM_type_not_32); -COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, pixels_shm_id) == 36, - OffsetOf_AsyncTexImage2DCHROMIUM_pixels_shm_id_not_36); -COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, pixels_shm_offset) == 40, - OffsetOf_AsyncTexImage2DCHROMIUM_pixels_shm_offset_not_40); +COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, format) == 24, + OffsetOf_AsyncTexImage2DCHROMIUM_format_not_24); +COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, type) == 28, + OffsetOf_AsyncTexImage2DCHROMIUM_type_not_28); +COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, pixels_shm_id) == 32, + OffsetOf_AsyncTexImage2DCHROMIUM_pixels_shm_id_not_32); +COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, pixels_shm_offset) == 36, + OffsetOf_AsyncTexImage2DCHROMIUM_pixels_shm_offset_not_36); +COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, async_upload_token) == 40, + OffsetOf_AsyncTexImage2DCHROMIUM_async_upload_token_not_40); +COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, sync_data_shm_id) == 44, + OffsetOf_AsyncTexImage2DCHROMIUM_sync_data_shm_id_not_44); +COMPILE_ASSERT(offsetof(AsyncTexImage2DCHROMIUM, sync_data_shm_offset) == 48, + OffsetOf_AsyncTexImage2DCHROMIUM_sync_data_shm_offset_not_48); struct WaitAsyncTexImage2DCHROMIUM { typedef WaitAsyncTexImage2DCHROMIUM ValueType; static const CommandId kCmdId = kWaitAsyncTexImage2DCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _target) { SetHeader(); @@ -10327,7 +8667,7 @@ struct WaitAsyncTexImage2DCHROMIUM { } gpu::CommandHeader header; - uint32 target; + uint32_t target; }; COMPILE_ASSERT(sizeof(WaitAsyncTexImage2DCHROMIUM) == 8, @@ -10337,71 +8677,46 @@ COMPILE_ASSERT(offsetof(WaitAsyncTexImage2DCHROMIUM, header) == 0, COMPILE_ASSERT(offsetof(WaitAsyncTexImage2DCHROMIUM, target) == 4, OffsetOf_WaitAsyncTexImage2DCHROMIUM_target_not_4); -struct DiscardFramebufferEXT { - typedef DiscardFramebufferEXT ValueType; - static const CommandId kCmdId = kDiscardFramebufferEXT; +struct WaitAllAsyncTexImage2DCHROMIUM { + typedef WaitAllAsyncTexImage2DCHROMIUM ValueType; + static const CommandId kCmdId = kWaitAllAsyncTexImage2DCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init( - GLenum _target, GLsizei _count, uint32 _attachments_shm_id, - uint32 _attachments_shm_offset) { - SetHeader(); - target = _target; - count = _count; - attachments_shm_id = _attachments_shm_id; - attachments_shm_offset = _attachments_shm_offset; - } + void Init() { SetHeader(); } - void* Set( - void* cmd, GLenum _target, GLsizei _count, uint32 _attachments_shm_id, - uint32 _attachments_shm_offset) { - static_cast<ValueType*>( - cmd)->Init( - _target, _count, _attachments_shm_id, _attachments_shm_offset); + void* Set(void* cmd) { + static_cast<ValueType*>(cmd)->Init(); return NextCmdAddress<ValueType>(cmd); } gpu::CommandHeader header; - uint32 target; - int32 count; - uint32 attachments_shm_id; - uint32 attachments_shm_offset; }; -COMPILE_ASSERT(sizeof(DiscardFramebufferEXT) == 20, - Sizeof_DiscardFramebufferEXT_is_not_20); -COMPILE_ASSERT(offsetof(DiscardFramebufferEXT, header) == 0, - OffsetOf_DiscardFramebufferEXT_header_not_0); -COMPILE_ASSERT(offsetof(DiscardFramebufferEXT, target) == 4, - OffsetOf_DiscardFramebufferEXT_target_not_4); -COMPILE_ASSERT(offsetof(DiscardFramebufferEXT, count) == 8, - OffsetOf_DiscardFramebufferEXT_count_not_8); -COMPILE_ASSERT(offsetof(DiscardFramebufferEXT, attachments_shm_id) == 12, - OffsetOf_DiscardFramebufferEXT_attachments_shm_id_not_12); -COMPILE_ASSERT(offsetof(DiscardFramebufferEXT, attachments_shm_offset) == 16, - OffsetOf_DiscardFramebufferEXT_attachments_shm_offset_not_16); +COMPILE_ASSERT(sizeof(WaitAllAsyncTexImage2DCHROMIUM) == 4, + Sizeof_WaitAllAsyncTexImage2DCHROMIUM_is_not_4); +COMPILE_ASSERT(offsetof(WaitAllAsyncTexImage2DCHROMIUM, header) == 0, + OffsetOf_WaitAllAsyncTexImage2DCHROMIUM_header_not_0); struct DiscardFramebufferEXTImmediate { typedef DiscardFramebufferEXTImmediate ValueType; static const CommandId kCmdId = kDiscardFramebufferEXTImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLenum) * 1 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLenum) * 1 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { @@ -10412,20 +8727,21 @@ struct DiscardFramebufferEXTImmediate { SetHeader(_count); target = _target; count = _count; - memcpy(ImmediateDataAddress(this), - _attachments, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _attachments, ComputeDataSize(_count)); } - void* Set( - void* cmd, GLenum _target, GLsizei _count, const GLenum* _attachments) { + void* Set(void* cmd, + GLenum _target, + GLsizei _count, + const GLenum* _attachments) { static_cast<ValueType*>(cmd)->Init(_target, _count, _attachments); - const uint32 size = ComputeSize(_count); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - uint32 target; - int32 count; + uint32_t target; + int32_t count; }; COMPILE_ASSERT(sizeof(DiscardFramebufferEXTImmediate) == 12, @@ -10441,14 +8757,13 @@ struct LoseContextCHROMIUM { typedef LoseContextCHROMIUM ValueType; static const CommandId kCmdId = kLoseContextCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLenum _current, GLenum _other) { SetHeader(); @@ -10462,8 +8777,8 @@ struct LoseContextCHROMIUM { } gpu::CommandHeader header; - uint32 current; - uint32 other; + uint32_t current; + uint32_t other; }; COMPILE_ASSERT(sizeof(LoseContextCHROMIUM) == 12, @@ -10479,14 +8794,13 @@ struct WaitSyncPointCHROMIUM { typedef WaitSyncPointCHROMIUM ValueType; static const CommandId kCmdId = kWaitSyncPointCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(1); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } void Init(GLuint _sync_point) { SetHeader(); @@ -10499,7 +8813,7 @@ struct WaitSyncPointCHROMIUM { } gpu::CommandHeader header; - uint32 sync_point; + uint32_t sync_point; }; COMPILE_ASSERT(sizeof(WaitSyncPointCHROMIUM) == 8, @@ -10509,63 +8823,19 @@ COMPILE_ASSERT(offsetof(WaitSyncPointCHROMIUM, header) == 0, COMPILE_ASSERT(offsetof(WaitSyncPointCHROMIUM, sync_point) == 4, OffsetOf_WaitSyncPointCHROMIUM_sync_point_not_4); -struct DrawBuffersEXT { - typedef DrawBuffersEXT ValueType; - static const CommandId kCmdId = kDrawBuffersEXT; - static const cmd::ArgFlags kArgFlags = cmd::kFixed; - - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT - } - - void SetHeader() { - header.SetCmd<ValueType>(); - } - - void Init(GLsizei _count, uint32 _bufs_shm_id, uint32 _bufs_shm_offset) { - SetHeader(); - count = _count; - bufs_shm_id = _bufs_shm_id; - bufs_shm_offset = _bufs_shm_offset; - } - - void* Set( - void* cmd, GLsizei _count, uint32 _bufs_shm_id, - uint32 _bufs_shm_offset) { - static_cast<ValueType*>(cmd)->Init(_count, _bufs_shm_id, _bufs_shm_offset); - return NextCmdAddress<ValueType>(cmd); - } - - gpu::CommandHeader header; - int32 count; - uint32 bufs_shm_id; - uint32 bufs_shm_offset; -}; - -COMPILE_ASSERT(sizeof(DrawBuffersEXT) == 16, - Sizeof_DrawBuffersEXT_is_not_16); -COMPILE_ASSERT(offsetof(DrawBuffersEXT, header) == 0, - OffsetOf_DrawBuffersEXT_header_not_0); -COMPILE_ASSERT(offsetof(DrawBuffersEXT, count) == 4, - OffsetOf_DrawBuffersEXT_count_not_4); -COMPILE_ASSERT(offsetof(DrawBuffersEXT, bufs_shm_id) == 8, - OffsetOf_DrawBuffersEXT_bufs_shm_id_not_8); -COMPILE_ASSERT(offsetof(DrawBuffersEXT, bufs_shm_offset) == 12, - OffsetOf_DrawBuffersEXT_bufs_shm_offset_not_12); - struct DrawBuffersEXTImmediate { typedef DrawBuffersEXTImmediate ValueType; static const CommandId kCmdId = kDrawBuffersEXTImmediate; static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeDataSize(GLsizei count) { - return static_cast<uint32>( - sizeof(GLenum) * 1 * count); // NOLINT + static uint32_t ComputeDataSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(GLenum) * 1 * count); // NOLINT } - static uint32 ComputeSize(GLsizei count) { - return static_cast<uint32>( - sizeof(ValueType) + ComputeDataSize(count)); // NOLINT + static uint32_t ComputeSize(GLsizei count) { + return static_cast<uint32_t>(sizeof(ValueType) + + ComputeDataSize(count)); // NOLINT } void SetHeader(GLsizei count) { @@ -10575,18 +8845,17 @@ struct DrawBuffersEXTImmediate { void Init(GLsizei _count, const GLenum* _bufs) { SetHeader(_count); count = _count; - memcpy(ImmediateDataAddress(this), - _bufs, ComputeDataSize(_count)); + memcpy(ImmediateDataAddress(this), _bufs, ComputeDataSize(_count)); } void* Set(void* cmd, GLsizei _count, const GLenum* _bufs) { static_cast<ValueType*>(cmd)->Init(_count, _bufs); - const uint32 size = ComputeSize(_count); + const uint32_t size = ComputeSize(_count); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; - int32 count; + int32_t count; }; COMPILE_ASSERT(sizeof(DrawBuffersEXTImmediate) == 8, @@ -10600,18 +8869,15 @@ struct DiscardBackbufferCHROMIUM { typedef DiscardBackbufferCHROMIUM ValueType; static const CommandId kCmdId = kDiscardBackbufferCHROMIUM; static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); - static uint32 ComputeSize() { - return static_cast<uint32>(sizeof(ValueType)); // NOLINT + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT } - void SetHeader() { - header.SetCmd<ValueType>(); - } + void SetHeader() { header.SetCmd<ValueType>(); } - void Init() { - SetHeader(); - } + void Init() { SetHeader(); } void* Set(void* cmd) { static_cast<ValueType*>(cmd)->Init(); @@ -10626,6 +8892,108 @@ COMPILE_ASSERT(sizeof(DiscardBackbufferCHROMIUM) == 4, COMPILE_ASSERT(offsetof(DiscardBackbufferCHROMIUM, header) == 0, OffsetOf_DiscardBackbufferCHROMIUM_header_not_0); +struct ScheduleOverlayPlaneCHROMIUM { + typedef ScheduleOverlayPlaneCHROMIUM ValueType; + static const CommandId kCmdId = kScheduleOverlayPlaneCHROMIUM; + static const cmd::ArgFlags kArgFlags = cmd::kFixed; + static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); + + static uint32_t ComputeSize() { + return static_cast<uint32_t>(sizeof(ValueType)); // NOLINT + } + + void SetHeader() { header.SetCmd<ValueType>(); } + + void Init(GLint _plane_z_order, + GLenum _plane_transform, + GLuint _overlay_texture_id, + GLint _bounds_x, + GLint _bounds_y, + GLint _bounds_width, + GLint _bounds_height, + GLfloat _uv_x, + GLfloat _uv_y, + GLfloat _uv_width, + GLfloat _uv_height) { + SetHeader(); + plane_z_order = _plane_z_order; + plane_transform = _plane_transform; + overlay_texture_id = _overlay_texture_id; + bounds_x = _bounds_x; + bounds_y = _bounds_y; + bounds_width = _bounds_width; + bounds_height = _bounds_height; + uv_x = _uv_x; + uv_y = _uv_y; + uv_width = _uv_width; + uv_height = _uv_height; + } + + void* Set(void* cmd, + GLint _plane_z_order, + GLenum _plane_transform, + GLuint _overlay_texture_id, + GLint _bounds_x, + GLint _bounds_y, + GLint _bounds_width, + GLint _bounds_height, + GLfloat _uv_x, + GLfloat _uv_y, + GLfloat _uv_width, + GLfloat _uv_height) { + static_cast<ValueType*>(cmd)->Init(_plane_z_order, + _plane_transform, + _overlay_texture_id, + _bounds_x, + _bounds_y, + _bounds_width, + _bounds_height, + _uv_x, + _uv_y, + _uv_width, + _uv_height); + return NextCmdAddress<ValueType>(cmd); + } + + gpu::CommandHeader header; + int32_t plane_z_order; + uint32_t plane_transform; + uint32_t overlay_texture_id; + int32_t bounds_x; + int32_t bounds_y; + int32_t bounds_width; + int32_t bounds_height; + float uv_x; + float uv_y; + float uv_width; + float uv_height; +}; + +COMPILE_ASSERT(sizeof(ScheduleOverlayPlaneCHROMIUM) == 48, + Sizeof_ScheduleOverlayPlaneCHROMIUM_is_not_48); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, header) == 0, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_header_not_0); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, plane_z_order) == 4, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_plane_z_order_not_4); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, plane_transform) == 8, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_plane_transform_not_8); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, overlay_texture_id) == 12, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_overlay_texture_id_not_12); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, bounds_x) == 16, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_bounds_x_not_16); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, bounds_y) == 20, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_bounds_y_not_20); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, bounds_width) == 24, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_bounds_width_not_24); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, bounds_height) == 28, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_bounds_height_not_28); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, uv_x) == 32, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_uv_x_not_32); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, uv_y) == 36, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_uv_y_not_36); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, uv_width) == 40, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_uv_width_not_40); +COMPILE_ASSERT(offsetof(ScheduleOverlayPlaneCHROMIUM, uv_height) == 44, + OffsetOf_ScheduleOverlayPlaneCHROMIUM_uv_height_not_44); #endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_format_test.cc b/chromium/gpu/command_buffer/common/gles2_cmd_format_test.cc index 396ccb3e2d7..717e6fb2030 100644 --- a/chromium/gpu/command_buffer/common/gles2_cmd_format_test.cc +++ b/chromium/gpu/command_buffer/common/gles2_cmd_format_test.cc @@ -4,6 +4,11 @@ // This file contains unit tests for gles2 commmands +#include <limits> + +#include "base/bind.h" +#include "base/synchronization/waitable_event.h" +#include "base/threading/thread.h" #include "testing/gtest/include/gtest/gtest.h" #include "gpu/command_buffer/common/gles2_cmd_format.h" @@ -46,6 +51,68 @@ class GLES2FormatTest : public testing::Test { unsigned char buffer_[1024]; }; +void SignalCompletion(uint32* assigned_async_token_ptr, + uint32 async_token, + AsyncUploadSync* sync) { + EXPECT_EQ(async_token, *assigned_async_token_ptr); + sync->SetAsyncUploadToken(async_token); +} + +TEST(GLES2FormatAsyncUploadSyncTest, AsyncUploadSync) { + const size_t kSize = 10; + const size_t kCount = 1000; + + base::Thread thread("GLES2FormatUploadSyncTest - Fake Upload Thread"); + thread.Start(); + + // Run the same test 50 times so we retest the wrap as well. + for (size_t test_run = 0; test_run < 50; ++test_run) { + AsyncUploadSync sync; + sync.Reset(); + + uint32 buffer_tokens[kSize]; + memset(buffer_tokens, 0, sizeof(buffer_tokens)); + + // Start with a token large enough so that we'll wrap. + uint32 async_token = std::numeric_limits<uint32>::max() - kCount / 2; + + // Set initial async token. + sync.SetAsyncUploadToken(async_token); + + for (size_t i = 0; i < kCount; ++i) { + size_t buffer = i % kSize; + + // Loop until previous async token has passed if any was set. + while (buffer_tokens[buffer] && + !sync.HasAsyncUploadTokenPassed(buffer_tokens[buffer])) + base::PlatformThread::YieldCurrentThread(); + + // Next token, skip 0. + async_token++; + if (async_token == 0) + async_token++; + + // Set the buffer's associated token. + buffer_tokens[buffer] = async_token; + + // Set the async upload token on the fake upload thread and assert that + // the associated buffer still has the given token. + thread.message_loop()->PostTask(FROM_HERE, + base::Bind(&SignalCompletion, + &buffer_tokens[buffer], + async_token, + &sync)); + } + + // Flush the thread message loop before starting again. + base::WaitableEvent waitable(false, false); + thread.message_loop()->PostTask(FROM_HERE, + base::Bind(&base::WaitableEvent::Signal, + base::Unretained(&waitable))); + waitable.Wait(); + } +} + // GCC requires these declarations, but MSVC requires they not be present #ifndef _MSC_VER const unsigned char GLES2FormatTest::kInitialValue; diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/chromium/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h index 9672db4c749..071bde21a6e 100644 --- a/chromium/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h +++ b/chromium/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // This file contains unit tests for gles2 commmands @@ -14,377 +16,295 @@ TEST_F(GLES2FormatTest, ActiveTexture) { cmds::ActiveTexture& cmd = *GetBufferAs<cmds::ActiveTexture>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::ActiveTexture::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ActiveTexture::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.texture); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, AttachShader) { cmds::AttachShader& cmd = *GetBufferAs<cmds::AttachShader>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLuint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::AttachShader::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<GLuint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::AttachShader::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); EXPECT_EQ(static_cast<GLuint>(12), cmd.shader); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, BindAttribLocation) { - cmds::BindAttribLocation& cmd = *GetBufferAs<cmds::BindAttribLocation>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLuint>(12), - static_cast<uint32>(13), - static_cast<uint32>(14), - static_cast<uint32>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::BindAttribLocation::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLuint>(11), cmd.program); - EXPECT_EQ(static_cast<GLuint>(12), cmd.index); - EXPECT_EQ(static_cast<uint32>(13), cmd.name_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.name_shm_offset); - EXPECT_EQ(static_cast<uint32>(15), cmd.data_size); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BindAttribLocationBucket) { cmds::BindAttribLocationBucket& cmd = *GetBufferAs<cmds::BindAttribLocationBucket>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLuint>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::BindAttribLocationBucket::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLuint>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BindAttribLocationBucket::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); EXPECT_EQ(static_cast<GLuint>(12), cmd.index); - EXPECT_EQ(static_cast<uint32>(13), cmd.name_bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.name_bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BindBuffer) { cmds::BindBuffer& cmd = *GetBufferAs<cmds::BindBuffer>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLuint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::BindBuffer::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLuint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BindBuffer::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLuint>(12), cmd.buffer); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BindFramebuffer) { cmds::BindFramebuffer& cmd = *GetBufferAs<cmds::BindFramebuffer>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLuint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::BindFramebuffer::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLuint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BindFramebuffer::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLuint>(12), cmd.framebuffer); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BindRenderbuffer) { cmds::BindRenderbuffer& cmd = *GetBufferAs<cmds::BindRenderbuffer>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLuint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::BindRenderbuffer::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLuint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BindRenderbuffer::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLuint>(12), cmd.renderbuffer); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BindTexture) { cmds::BindTexture& cmd = *GetBufferAs<cmds::BindTexture>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLuint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::BindTexture::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLuint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BindTexture::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLuint>(12), cmd.texture); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BlendColor) { cmds::BlendColor& cmd = *GetBufferAs<cmds::BlendColor>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLclampf>(11), - static_cast<GLclampf>(12), - static_cast<GLclampf>(13), - static_cast<GLclampf>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::BlendColor::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLclampf>(11), + static_cast<GLclampf>(12), + static_cast<GLclampf>(13), + static_cast<GLclampf>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BlendColor::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLclampf>(11), cmd.red); EXPECT_EQ(static_cast<GLclampf>(12), cmd.green); EXPECT_EQ(static_cast<GLclampf>(13), cmd.blue); EXPECT_EQ(static_cast<GLclampf>(14), cmd.alpha); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BlendEquation) { cmds::BlendEquation& cmd = *GetBufferAs<cmds::BlendEquation>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::BlendEquation::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BlendEquation::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.mode); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BlendEquationSeparate) { cmds::BlendEquationSeparate& cmd = *GetBufferAs<cmds::BlendEquationSeparate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::BlendEquationSeparate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLenum>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BlendEquationSeparate::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.modeRGB); EXPECT_EQ(static_cast<GLenum>(12), cmd.modeAlpha); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BlendFunc) { cmds::BlendFunc& cmd = *GetBufferAs<cmds::BlendFunc>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::BlendFunc::kCmdId), - cmd.header.command); + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLenum>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BlendFunc::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.sfactor); EXPECT_EQ(static_cast<GLenum>(12), cmd.dfactor); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BlendFuncSeparate) { cmds::BlendFuncSeparate& cmd = *GetBufferAs<cmds::BlendFuncSeparate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLenum>(13), - static_cast<GLenum>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::BlendFuncSeparate::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLenum>(13), + static_cast<GLenum>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BlendFuncSeparate::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.srcRGB); EXPECT_EQ(static_cast<GLenum>(12), cmd.dstRGB); EXPECT_EQ(static_cast<GLenum>(13), cmd.srcAlpha); EXPECT_EQ(static_cast<GLenum>(14), cmd.dstAlpha); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BufferData) { cmds::BufferData& cmd = *GetBufferAs<cmds::BufferData>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLsizeiptr>(12), - static_cast<uint32>(13), - static_cast<uint32>(14), - static_cast<GLenum>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::BufferData::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLsizeiptr>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14), + static_cast<GLenum>(15)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BufferData::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLsizeiptr>(12), cmd.size); - EXPECT_EQ(static_cast<uint32>(13), cmd.data_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.data_shm_offset); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.data_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.data_shm_offset); EXPECT_EQ(static_cast<GLenum>(15), cmd.usage); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BufferSubData) { cmds::BufferSubData& cmd = *GetBufferAs<cmds::BufferSubData>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLintptr>(12), - static_cast<GLsizeiptr>(13), - static_cast<uint32>(14), - static_cast<uint32>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::BufferSubData::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLintptr>(12), + static_cast<GLsizeiptr>(13), + static_cast<uint32_t>(14), + static_cast<uint32_t>(15)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BufferSubData::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLintptr>(12), cmd.offset); EXPECT_EQ(static_cast<GLsizeiptr>(13), cmd.size); - EXPECT_EQ(static_cast<uint32>(14), cmd.data_shm_id); - EXPECT_EQ(static_cast<uint32>(15), cmd.data_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.data_shm_id); + EXPECT_EQ(static_cast<uint32_t>(15), cmd.data_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, CheckFramebufferStatus) { cmds::CheckFramebufferStatus& cmd = *GetBufferAs<cmds::CheckFramebufferStatus>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::CheckFramebufferStatus::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CheckFramebufferStatus::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Clear) { cmds::Clear& cmd = *GetBufferAs<cmds::Clear>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLbitfield>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::Clear::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, static_cast<GLbitfield>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Clear::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLbitfield>(11), cmd.mask); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, ClearColor) { cmds::ClearColor& cmd = *GetBufferAs<cmds::ClearColor>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLclampf>(11), - static_cast<GLclampf>(12), - static_cast<GLclampf>(13), - static_cast<GLclampf>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::ClearColor::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLclampf>(11), + static_cast<GLclampf>(12), + static_cast<GLclampf>(13), + static_cast<GLclampf>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ClearColor::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLclampf>(11), cmd.red); EXPECT_EQ(static_cast<GLclampf>(12), cmd.green); EXPECT_EQ(static_cast<GLclampf>(13), cmd.blue); EXPECT_EQ(static_cast<GLclampf>(14), cmd.alpha); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, ClearDepthf) { cmds::ClearDepthf& cmd = *GetBufferAs<cmds::ClearDepthf>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLclampf>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::ClearDepthf::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLclampf>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ClearDepthf::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLclampf>(11), cmd.depth); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, ClearStencil) { cmds::ClearStencil& cmd = *GetBufferAs<cmds::ClearStencil>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::ClearStencil::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ClearStencil::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.s); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, ColorMask) { cmds::ColorMask& cmd = *GetBufferAs<cmds::ColorMask>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLboolean>(11), - static_cast<GLboolean>(12), - static_cast<GLboolean>(13), - static_cast<GLboolean>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::ColorMask::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLboolean>(11), + static_cast<GLboolean>(12), + static_cast<GLboolean>(13), + static_cast<GLboolean>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ColorMask::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLboolean>(11), cmd.red); EXPECT_EQ(static_cast<GLboolean>(12), cmd.green); EXPECT_EQ(static_cast<GLboolean>(13), cmd.blue); EXPECT_EQ(static_cast<GLboolean>(14), cmd.alpha); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, CompileShader) { cmds::CompileShader& cmd = *GetBufferAs<cmds::CompileShader>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::CompileShader::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CompileShader::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.shader); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } -TEST_F(GLES2FormatTest, CompressedTexImage2D) { - cmds::CompressedTexImage2D& cmd = *GetBufferAs<cmds::CompressedTexImage2D>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLenum>(13), - static_cast<GLsizei>(14), - static_cast<GLsizei>(15), - static_cast<GLint>(16), - static_cast<GLsizei>(17), - static_cast<uint32>(18), - static_cast<uint32>(19)); - EXPECT_EQ(static_cast<uint32>(cmds::CompressedTexImage2D::kCmdId), +TEST_F(GLES2FormatTest, CompressedTexImage2DBucket) { + cmds::CompressedTexImage2DBucket& cmd = + *GetBufferAs<cmds::CompressedTexImage2DBucket>(); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLenum>(13), + static_cast<GLsizei>(14), + static_cast<GLsizei>(15), + static_cast<GLuint>(16)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CompressedTexImage2DBucket::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -392,27 +312,22 @@ TEST_F(GLES2FormatTest, CompressedTexImage2D) { EXPECT_EQ(static_cast<GLenum>(13), cmd.internalformat); EXPECT_EQ(static_cast<GLsizei>(14), cmd.width); EXPECT_EQ(static_cast<GLsizei>(15), cmd.height); - EXPECT_EQ(static_cast<GLint>(16), cmd.border); - EXPECT_EQ(static_cast<GLsizei>(17), cmd.imageSize); - EXPECT_EQ(static_cast<uint32>(18), cmd.data_shm_id); - EXPECT_EQ(static_cast<uint32>(19), cmd.data_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<GLuint>(16), cmd.bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } -TEST_F(GLES2FormatTest, CompressedTexImage2DBucket) { - cmds::CompressedTexImage2DBucket& cmd = - *GetBufferAs<cmds::CompressedTexImage2DBucket>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLenum>(13), - static_cast<GLsizei>(14), - static_cast<GLsizei>(15), - static_cast<GLint>(16), - static_cast<GLuint>(17)); - EXPECT_EQ(static_cast<uint32>(cmds::CompressedTexImage2DBucket::kCmdId), +TEST_F(GLES2FormatTest, CompressedTexImage2D) { + cmds::CompressedTexImage2D& cmd = *GetBufferAs<cmds::CompressedTexImage2D>(); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLenum>(13), + static_cast<GLsizei>(14), + static_cast<GLsizei>(15), + static_cast<GLsizei>(16), + static_cast<uint32_t>(17), + static_cast<uint32_t>(18)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CompressedTexImage2D::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -420,28 +335,25 @@ TEST_F(GLES2FormatTest, CompressedTexImage2DBucket) { EXPECT_EQ(static_cast<GLenum>(13), cmd.internalformat); EXPECT_EQ(static_cast<GLsizei>(14), cmd.width); EXPECT_EQ(static_cast<GLsizei>(15), cmd.height); - EXPECT_EQ(static_cast<GLint>(16), cmd.border); - EXPECT_EQ(static_cast<GLuint>(17), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<GLsizei>(16), cmd.imageSize); + EXPECT_EQ(static_cast<uint32_t>(17), cmd.data_shm_id); + EXPECT_EQ(static_cast<uint32_t>(18), cmd.data_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } -TEST_F(GLES2FormatTest, CompressedTexSubImage2D) { - cmds::CompressedTexSubImage2D& cmd = - *GetBufferAs<cmds::CompressedTexSubImage2D>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLint>(13), - static_cast<GLint>(14), - static_cast<GLsizei>(15), - static_cast<GLsizei>(16), - static_cast<GLenum>(17), - static_cast<GLsizei>(18), - static_cast<uint32>(19), - static_cast<uint32>(20)); - EXPECT_EQ(static_cast<uint32>(cmds::CompressedTexSubImage2D::kCmdId), +TEST_F(GLES2FormatTest, CompressedTexSubImage2DBucket) { + cmds::CompressedTexSubImage2DBucket& cmd = + *GetBufferAs<cmds::CompressedTexSubImage2DBucket>(); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLint>(13), + static_cast<GLint>(14), + static_cast<GLsizei>(15), + static_cast<GLsizei>(16), + static_cast<GLenum>(17), + static_cast<GLuint>(18)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CompressedTexSubImage2DBucket::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -451,27 +363,25 @@ TEST_F(GLES2FormatTest, CompressedTexSubImage2D) { EXPECT_EQ(static_cast<GLsizei>(15), cmd.width); EXPECT_EQ(static_cast<GLsizei>(16), cmd.height); EXPECT_EQ(static_cast<GLenum>(17), cmd.format); - EXPECT_EQ(static_cast<GLsizei>(18), cmd.imageSize); - EXPECT_EQ(static_cast<uint32>(19), cmd.data_shm_id); - EXPECT_EQ(static_cast<uint32>(20), cmd.data_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<GLuint>(18), cmd.bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } -TEST_F(GLES2FormatTest, CompressedTexSubImage2DBucket) { - cmds::CompressedTexSubImage2DBucket& cmd = - *GetBufferAs<cmds::CompressedTexSubImage2DBucket>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLint>(13), - static_cast<GLint>(14), - static_cast<GLsizei>(15), - static_cast<GLsizei>(16), - static_cast<GLenum>(17), - static_cast<GLuint>(18)); - EXPECT_EQ(static_cast<uint32>(cmds::CompressedTexSubImage2DBucket::kCmdId), +TEST_F(GLES2FormatTest, CompressedTexSubImage2D) { + cmds::CompressedTexSubImage2D& cmd = + *GetBufferAs<cmds::CompressedTexSubImage2D>(); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLint>(13), + static_cast<GLint>(14), + static_cast<GLsizei>(15), + static_cast<GLsizei>(16), + static_cast<GLenum>(17), + static_cast<GLsizei>(18), + static_cast<uint32_t>(19), + static_cast<uint32_t>(20)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CompressedTexSubImage2D::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -481,24 +391,23 @@ TEST_F(GLES2FormatTest, CompressedTexSubImage2DBucket) { EXPECT_EQ(static_cast<GLsizei>(15), cmd.width); EXPECT_EQ(static_cast<GLsizei>(16), cmd.height); EXPECT_EQ(static_cast<GLenum>(17), cmd.format); - EXPECT_EQ(static_cast<GLuint>(18), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<GLsizei>(18), cmd.imageSize); + EXPECT_EQ(static_cast<uint32_t>(19), cmd.data_shm_id); + EXPECT_EQ(static_cast<uint32_t>(20), cmd.data_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, CopyTexImage2D) { cmds::CopyTexImage2D& cmd = *GetBufferAs<cmds::CopyTexImage2D>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLenum>(13), - static_cast<GLint>(14), - static_cast<GLint>(15), - static_cast<GLsizei>(16), - static_cast<GLsizei>(17), - static_cast<GLint>(18)); - EXPECT_EQ(static_cast<uint32>(cmds::CopyTexImage2D::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLenum>(13), + static_cast<GLint>(14), + static_cast<GLint>(15), + static_cast<GLsizei>(16), + static_cast<GLsizei>(17)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CopyTexImage2D::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -508,24 +417,21 @@ TEST_F(GLES2FormatTest, CopyTexImage2D) { EXPECT_EQ(static_cast<GLint>(15), cmd.y); EXPECT_EQ(static_cast<GLsizei>(16), cmd.width); EXPECT_EQ(static_cast<GLsizei>(17), cmd.height); - EXPECT_EQ(static_cast<GLint>(18), cmd.border); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, CopyTexSubImage2D) { cmds::CopyTexSubImage2D& cmd = *GetBufferAs<cmds::CopyTexSubImage2D>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLint>(13), - static_cast<GLint>(14), - static_cast<GLint>(15), - static_cast<GLint>(16), - static_cast<GLsizei>(17), - static_cast<GLsizei>(18)); - EXPECT_EQ(static_cast<uint32>(cmds::CopyTexSubImage2D::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLint>(13), + static_cast<GLint>(14), + static_cast<GLint>(15), + static_cast<GLint>(16), + static_cast<GLsizei>(17), + static_cast<GLsizei>(18)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CopyTexSubImage2D::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -536,1241 +442,942 @@ TEST_F(GLES2FormatTest, CopyTexSubImage2D) { EXPECT_EQ(static_cast<GLint>(16), cmd.y); EXPECT_EQ(static_cast<GLsizei>(17), cmd.width); EXPECT_EQ(static_cast<GLsizei>(18), cmd.height); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, CreateProgram) { cmds::CreateProgram& cmd = *GetBufferAs<cmds::CreateProgram>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<uint32>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::CreateProgram::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<uint32_t>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CreateProgram::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<uint32>(11), cmd.client_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(11), cmd.client_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, CreateShader) { cmds::CreateShader& cmd = *GetBufferAs<cmds::CreateShader>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<uint32>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::CreateShader::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<uint32_t>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CreateShader::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.type); - EXPECT_EQ(static_cast<uint32>(12), cmd.client_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.client_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, CullFace) { cmds::CullFace& cmd = *GetBufferAs<cmds::CullFace>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::CullFace::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CullFace::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.mode); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, DeleteBuffers) { - cmds::DeleteBuffers& cmd = *GetBufferAs<cmds::DeleteBuffers>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteBuffers::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.buffers_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.buffers_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DeleteBuffersImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::DeleteBuffersImmediate& cmd = *GetBufferAs<cmds::DeleteBuffersImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteBuffersImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::DeleteBuffersImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } -TEST_F(GLES2FormatTest, DeleteFramebuffers) { - cmds::DeleteFramebuffers& cmd = *GetBufferAs<cmds::DeleteFramebuffers>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteFramebuffers::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.framebuffers_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.framebuffers_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - TEST_F(GLES2FormatTest, DeleteFramebuffersImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::DeleteFramebuffersImmediate& cmd = *GetBufferAs<cmds::DeleteFramebuffersImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteFramebuffersImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::DeleteFramebuffersImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } TEST_F(GLES2FormatTest, DeleteProgram) { cmds::DeleteProgram& cmd = *GetBufferAs<cmds::DeleteProgram>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteProgram::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DeleteProgram::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, DeleteRenderbuffers) { - cmds::DeleteRenderbuffers& cmd = *GetBufferAs<cmds::DeleteRenderbuffers>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteRenderbuffers::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.renderbuffers_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.renderbuffers_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DeleteRenderbuffersImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::DeleteRenderbuffersImmediate& cmd = *GetBufferAs<cmds::DeleteRenderbuffersImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteRenderbuffersImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::DeleteRenderbuffersImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } TEST_F(GLES2FormatTest, DeleteShader) { cmds::DeleteShader& cmd = *GetBufferAs<cmds::DeleteShader>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteShader::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DeleteShader::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.shader); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, DeleteTextures) { - cmds::DeleteTextures& cmd = *GetBufferAs<cmds::DeleteTextures>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteTextures::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.textures_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.textures_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DeleteTexturesImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::DeleteTexturesImmediate& cmd = *GetBufferAs<cmds::DeleteTexturesImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteTexturesImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::DeleteTexturesImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } TEST_F(GLES2FormatTest, DepthFunc) { cmds::DepthFunc& cmd = *GetBufferAs<cmds::DepthFunc>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::DepthFunc::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DepthFunc::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.func); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DepthMask) { cmds::DepthMask& cmd = *GetBufferAs<cmds::DepthMask>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLboolean>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::DepthMask::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, static_cast<GLboolean>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DepthMask::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLboolean>(11), cmd.flag); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DepthRangef) { cmds::DepthRangef& cmd = *GetBufferAs<cmds::DepthRangef>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLclampf>(11), - static_cast<GLclampf>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::DepthRangef::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLclampf>(11), static_cast<GLclampf>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DepthRangef::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLclampf>(11), cmd.zNear); EXPECT_EQ(static_cast<GLclampf>(12), cmd.zFar); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DetachShader) { cmds::DetachShader& cmd = *GetBufferAs<cmds::DetachShader>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLuint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::DetachShader::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<GLuint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DetachShader::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); EXPECT_EQ(static_cast<GLuint>(12), cmd.shader); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Disable) { cmds::Disable& cmd = *GetBufferAs<cmds::Disable>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::Disable::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Disable::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.cap); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DisableVertexAttribArray) { cmds::DisableVertexAttribArray& cmd = *GetBufferAs<cmds::DisableVertexAttribArray>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::DisableVertexAttribArray::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DisableVertexAttribArray::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.index); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DrawArrays) { cmds::DrawArrays& cmd = *GetBufferAs<cmds::DrawArrays>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLsizei>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::DrawArrays::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLsizei>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DrawArrays::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.mode); EXPECT_EQ(static_cast<GLint>(12), cmd.first); EXPECT_EQ(static_cast<GLsizei>(13), cmd.count); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DrawElements) { cmds::DrawElements& cmd = *GetBufferAs<cmds::DrawElements>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLsizei>(12), - static_cast<GLenum>(13), - static_cast<GLuint>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::DrawElements::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLsizei>(12), + static_cast<GLenum>(13), + static_cast<GLuint>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DrawElements::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.mode); EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); EXPECT_EQ(static_cast<GLenum>(13), cmd.type); EXPECT_EQ(static_cast<GLuint>(14), cmd.index_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Enable) { cmds::Enable& cmd = *GetBufferAs<cmds::Enable>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::Enable::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Enable::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.cap); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, EnableVertexAttribArray) { cmds::EnableVertexAttribArray& cmd = *GetBufferAs<cmds::EnableVertexAttribArray>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::EnableVertexAttribArray::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::EnableVertexAttribArray::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.index); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Finish) { cmds::Finish& cmd = *GetBufferAs<cmds::Finish>(); - void* next_cmd = cmd.Set( - &cmd); - EXPECT_EQ(static_cast<uint32>(cmds::Finish::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd); + EXPECT_EQ(static_cast<uint32_t>(cmds::Finish::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Flush) { cmds::Flush& cmd = *GetBufferAs<cmds::Flush>(); - void* next_cmd = cmd.Set( - &cmd); - EXPECT_EQ(static_cast<uint32>(cmds::Flush::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd); + EXPECT_EQ(static_cast<uint32_t>(cmds::Flush::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, FramebufferRenderbuffer) { cmds::FramebufferRenderbuffer& cmd = *GetBufferAs<cmds::FramebufferRenderbuffer>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLenum>(13), - static_cast<GLuint>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::FramebufferRenderbuffer::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLenum>(13), + static_cast<GLuint>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::FramebufferRenderbuffer::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.attachment); EXPECT_EQ(static_cast<GLenum>(13), cmd.renderbuffertarget); EXPECT_EQ(static_cast<GLuint>(14), cmd.renderbuffer); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, FramebufferTexture2D) { cmds::FramebufferTexture2D& cmd = *GetBufferAs<cmds::FramebufferTexture2D>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLenum>(13), - static_cast<GLuint>(14), - static_cast<GLint>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::FramebufferTexture2D::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLenum>(13), + static_cast<GLuint>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::FramebufferTexture2D::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.attachment); EXPECT_EQ(static_cast<GLenum>(13), cmd.textarget); EXPECT_EQ(static_cast<GLuint>(14), cmd.texture); - EXPECT_EQ(static_cast<GLint>(15), cmd.level); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, FrontFace) { cmds::FrontFace& cmd = *GetBufferAs<cmds::FrontFace>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::FrontFace::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::FrontFace::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.mode); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, GenBuffers) { - cmds::GenBuffers& cmd = *GetBufferAs<cmds::GenBuffers>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::GenBuffers::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.buffers_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.buffers_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GenBuffersImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::GenBuffersImmediate& cmd = *GetBufferAs<cmds::GenBuffersImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::GenBuffersImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::GenBuffersImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } TEST_F(GLES2FormatTest, GenerateMipmap) { cmds::GenerateMipmap& cmd = *GetBufferAs<cmds::GenerateMipmap>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::GenerateMipmap::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GenerateMipmap::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, GenFramebuffers) { - cmds::GenFramebuffers& cmd = *GetBufferAs<cmds::GenFramebuffers>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::GenFramebuffers::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.framebuffers_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.framebuffers_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GenFramebuffersImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::GenFramebuffersImmediate& cmd = *GetBufferAs<cmds::GenFramebuffersImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::GenFramebuffersImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::GenFramebuffersImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } -TEST_F(GLES2FormatTest, GenRenderbuffers) { - cmds::GenRenderbuffers& cmd = *GetBufferAs<cmds::GenRenderbuffers>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::GenRenderbuffers::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.renderbuffers_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.renderbuffers_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - TEST_F(GLES2FormatTest, GenRenderbuffersImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::GenRenderbuffersImmediate& cmd = *GetBufferAs<cmds::GenRenderbuffersImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::GenRenderbuffersImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::GenRenderbuffersImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } -TEST_F(GLES2FormatTest, GenTextures) { - cmds::GenTextures& cmd = *GetBufferAs<cmds::GenTextures>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::GenTextures::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.textures_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.textures_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - TEST_F(GLES2FormatTest, GenTexturesImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::GenTexturesImmediate& cmd = *GetBufferAs<cmds::GenTexturesImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::GenTexturesImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::GenTexturesImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } TEST_F(GLES2FormatTest, GetActiveAttrib) { cmds::GetActiveAttrib& cmd = *GetBufferAs<cmds::GetActiveAttrib>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLuint>(12), - static_cast<uint32>(13), - static_cast<uint32>(14), - static_cast<uint32>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::GetActiveAttrib::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLuint>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14), + static_cast<uint32_t>(15)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetActiveAttrib::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); EXPECT_EQ(static_cast<GLuint>(12), cmd.index); - EXPECT_EQ(static_cast<uint32>(13), cmd.name_bucket_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(15), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.name_bucket_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(15), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetActiveUniform) { cmds::GetActiveUniform& cmd = *GetBufferAs<cmds::GetActiveUniform>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLuint>(12), - static_cast<uint32>(13), - static_cast<uint32>(14), - static_cast<uint32>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::GetActiveUniform::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLuint>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14), + static_cast<uint32_t>(15)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetActiveUniform::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); EXPECT_EQ(static_cast<GLuint>(12), cmd.index); - EXPECT_EQ(static_cast<uint32>(13), cmd.name_bucket_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(15), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.name_bucket_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(15), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetAttachedShaders) { cmds::GetAttachedShaders& cmd = *GetBufferAs<cmds::GetAttachedShaders>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetAttachedShaders::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetAttachedShaders::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - EXPECT_EQ(static_cast<uint32>(14), cmd.result_size); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_offset); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.result_size); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } // TODO(gman): Write test for GetAttribLocation -// TODO(gman): Write test for GetAttribLocationBucket TEST_F(GLES2FormatTest, GetBooleanv) { cmds::GetBooleanv& cmd = *GetBufferAs<cmds::GetBooleanv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::GetBooleanv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetBooleanv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.pname); - EXPECT_EQ(static_cast<uint32>(12), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetBufferParameteriv) { cmds::GetBufferParameteriv& cmd = *GetBufferAs<cmds::GetBufferParameteriv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetBufferParameteriv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetBufferParameteriv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetError) { cmds::GetError& cmd = *GetBufferAs<cmds::GetError>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<uint32>(11), - static_cast<uint32>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::GetError::kCmdId), - cmd.header.command); + void* next_cmd = + cmd.Set(&cmd, static_cast<uint32_t>(11), static_cast<uint32_t>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetError::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<uint32>(11), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(11), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetFloatv) { cmds::GetFloatv& cmd = *GetBufferAs<cmds::GetFloatv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::GetFloatv::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetFloatv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.pname); - EXPECT_EQ(static_cast<uint32>(12), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetFramebufferAttachmentParameteriv) { cmds::GetFramebufferAttachmentParameteriv& cmd = *GetBufferAs<cmds::GetFramebufferAttachmentParameteriv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLenum>(13), - static_cast<uint32>(14), - static_cast<uint32>(15)); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLenum>(13), + static_cast<uint32_t>(14), + static_cast<uint32_t>(15)); EXPECT_EQ( - static_cast<uint32>(cmds::GetFramebufferAttachmentParameteriv::kCmdId), - cmd.header.command); + static_cast<uint32_t>(cmds::GetFramebufferAttachmentParameteriv::kCmdId), + cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.attachment); EXPECT_EQ(static_cast<GLenum>(13), cmd.pname); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(15), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(15), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetIntegerv) { cmds::GetIntegerv& cmd = *GetBufferAs<cmds::GetIntegerv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::GetIntegerv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetIntegerv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.pname); - EXPECT_EQ(static_cast<uint32>(12), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetProgramiv) { cmds::GetProgramiv& cmd = *GetBufferAs<cmds::GetProgramiv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetProgramiv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLenum>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetProgramiv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetProgramInfoLog) { cmds::GetProgramInfoLog& cmd = *GetBufferAs<cmds::GetProgramInfoLog>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::GetProgramInfoLog::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<uint32_t>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetProgramInfoLog::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); - EXPECT_EQ(static_cast<uint32>(12), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetRenderbufferParameteriv) { cmds::GetRenderbufferParameteriv& cmd = *GetBufferAs<cmds::GetRenderbufferParameteriv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetRenderbufferParameteriv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetRenderbufferParameteriv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetShaderiv) { cmds::GetShaderiv& cmd = *GetBufferAs<cmds::GetShaderiv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetShaderiv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLenum>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetShaderiv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.shader); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetShaderInfoLog) { cmds::GetShaderInfoLog& cmd = *GetBufferAs<cmds::GetShaderInfoLog>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::GetShaderInfoLog::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<uint32_t>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetShaderInfoLog::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.shader); - EXPECT_EQ(static_cast<uint32>(12), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetShaderPrecisionFormat) { cmds::GetShaderPrecisionFormat& cmd = *GetBufferAs<cmds::GetShaderPrecisionFormat>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetShaderPrecisionFormat::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetShaderPrecisionFormat::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.shadertype); EXPECT_EQ(static_cast<GLenum>(12), cmd.precisiontype); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetShaderSource) { cmds::GetShaderSource& cmd = *GetBufferAs<cmds::GetShaderSource>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::GetShaderSource::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<uint32_t>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetShaderSource::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.shader); - EXPECT_EQ(static_cast<uint32>(12), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetString) { cmds::GetString& cmd = *GetBufferAs<cmds::GetString>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<uint32>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::GetString::kCmdId), - cmd.header.command); + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<uint32_t>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetString::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.name); - EXPECT_EQ(static_cast<uint32>(12), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetTexParameterfv) { cmds::GetTexParameterfv& cmd = *GetBufferAs<cmds::GetTexParameterfv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetTexParameterfv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetTexParameterfv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetTexParameteriv) { cmds::GetTexParameteriv& cmd = *GetBufferAs<cmds::GetTexParameteriv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetTexParameteriv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetTexParameteriv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetUniformfv) { cmds::GetUniformfv& cmd = *GetBufferAs<cmds::GetUniformfv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLint>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetUniformfv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLint>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetUniformfv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); EXPECT_EQ(static_cast<GLint>(12), cmd.location); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetUniformiv) { cmds::GetUniformiv& cmd = *GetBufferAs<cmds::GetUniformiv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLint>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetUniformiv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLint>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetUniformiv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); EXPECT_EQ(static_cast<GLint>(12), cmd.location); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } // TODO(gman): Write test for GetUniformLocation -// TODO(gman): Write test for GetUniformLocationBucket TEST_F(GLES2FormatTest, GetVertexAttribfv) { cmds::GetVertexAttribfv& cmd = *GetBufferAs<cmds::GetVertexAttribfv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetVertexAttribfv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLenum>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetVertexAttribfv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.index); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetVertexAttribiv) { cmds::GetVertexAttribiv& cmd = *GetBufferAs<cmds::GetVertexAttribiv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetVertexAttribiv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLenum>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetVertexAttribiv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.index); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.params_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.params_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetVertexAttribPointerv) { cmds::GetVertexAttribPointerv& cmd = *GetBufferAs<cmds::GetVertexAttribPointerv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::GetVertexAttribPointerv::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLenum>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetVertexAttribPointerv::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.index); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); - EXPECT_EQ(static_cast<uint32>(13), cmd.pointer_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.pointer_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.pointer_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.pointer_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Hint) { cmds::Hint& cmd = *GetBufferAs<cmds::Hint>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::Hint::kCmdId), - cmd.header.command); + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLenum>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Hint::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.mode); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, IsBuffer) { cmds::IsBuffer& cmd = *GetBufferAs<cmds::IsBuffer>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::IsBuffer::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::IsBuffer::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.buffer); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, IsEnabled) { cmds::IsEnabled& cmd = *GetBufferAs<cmds::IsEnabled>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::IsEnabled::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::IsEnabled::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.cap); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, IsFramebuffer) { cmds::IsFramebuffer& cmd = *GetBufferAs<cmds::IsFramebuffer>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::IsFramebuffer::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::IsFramebuffer::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.framebuffer); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, IsProgram) { cmds::IsProgram& cmd = *GetBufferAs<cmds::IsProgram>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::IsProgram::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::IsProgram::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, IsRenderbuffer) { cmds::IsRenderbuffer& cmd = *GetBufferAs<cmds::IsRenderbuffer>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::IsRenderbuffer::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::IsRenderbuffer::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.renderbuffer); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, IsShader) { cmds::IsShader& cmd = *GetBufferAs<cmds::IsShader>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::IsShader::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::IsShader::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.shader); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, IsTexture) { cmds::IsTexture& cmd = *GetBufferAs<cmds::IsTexture>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::IsTexture::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::IsTexture::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.texture); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, LineWidth) { cmds::LineWidth& cmd = *GetBufferAs<cmds::LineWidth>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLfloat>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::LineWidth::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, static_cast<GLfloat>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::LineWidth::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLfloat>(11), cmd.width); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, LinkProgram) { cmds::LinkProgram& cmd = *GetBufferAs<cmds::LinkProgram>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::LinkProgram::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::LinkProgram::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, PixelStorei) { cmds::PixelStorei& cmd = *GetBufferAs<cmds::PixelStorei>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::PixelStorei::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::PixelStorei::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.pname); EXPECT_EQ(static_cast<GLint>(12), cmd.param); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, PolygonOffset) { cmds::PolygonOffset& cmd = *GetBufferAs<cmds::PolygonOffset>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLfloat>(11), - static_cast<GLfloat>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::PolygonOffset::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLfloat>(11), static_cast<GLfloat>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::PolygonOffset::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLfloat>(11), cmd.factor); EXPECT_EQ(static_cast<GLfloat>(12), cmd.units); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, ReadPixels) { cmds::ReadPixels& cmd = *GetBufferAs<cmds::ReadPixels>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLint>(12), - static_cast<GLsizei>(13), - static_cast<GLsizei>(14), - static_cast<GLenum>(15), - static_cast<GLenum>(16), - static_cast<uint32>(17), - static_cast<uint32>(18), - static_cast<uint32>(19), - static_cast<uint32>(20), - static_cast<GLboolean>(21)); - EXPECT_EQ(static_cast<uint32>(cmds::ReadPixels::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLint>(12), + static_cast<GLsizei>(13), + static_cast<GLsizei>(14), + static_cast<GLenum>(15), + static_cast<GLenum>(16), + static_cast<uint32_t>(17), + static_cast<uint32_t>(18), + static_cast<uint32_t>(19), + static_cast<uint32_t>(20), + static_cast<GLboolean>(21)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ReadPixels::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.x); @@ -1779,254 +1386,202 @@ TEST_F(GLES2FormatTest, ReadPixels) { EXPECT_EQ(static_cast<GLsizei>(14), cmd.height); EXPECT_EQ(static_cast<GLenum>(15), cmd.format); EXPECT_EQ(static_cast<GLenum>(16), cmd.type); - EXPECT_EQ(static_cast<uint32>(17), cmd.pixels_shm_id); - EXPECT_EQ(static_cast<uint32>(18), cmd.pixels_shm_offset); - EXPECT_EQ(static_cast<uint32>(19), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(20), cmd.result_shm_offset); + EXPECT_EQ(static_cast<uint32_t>(17), cmd.pixels_shm_id); + EXPECT_EQ(static_cast<uint32_t>(18), cmd.pixels_shm_offset); + EXPECT_EQ(static_cast<uint32_t>(19), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(20), cmd.result_shm_offset); EXPECT_EQ(static_cast<GLboolean>(21), cmd.async); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, ReleaseShaderCompiler) { cmds::ReleaseShaderCompiler& cmd = *GetBufferAs<cmds::ReleaseShaderCompiler>(); - void* next_cmd = cmd.Set( - &cmd); - EXPECT_EQ(static_cast<uint32>(cmds::ReleaseShaderCompiler::kCmdId), + void* next_cmd = cmd.Set(&cmd); + EXPECT_EQ(static_cast<uint32_t>(cmds::ReleaseShaderCompiler::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, RenderbufferStorage) { cmds::RenderbufferStorage& cmd = *GetBufferAs<cmds::RenderbufferStorage>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLsizei>(13), - static_cast<GLsizei>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::RenderbufferStorage::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLsizei>(13), + static_cast<GLsizei>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::RenderbufferStorage::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.internalformat); EXPECT_EQ(static_cast<GLsizei>(13), cmd.width); EXPECT_EQ(static_cast<GLsizei>(14), cmd.height); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, SampleCoverage) { cmds::SampleCoverage& cmd = *GetBufferAs<cmds::SampleCoverage>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLclampf>(11), - static_cast<GLboolean>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::SampleCoverage::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLclampf>(11), static_cast<GLboolean>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::SampleCoverage::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLclampf>(11), cmd.value); EXPECT_EQ(static_cast<GLboolean>(12), cmd.invert); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Scissor) { cmds::Scissor& cmd = *GetBufferAs<cmds::Scissor>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLint>(12), - static_cast<GLsizei>(13), - static_cast<GLsizei>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Scissor::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLint>(12), + static_cast<GLsizei>(13), + static_cast<GLsizei>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Scissor::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.x); EXPECT_EQ(static_cast<GLint>(12), cmd.y); EXPECT_EQ(static_cast<GLsizei>(13), cmd.width); EXPECT_EQ(static_cast<GLsizei>(14), cmd.height); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, ShaderBinary) { cmds::ShaderBinary& cmd = *GetBufferAs<cmds::ShaderBinary>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13), - static_cast<GLenum>(14), - static_cast<uint32>(15), - static_cast<uint32>(16), - static_cast<GLsizei>(17)); - EXPECT_EQ(static_cast<uint32>(cmds::ShaderBinary::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLsizei>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13), + static_cast<GLenum>(14), + static_cast<uint32_t>(15), + static_cast<uint32_t>(16), + static_cast<GLsizei>(17)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ShaderBinary::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.shaders_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.shaders_shm_offset); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.shaders_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.shaders_shm_offset); EXPECT_EQ(static_cast<GLenum>(14), cmd.binaryformat); - EXPECT_EQ(static_cast<uint32>(15), cmd.binary_shm_id); - EXPECT_EQ(static_cast<uint32>(16), cmd.binary_shm_offset); + EXPECT_EQ(static_cast<uint32_t>(15), cmd.binary_shm_id); + EXPECT_EQ(static_cast<uint32_t>(16), cmd.binary_shm_offset); EXPECT_EQ(static_cast<GLsizei>(17), cmd.length); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, ShaderSource) { - cmds::ShaderSource& cmd = *GetBufferAs<cmds::ShaderSource>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::ShaderSource::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLuint>(11), cmd.shader); - EXPECT_EQ(static_cast<uint32>(12), cmd.data_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.data_shm_offset); - EXPECT_EQ(static_cast<uint32>(14), cmd.data_size); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, ShaderSourceBucket) { cmds::ShaderSourceBucket& cmd = *GetBufferAs<cmds::ShaderSourceBucket>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::ShaderSourceBucket::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<uint32_t>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ShaderSourceBucket::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.shader); - EXPECT_EQ(static_cast<uint32>(12), cmd.data_bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.data_bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, StencilFunc) { cmds::StencilFunc& cmd = *GetBufferAs<cmds::StencilFunc>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLuint>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::StencilFunc::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLuint>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::StencilFunc::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.func); EXPECT_EQ(static_cast<GLint>(12), cmd.ref); EXPECT_EQ(static_cast<GLuint>(13), cmd.mask); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, StencilFuncSeparate) { cmds::StencilFuncSeparate& cmd = *GetBufferAs<cmds::StencilFuncSeparate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLint>(13), - static_cast<GLuint>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::StencilFuncSeparate::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLint>(13), + static_cast<GLuint>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::StencilFuncSeparate::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.face); EXPECT_EQ(static_cast<GLenum>(12), cmd.func); EXPECT_EQ(static_cast<GLint>(13), cmd.ref); EXPECT_EQ(static_cast<GLuint>(14), cmd.mask); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, StencilMask) { cmds::StencilMask& cmd = *GetBufferAs<cmds::StencilMask>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::StencilMask::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::StencilMask::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.mask); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, StencilMaskSeparate) { cmds::StencilMaskSeparate& cmd = *GetBufferAs<cmds::StencilMaskSeparate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLuint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::StencilMaskSeparate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLuint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::StencilMaskSeparate::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.face); EXPECT_EQ(static_cast<GLuint>(12), cmd.mask); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, StencilOp) { cmds::StencilOp& cmd = *GetBufferAs<cmds::StencilOp>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLenum>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::StencilOp::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLenum>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::StencilOp::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.fail); EXPECT_EQ(static_cast<GLenum>(12), cmd.zfail); EXPECT_EQ(static_cast<GLenum>(13), cmd.zpass); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, StencilOpSeparate) { cmds::StencilOpSeparate& cmd = *GetBufferAs<cmds::StencilOpSeparate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLenum>(13), - static_cast<GLenum>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::StencilOpSeparate::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLenum>(13), + static_cast<GLenum>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::StencilOpSeparate::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.face); EXPECT_EQ(static_cast<GLenum>(12), cmd.fail); EXPECT_EQ(static_cast<GLenum>(13), cmd.zfail); EXPECT_EQ(static_cast<GLenum>(14), cmd.zpass); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, TexImage2D) { cmds::TexImage2D& cmd = *GetBufferAs<cmds::TexImage2D>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLint>(13), - static_cast<GLsizei>(14), - static_cast<GLsizei>(15), - static_cast<GLint>(16), - static_cast<GLenum>(17), - static_cast<GLenum>(18), - static_cast<uint32>(19), - static_cast<uint32>(20)); - EXPECT_EQ(static_cast<uint32>(cmds::TexImage2D::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLint>(13), + static_cast<GLsizei>(14), + static_cast<GLsizei>(15), + static_cast<GLenum>(16), + static_cast<GLenum>(17), + static_cast<uint32_t>(18), + static_cast<uint32_t>(19)); + EXPECT_EQ(static_cast<uint32_t>(cmds::TexImage2D::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -2034,153 +1589,98 @@ TEST_F(GLES2FormatTest, TexImage2D) { EXPECT_EQ(static_cast<GLint>(13), cmd.internalformat); EXPECT_EQ(static_cast<GLsizei>(14), cmd.width); EXPECT_EQ(static_cast<GLsizei>(15), cmd.height); - EXPECT_EQ(static_cast<GLint>(16), cmd.border); - EXPECT_EQ(static_cast<GLenum>(17), cmd.format); - EXPECT_EQ(static_cast<GLenum>(18), cmd.type); - EXPECT_EQ(static_cast<uint32>(19), cmd.pixels_shm_id); - EXPECT_EQ(static_cast<uint32>(20), cmd.pixels_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<GLenum>(16), cmd.format); + EXPECT_EQ(static_cast<GLenum>(17), cmd.type); + EXPECT_EQ(static_cast<uint32_t>(18), cmd.pixels_shm_id); + EXPECT_EQ(static_cast<uint32_t>(19), cmd.pixels_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, TexParameterf) { cmds::TexParameterf& cmd = *GetBufferAs<cmds::TexParameterf>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLfloat>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::TexParameterf::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLfloat>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::TexParameterf::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); EXPECT_EQ(static_cast<GLfloat>(13), cmd.param); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, TexParameterfv) { - cmds::TexParameterfv& cmd = *GetBufferAs<cmds::TexParameterfv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::TexParameterfv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLenum>(11), cmd.target); - EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, TexParameterfvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), }; cmds::TexParameterfvImmediate& cmd = *GetBufferAs<cmds::TexParameterfvImmediate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - data); - EXPECT_EQ(static_cast<uint32>(cmds::TexParameterfvImmediate::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data)), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLenum>(12), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::TexParameterfvImmediate::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, TexParameteri) { cmds::TexParameteri& cmd = *GetBufferAs<cmds::TexParameteri>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLint>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::TexParameteri::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLint>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::TexParameteri::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); EXPECT_EQ(static_cast<GLint>(13), cmd.param); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, TexParameteriv) { - cmds::TexParameteriv& cmd = *GetBufferAs<cmds::TexParameteriv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::TexParameteriv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLenum>(11), cmd.target); - EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); - EXPECT_EQ(static_cast<uint32>(13), cmd.params_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.params_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, TexParameterivImmediate) { const int kSomeBaseValueToTestWith = 51; static GLint data[] = { - static_cast<GLint>(kSomeBaseValueToTestWith + 0), + static_cast<GLint>(kSomeBaseValueToTestWith + 0), }; cmds::TexParameterivImmediate& cmd = *GetBufferAs<cmds::TexParameterivImmediate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - data); - EXPECT_EQ(static_cast<uint32>(cmds::TexParameterivImmediate::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data)), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLenum>(12), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::TexParameterivImmediate::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.pname); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, TexSubImage2D) { cmds::TexSubImage2D& cmd = *GetBufferAs<cmds::TexSubImage2D>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLint>(13), - static_cast<GLint>(14), - static_cast<GLsizei>(15), - static_cast<GLsizei>(16), - static_cast<GLenum>(17), - static_cast<GLenum>(18), - static_cast<uint32>(19), - static_cast<uint32>(20), - static_cast<GLboolean>(21)); - EXPECT_EQ(static_cast<uint32>(cmds::TexSubImage2D::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLint>(13), + static_cast<GLint>(14), + static_cast<GLsizei>(15), + static_cast<GLsizei>(16), + static_cast<GLenum>(17), + static_cast<GLenum>(18), + static_cast<uint32_t>(19), + static_cast<uint32_t>(20), + static_cast<GLboolean>(21)); + EXPECT_EQ(static_cast<uint32_t>(cmds::TexSubImage2D::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -2191,953 +1691,581 @@ TEST_F(GLES2FormatTest, TexSubImage2D) { EXPECT_EQ(static_cast<GLsizei>(16), cmd.height); EXPECT_EQ(static_cast<GLenum>(17), cmd.format); EXPECT_EQ(static_cast<GLenum>(18), cmd.type); - EXPECT_EQ(static_cast<uint32>(19), cmd.pixels_shm_id); - EXPECT_EQ(static_cast<uint32>(20), cmd.pixels_shm_offset); + EXPECT_EQ(static_cast<uint32_t>(19), cmd.pixels_shm_id); + EXPECT_EQ(static_cast<uint32_t>(20), cmd.pixels_shm_offset); EXPECT_EQ(static_cast<GLboolean>(21), cmd.internal); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Uniform1f) { cmds::Uniform1f& cmd = *GetBufferAs<cmds::Uniform1f>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLfloat>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform1f::kCmdId), - cmd.header.command); + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(11), static_cast<GLfloat>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform1f::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.location); EXPECT_EQ(static_cast<GLfloat>(12), cmd.x); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, Uniform1fv) { - cmds::Uniform1fv& cmd = *GetBufferAs<cmds::Uniform1fv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLsizei>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform1fv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLint>(11), cmd.location); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<uint32>(13), cmd.v_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.v_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Uniform1fvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), }; cmds::Uniform1fvImmediate& cmd = *GetBufferAs<cmds::Uniform1fvImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLfloat) * 1; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(1), - static_cast<GLsizei>(2), - data); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform1fvImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform1fvImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(1), cmd.location); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, Uniform1i) { cmds::Uniform1i& cmd = *GetBufferAs<cmds::Uniform1i>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform1i::kCmdId), - cmd.header.command); + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(11), static_cast<GLint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform1i::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.location); EXPECT_EQ(static_cast<GLint>(12), cmd.x); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, Uniform1iv) { - cmds::Uniform1iv& cmd = *GetBufferAs<cmds::Uniform1iv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLsizei>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform1iv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLint>(11), cmd.location); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<uint32>(13), cmd.v_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.v_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Uniform1ivImmediate) { const int kSomeBaseValueToTestWith = 51; static GLint data[] = { - static_cast<GLint>(kSomeBaseValueToTestWith + 0), - static_cast<GLint>(kSomeBaseValueToTestWith + 1), + static_cast<GLint>(kSomeBaseValueToTestWith + 0), + static_cast<GLint>(kSomeBaseValueToTestWith + 1), }; cmds::Uniform1ivImmediate& cmd = *GetBufferAs<cmds::Uniform1ivImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLint) * 1; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(1), - static_cast<GLsizei>(2), - data); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform1ivImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform1ivImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(1), cmd.location); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, Uniform2f) { cmds::Uniform2f& cmd = *GetBufferAs<cmds::Uniform2f>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLfloat>(12), - static_cast<GLfloat>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform2f::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLfloat>(12), + static_cast<GLfloat>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform2f::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.location); EXPECT_EQ(static_cast<GLfloat>(12), cmd.x); EXPECT_EQ(static_cast<GLfloat>(13), cmd.y); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, Uniform2fv) { - cmds::Uniform2fv& cmd = *GetBufferAs<cmds::Uniform2fv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLsizei>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform2fv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLint>(11), cmd.location); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<uint32>(13), cmd.v_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.v_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Uniform2fvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), }; cmds::Uniform2fvImmediate& cmd = *GetBufferAs<cmds::Uniform2fvImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLfloat) * 2; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(1), - static_cast<GLsizei>(2), - data); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform2fvImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform2fvImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(1), cmd.location); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, Uniform2i) { cmds::Uniform2i& cmd = *GetBufferAs<cmds::Uniform2i>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLint>(12), - static_cast<GLint>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform2i::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLint>(12), + static_cast<GLint>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform2i::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.location); EXPECT_EQ(static_cast<GLint>(12), cmd.x); EXPECT_EQ(static_cast<GLint>(13), cmd.y); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, Uniform2iv) { - cmds::Uniform2iv& cmd = *GetBufferAs<cmds::Uniform2iv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLsizei>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform2iv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLint>(11), cmd.location); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<uint32>(13), cmd.v_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.v_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Uniform2ivImmediate) { const int kSomeBaseValueToTestWith = 51; static GLint data[] = { - static_cast<GLint>(kSomeBaseValueToTestWith + 0), - static_cast<GLint>(kSomeBaseValueToTestWith + 1), - static_cast<GLint>(kSomeBaseValueToTestWith + 2), - static_cast<GLint>(kSomeBaseValueToTestWith + 3), + static_cast<GLint>(kSomeBaseValueToTestWith + 0), + static_cast<GLint>(kSomeBaseValueToTestWith + 1), + static_cast<GLint>(kSomeBaseValueToTestWith + 2), + static_cast<GLint>(kSomeBaseValueToTestWith + 3), }; cmds::Uniform2ivImmediate& cmd = *GetBufferAs<cmds::Uniform2ivImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLint) * 2; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(1), - static_cast<GLsizei>(2), - data); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform2ivImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform2ivImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(1), cmd.location); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, Uniform3f) { cmds::Uniform3f& cmd = *GetBufferAs<cmds::Uniform3f>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLfloat>(12), - static_cast<GLfloat>(13), - static_cast<GLfloat>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform3f::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLfloat>(12), + static_cast<GLfloat>(13), + static_cast<GLfloat>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform3f::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.location); EXPECT_EQ(static_cast<GLfloat>(12), cmd.x); EXPECT_EQ(static_cast<GLfloat>(13), cmd.y); EXPECT_EQ(static_cast<GLfloat>(14), cmd.z); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, Uniform3fv) { - cmds::Uniform3fv& cmd = *GetBufferAs<cmds::Uniform3fv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLsizei>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform3fv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLint>(11), cmd.location); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<uint32>(13), cmd.v_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.v_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Uniform3fvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 4), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 5), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 4), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 5), }; cmds::Uniform3fvImmediate& cmd = *GetBufferAs<cmds::Uniform3fvImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLfloat) * 3; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(1), - static_cast<GLsizei>(2), - data); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform3fvImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform3fvImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(1), cmd.location); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, Uniform3i) { cmds::Uniform3i& cmd = *GetBufferAs<cmds::Uniform3i>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLint>(12), - static_cast<GLint>(13), - static_cast<GLint>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform3i::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLint>(12), + static_cast<GLint>(13), + static_cast<GLint>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform3i::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.location); EXPECT_EQ(static_cast<GLint>(12), cmd.x); EXPECT_EQ(static_cast<GLint>(13), cmd.y); EXPECT_EQ(static_cast<GLint>(14), cmd.z); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, Uniform3iv) { - cmds::Uniform3iv& cmd = *GetBufferAs<cmds::Uniform3iv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLsizei>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform3iv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLint>(11), cmd.location); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<uint32>(13), cmd.v_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.v_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Uniform3ivImmediate) { const int kSomeBaseValueToTestWith = 51; static GLint data[] = { - static_cast<GLint>(kSomeBaseValueToTestWith + 0), - static_cast<GLint>(kSomeBaseValueToTestWith + 1), - static_cast<GLint>(kSomeBaseValueToTestWith + 2), - static_cast<GLint>(kSomeBaseValueToTestWith + 3), - static_cast<GLint>(kSomeBaseValueToTestWith + 4), - static_cast<GLint>(kSomeBaseValueToTestWith + 5), + static_cast<GLint>(kSomeBaseValueToTestWith + 0), + static_cast<GLint>(kSomeBaseValueToTestWith + 1), + static_cast<GLint>(kSomeBaseValueToTestWith + 2), + static_cast<GLint>(kSomeBaseValueToTestWith + 3), + static_cast<GLint>(kSomeBaseValueToTestWith + 4), + static_cast<GLint>(kSomeBaseValueToTestWith + 5), }; cmds::Uniform3ivImmediate& cmd = *GetBufferAs<cmds::Uniform3ivImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLint) * 3; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(1), - static_cast<GLsizei>(2), - data); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform3ivImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform3ivImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(1), cmd.location); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, Uniform4f) { cmds::Uniform4f& cmd = *GetBufferAs<cmds::Uniform4f>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLfloat>(12), - static_cast<GLfloat>(13), - static_cast<GLfloat>(14), - static_cast<GLfloat>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform4f::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLfloat>(12), + static_cast<GLfloat>(13), + static_cast<GLfloat>(14), + static_cast<GLfloat>(15)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform4f::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.location); EXPECT_EQ(static_cast<GLfloat>(12), cmd.x); EXPECT_EQ(static_cast<GLfloat>(13), cmd.y); EXPECT_EQ(static_cast<GLfloat>(14), cmd.z); EXPECT_EQ(static_cast<GLfloat>(15), cmd.w); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, Uniform4fv) { - cmds::Uniform4fv& cmd = *GetBufferAs<cmds::Uniform4fv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLsizei>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform4fv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLint>(11), cmd.location); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<uint32>(13), cmd.v_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.v_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Uniform4fvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 4), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 5), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 6), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 7), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 4), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 5), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 6), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 7), }; cmds::Uniform4fvImmediate& cmd = *GetBufferAs<cmds::Uniform4fvImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLfloat) * 4; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(1), - static_cast<GLsizei>(2), - data); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform4fvImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform4fvImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(1), cmd.location); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, Uniform4i) { cmds::Uniform4i& cmd = *GetBufferAs<cmds::Uniform4i>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLint>(12), - static_cast<GLint>(13), - static_cast<GLint>(14), - static_cast<GLint>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform4i::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLint>(12), + static_cast<GLint>(13), + static_cast<GLint>(14), + static_cast<GLint>(15)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform4i::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.location); EXPECT_EQ(static_cast<GLint>(12), cmd.x); EXPECT_EQ(static_cast<GLint>(13), cmd.y); EXPECT_EQ(static_cast<GLint>(14), cmd.z); EXPECT_EQ(static_cast<GLint>(15), cmd.w); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, Uniform4iv) { - cmds::Uniform4iv& cmd = *GetBufferAs<cmds::Uniform4iv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLsizei>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform4iv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLint>(11), cmd.location); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<uint32>(13), cmd.v_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.v_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Uniform4ivImmediate) { const int kSomeBaseValueToTestWith = 51; static GLint data[] = { - static_cast<GLint>(kSomeBaseValueToTestWith + 0), - static_cast<GLint>(kSomeBaseValueToTestWith + 1), - static_cast<GLint>(kSomeBaseValueToTestWith + 2), - static_cast<GLint>(kSomeBaseValueToTestWith + 3), - static_cast<GLint>(kSomeBaseValueToTestWith + 4), - static_cast<GLint>(kSomeBaseValueToTestWith + 5), - static_cast<GLint>(kSomeBaseValueToTestWith + 6), - static_cast<GLint>(kSomeBaseValueToTestWith + 7), + static_cast<GLint>(kSomeBaseValueToTestWith + 0), + static_cast<GLint>(kSomeBaseValueToTestWith + 1), + static_cast<GLint>(kSomeBaseValueToTestWith + 2), + static_cast<GLint>(kSomeBaseValueToTestWith + 3), + static_cast<GLint>(kSomeBaseValueToTestWith + 4), + static_cast<GLint>(kSomeBaseValueToTestWith + 5), + static_cast<GLint>(kSomeBaseValueToTestWith + 6), + static_cast<GLint>(kSomeBaseValueToTestWith + 7), }; cmds::Uniform4ivImmediate& cmd = *GetBufferAs<cmds::Uniform4ivImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLint) * 4; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(1), - static_cast<GLsizei>(2), - data); - EXPECT_EQ(static_cast<uint32>(cmds::Uniform4ivImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::Uniform4ivImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(1), cmd.location); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } -TEST_F(GLES2FormatTest, UniformMatrix2fv) { - cmds::UniformMatrix2fv& cmd = *GetBufferAs<cmds::UniformMatrix2fv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLsizei>(12), - static_cast<GLboolean>(13), - static_cast<uint32>(14), - static_cast<uint32>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::UniformMatrix2fv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLint>(11), cmd.location); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<GLboolean>(13), cmd.transpose); - EXPECT_EQ(static_cast<uint32>(14), cmd.value_shm_id); - EXPECT_EQ(static_cast<uint32>(15), cmd.value_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - TEST_F(GLES2FormatTest, UniformMatrix2fvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 4), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 5), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 6), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 7), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 4), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 5), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 6), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 7), }; cmds::UniformMatrix2fvImmediate& cmd = *GetBufferAs<cmds::UniformMatrix2fvImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLfloat) * 4; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(1), - static_cast<GLsizei>(2), - static_cast<GLboolean>(3), - data); - EXPECT_EQ(static_cast<uint32>(cmds::UniformMatrix2fvImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix2fvImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(1), cmd.location); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); - EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } -TEST_F(GLES2FormatTest, UniformMatrix3fv) { - cmds::UniformMatrix3fv& cmd = *GetBufferAs<cmds::UniformMatrix3fv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLsizei>(12), - static_cast<GLboolean>(13), - static_cast<uint32>(14), - static_cast<uint32>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::UniformMatrix3fv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLint>(11), cmd.location); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<GLboolean>(13), cmd.transpose); - EXPECT_EQ(static_cast<uint32>(14), cmd.value_shm_id); - EXPECT_EQ(static_cast<uint32>(15), cmd.value_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - TEST_F(GLES2FormatTest, UniformMatrix3fvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 4), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 5), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 6), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 7), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 8), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 9), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 10), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 11), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 12), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 13), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 14), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 15), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 16), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 17), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 4), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 5), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 6), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 7), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 8), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 9), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 10), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 11), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 12), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 13), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 14), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 15), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 16), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 17), }; cmds::UniformMatrix3fvImmediate& cmd = *GetBufferAs<cmds::UniformMatrix3fvImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLfloat) * 9; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(1), - static_cast<GLsizei>(2), - static_cast<GLboolean>(3), - data); - EXPECT_EQ(static_cast<uint32>(cmds::UniformMatrix3fvImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix3fvImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(1), cmd.location); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); - EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } -TEST_F(GLES2FormatTest, UniformMatrix4fv) { - cmds::UniformMatrix4fv& cmd = *GetBufferAs<cmds::UniformMatrix4fv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLsizei>(12), - static_cast<GLboolean>(13), - static_cast<uint32>(14), - static_cast<uint32>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::UniformMatrix4fv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLint>(11), cmd.location); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<GLboolean>(13), cmd.transpose); - EXPECT_EQ(static_cast<uint32>(14), cmd.value_shm_id); - EXPECT_EQ(static_cast<uint32>(15), cmd.value_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - TEST_F(GLES2FormatTest, UniformMatrix4fvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 4), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 5), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 6), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 7), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 8), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 9), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 10), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 11), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 12), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 13), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 14), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 15), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 16), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 17), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 18), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 19), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 20), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 21), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 22), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 23), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 24), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 25), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 26), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 27), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 28), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 29), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 30), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 31), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 4), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 5), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 6), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 7), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 8), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 9), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 10), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 11), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 12), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 13), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 14), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 15), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 16), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 17), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 18), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 19), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 20), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 21), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 22), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 23), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 24), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 25), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 26), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 27), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 28), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 29), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 30), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 31), }; cmds::UniformMatrix4fvImmediate& cmd = *GetBufferAs<cmds::UniformMatrix4fvImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLfloat) * 16; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(1), - static_cast<GLsizei>(2), - static_cast<GLboolean>(3), - data); - EXPECT_EQ(static_cast<uint32>(cmds::UniformMatrix4fvImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLint>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::UniformMatrix4fvImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(1), cmd.location); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); - EXPECT_EQ(static_cast<GLboolean>(3), cmd.transpose); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, UseProgram) { cmds::UseProgram& cmd = *GetBufferAs<cmds::UseProgram>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::UseProgram::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::UseProgram::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, ValidateProgram) { cmds::ValidateProgram& cmd = *GetBufferAs<cmds::ValidateProgram>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::ValidateProgram::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ValidateProgram::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, VertexAttrib1f) { cmds::VertexAttrib1f& cmd = *GetBufferAs<cmds::VertexAttrib1f>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLfloat>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib1f::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<GLfloat>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttrib1f::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); EXPECT_EQ(static_cast<GLfloat>(12), cmd.x); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, VertexAttrib1fv) { - cmds::VertexAttrib1fv& cmd = *GetBufferAs<cmds::VertexAttrib1fv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib1fv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); - EXPECT_EQ(static_cast<uint32>(12), cmd.values_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.values_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, VertexAttrib1fvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), }; cmds::VertexAttrib1fvImmediate& cmd = *GetBufferAs<cmds::VertexAttrib1fvImmediate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - data); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib1fvImmediate::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data)), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttrib1fvImmediate::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, VertexAttrib2f) { cmds::VertexAttrib2f& cmd = *GetBufferAs<cmds::VertexAttrib2f>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLfloat>(12), - static_cast<GLfloat>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib2f::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLfloat>(12), + static_cast<GLfloat>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttrib2f::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); EXPECT_EQ(static_cast<GLfloat>(12), cmd.x); EXPECT_EQ(static_cast<GLfloat>(13), cmd.y); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, VertexAttrib2fv) { - cmds::VertexAttrib2fv& cmd = *GetBufferAs<cmds::VertexAttrib2fv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib2fv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); - EXPECT_EQ(static_cast<uint32>(12), cmd.values_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.values_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, VertexAttrib2fvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), }; cmds::VertexAttrib2fvImmediate& cmd = *GetBufferAs<cmds::VertexAttrib2fvImmediate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - data); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib2fvImmediate::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data)), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttrib2fvImmediate::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, VertexAttrib3f) { cmds::VertexAttrib3f& cmd = *GetBufferAs<cmds::VertexAttrib3f>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLfloat>(12), - static_cast<GLfloat>(13), - static_cast<GLfloat>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib3f::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLfloat>(12), + static_cast<GLfloat>(13), + static_cast<GLfloat>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttrib3f::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); EXPECT_EQ(static_cast<GLfloat>(12), cmd.x); EXPECT_EQ(static_cast<GLfloat>(13), cmd.y); EXPECT_EQ(static_cast<GLfloat>(14), cmd.z); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, VertexAttrib3fv) { - cmds::VertexAttrib3fv& cmd = *GetBufferAs<cmds::VertexAttrib3fv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib3fv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); - EXPECT_EQ(static_cast<uint32>(12), cmd.values_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.values_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, VertexAttrib3fvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), }; cmds::VertexAttrib3fvImmediate& cmd = *GetBufferAs<cmds::VertexAttrib3fvImmediate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - data); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib3fvImmediate::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data)), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttrib3fvImmediate::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, VertexAttrib4f) { cmds::VertexAttrib4f& cmd = *GetBufferAs<cmds::VertexAttrib4f>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLfloat>(12), - static_cast<GLfloat>(13), - static_cast<GLfloat>(14), - static_cast<GLfloat>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib4f::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLfloat>(12), + static_cast<GLfloat>(13), + static_cast<GLfloat>(14), + static_cast<GLfloat>(15)); + EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttrib4f::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); @@ -3145,64 +2273,40 @@ TEST_F(GLES2FormatTest, VertexAttrib4f) { EXPECT_EQ(static_cast<GLfloat>(13), cmd.y); EXPECT_EQ(static_cast<GLfloat>(14), cmd.z); EXPECT_EQ(static_cast<GLfloat>(15), cmd.w); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, VertexAttrib4fv) { - cmds::VertexAttrib4fv& cmd = *GetBufferAs<cmds::VertexAttrib4fv>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib4fv::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); - EXPECT_EQ(static_cast<uint32>(12), cmd.values_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.values_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, VertexAttrib4fvImmediate) { const int kSomeBaseValueToTestWith = 51; static GLfloat data[] = { - static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), - static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 0), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 1), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 2), + static_cast<GLfloat>(kSomeBaseValueToTestWith + 3), }; cmds::VertexAttrib4fvImmediate& cmd = *GetBufferAs<cmds::VertexAttrib4fvImmediate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - data); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttrib4fvImmediate::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data)), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttrib4fvImmediate::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, VertexAttribPointer) { cmds::VertexAttribPointer& cmd = *GetBufferAs<cmds::VertexAttribPointer>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLint>(12), - static_cast<GLenum>(13), - static_cast<GLboolean>(14), - static_cast<GLsizei>(15), - static_cast<GLuint>(16)); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttribPointer::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLint>(12), + static_cast<GLenum>(13), + static_cast<GLboolean>(14), + static_cast<GLsizei>(15), + static_cast<GLuint>(16)); + EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttribPointer::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.indx); @@ -3211,45 +2315,40 @@ TEST_F(GLES2FormatTest, VertexAttribPointer) { EXPECT_EQ(static_cast<GLboolean>(14), cmd.normalized); EXPECT_EQ(static_cast<GLsizei>(15), cmd.stride); EXPECT_EQ(static_cast<GLuint>(16), cmd.offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, Viewport) { cmds::Viewport& cmd = *GetBufferAs<cmds::Viewport>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLint>(12), - static_cast<GLsizei>(13), - static_cast<GLsizei>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::Viewport::kCmdId), - cmd.header.command); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLint>(12), + static_cast<GLsizei>(13), + static_cast<GLsizei>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::Viewport::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.x); EXPECT_EQ(static_cast<GLint>(12), cmd.y); EXPECT_EQ(static_cast<GLsizei>(13), cmd.width); EXPECT_EQ(static_cast<GLsizei>(14), cmd.height); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BlitFramebufferCHROMIUM) { cmds::BlitFramebufferCHROMIUM& cmd = *GetBufferAs<cmds::BlitFramebufferCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLint>(12), - static_cast<GLint>(13), - static_cast<GLint>(14), - static_cast<GLint>(15), - static_cast<GLint>(16), - static_cast<GLint>(17), - static_cast<GLint>(18), - static_cast<GLbitfield>(19), - static_cast<GLenum>(20)); - EXPECT_EQ(static_cast<uint32>(cmds::BlitFramebufferCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLint>(12), + static_cast<GLint>(13), + static_cast<GLint>(14), + static_cast<GLint>(15), + static_cast<GLint>(16), + static_cast<GLint>(17), + static_cast<GLint>(18), + static_cast<GLbitfield>(19), + static_cast<GLenum>(20)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BlitFramebufferCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.srcX0); @@ -3262,23 +2361,20 @@ TEST_F(GLES2FormatTest, BlitFramebufferCHROMIUM) { EXPECT_EQ(static_cast<GLint>(18), cmd.dstY1); EXPECT_EQ(static_cast<GLbitfield>(19), cmd.mask); EXPECT_EQ(static_cast<GLenum>(20), cmd.filter); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, RenderbufferStorageMultisampleCHROMIUM) { cmds::RenderbufferStorageMultisampleCHROMIUM& cmd = *GetBufferAs<cmds::RenderbufferStorageMultisampleCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLsizei>(12), - static_cast<GLenum>(13), - static_cast<GLsizei>(14), - static_cast<GLsizei>(15)); - EXPECT_EQ( - static_cast<uint32>( - cmds::RenderbufferStorageMultisampleCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLsizei>(12), + static_cast<GLenum>(13), + static_cast<GLsizei>(14), + static_cast<GLsizei>(15)); + EXPECT_EQ(static_cast<uint32_t>( + cmds::RenderbufferStorageMultisampleCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -3286,68 +2382,60 @@ TEST_F(GLES2FormatTest, RenderbufferStorageMultisampleCHROMIUM) { EXPECT_EQ(static_cast<GLenum>(13), cmd.internalformat); EXPECT_EQ(static_cast<GLsizei>(14), cmd.width); EXPECT_EQ(static_cast<GLsizei>(15), cmd.height); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, RenderbufferStorageMultisampleEXT) { cmds::RenderbufferStorageMultisampleEXT& cmd = *GetBufferAs<cmds::RenderbufferStorageMultisampleEXT>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLsizei>(12), - static_cast<GLenum>(13), - static_cast<GLsizei>(14), - static_cast<GLsizei>(15)); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLsizei>(12), + static_cast<GLenum>(13), + static_cast<GLsizei>(14), + static_cast<GLsizei>(15)); EXPECT_EQ( - static_cast<uint32>(cmds::RenderbufferStorageMultisampleEXT::kCmdId), - cmd.header.command); + static_cast<uint32_t>(cmds::RenderbufferStorageMultisampleEXT::kCmdId), + cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLsizei>(12), cmd.samples); EXPECT_EQ(static_cast<GLenum>(13), cmd.internalformat); EXPECT_EQ(static_cast<GLsizei>(14), cmd.width); EXPECT_EQ(static_cast<GLsizei>(15), cmd.height); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, FramebufferTexture2DMultisampleEXT) { cmds::FramebufferTexture2DMultisampleEXT& cmd = *GetBufferAs<cmds::FramebufferTexture2DMultisampleEXT>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLenum>(13), - static_cast<GLuint>(14), - static_cast<GLint>(15), - static_cast<GLsizei>(16)); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLenum>(13), + static_cast<GLuint>(14), + static_cast<GLsizei>(15)); EXPECT_EQ( - static_cast<uint32>(cmds::FramebufferTexture2DMultisampleEXT::kCmdId), - cmd.header.command); + static_cast<uint32_t>(cmds::FramebufferTexture2DMultisampleEXT::kCmdId), + cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLenum>(12), cmd.attachment); EXPECT_EQ(static_cast<GLenum>(13), cmd.textarget); EXPECT_EQ(static_cast<GLuint>(14), cmd.texture); - EXPECT_EQ(static_cast<GLint>(15), cmd.level); - EXPECT_EQ(static_cast<GLsizei>(16), cmd.samples); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<GLsizei>(15), cmd.samples); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, TexStorage2DEXT) { cmds::TexStorage2DEXT& cmd = *GetBufferAs<cmds::TexStorage2DEXT>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLsizei>(12), - static_cast<GLenum>(13), - static_cast<GLsizei>(14), - static_cast<GLsizei>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::TexStorage2DEXT::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLsizei>(12), + static_cast<GLenum>(13), + static_cast<GLsizei>(14), + static_cast<GLsizei>(15)); + EXPECT_EQ(static_cast<uint32_t>(cmds::TexStorage2DEXT::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -3355,531 +2443,380 @@ TEST_F(GLES2FormatTest, TexStorage2DEXT) { EXPECT_EQ(static_cast<GLenum>(13), cmd.internalFormat); EXPECT_EQ(static_cast<GLsizei>(14), cmd.width); EXPECT_EQ(static_cast<GLsizei>(15), cmd.height); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, GenQueriesEXT) { - cmds::GenQueriesEXT& cmd = *GetBufferAs<cmds::GenQueriesEXT>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::GenQueriesEXT::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.queries_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.queries_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GenQueriesEXTImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::GenQueriesEXTImmediate& cmd = *GetBufferAs<cmds::GenQueriesEXTImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::GenQueriesEXTImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::GenQueriesEXTImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } -TEST_F(GLES2FormatTest, DeleteQueriesEXT) { - cmds::DeleteQueriesEXT& cmd = *GetBufferAs<cmds::DeleteQueriesEXT>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteQueriesEXT::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.queries_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.queries_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - TEST_F(GLES2FormatTest, DeleteQueriesEXTImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::DeleteQueriesEXTImmediate& cmd = *GetBufferAs<cmds::DeleteQueriesEXTImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteQueriesEXTImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::DeleteQueriesEXTImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } TEST_F(GLES2FormatTest, BeginQueryEXT) { cmds::BeginQueryEXT& cmd = *GetBufferAs<cmds::BeginQueryEXT>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLuint>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::BeginQueryEXT::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLuint>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BeginQueryEXT::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLuint>(12), cmd.id); - EXPECT_EQ(static_cast<uint32>(13), cmd.sync_data_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.sync_data_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.sync_data_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.sync_data_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, EndQueryEXT) { cmds::EndQueryEXT& cmd = *GetBufferAs<cmds::EndQueryEXT>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLuint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::EndQueryEXT::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLuint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::EndQueryEXT::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLuint>(12), cmd.submit_count); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, InsertEventMarkerEXT) { cmds::InsertEventMarkerEXT& cmd = *GetBufferAs<cmds::InsertEventMarkerEXT>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::InsertEventMarkerEXT::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::InsertEventMarkerEXT::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, PushGroupMarkerEXT) { cmds::PushGroupMarkerEXT& cmd = *GetBufferAs<cmds::PushGroupMarkerEXT>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::PushGroupMarkerEXT::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::PushGroupMarkerEXT::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, PopGroupMarkerEXT) { cmds::PopGroupMarkerEXT& cmd = *GetBufferAs<cmds::PopGroupMarkerEXT>(); - void* next_cmd = cmd.Set( - &cmd); - EXPECT_EQ(static_cast<uint32>(cmds::PopGroupMarkerEXT::kCmdId), + void* next_cmd = cmd.Set(&cmd); + EXPECT_EQ(static_cast<uint32_t>(cmds::PopGroupMarkerEXT::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, GenVertexArraysOES) { - cmds::GenVertexArraysOES& cmd = *GetBufferAs<cmds::GenVertexArraysOES>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::GenVertexArraysOES::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.arrays_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.arrays_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GenVertexArraysOESImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::GenVertexArraysOESImmediate& cmd = *GetBufferAs<cmds::GenVertexArraysOESImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::GenVertexArraysOESImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::GenVertexArraysOESImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } -TEST_F(GLES2FormatTest, DeleteVertexArraysOES) { - cmds::DeleteVertexArraysOES& cmd = - *GetBufferAs<cmds::DeleteVertexArraysOES>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteVertexArraysOES::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.n); - EXPECT_EQ(static_cast<uint32>(12), cmd.arrays_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.arrays_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - TEST_F(GLES2FormatTest, DeleteVertexArraysOESImmediate) { - static GLuint ids[] = { 12, 23, 34, }; + static GLuint ids[] = { + 12, 23, 34, + }; cmds::DeleteVertexArraysOESImmediate& cmd = *GetBufferAs<cmds::DeleteVertexArraysOESImmediate>(); - void* next_cmd = cmd.Set( - &cmd, static_cast<GLsizei>(arraysize(ids)), ids); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteVertexArraysOESImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(arraysize(ids)), ids); + EXPECT_EQ(static_cast<uint32_t>(cmds::DeleteVertexArraysOESImmediate::kCmdId), cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(cmd.n * 4u), + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(cmd.n * 4u), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); + next_cmd, + sizeof(cmd) + RoundSizeToMultipleOfEntries(arraysize(ids) * 4u)); // TODO(gman): Check that ids were inserted; } TEST_F(GLES2FormatTest, IsVertexArrayOES) { cmds::IsVertexArrayOES& cmd = *GetBufferAs<cmds::IsVertexArrayOES>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::IsVertexArrayOES::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::IsVertexArrayOES::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.array); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BindVertexArrayOES) { cmds::BindVertexArrayOES& cmd = *GetBufferAs<cmds::BindVertexArrayOES>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::BindVertexArrayOES::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BindVertexArrayOES::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.array); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, SwapBuffers) { cmds::SwapBuffers& cmd = *GetBufferAs<cmds::SwapBuffers>(); - void* next_cmd = cmd.Set( - &cmd); - EXPECT_EQ(static_cast<uint32>(cmds::SwapBuffers::kCmdId), + void* next_cmd = cmd.Set(&cmd); + EXPECT_EQ(static_cast<uint32_t>(cmds::SwapBuffers::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetMaxValueInBufferCHROMIUM) { cmds::GetMaxValueInBufferCHROMIUM& cmd = *GetBufferAs<cmds::GetMaxValueInBufferCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLsizei>(12), - static_cast<GLenum>(13), - static_cast<GLuint>(14), - static_cast<uint32>(15), - static_cast<uint32>(16)); - EXPECT_EQ(static_cast<uint32>(cmds::GetMaxValueInBufferCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLsizei>(12), + static_cast<GLenum>(13), + static_cast<GLuint>(14), + static_cast<uint32_t>(15), + static_cast<uint32_t>(16)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetMaxValueInBufferCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.buffer_id); EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); EXPECT_EQ(static_cast<GLenum>(13), cmd.type); EXPECT_EQ(static_cast<GLuint>(14), cmd.offset); - EXPECT_EQ(static_cast<uint32>(15), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(16), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(15), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(16), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GenSharedIdsCHROMIUM) { cmds::GenSharedIdsCHROMIUM& cmd = *GetBufferAs<cmds::GenSharedIdsCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLuint>(12), - static_cast<GLsizei>(13), - static_cast<uint32>(14), - static_cast<uint32>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::GenSharedIdsCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLuint>(12), + static_cast<GLsizei>(13), + static_cast<uint32_t>(14), + static_cast<uint32_t>(15)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GenSharedIdsCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.namespace_id); EXPECT_EQ(static_cast<GLuint>(12), cmd.id_offset); EXPECT_EQ(static_cast<GLsizei>(13), cmd.n); - EXPECT_EQ(static_cast<uint32>(14), cmd.ids_shm_id); - EXPECT_EQ(static_cast<uint32>(15), cmd.ids_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.ids_shm_id); + EXPECT_EQ(static_cast<uint32_t>(15), cmd.ids_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DeleteSharedIdsCHROMIUM) { cmds::DeleteSharedIdsCHROMIUM& cmd = *GetBufferAs<cmds::DeleteSharedIdsCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLsizei>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::DeleteSharedIdsCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLsizei>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DeleteSharedIdsCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.namespace_id); EXPECT_EQ(static_cast<GLsizei>(12), cmd.n); - EXPECT_EQ(static_cast<uint32>(13), cmd.ids_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.ids_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.ids_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.ids_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, RegisterSharedIdsCHROMIUM) { cmds::RegisterSharedIdsCHROMIUM& cmd = *GetBufferAs<cmds::RegisterSharedIdsCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLsizei>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::RegisterSharedIdsCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLsizei>(12), + static_cast<uint32_t>(13), + static_cast<uint32_t>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::RegisterSharedIdsCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.namespace_id); EXPECT_EQ(static_cast<GLsizei>(12), cmd.n); - EXPECT_EQ(static_cast<uint32>(13), cmd.ids_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.ids_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.ids_shm_id); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.ids_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, EnableFeatureCHROMIUM) { cmds::EnableFeatureCHROMIUM& cmd = *GetBufferAs<cmds::EnableFeatureCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::EnableFeatureCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<uint32_t>(12), + static_cast<uint32_t>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::EnableFeatureCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.bucket_id); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.result_shm_id); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.result_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, ResizeCHROMIUM) { cmds::ResizeCHROMIUM& cmd = *GetBufferAs<cmds::ResizeCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLuint>(12), - static_cast<GLfloat>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::ResizeCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLuint>(12), + static_cast<GLfloat>(13)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ResizeCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.width); EXPECT_EQ(static_cast<GLuint>(12), cmd.height); EXPECT_EQ(static_cast<GLfloat>(13), cmd.scale_factor); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetRequestableExtensionsCHROMIUM) { cmds::GetRequestableExtensionsCHROMIUM& cmd = *GetBufferAs<cmds::GetRequestableExtensionsCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<uint32>(11)); + void* next_cmd = cmd.Set(&cmd, static_cast<uint32_t>(11)); EXPECT_EQ( - static_cast<uint32>(cmds::GetRequestableExtensionsCHROMIUM::kCmdId), - cmd.header.command); + static_cast<uint32_t>(cmds::GetRequestableExtensionsCHROMIUM::kCmdId), + cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<uint32>(11), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(11), cmd.bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, RequestExtensionCHROMIUM) { cmds::RequestExtensionCHROMIUM& cmd = *GetBufferAs<cmds::RequestExtensionCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<uint32>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::RequestExtensionCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<uint32_t>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::RequestExtensionCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<uint32>(11), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(11), cmd.bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetMultipleIntegervCHROMIUM) { cmds::GetMultipleIntegervCHROMIUM& cmd = *GetBufferAs<cmds::GetMultipleIntegervCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<uint32>(11), - static_cast<uint32>(12), - static_cast<GLuint>(13), - static_cast<uint32>(14), - static_cast<uint32>(15), - static_cast<GLsizeiptr>(16)); - EXPECT_EQ(static_cast<uint32>(cmds::GetMultipleIntegervCHROMIUM::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<uint32>(11), cmd.pnames_shm_id); - EXPECT_EQ(static_cast<uint32>(12), cmd.pnames_shm_offset); + void* next_cmd = cmd.Set(&cmd, + static_cast<uint32_t>(11), + static_cast<uint32_t>(12), + static_cast<GLuint>(13), + static_cast<uint32_t>(14), + static_cast<uint32_t>(15), + static_cast<GLsizeiptr>(16)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetMultipleIntegervCHROMIUM::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); + EXPECT_EQ(static_cast<uint32_t>(11), cmd.pnames_shm_id); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.pnames_shm_offset); EXPECT_EQ(static_cast<GLuint>(13), cmd.count); - EXPECT_EQ(static_cast<uint32>(14), cmd.results_shm_id); - EXPECT_EQ(static_cast<uint32>(15), cmd.results_shm_offset); + EXPECT_EQ(static_cast<uint32_t>(14), cmd.results_shm_id); + EXPECT_EQ(static_cast<uint32_t>(15), cmd.results_shm_offset); EXPECT_EQ(static_cast<GLsizeiptr>(16), cmd.size); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetProgramInfoCHROMIUM) { cmds::GetProgramInfoCHROMIUM& cmd = *GetBufferAs<cmds::GetProgramInfoCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::GetProgramInfoCHROMIUM::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<uint32_t>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetProgramInfoCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); - EXPECT_EQ(static_cast<uint32>(12), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, CreateStreamTextureCHROMIUM) { - cmds::CreateStreamTextureCHROMIUM& cmd = - *GetBufferAs<cmds::CreateStreamTextureCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::CreateStreamTextureCHROMIUM::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLuint>(11), cmd.client_id); - EXPECT_EQ(static_cast<uint32>(12), cmd.result_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.result_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, DestroyStreamTextureCHROMIUM) { - cmds::DestroyStreamTextureCHROMIUM& cmd = - *GetBufferAs<cmds::DestroyStreamTextureCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::DestroyStreamTextureCHROMIUM::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLuint>(11), cmd.texture); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, GetTranslatedShaderSourceANGLE) { cmds::GetTranslatedShaderSourceANGLE& cmd = *GetBufferAs<cmds::GetTranslatedShaderSourceANGLE>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<uint32>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::GetTranslatedShaderSourceANGLE::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<uint32_t>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::GetTranslatedShaderSourceANGLE::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.shader); - EXPECT_EQ(static_cast<uint32>(12), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(12), cmd.bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, PostSubBufferCHROMIUM) { cmds::PostSubBufferCHROMIUM& cmd = *GetBufferAs<cmds::PostSubBufferCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLint>(11), - static_cast<GLint>(12), - static_cast<GLint>(13), - static_cast<GLint>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::PostSubBufferCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLint>(12), + static_cast<GLint>(13), + static_cast<GLint>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::PostSubBufferCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLint>(11), cmd.x); EXPECT_EQ(static_cast<GLint>(12), cmd.y); EXPECT_EQ(static_cast<GLint>(13), cmd.width); EXPECT_EQ(static_cast<GLint>(14), cmd.height); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, TexImageIOSurface2DCHROMIUM) { cmds::TexImageIOSurface2DCHROMIUM& cmd = *GetBufferAs<cmds::TexImageIOSurface2DCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLsizei>(12), - static_cast<GLsizei>(13), - static_cast<GLuint>(14), - static_cast<GLuint>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::TexImageIOSurface2DCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLsizei>(12), + static_cast<GLsizei>(13), + static_cast<GLuint>(14), + static_cast<GLuint>(15)); + EXPECT_EQ(static_cast<uint32_t>(cmds::TexImageIOSurface2DCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -3887,21 +2824,19 @@ TEST_F(GLES2FormatTest, TexImageIOSurface2DCHROMIUM) { EXPECT_EQ(static_cast<GLsizei>(13), cmd.height); EXPECT_EQ(static_cast<GLuint>(14), cmd.ioSurfaceId); EXPECT_EQ(static_cast<GLuint>(15), cmd.plane); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, CopyTextureCHROMIUM) { cmds::CopyTextureCHROMIUM& cmd = *GetBufferAs<cmds::CopyTextureCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12), - static_cast<GLenum>(13), - static_cast<GLint>(14), - static_cast<GLint>(15), - static_cast<GLenum>(16)); - EXPECT_EQ(static_cast<uint32>(cmds::CopyTextureCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLenum>(12), + static_cast<GLenum>(13), + static_cast<GLint>(14), + static_cast<GLint>(15), + static_cast<GLenum>(16)); + EXPECT_EQ(static_cast<uint32_t>(cmds::CopyTextureCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -3910,41 +2845,37 @@ TEST_F(GLES2FormatTest, CopyTextureCHROMIUM) { EXPECT_EQ(static_cast<GLint>(14), cmd.level); EXPECT_EQ(static_cast<GLint>(15), cmd.internalformat); EXPECT_EQ(static_cast<GLenum>(16), cmd.dest_type); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DrawArraysInstancedANGLE) { cmds::DrawArraysInstancedANGLE& cmd = *GetBufferAs<cmds::DrawArraysInstancedANGLE>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLsizei>(13), - static_cast<GLsizei>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::DrawArraysInstancedANGLE::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLsizei>(13), + static_cast<GLsizei>(14)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DrawArraysInstancedANGLE::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.mode); EXPECT_EQ(static_cast<GLint>(12), cmd.first); EXPECT_EQ(static_cast<GLsizei>(13), cmd.count); EXPECT_EQ(static_cast<GLsizei>(14), cmd.primcount); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DrawElementsInstancedANGLE) { cmds::DrawElementsInstancedANGLE& cmd = *GetBufferAs<cmds::DrawElementsInstancedANGLE>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLsizei>(12), - static_cast<GLenum>(13), - static_cast<GLuint>(14), - static_cast<GLsizei>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::DrawElementsInstancedANGLE::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLsizei>(12), + static_cast<GLenum>(13), + static_cast<GLuint>(14), + static_cast<GLsizei>(15)); + EXPECT_EQ(static_cast<uint32_t>(cmds::DrawElementsInstancedANGLE::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.mode); @@ -3952,348 +2883,352 @@ TEST_F(GLES2FormatTest, DrawElementsInstancedANGLE) { EXPECT_EQ(static_cast<GLenum>(13), cmd.type); EXPECT_EQ(static_cast<GLuint>(14), cmd.index_offset); EXPECT_EQ(static_cast<GLsizei>(15), cmd.primcount); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, VertexAttribDivisorANGLE) { cmds::VertexAttribDivisorANGLE& cmd = *GetBufferAs<cmds::VertexAttribDivisorANGLE>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLuint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::VertexAttribDivisorANGLE::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<GLuint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::VertexAttribDivisorANGLE::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.index); EXPECT_EQ(static_cast<GLuint>(12), cmd.divisor); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } // TODO(gman): Write test for GenMailboxCHROMIUM -TEST_F(GLES2FormatTest, ProduceTextureCHROMIUM) { - cmds::ProduceTextureCHROMIUM& cmd = - *GetBufferAs<cmds::ProduceTextureCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::ProduceTextureCHROMIUM::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLenum>(11), cmd.target); - EXPECT_EQ(static_cast<uint32>(12), cmd.mailbox_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.mailbox_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - TEST_F(GLES2FormatTest, ProduceTextureCHROMIUMImmediate) { const int kSomeBaseValueToTestWith = 51; static GLbyte data[] = { - static_cast<GLbyte>(kSomeBaseValueToTestWith + 0), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 1), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 2), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 3), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 4), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 5), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 6), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 7), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 8), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 9), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 10), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 11), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 12), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 13), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 14), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 15), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 16), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 17), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 18), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 19), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 20), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 21), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 22), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 23), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 24), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 25), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 26), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 27), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 28), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 29), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 30), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 31), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 32), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 33), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 34), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 35), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 36), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 37), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 38), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 39), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 40), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 41), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 42), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 43), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 44), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 45), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 46), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 47), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 48), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 49), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 50), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 51), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 52), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 53), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 54), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 55), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 56), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 57), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 58), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 59), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 60), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 61), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 62), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 63), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 0), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 1), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 2), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 3), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 4), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 5), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 6), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 7), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 8), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 9), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 10), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 11), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 12), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 13), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 14), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 15), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 16), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 17), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 18), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 19), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 20), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 21), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 22), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 23), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 24), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 25), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 26), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 27), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 28), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 29), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 30), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 31), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 32), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 33), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 34), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 35), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 36), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 37), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 38), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 39), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 40), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 41), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 42), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 43), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 44), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 45), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 46), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 47), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 48), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 49), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 50), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 51), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 52), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 53), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 54), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 55), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 56), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 57), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 58), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 59), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 60), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 61), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 62), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 63), }; cmds::ProduceTextureCHROMIUMImmediate& cmd = *GetBufferAs<cmds::ProduceTextureCHROMIUMImmediate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - data); - EXPECT_EQ(static_cast<uint32>(cmds::ProduceTextureCHROMIUMImmediate::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data)), + void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11), data); + EXPECT_EQ( + static_cast<uint32_t>(cmds::ProduceTextureCHROMIUMImmediate::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } -TEST_F(GLES2FormatTest, ConsumeTextureCHROMIUM) { - cmds::ConsumeTextureCHROMIUM& cmd = - *GetBufferAs<cmds::ConsumeTextureCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::ConsumeTextureCHROMIUM::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLenum>(11), cmd.target); - EXPECT_EQ(static_cast<uint32>(12), cmd.mailbox_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.mailbox_shm_offset); +TEST_F(GLES2FormatTest, ProduceTextureDirectCHROMIUMImmediate) { + const int kSomeBaseValueToTestWith = 51; + static GLbyte data[] = { + static_cast<GLbyte>(kSomeBaseValueToTestWith + 0), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 1), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 2), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 3), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 4), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 5), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 6), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 7), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 8), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 9), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 10), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 11), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 12), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 13), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 14), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 15), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 16), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 17), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 18), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 19), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 20), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 21), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 22), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 23), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 24), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 25), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 26), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 27), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 28), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 29), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 30), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 31), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 32), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 33), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 34), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 35), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 36), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 37), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 38), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 39), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 40), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 41), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 42), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 43), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 44), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 45), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 46), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 47), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 48), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 49), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 50), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 51), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 52), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 53), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 54), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 55), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 56), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 57), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 58), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 59), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 60), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 61), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 62), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 63), + }; + cmds::ProduceTextureDirectCHROMIUMImmediate& cmd = + *GetBufferAs<cmds::ProduceTextureDirectCHROMIUMImmediate>(); + void* next_cmd = + cmd.Set(&cmd, static_cast<GLuint>(11), static_cast<GLenum>(12), data); + EXPECT_EQ(static_cast<uint32_t>( + cmds::ProduceTextureDirectCHROMIUMImmediate::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), + cmd.header.size * 4u); + EXPECT_EQ(static_cast<GLuint>(11), cmd.texture); + EXPECT_EQ(static_cast<GLenum>(12), cmd.target); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); + // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, ConsumeTextureCHROMIUMImmediate) { const int kSomeBaseValueToTestWith = 51; static GLbyte data[] = { - static_cast<GLbyte>(kSomeBaseValueToTestWith + 0), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 1), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 2), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 3), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 4), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 5), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 6), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 7), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 8), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 9), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 10), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 11), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 12), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 13), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 14), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 15), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 16), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 17), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 18), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 19), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 20), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 21), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 22), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 23), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 24), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 25), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 26), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 27), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 28), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 29), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 30), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 31), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 32), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 33), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 34), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 35), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 36), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 37), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 38), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 39), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 40), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 41), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 42), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 43), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 44), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 45), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 46), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 47), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 48), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 49), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 50), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 51), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 52), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 53), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 54), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 55), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 56), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 57), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 58), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 59), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 60), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 61), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 62), - static_cast<GLbyte>(kSomeBaseValueToTestWith + 63), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 0), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 1), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 2), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 3), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 4), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 5), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 6), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 7), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 8), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 9), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 10), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 11), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 12), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 13), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 14), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 15), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 16), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 17), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 18), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 19), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 20), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 21), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 22), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 23), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 24), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 25), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 26), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 27), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 28), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 29), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 30), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 31), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 32), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 33), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 34), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 35), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 36), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 37), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 38), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 39), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 40), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 41), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 42), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 43), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 44), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 45), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 46), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 47), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 48), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 49), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 50), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 51), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 52), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 53), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 54), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 55), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 56), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 57), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 58), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 59), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 60), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 61), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 62), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 63), }; cmds::ConsumeTextureCHROMIUMImmediate& cmd = *GetBufferAs<cmds::ConsumeTextureCHROMIUMImmediate>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - data); - EXPECT_EQ(static_cast<uint32>(cmds::ConsumeTextureCHROMIUMImmediate::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data)), + void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11), data); + EXPECT_EQ( + static_cast<uint32_t>(cmds::ConsumeTextureCHROMIUMImmediate::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } -TEST_F(GLES2FormatTest, BindUniformLocationCHROMIUM) { - cmds::BindUniformLocationCHROMIUM& cmd = - *GetBufferAs<cmds::BindUniformLocationCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLint>(12), - static_cast<uint32>(13), - static_cast<uint32>(14), - static_cast<uint32>(15)); - EXPECT_EQ(static_cast<uint32>(cmds::BindUniformLocationCHROMIUM::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLuint>(11), cmd.program); - EXPECT_EQ(static_cast<GLint>(12), cmd.location); - EXPECT_EQ(static_cast<uint32>(13), cmd.name_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.name_shm_offset); - EXPECT_EQ(static_cast<uint32>(15), cmd.data_size); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - +// TODO(gman): Write test for CreateAndConsumeTextureCHROMIUMImmediate TEST_F(GLES2FormatTest, BindUniformLocationCHROMIUMBucket) { cmds::BindUniformLocationCHROMIUMBucket& cmd = *GetBufferAs<cmds::BindUniformLocationCHROMIUMBucket>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11), - static_cast<GLint>(12), - static_cast<uint32>(13)); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLuint>(11), + static_cast<GLint>(12), + static_cast<uint32_t>(13)); EXPECT_EQ( - static_cast<uint32>(cmds::BindUniformLocationCHROMIUMBucket::kCmdId), - cmd.header.command); + static_cast<uint32_t>(cmds::BindUniformLocationCHROMIUMBucket::kCmdId), + cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.program); EXPECT_EQ(static_cast<GLint>(12), cmd.location); - EXPECT_EQ(static_cast<uint32>(13), cmd.name_bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(13), cmd.name_bucket_id); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, BindTexImage2DCHROMIUM) { cmds::BindTexImage2DCHROMIUM& cmd = *GetBufferAs<cmds::BindTexImage2DCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::BindTexImage2DCHROMIUM::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::BindTexImage2DCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLint>(12), cmd.imageId); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, ReleaseTexImage2DCHROMIUM) { cmds::ReleaseTexImage2DCHROMIUM& cmd = *GetBufferAs<cmds::ReleaseTexImage2DCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::ReleaseTexImage2DCHROMIUM::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLint>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ReleaseTexImage2DCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); EXPECT_EQ(static_cast<GLint>(12), cmd.imageId); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, TraceBeginCHROMIUM) { cmds::TraceBeginCHROMIUM& cmd = *GetBufferAs<cmds::TraceBeginCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::TraceBeginCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::TraceBeginCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.bucket_id); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, TraceEndCHROMIUM) { cmds::TraceEndCHROMIUM& cmd = *GetBufferAs<cmds::TraceEndCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd); - EXPECT_EQ(static_cast<uint32>(cmds::TraceEndCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd); + EXPECT_EQ(static_cast<uint32_t>(cmds::TraceEndCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, AsyncTexSubImage2DCHROMIUM) { cmds::AsyncTexSubImage2DCHROMIUM& cmd = *GetBufferAs<cmds::AsyncTexSubImage2DCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLint>(13), - static_cast<GLint>(14), - static_cast<GLsizei>(15), - static_cast<GLsizei>(16), - static_cast<GLenum>(17), - static_cast<GLenum>(18), - static_cast<uint32>(19), - static_cast<uint32>(20)); - EXPECT_EQ(static_cast<uint32>(cmds::AsyncTexSubImage2DCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLint>(13), + static_cast<GLint>(14), + static_cast<GLsizei>(15), + static_cast<GLsizei>(16), + static_cast<GLenum>(17), + static_cast<GLenum>(18), + static_cast<uint32_t>(19), + static_cast<uint32_t>(20), + static_cast<uint32_t>(21), + static_cast<uint32_t>(22), + static_cast<uint32_t>(23)); + EXPECT_EQ(static_cast<uint32_t>(cmds::AsyncTexSubImage2DCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -4304,28 +3239,31 @@ TEST_F(GLES2FormatTest, AsyncTexSubImage2DCHROMIUM) { EXPECT_EQ(static_cast<GLsizei>(16), cmd.height); EXPECT_EQ(static_cast<GLenum>(17), cmd.format); EXPECT_EQ(static_cast<GLenum>(18), cmd.type); - EXPECT_EQ(static_cast<uint32>(19), cmd.data_shm_id); - EXPECT_EQ(static_cast<uint32>(20), cmd.data_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<uint32_t>(19), cmd.data_shm_id); + EXPECT_EQ(static_cast<uint32_t>(20), cmd.data_shm_offset); + EXPECT_EQ(static_cast<uint32_t>(21), cmd.async_upload_token); + EXPECT_EQ(static_cast<uint32_t>(22), cmd.sync_data_shm_id); + EXPECT_EQ(static_cast<uint32_t>(23), cmd.sync_data_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, AsyncTexImage2DCHROMIUM) { cmds::AsyncTexImage2DCHROMIUM& cmd = *GetBufferAs<cmds::AsyncTexImage2DCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLint>(12), - static_cast<GLint>(13), - static_cast<GLsizei>(14), - static_cast<GLsizei>(15), - static_cast<GLint>(16), - static_cast<GLenum>(17), - static_cast<GLenum>(18), - static_cast<uint32>(19), - static_cast<uint32>(20)); - EXPECT_EQ(static_cast<uint32>(cmds::AsyncTexImage2DCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, + static_cast<GLenum>(11), + static_cast<GLint>(12), + static_cast<GLint>(13), + static_cast<GLsizei>(14), + static_cast<GLsizei>(15), + static_cast<GLenum>(16), + static_cast<GLenum>(17), + static_cast<uint32_t>(18), + static_cast<uint32_t>(19), + static_cast<uint32_t>(20), + static_cast<uint32_t>(21), + static_cast<uint32_t>(22)); + EXPECT_EQ(static_cast<uint32_t>(cmds::AsyncTexImage2DCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); @@ -4333,158 +3271,144 @@ TEST_F(GLES2FormatTest, AsyncTexImage2DCHROMIUM) { EXPECT_EQ(static_cast<GLint>(13), cmd.internalformat); EXPECT_EQ(static_cast<GLsizei>(14), cmd.width); EXPECT_EQ(static_cast<GLsizei>(15), cmd.height); - EXPECT_EQ(static_cast<GLint>(16), cmd.border); - EXPECT_EQ(static_cast<GLenum>(17), cmd.format); - EXPECT_EQ(static_cast<GLenum>(18), cmd.type); - EXPECT_EQ(static_cast<uint32>(19), cmd.pixels_shm_id); - EXPECT_EQ(static_cast<uint32>(20), cmd.pixels_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + EXPECT_EQ(static_cast<GLenum>(16), cmd.format); + EXPECT_EQ(static_cast<GLenum>(17), cmd.type); + EXPECT_EQ(static_cast<uint32_t>(18), cmd.pixels_shm_id); + EXPECT_EQ(static_cast<uint32_t>(19), cmd.pixels_shm_offset); + EXPECT_EQ(static_cast<uint32_t>(20), cmd.async_upload_token); + EXPECT_EQ(static_cast<uint32_t>(21), cmd.sync_data_shm_id); + EXPECT_EQ(static_cast<uint32_t>(22), cmd.sync_data_shm_offset); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, WaitAsyncTexImage2DCHROMIUM) { cmds::WaitAsyncTexImage2DCHROMIUM& cmd = *GetBufferAs<cmds::WaitAsyncTexImage2DCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::WaitAsyncTexImage2DCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::WaitAsyncTexImage2DCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.target); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } -TEST_F(GLES2FormatTest, DiscardFramebufferEXT) { - cmds::DiscardFramebufferEXT& cmd = - *GetBufferAs<cmds::DiscardFramebufferEXT>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLsizei>(12), - static_cast<uint32>(13), - static_cast<uint32>(14)); - EXPECT_EQ(static_cast<uint32>(cmds::DiscardFramebufferEXT::kCmdId), +TEST_F(GLES2FormatTest, WaitAllAsyncTexImage2DCHROMIUM) { + cmds::WaitAllAsyncTexImage2DCHROMIUM& cmd = + *GetBufferAs<cmds::WaitAllAsyncTexImage2DCHROMIUM>(); + void* next_cmd = cmd.Set(&cmd); + EXPECT_EQ(static_cast<uint32_t>(cmds::WaitAllAsyncTexImage2DCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLenum>(11), cmd.target); - EXPECT_EQ(static_cast<GLsizei>(12), cmd.count); - EXPECT_EQ(static_cast<uint32>(13), cmd.attachments_shm_id); - EXPECT_EQ(static_cast<uint32>(14), cmd.attachments_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DiscardFramebufferEXTImmediate) { const int kSomeBaseValueToTestWith = 51; static GLenum data[] = { - static_cast<GLenum>(kSomeBaseValueToTestWith + 0), - static_cast<GLenum>(kSomeBaseValueToTestWith + 1), + static_cast<GLenum>(kSomeBaseValueToTestWith + 0), + static_cast<GLenum>(kSomeBaseValueToTestWith + 1), }; cmds::DiscardFramebufferEXTImmediate& cmd = *GetBufferAs<cmds::DiscardFramebufferEXTImmediate>(); const GLsizei kNumElements = 2; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLenum) * 1; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(1), - static_cast<GLsizei>(2), - data); - EXPECT_EQ(static_cast<uint32>(cmds::DiscardFramebufferEXTImmediate::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(1), static_cast<GLsizei>(2), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::DiscardFramebufferEXTImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(1), cmd.target); EXPECT_EQ(static_cast<GLsizei>(2), cmd.count); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, LoseContextCHROMIUM) { cmds::LoseContextCHROMIUM& cmd = *GetBufferAs<cmds::LoseContextCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLenum>(11), - static_cast<GLenum>(12)); - EXPECT_EQ(static_cast<uint32>(cmds::LoseContextCHROMIUM::kCmdId), + void* next_cmd = + cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLenum>(12)); + EXPECT_EQ(static_cast<uint32_t>(cmds::LoseContextCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLenum>(11), cmd.current); EXPECT_EQ(static_cast<GLenum>(12), cmd.other); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } // TODO(gman): Write test for InsertSyncPointCHROMIUM TEST_F(GLES2FormatTest, WaitSyncPointCHROMIUM) { cmds::WaitSyncPointCHROMIUM& cmd = *GetBufferAs<cmds::WaitSyncPointCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLuint>(11)); - EXPECT_EQ(static_cast<uint32>(cmds::WaitSyncPointCHROMIUM::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLuint>(11)); + EXPECT_EQ(static_cast<uint32_t>(cmds::WaitSyncPointCHROMIUM::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); EXPECT_EQ(static_cast<GLuint>(11), cmd.sync_point); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); -} - -TEST_F(GLES2FormatTest, DrawBuffersEXT) { - cmds::DrawBuffersEXT& cmd = *GetBufferAs<cmds::DrawBuffersEXT>(); - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(11), - static_cast<uint32>(12), - static_cast<uint32>(13)); - EXPECT_EQ(static_cast<uint32>(cmds::DrawBuffersEXT::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLsizei>(11), cmd.count); - EXPECT_EQ(static_cast<uint32>(12), cmd.bufs_shm_id); - EXPECT_EQ(static_cast<uint32>(13), cmd.bufs_shm_offset); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } TEST_F(GLES2FormatTest, DrawBuffersEXTImmediate) { const int kSomeBaseValueToTestWith = 51; static GLenum data[] = { - static_cast<GLenum>(kSomeBaseValueToTestWith + 0), + static_cast<GLenum>(kSomeBaseValueToTestWith + 0), }; cmds::DrawBuffersEXTImmediate& cmd = *GetBufferAs<cmds::DrawBuffersEXTImmediate>(); const GLsizei kNumElements = 1; const size_t kExpectedCmdSize = sizeof(cmd) + kNumElements * sizeof(GLenum) * 1; - void* next_cmd = cmd.Set( - &cmd, - static_cast<GLsizei>(1), - data); - EXPECT_EQ(static_cast<uint32>(cmds::DrawBuffersEXTImmediate::kCmdId), + void* next_cmd = cmd.Set(&cmd, static_cast<GLsizei>(1), data); + EXPECT_EQ(static_cast<uint32_t>(cmds::DrawBuffersEXTImmediate::kCmdId), cmd.header.command); EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u); EXPECT_EQ(static_cast<GLsizei>(1), cmd.count); CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd) + - RoundSizeToMultipleOfEntries(sizeof(data))); + next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); // TODO(gman): Check that data was inserted; } TEST_F(GLES2FormatTest, DiscardBackbufferCHROMIUM) { cmds::DiscardBackbufferCHROMIUM& cmd = *GetBufferAs<cmds::DiscardBackbufferCHROMIUM>(); - void* next_cmd = cmd.Set( - &cmd); - EXPECT_EQ(static_cast<uint32>(cmds::DiscardBackbufferCHROMIUM::kCmdId), - cmd.header.command); - EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); - CheckBytesWrittenMatchesExpectedSize( - next_cmd, sizeof(cmd)); + void* next_cmd = cmd.Set(&cmd); + EXPECT_EQ(static_cast<uint32_t>(cmds::DiscardBackbufferCHROMIUM::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); +} + +TEST_F(GLES2FormatTest, ScheduleOverlayPlaneCHROMIUM) { + cmds::ScheduleOverlayPlaneCHROMIUM& cmd = + *GetBufferAs<cmds::ScheduleOverlayPlaneCHROMIUM>(); + void* next_cmd = cmd.Set(&cmd, + static_cast<GLint>(11), + static_cast<GLenum>(12), + static_cast<GLuint>(13), + static_cast<GLint>(14), + static_cast<GLint>(15), + static_cast<GLint>(16), + static_cast<GLint>(17), + static_cast<GLfloat>(18), + static_cast<GLfloat>(19), + static_cast<GLfloat>(20), + static_cast<GLfloat>(21)); + EXPECT_EQ(static_cast<uint32_t>(cmds::ScheduleOverlayPlaneCHROMIUM::kCmdId), + cmd.header.command); + EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u); + EXPECT_EQ(static_cast<GLint>(11), cmd.plane_z_order); + EXPECT_EQ(static_cast<GLenum>(12), cmd.plane_transform); + EXPECT_EQ(static_cast<GLuint>(13), cmd.overlay_texture_id); + EXPECT_EQ(static_cast<GLint>(14), cmd.bounds_x); + EXPECT_EQ(static_cast<GLint>(15), cmd.bounds_y); + EXPECT_EQ(static_cast<GLint>(16), cmd.bounds_width); + EXPECT_EQ(static_cast<GLint>(17), cmd.bounds_height); + EXPECT_EQ(static_cast<GLfloat>(18), cmd.uv_x); + EXPECT_EQ(static_cast<GLfloat>(19), cmd.uv_y); + EXPECT_EQ(static_cast<GLfloat>(20), cmd.uv_width); + EXPECT_EQ(static_cast<GLfloat>(21), cmd.uv_height); + CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd)); } #endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_TEST_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/chromium/gpu/command_buffer/common/gles2_cmd_ids_autogen.h index e26e8d22d91..0d2b9b77024 100644 --- a/chromium/gpu/command_buffer/common/gles2_cmd_ids_autogen.h +++ b/chromium/gpu/command_buffer/common/gles2_cmd_ids_autogen.h @@ -1,258 +1,223 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! #ifndef GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_IDS_AUTOGEN_H_ #define GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_IDS_AUTOGEN_H_ -#define GLES2_COMMAND_LIST(OP) \ - OP(ActiveTexture) /* 256 */ \ - OP(AttachShader) /* 257 */ \ - OP(BindAttribLocation) /* 258 */ \ - OP(BindAttribLocationBucket) /* 259 */ \ - OP(BindBuffer) /* 260 */ \ - OP(BindFramebuffer) /* 261 */ \ - OP(BindRenderbuffer) /* 262 */ \ - OP(BindTexture) /* 263 */ \ - OP(BlendColor) /* 264 */ \ - OP(BlendEquation) /* 265 */ \ - OP(BlendEquationSeparate) /* 266 */ \ - OP(BlendFunc) /* 267 */ \ - OP(BlendFuncSeparate) /* 268 */ \ - OP(BufferData) /* 269 */ \ - OP(BufferSubData) /* 270 */ \ - OP(CheckFramebufferStatus) /* 271 */ \ - OP(Clear) /* 272 */ \ - OP(ClearColor) /* 273 */ \ - OP(ClearDepthf) /* 274 */ \ - OP(ClearStencil) /* 275 */ \ - OP(ColorMask) /* 276 */ \ - OP(CompileShader) /* 277 */ \ - OP(CompressedTexImage2D) /* 278 */ \ - OP(CompressedTexImage2DBucket) /* 279 */ \ - OP(CompressedTexSubImage2D) /* 280 */ \ - OP(CompressedTexSubImage2DBucket) /* 281 */ \ - OP(CopyTexImage2D) /* 282 */ \ - OP(CopyTexSubImage2D) /* 283 */ \ - OP(CreateProgram) /* 284 */ \ - OP(CreateShader) /* 285 */ \ - OP(CullFace) /* 286 */ \ - OP(DeleteBuffers) /* 287 */ \ - OP(DeleteBuffersImmediate) /* 288 */ \ - OP(DeleteFramebuffers) /* 289 */ \ - OP(DeleteFramebuffersImmediate) /* 290 */ \ - OP(DeleteProgram) /* 291 */ \ - OP(DeleteRenderbuffers) /* 292 */ \ - OP(DeleteRenderbuffersImmediate) /* 293 */ \ - OP(DeleteShader) /* 294 */ \ - OP(DeleteTextures) /* 295 */ \ - OP(DeleteTexturesImmediate) /* 296 */ \ - OP(DepthFunc) /* 297 */ \ - OP(DepthMask) /* 298 */ \ - OP(DepthRangef) /* 299 */ \ - OP(DetachShader) /* 300 */ \ - OP(Disable) /* 301 */ \ - OP(DisableVertexAttribArray) /* 302 */ \ - OP(DrawArrays) /* 303 */ \ - OP(DrawElements) /* 304 */ \ - OP(Enable) /* 305 */ \ - OP(EnableVertexAttribArray) /* 306 */ \ - OP(Finish) /* 307 */ \ - OP(Flush) /* 308 */ \ - OP(FramebufferRenderbuffer) /* 309 */ \ - OP(FramebufferTexture2D) /* 310 */ \ - OP(FrontFace) /* 311 */ \ - OP(GenBuffers) /* 312 */ \ - OP(GenBuffersImmediate) /* 313 */ \ - OP(GenerateMipmap) /* 314 */ \ - OP(GenFramebuffers) /* 315 */ \ - OP(GenFramebuffersImmediate) /* 316 */ \ - OP(GenRenderbuffers) /* 317 */ \ - OP(GenRenderbuffersImmediate) /* 318 */ \ - OP(GenTextures) /* 319 */ \ - OP(GenTexturesImmediate) /* 320 */ \ - OP(GetActiveAttrib) /* 321 */ \ - OP(GetActiveUniform) /* 322 */ \ - OP(GetAttachedShaders) /* 323 */ \ - OP(GetAttribLocation) /* 324 */ \ - OP(GetAttribLocationBucket) /* 325 */ \ - OP(GetBooleanv) /* 326 */ \ - OP(GetBufferParameteriv) /* 327 */ \ - OP(GetError) /* 328 */ \ - OP(GetFloatv) /* 329 */ \ - OP(GetFramebufferAttachmentParameteriv) /* 330 */ \ - OP(GetIntegerv) /* 331 */ \ - OP(GetProgramiv) /* 332 */ \ - OP(GetProgramInfoLog) /* 333 */ \ - OP(GetRenderbufferParameteriv) /* 334 */ \ - OP(GetShaderiv) /* 335 */ \ - OP(GetShaderInfoLog) /* 336 */ \ - OP(GetShaderPrecisionFormat) /* 337 */ \ - OP(GetShaderSource) /* 338 */ \ - OP(GetString) /* 339 */ \ - OP(GetTexParameterfv) /* 340 */ \ - OP(GetTexParameteriv) /* 341 */ \ - OP(GetUniformfv) /* 342 */ \ - OP(GetUniformiv) /* 343 */ \ - OP(GetUniformLocation) /* 344 */ \ - OP(GetUniformLocationBucket) /* 345 */ \ - OP(GetVertexAttribfv) /* 346 */ \ - OP(GetVertexAttribiv) /* 347 */ \ - OP(GetVertexAttribPointerv) /* 348 */ \ - OP(Hint) /* 349 */ \ - OP(IsBuffer) /* 350 */ \ - OP(IsEnabled) /* 351 */ \ - OP(IsFramebuffer) /* 352 */ \ - OP(IsProgram) /* 353 */ \ - OP(IsRenderbuffer) /* 354 */ \ - OP(IsShader) /* 355 */ \ - OP(IsTexture) /* 356 */ \ - OP(LineWidth) /* 357 */ \ - OP(LinkProgram) /* 358 */ \ - OP(PixelStorei) /* 359 */ \ - OP(PolygonOffset) /* 360 */ \ - OP(ReadPixels) /* 361 */ \ - OP(ReleaseShaderCompiler) /* 362 */ \ - OP(RenderbufferStorage) /* 363 */ \ - OP(SampleCoverage) /* 364 */ \ - OP(Scissor) /* 365 */ \ - OP(ShaderBinary) /* 366 */ \ - OP(ShaderSource) /* 367 */ \ - OP(ShaderSourceBucket) /* 368 */ \ - OP(StencilFunc) /* 369 */ \ - OP(StencilFuncSeparate) /* 370 */ \ - OP(StencilMask) /* 371 */ \ - OP(StencilMaskSeparate) /* 372 */ \ - OP(StencilOp) /* 373 */ \ - OP(StencilOpSeparate) /* 374 */ \ - OP(TexImage2D) /* 375 */ \ - OP(TexParameterf) /* 376 */ \ - OP(TexParameterfv) /* 377 */ \ - OP(TexParameterfvImmediate) /* 378 */ \ - OP(TexParameteri) /* 379 */ \ - OP(TexParameteriv) /* 380 */ \ - OP(TexParameterivImmediate) /* 381 */ \ - OP(TexSubImage2D) /* 382 */ \ - OP(Uniform1f) /* 383 */ \ - OP(Uniform1fv) /* 384 */ \ - OP(Uniform1fvImmediate) /* 385 */ \ - OP(Uniform1i) /* 386 */ \ - OP(Uniform1iv) /* 387 */ \ - OP(Uniform1ivImmediate) /* 388 */ \ - OP(Uniform2f) /* 389 */ \ - OP(Uniform2fv) /* 390 */ \ - OP(Uniform2fvImmediate) /* 391 */ \ - OP(Uniform2i) /* 392 */ \ - OP(Uniform2iv) /* 393 */ \ - OP(Uniform2ivImmediate) /* 394 */ \ - OP(Uniform3f) /* 395 */ \ - OP(Uniform3fv) /* 396 */ \ - OP(Uniform3fvImmediate) /* 397 */ \ - OP(Uniform3i) /* 398 */ \ - OP(Uniform3iv) /* 399 */ \ - OP(Uniform3ivImmediate) /* 400 */ \ - OP(Uniform4f) /* 401 */ \ - OP(Uniform4fv) /* 402 */ \ - OP(Uniform4fvImmediate) /* 403 */ \ - OP(Uniform4i) /* 404 */ \ - OP(Uniform4iv) /* 405 */ \ - OP(Uniform4ivImmediate) /* 406 */ \ - OP(UniformMatrix2fv) /* 407 */ \ - OP(UniformMatrix2fvImmediate) /* 408 */ \ - OP(UniformMatrix3fv) /* 409 */ \ - OP(UniformMatrix3fvImmediate) /* 410 */ \ - OP(UniformMatrix4fv) /* 411 */ \ - OP(UniformMatrix4fvImmediate) /* 412 */ \ - OP(UseProgram) /* 413 */ \ - OP(ValidateProgram) /* 414 */ \ - OP(VertexAttrib1f) /* 415 */ \ - OP(VertexAttrib1fv) /* 416 */ \ - OP(VertexAttrib1fvImmediate) /* 417 */ \ - OP(VertexAttrib2f) /* 418 */ \ - OP(VertexAttrib2fv) /* 419 */ \ - OP(VertexAttrib2fvImmediate) /* 420 */ \ - OP(VertexAttrib3f) /* 421 */ \ - OP(VertexAttrib3fv) /* 422 */ \ - OP(VertexAttrib3fvImmediate) /* 423 */ \ - OP(VertexAttrib4f) /* 424 */ \ - OP(VertexAttrib4fv) /* 425 */ \ - OP(VertexAttrib4fvImmediate) /* 426 */ \ - OP(VertexAttribPointer) /* 427 */ \ - OP(Viewport) /* 428 */ \ - OP(BlitFramebufferCHROMIUM) /* 429 */ \ - OP(RenderbufferStorageMultisampleCHROMIUM) /* 430 */ \ - OP(RenderbufferStorageMultisampleEXT) /* 431 */ \ - OP(FramebufferTexture2DMultisampleEXT) /* 432 */ \ - OP(TexStorage2DEXT) /* 433 */ \ - OP(GenQueriesEXT) /* 434 */ \ - OP(GenQueriesEXTImmediate) /* 435 */ \ - OP(DeleteQueriesEXT) /* 436 */ \ - OP(DeleteQueriesEXTImmediate) /* 437 */ \ - OP(BeginQueryEXT) /* 438 */ \ - OP(EndQueryEXT) /* 439 */ \ - OP(InsertEventMarkerEXT) /* 440 */ \ - OP(PushGroupMarkerEXT) /* 441 */ \ - OP(PopGroupMarkerEXT) /* 442 */ \ - OP(GenVertexArraysOES) /* 443 */ \ - OP(GenVertexArraysOESImmediate) /* 444 */ \ - OP(DeleteVertexArraysOES) /* 445 */ \ - OP(DeleteVertexArraysOESImmediate) /* 446 */ \ - OP(IsVertexArrayOES) /* 447 */ \ - OP(BindVertexArrayOES) /* 448 */ \ - OP(SwapBuffers) /* 449 */ \ - OP(GetMaxValueInBufferCHROMIUM) /* 450 */ \ - OP(GenSharedIdsCHROMIUM) /* 451 */ \ - OP(DeleteSharedIdsCHROMIUM) /* 452 */ \ - OP(RegisterSharedIdsCHROMIUM) /* 453 */ \ - OP(EnableFeatureCHROMIUM) /* 454 */ \ - OP(ResizeCHROMIUM) /* 455 */ \ - OP(GetRequestableExtensionsCHROMIUM) /* 456 */ \ - OP(RequestExtensionCHROMIUM) /* 457 */ \ - OP(GetMultipleIntegervCHROMIUM) /* 458 */ \ - OP(GetProgramInfoCHROMIUM) /* 459 */ \ - OP(CreateStreamTextureCHROMIUM) /* 460 */ \ - OP(DestroyStreamTextureCHROMIUM) /* 461 */ \ - OP(GetTranslatedShaderSourceANGLE) /* 462 */ \ - OP(PostSubBufferCHROMIUM) /* 463 */ \ - OP(TexImageIOSurface2DCHROMIUM) /* 464 */ \ - OP(CopyTextureCHROMIUM) /* 465 */ \ - OP(DrawArraysInstancedANGLE) /* 466 */ \ - OP(DrawElementsInstancedANGLE) /* 467 */ \ - OP(VertexAttribDivisorANGLE) /* 468 */ \ - OP(GenMailboxCHROMIUM) /* 469 */ \ - OP(ProduceTextureCHROMIUM) /* 470 */ \ - OP(ProduceTextureCHROMIUMImmediate) /* 471 */ \ - OP(ConsumeTextureCHROMIUM) /* 472 */ \ - OP(ConsumeTextureCHROMIUMImmediate) /* 473 */ \ - OP(BindUniformLocationCHROMIUM) /* 474 */ \ - OP(BindUniformLocationCHROMIUMBucket) /* 475 */ \ - OP(BindTexImage2DCHROMIUM) /* 476 */ \ - OP(ReleaseTexImage2DCHROMIUM) /* 477 */ \ - OP(TraceBeginCHROMIUM) /* 478 */ \ - OP(TraceEndCHROMIUM) /* 479 */ \ - OP(AsyncTexSubImage2DCHROMIUM) /* 480 */ \ - OP(AsyncTexImage2DCHROMIUM) /* 481 */ \ - OP(WaitAsyncTexImage2DCHROMIUM) /* 482 */ \ - OP(DiscardFramebufferEXT) /* 483 */ \ - OP(DiscardFramebufferEXTImmediate) /* 484 */ \ - OP(LoseContextCHROMIUM) /* 485 */ \ - OP(InsertSyncPointCHROMIUM) /* 486 */ \ - OP(WaitSyncPointCHROMIUM) /* 487 */ \ - OP(DrawBuffersEXT) /* 488 */ \ - OP(DrawBuffersEXTImmediate) /* 489 */ \ - OP(DiscardBackbufferCHROMIUM) /* 490 */ \ +#define GLES2_COMMAND_LIST(OP) \ + OP(ActiveTexture) /* 256 */ \ + OP(AttachShader) /* 257 */ \ + OP(BindAttribLocationBucket) /* 258 */ \ + OP(BindBuffer) /* 259 */ \ + OP(BindFramebuffer) /* 260 */ \ + OP(BindRenderbuffer) /* 261 */ \ + OP(BindTexture) /* 262 */ \ + OP(BlendColor) /* 263 */ \ + OP(BlendEquation) /* 264 */ \ + OP(BlendEquationSeparate) /* 265 */ \ + OP(BlendFunc) /* 266 */ \ + OP(BlendFuncSeparate) /* 267 */ \ + OP(BufferData) /* 268 */ \ + OP(BufferSubData) /* 269 */ \ + OP(CheckFramebufferStatus) /* 270 */ \ + OP(Clear) /* 271 */ \ + OP(ClearColor) /* 272 */ \ + OP(ClearDepthf) /* 273 */ \ + OP(ClearStencil) /* 274 */ \ + OP(ColorMask) /* 275 */ \ + OP(CompileShader) /* 276 */ \ + OP(CompressedTexImage2DBucket) /* 277 */ \ + OP(CompressedTexImage2D) /* 278 */ \ + OP(CompressedTexSubImage2DBucket) /* 279 */ \ + OP(CompressedTexSubImage2D) /* 280 */ \ + OP(CopyTexImage2D) /* 281 */ \ + OP(CopyTexSubImage2D) /* 282 */ \ + OP(CreateProgram) /* 283 */ \ + OP(CreateShader) /* 284 */ \ + OP(CullFace) /* 285 */ \ + OP(DeleteBuffersImmediate) /* 286 */ \ + OP(DeleteFramebuffersImmediate) /* 287 */ \ + OP(DeleteProgram) /* 288 */ \ + OP(DeleteRenderbuffersImmediate) /* 289 */ \ + OP(DeleteShader) /* 290 */ \ + OP(DeleteTexturesImmediate) /* 291 */ \ + OP(DepthFunc) /* 292 */ \ + OP(DepthMask) /* 293 */ \ + OP(DepthRangef) /* 294 */ \ + OP(DetachShader) /* 295 */ \ + OP(Disable) /* 296 */ \ + OP(DisableVertexAttribArray) /* 297 */ \ + OP(DrawArrays) /* 298 */ \ + OP(DrawElements) /* 299 */ \ + OP(Enable) /* 300 */ \ + OP(EnableVertexAttribArray) /* 301 */ \ + OP(Finish) /* 302 */ \ + OP(Flush) /* 303 */ \ + OP(FramebufferRenderbuffer) /* 304 */ \ + OP(FramebufferTexture2D) /* 305 */ \ + OP(FrontFace) /* 306 */ \ + OP(GenBuffersImmediate) /* 307 */ \ + OP(GenerateMipmap) /* 308 */ \ + OP(GenFramebuffersImmediate) /* 309 */ \ + OP(GenRenderbuffersImmediate) /* 310 */ \ + OP(GenTexturesImmediate) /* 311 */ \ + OP(GetActiveAttrib) /* 312 */ \ + OP(GetActiveUniform) /* 313 */ \ + OP(GetAttachedShaders) /* 314 */ \ + OP(GetAttribLocation) /* 315 */ \ + OP(GetBooleanv) /* 316 */ \ + OP(GetBufferParameteriv) /* 317 */ \ + OP(GetError) /* 318 */ \ + OP(GetFloatv) /* 319 */ \ + OP(GetFramebufferAttachmentParameteriv) /* 320 */ \ + OP(GetIntegerv) /* 321 */ \ + OP(GetProgramiv) /* 322 */ \ + OP(GetProgramInfoLog) /* 323 */ \ + OP(GetRenderbufferParameteriv) /* 324 */ \ + OP(GetShaderiv) /* 325 */ \ + OP(GetShaderInfoLog) /* 326 */ \ + OP(GetShaderPrecisionFormat) /* 327 */ \ + OP(GetShaderSource) /* 328 */ \ + OP(GetString) /* 329 */ \ + OP(GetTexParameterfv) /* 330 */ \ + OP(GetTexParameteriv) /* 331 */ \ + OP(GetUniformfv) /* 332 */ \ + OP(GetUniformiv) /* 333 */ \ + OP(GetUniformLocation) /* 334 */ \ + OP(GetVertexAttribfv) /* 335 */ \ + OP(GetVertexAttribiv) /* 336 */ \ + OP(GetVertexAttribPointerv) /* 337 */ \ + OP(Hint) /* 338 */ \ + OP(IsBuffer) /* 339 */ \ + OP(IsEnabled) /* 340 */ \ + OP(IsFramebuffer) /* 341 */ \ + OP(IsProgram) /* 342 */ \ + OP(IsRenderbuffer) /* 343 */ \ + OP(IsShader) /* 344 */ \ + OP(IsTexture) /* 345 */ \ + OP(LineWidth) /* 346 */ \ + OP(LinkProgram) /* 347 */ \ + OP(PixelStorei) /* 348 */ \ + OP(PolygonOffset) /* 349 */ \ + OP(ReadPixels) /* 350 */ \ + OP(ReleaseShaderCompiler) /* 351 */ \ + OP(RenderbufferStorage) /* 352 */ \ + OP(SampleCoverage) /* 353 */ \ + OP(Scissor) /* 354 */ \ + OP(ShaderBinary) /* 355 */ \ + OP(ShaderSourceBucket) /* 356 */ \ + OP(StencilFunc) /* 357 */ \ + OP(StencilFuncSeparate) /* 358 */ \ + OP(StencilMask) /* 359 */ \ + OP(StencilMaskSeparate) /* 360 */ \ + OP(StencilOp) /* 361 */ \ + OP(StencilOpSeparate) /* 362 */ \ + OP(TexImage2D) /* 363 */ \ + OP(TexParameterf) /* 364 */ \ + OP(TexParameterfvImmediate) /* 365 */ \ + OP(TexParameteri) /* 366 */ \ + OP(TexParameterivImmediate) /* 367 */ \ + OP(TexSubImage2D) /* 368 */ \ + OP(Uniform1f) /* 369 */ \ + OP(Uniform1fvImmediate) /* 370 */ \ + OP(Uniform1i) /* 371 */ \ + OP(Uniform1ivImmediate) /* 372 */ \ + OP(Uniform2f) /* 373 */ \ + OP(Uniform2fvImmediate) /* 374 */ \ + OP(Uniform2i) /* 375 */ \ + OP(Uniform2ivImmediate) /* 376 */ \ + OP(Uniform3f) /* 377 */ \ + OP(Uniform3fvImmediate) /* 378 */ \ + OP(Uniform3i) /* 379 */ \ + OP(Uniform3ivImmediate) /* 380 */ \ + OP(Uniform4f) /* 381 */ \ + OP(Uniform4fvImmediate) /* 382 */ \ + OP(Uniform4i) /* 383 */ \ + OP(Uniform4ivImmediate) /* 384 */ \ + OP(UniformMatrix2fvImmediate) /* 385 */ \ + OP(UniformMatrix3fvImmediate) /* 386 */ \ + OP(UniformMatrix4fvImmediate) /* 387 */ \ + OP(UseProgram) /* 388 */ \ + OP(ValidateProgram) /* 389 */ \ + OP(VertexAttrib1f) /* 390 */ \ + OP(VertexAttrib1fvImmediate) /* 391 */ \ + OP(VertexAttrib2f) /* 392 */ \ + OP(VertexAttrib2fvImmediate) /* 393 */ \ + OP(VertexAttrib3f) /* 394 */ \ + OP(VertexAttrib3fvImmediate) /* 395 */ \ + OP(VertexAttrib4f) /* 396 */ \ + OP(VertexAttrib4fvImmediate) /* 397 */ \ + OP(VertexAttribPointer) /* 398 */ \ + OP(Viewport) /* 399 */ \ + OP(BlitFramebufferCHROMIUM) /* 400 */ \ + OP(RenderbufferStorageMultisampleCHROMIUM) /* 401 */ \ + OP(RenderbufferStorageMultisampleEXT) /* 402 */ \ + OP(FramebufferTexture2DMultisampleEXT) /* 403 */ \ + OP(TexStorage2DEXT) /* 404 */ \ + OP(GenQueriesEXTImmediate) /* 405 */ \ + OP(DeleteQueriesEXTImmediate) /* 406 */ \ + OP(BeginQueryEXT) /* 407 */ \ + OP(EndQueryEXT) /* 408 */ \ + OP(InsertEventMarkerEXT) /* 409 */ \ + OP(PushGroupMarkerEXT) /* 410 */ \ + OP(PopGroupMarkerEXT) /* 411 */ \ + OP(GenVertexArraysOESImmediate) /* 412 */ \ + OP(DeleteVertexArraysOESImmediate) /* 413 */ \ + OP(IsVertexArrayOES) /* 414 */ \ + OP(BindVertexArrayOES) /* 415 */ \ + OP(SwapBuffers) /* 416 */ \ + OP(GetMaxValueInBufferCHROMIUM) /* 417 */ \ + OP(GenSharedIdsCHROMIUM) /* 418 */ \ + OP(DeleteSharedIdsCHROMIUM) /* 419 */ \ + OP(RegisterSharedIdsCHROMIUM) /* 420 */ \ + OP(EnableFeatureCHROMIUM) /* 421 */ \ + OP(ResizeCHROMIUM) /* 422 */ \ + OP(GetRequestableExtensionsCHROMIUM) /* 423 */ \ + OP(RequestExtensionCHROMIUM) /* 424 */ \ + OP(GetMultipleIntegervCHROMIUM) /* 425 */ \ + OP(GetProgramInfoCHROMIUM) /* 426 */ \ + OP(GetTranslatedShaderSourceANGLE) /* 427 */ \ + OP(PostSubBufferCHROMIUM) /* 428 */ \ + OP(TexImageIOSurface2DCHROMIUM) /* 429 */ \ + OP(CopyTextureCHROMIUM) /* 430 */ \ + OP(DrawArraysInstancedANGLE) /* 431 */ \ + OP(DrawElementsInstancedANGLE) /* 432 */ \ + OP(VertexAttribDivisorANGLE) /* 433 */ \ + OP(GenMailboxCHROMIUM) /* 434 */ \ + OP(ProduceTextureCHROMIUMImmediate) /* 435 */ \ + OP(ProduceTextureDirectCHROMIUMImmediate) /* 436 */ \ + OP(ConsumeTextureCHROMIUMImmediate) /* 437 */ \ + OP(CreateAndConsumeTextureCHROMIUMImmediate) /* 438 */ \ + OP(BindUniformLocationCHROMIUMBucket) /* 439 */ \ + OP(BindTexImage2DCHROMIUM) /* 440 */ \ + OP(ReleaseTexImage2DCHROMIUM) /* 441 */ \ + OP(TraceBeginCHROMIUM) /* 442 */ \ + OP(TraceEndCHROMIUM) /* 443 */ \ + OP(AsyncTexSubImage2DCHROMIUM) /* 444 */ \ + OP(AsyncTexImage2DCHROMIUM) /* 445 */ \ + OP(WaitAsyncTexImage2DCHROMIUM) /* 446 */ \ + OP(WaitAllAsyncTexImage2DCHROMIUM) /* 447 */ \ + OP(DiscardFramebufferEXTImmediate) /* 448 */ \ + OP(LoseContextCHROMIUM) /* 449 */ \ + OP(InsertSyncPointCHROMIUM) /* 450 */ \ + OP(WaitSyncPointCHROMIUM) /* 451 */ \ + OP(DrawBuffersEXTImmediate) /* 452 */ \ + OP(DiscardBackbufferCHROMIUM) /* 453 */ \ + OP(ScheduleOverlayPlaneCHROMIUM) /* 454 */ enum CommandId { kStartPoint = cmd::kLastCommonId, // All GLES2 commands start after this. -#define GLES2_CMD_OP(name) k ## name, +#define GLES2_CMD_OP(name) k##name, GLES2_COMMAND_LIST(GLES2_CMD_OP) #undef GLES2_CMD_OP kNumCommands }; #endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_IDS_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_utils.cc b/chromium/gpu/command_buffer/common/gles2_cmd_utils.cc index b7d5e525e6d..8381586482b 100644 --- a/chromium/gpu/command_buffer/common/gles2_cmd_utils.cc +++ b/chromium/gpu/command_buffer/common/gles2_cmd_utils.cc @@ -5,7 +5,7 @@ // This file is here so other GLES2 related files can have a common set of // includes where appropriate. -#include <stdio.h> +#include <sstream> #include <GLES2/gl2.h> #include <GLES2/gl2ext.h> #include <GLES2/gl2extchromium.h> @@ -326,6 +326,10 @@ int GLES2Util::GLGetNumValuesReturned(int id) const { case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES: return 1; + // Chromium internal bind_generates_resource query + case GL_BIND_GENERATES_RESOURCE_CHROMIUM: + return 1; + // bad enum default: return 0; @@ -692,9 +696,11 @@ std::string GLES2Util::GetStringEnum(uint32 value) { return entry->name; } } - char buffer[20]; - sprintf(buffer, (value < 0x10000) ? "0x%04x" : "0x%08x", value); - return buffer; + std::stringstream ss; + ss.fill('0'); + ss.width(value < 0x10000 ? 4 : 8); + ss << std::hex << value; + return "0x" + ss.str(); } std::string GLES2Util::GetStringError(uint32 value) { @@ -772,23 +778,24 @@ const int32 kBufferDestroyed = 0x3095; // EGL_BUFFER_DESTROYED const int32 kShareResources = 0x10000; const int32 kBindGeneratesResource = 0x10001; const int32 kFailIfMajorPerfCaveat = 0x10002; +const int32 kLoseContextWhenOutOfMemory = 0x10003; } // namespace ContextCreationAttribHelper::ContextCreationAttribHelper() - : alpha_size_(-1), - blue_size_(-1), - green_size_(-1), - red_size_(-1), - depth_size_(-1), - stencil_size_(-1), - samples_(-1), - sample_buffers_(-1), - buffer_preserved_(true), - share_resources_(false), - bind_generates_resource_(true), - fail_if_major_perf_caveat_(false) { -} + : alpha_size_(-1), + blue_size_(-1), + green_size_(-1), + red_size_(-1), + depth_size_(-1), + stencil_size_(-1), + samples_(-1), + sample_buffers_(-1), + buffer_preserved_(true), + share_resources_(false), + bind_generates_resource_(true), + fail_if_major_perf_caveat_(false), + lose_context_when_out_of_memory_(false) {} void ContextCreationAttribHelper::Serialize(std::vector<int32>* attribs) { if (alpha_size_ != -1) { @@ -831,6 +838,8 @@ void ContextCreationAttribHelper::Serialize(std::vector<int32>* attribs) { attribs->push_back(bind_generates_resource_ ? 1 : 0); attribs->push_back(kFailIfMajorPerfCaveat); attribs->push_back(fail_if_major_perf_caveat_ ? 1 : 0); + attribs->push_back(kLoseContextWhenOutOfMemory); + attribs->push_back(lose_context_when_out_of_memory_ ? 1 : 0); attribs->push_back(kNone); } @@ -885,6 +894,9 @@ bool ContextCreationAttribHelper::Parse(const std::vector<int32>& attribs) { case kFailIfMajorPerfCaveat: fail_if_major_perf_caveat_ = value != 0; break; + case kLoseContextWhenOutOfMemory: + lose_context_when_out_of_memory_ = value != 0; + break; case kNone: // Terminate list, even if more attributes. return true; diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_utils.h b/chromium/gpu/command_buffer/common/gles2_cmd_utils.h index 59b5d96de8c..f6432a744a9 100644 --- a/chromium/gpu/command_buffer/common/gles2_cmd_utils.h +++ b/chromium/gpu/command_buffer/common/gles2_cmd_utils.h @@ -8,12 +8,13 @@ #ifndef GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_H_ #define GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_H_ +#include <stdint.h> + #include <limits> #include <string> #include <vector> #include "gpu/command_buffer/common/gles2_utils_export.h" -#include "gpu/command_buffer/common/types.h" namespace gpu { namespace gles2 { @@ -23,12 +24,12 @@ namespace gles2 { // Multiplies 2 32 bit unsigned numbers checking for overflow. // If there was no overflow returns true. -inline bool SafeMultiplyUint32(uint32 a, uint32 b, uint32* dst) { +inline bool SafeMultiplyUint32(uint32_t a, uint32_t b, uint32_t* dst) { if (b == 0) { *dst = 0; return true; } - uint32 v = a * b; + uint32_t v = a * b; if (v / b != a) { *dst = 0; return false; @@ -38,7 +39,7 @@ inline bool SafeMultiplyUint32(uint32 a, uint32 b, uint32* dst) { } // Does an add checking for overflow. If there was no overflow returns true. -inline bool SafeAddUint32(uint32 a, uint32 b, uint32* dst) { +inline bool SafeAddUint32(uint32_t a, uint32_t b, uint32_t* dst) { if (a + b < a) { *dst = 0; return false; @@ -48,14 +49,22 @@ inline bool SafeAddUint32(uint32 a, uint32 b, uint32* dst) { } // Does an add checking for overflow. If there was no overflow returns true. -inline bool SafeAddInt32(int32 a, int32 b, int32* dst) { - int64 sum64 = static_cast<int64>(a) + b; - int32 sum32 = static_cast<int32>(sum64); - bool safe = sum64 == static_cast<int64>(sum32); +inline bool SafeAddInt32(int32_t a, int32_t b, int32_t* dst) { + int64_t sum64 = static_cast<int64_t>(a) + b; + int32_t sum32 = static_cast<int32_t>(sum64); + bool safe = sum64 == static_cast<int64_t>(sum32); *dst = safe ? sum32 : 0; return safe; } +// Return false if |value| is more than a 32 bit integer can represent. +template<typename T> +inline bool FitInt32NonNegative(T value) { + const int32_t max = std::numeric_limits<int32_t>::max(); + return (std::numeric_limits<T>::max() <= max || + value <= static_cast<T>(max)); +} + // Utilties for GLES2 support. class GLES2_UTILS_EXPORT GLES2Util { public: @@ -75,7 +84,7 @@ class GLES2_UTILS_EXPORT GLES2Util { }; struct EnumToString { - uint32 value; + uint32_t value; const char* name; }; @@ -105,12 +114,12 @@ class GLES2_UTILS_EXPORT GLES2Util { int GLGetNumValuesReturned(int id) const; // Computes the size of a single group of elements from a format and type pair - static uint32 ComputeImageGroupSize(int format, int type); + static uint32_t ComputeImageGroupSize(int format, int type); // Computes the size of an image row including alignment padding static bool ComputeImagePaddedRowSize( int width, int format, int type, int unpack_alignment, - uint32* padded_row_size); + uint32_t* padded_row_size); // Computes the size of image data for TexImage2D and TexSubImage2D. // Optionally the unpadded and padded row sizes can be returned. If height < 2 @@ -118,40 +127,40 @@ class GLES2_UTILS_EXPORT GLES2Util { // padding is not necessary. static bool ComputeImageDataSizes( int width, int height, int format, int type, int unpack_alignment, - uint32* size, uint32* unpadded_row_size, uint32* padded_row_size); + uint32_t* size, uint32_t* unpadded_row_size, uint32_t* padded_row_size); static size_t RenderbufferBytesPerPixel(int format); - static uint32 GetGLDataTypeSizeForUniforms(int type); + static uint32_t GetGLDataTypeSizeForUniforms(int type); - static size_t GetGLTypeSizeForTexturesAndBuffers(uint32 type); + static size_t GetGLTypeSizeForTexturesAndBuffers(uint32_t type); - static uint32 GLErrorToErrorBit(uint32 gl_error); + static uint32_t GLErrorToErrorBit(uint32_t gl_error); - static uint32 GLErrorBitToGLError(uint32 error_bit); + static uint32_t GLErrorBitToGLError(uint32_t error_bit); - static uint32 IndexToGLFaceTarget(int index); + static uint32_t IndexToGLFaceTarget(int index); - static uint32 GetPreferredGLReadPixelsFormat(uint32 internal_format); + static uint32_t GetPreferredGLReadPixelsFormat(uint32_t internal_format); - static uint32 GetPreferredGLReadPixelsType( - uint32 internal_format, uint32 texture_type); + static uint32_t GetPreferredGLReadPixelsType( + uint32_t internal_format, uint32_t texture_type); // Returns a bitmask for the channels the given format supports. // See ChannelBits. - static uint32 GetChannelsForFormat(int format); + static uint32_t GetChannelsForFormat(int format); // Returns a bitmask for the channels the given attachment type needs. - static uint32 GetChannelsNeededForAttachmentType( - int type, uint32 max_color_attachments); + static uint32_t GetChannelsNeededForAttachmentType( + int type, uint32_t max_color_attachments); - static bool IsNPOT(uint32 value) { + static bool IsNPOT(uint32_t value) { return value > 0 && (value & (value - 1)) != 0; } - static std::string GetStringEnum(uint32 value); - static std::string GetStringBool(uint32 value); - static std::string GetStringError(uint32 value); + static std::string GetStringEnum(uint32_t value); + static std::string GetStringBool(uint32_t value); + static std::string GetStringError(uint32_t value); // Parses a uniform name. // array_pos: the position of the last '[' character in name. @@ -170,7 +179,7 @@ class GLES2_UTILS_EXPORT GLES2Util { private: static std::string GetQualifiedEnumString( - const EnumToString* table, size_t count, uint32 value); + const EnumToString* table, size_t count, uint32_t value); static const EnumToString* const enum_to_string_table_; static const size_t enum_to_string_table_len_; @@ -183,22 +192,23 @@ class GLES2_UTILS_EXPORT ContextCreationAttribHelper { public: ContextCreationAttribHelper(); - void Serialize(std::vector<int32>* attribs); - bool Parse(const std::vector<int32>& attribs); + void Serialize(std::vector<int32_t>* attribs); + bool Parse(const std::vector<int32_t>& attribs); // -1 if invalid or unspecified. - int32 alpha_size_; - int32 blue_size_; - int32 green_size_; - int32 red_size_; - int32 depth_size_; - int32 stencil_size_; - int32 samples_; - int32 sample_buffers_; + int32_t alpha_size_; + int32_t blue_size_; + int32_t green_size_; + int32_t red_size_; + int32_t depth_size_; + int32_t stencil_size_; + int32_t samples_; + int32_t sample_buffers_; bool buffer_preserved_; bool share_resources_; bool bind_generates_resource_; bool fail_if_major_perf_caveat_; + bool lose_context_when_out_of_memory_; }; } // namespace gles2 diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_utils_autogen.h b/chromium/gpu/command_buffer/common/gles2_cmd_utils_autogen.h index 00e1f0ea072..d4f5776096a 100644 --- a/chromium/gpu/command_buffer/common/gles2_cmd_utils_autogen.h +++ b/chromium/gpu/command_buffer/common/gles2_cmd_utils_autogen.h @@ -1,69 +1,70 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! #ifndef GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_AUTOGEN_H_ #define GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_AUTOGEN_H_ -static std::string GetStringAttachment(uint32 value); -static std::string GetStringBackbufferAttachment(uint32 value); -static std::string GetStringBlitFilter(uint32 value); -static std::string GetStringBufferParameter(uint32 value); -static std::string GetStringBufferTarget(uint32 value); -static std::string GetStringBufferUsage(uint32 value); -static std::string GetStringCapability(uint32 value); -static std::string GetStringCmpFunction(uint32 value); -static std::string GetStringCompressedTextureFormat(uint32 value); -static std::string GetStringDrawMode(uint32 value); -static std::string GetStringDstBlendFactor(uint32 value); -static std::string GetStringEquation(uint32 value); -static std::string GetStringFaceMode(uint32 value); -static std::string GetStringFaceType(uint32 value); -static std::string GetStringFrameBufferParameter(uint32 value); -static std::string GetStringFrameBufferTarget(uint32 value); -static std::string GetStringGLState(uint32 value); -static std::string GetStringGetMaxIndexType(uint32 value); -static std::string GetStringGetTexParamTarget(uint32 value); -static std::string GetStringHintMode(uint32 value); -static std::string GetStringHintTarget(uint32 value); -static std::string GetStringIndexType(uint32 value); -static std::string GetStringPixelStore(uint32 value); -static std::string GetStringPixelType(uint32 value); -static std::string GetStringProgramParameter(uint32 value); -static std::string GetStringQueryObjectParameter(uint32 value); -static std::string GetStringQueryParameter(uint32 value); -static std::string GetStringQueryTarget(uint32 value); -static std::string GetStringReadPixelFormat(uint32 value); -static std::string GetStringReadPixelType(uint32 value); -static std::string GetStringRenderBufferFormat(uint32 value); -static std::string GetStringRenderBufferParameter(uint32 value); -static std::string GetStringRenderBufferTarget(uint32 value); -static std::string GetStringResetStatus(uint32 value); -static std::string GetStringShaderBinaryFormat(uint32 value); -static std::string GetStringShaderParameter(uint32 value); -static std::string GetStringShaderPrecision(uint32 value); -static std::string GetStringShaderType(uint32 value); -static std::string GetStringSrcBlendFactor(uint32 value); -static std::string GetStringStencilOp(uint32 value); -static std::string GetStringStringType(uint32 value); -static std::string GetStringTextureBindTarget(uint32 value); -static std::string GetStringTextureFormat(uint32 value); -static std::string GetStringTextureInternalFormat(uint32 value); -static std::string GetStringTextureInternalFormatStorage(uint32 value); -static std::string GetStringTextureMagFilterMode(uint32 value); -static std::string GetStringTextureMinFilterMode(uint32 value); -static std::string GetStringTextureParameter(uint32 value); -static std::string GetStringTexturePool(uint32 value); -static std::string GetStringTextureTarget(uint32 value); -static std::string GetStringTextureUsage(uint32 value); -static std::string GetStringTextureWrapMode(uint32 value); -static std::string GetStringVertexAttribType(uint32 value); -static std::string GetStringVertexAttribute(uint32 value); -static std::string GetStringVertexPointer(uint32 value); +static std::string GetStringAttachment(uint32_t value); +static std::string GetStringBackbufferAttachment(uint32_t value); +static std::string GetStringBlitFilter(uint32_t value); +static std::string GetStringBufferParameter(uint32_t value); +static std::string GetStringBufferTarget(uint32_t value); +static std::string GetStringBufferUsage(uint32_t value); +static std::string GetStringCapability(uint32_t value); +static std::string GetStringCmpFunction(uint32_t value); +static std::string GetStringCompressedTextureFormat(uint32_t value); +static std::string GetStringDrawMode(uint32_t value); +static std::string GetStringDstBlendFactor(uint32_t value); +static std::string GetStringEquation(uint32_t value); +static std::string GetStringFaceMode(uint32_t value); +static std::string GetStringFaceType(uint32_t value); +static std::string GetStringFrameBufferParameter(uint32_t value); +static std::string GetStringFrameBufferTarget(uint32_t value); +static std::string GetStringGLState(uint32_t value); +static std::string GetStringGetMaxIndexType(uint32_t value); +static std::string GetStringGetTexParamTarget(uint32_t value); +static std::string GetStringHintMode(uint32_t value); +static std::string GetStringHintTarget(uint32_t value); +static std::string GetStringIndexType(uint32_t value); +static std::string GetStringPixelStore(uint32_t value); +static std::string GetStringPixelType(uint32_t value); +static std::string GetStringProgramParameter(uint32_t value); +static std::string GetStringQueryObjectParameter(uint32_t value); +static std::string GetStringQueryParameter(uint32_t value); +static std::string GetStringQueryTarget(uint32_t value); +static std::string GetStringReadPixelFormat(uint32_t value); +static std::string GetStringReadPixelType(uint32_t value); +static std::string GetStringRenderBufferFormat(uint32_t value); +static std::string GetStringRenderBufferParameter(uint32_t value); +static std::string GetStringRenderBufferTarget(uint32_t value); +static std::string GetStringResetStatus(uint32_t value); +static std::string GetStringShaderBinaryFormat(uint32_t value); +static std::string GetStringShaderParameter(uint32_t value); +static std::string GetStringShaderPrecision(uint32_t value); +static std::string GetStringShaderType(uint32_t value); +static std::string GetStringSrcBlendFactor(uint32_t value); +static std::string GetStringStencilOp(uint32_t value); +static std::string GetStringStringType(uint32_t value); +static std::string GetStringTextureBindTarget(uint32_t value); +static std::string GetStringTextureFormat(uint32_t value); +static std::string GetStringTextureInternalFormat(uint32_t value); +static std::string GetStringTextureInternalFormatStorage(uint32_t value); +static std::string GetStringTextureMagFilterMode(uint32_t value); +static std::string GetStringTextureMinFilterMode(uint32_t value); +static std::string GetStringTextureParameter(uint32_t value); +static std::string GetStringTexturePool(uint32_t value); +static std::string GetStringTextureTarget(uint32_t value); +static std::string GetStringTextureUsage(uint32_t value); +static std::string GetStringTextureWrapMode(uint32_t value); +static std::string GetStringVertexAttribType(uint32_t value); +static std::string GetStringVertexAttribute(uint32_t value); +static std::string GetStringVertexPointer(uint32_t value); #endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h b/chromium/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h index aa24ccd77ea..b3ec4218260 100644 --- a/chromium/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h +++ b/chromium/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h @@ -1,676 +1,2354 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! #ifndef GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_IMPLEMENTATION_AUTOGEN_H_ #define GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_IMPLEMENTATION_AUTOGEN_H_ static const GLES2Util::EnumToString enum_to_string_table[] = { - { 0x78EC, "GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM", }, - { 0x8825, "GL_DRAW_BUFFER0_NV", }, - { 0x0BC1, "GL_ALPHA_TEST_FUNC_QCOM", }, - { 0x884C, "GL_TEXTURE_COMPARE_MODE_EXT", }, - { 0x0BC2, "GL_ALPHA_TEST_REF_QCOM", }, - { 0x78EF, "GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM", }, - { 0x884D, "GL_TEXTURE_COMPARE_FUNC_EXT", }, - { 0x884E, "GL_COMPARE_REF_TO_TEXTURE_EXT", }, - { 0x93A1, "GL_BGRA8_EXT", }, - { 0x8826, "GL_DRAW_BUFFER1_NV", }, - { 0x1E01, "GL_REPLACE", }, - { 0, "GL_FALSE", }, - { 0x00400000, "GL_STENCIL_BUFFER_BIT6_QCOM", }, - { 0x82E6, "GL_SAMPLER", }, - { 0x1E02, "GL_INCR", }, - { 0x9130, "GL_SGX_PROGRAM_BINARY_IMG", }, - { 0x9133, "GL_RENDERBUFFER_SAMPLES_IMG", }, - { 0x82E0, "GL_BUFFER", }, - { 0x9135, "GL_MAX_SAMPLES_IMG", }, - { 0x9134, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG", }, - { 0x9136, "GL_TEXTURE_SAMPLES_IMG", }, - { 0x00000020, "GL_COLOR_BUFFER_BIT5_QCOM", }, - { 0x0008, "GL_MAP_INVALIDATE_BUFFER_BIT_EXT", }, - { 0x0BC0, "GL_ALPHA_TEST_QCOM", }, - { 0x0006, "GL_TRIANGLE_FAN", }, - { 0x0004, "GL_TRIANGLES", }, - { 0x0005, "GL_TRIANGLE_STRIP", }, - { 0x0002, "GL_LINE_LOOP", }, - { 0x0003, "GL_LINE_STRIP", }, - { 0x0000, "GL_POINTS", }, - { 0x0001, "GL_LINES", }, - { 0x78F0, "GL_IMAGE_ROWBYTES_CHROMIUM", }, - { 0x88B8, "GL_READ_ONLY", }, - { 0x88B9, "GL_WRITE_ONLY_OES", }, - { 0x8211, "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT", }, - { 0x8210, "GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT", }, - { 0x8741, "GL_PROGRAM_BINARY_LENGTH_OES", }, - { 0x8740, "GL_Z400_BINARY_AMD", }, - { 0x8192, "GL_GENERATE_MIPMAP_HINT", }, - { 0x87F9, "GL_3DC_X_AMD", }, - { 0x8A53, "GL_SYNC_OBJECT_APPLE", }, - { 0x8DF8, "GL_SHADER_BINARY_FORMATS", }, - { 0x8DF9, "GL_NUM_SHADER_BINARY_FORMATS", }, - { 0x826D, "GL_DEBUG_GROUP_STACK_DEPTH", }, - { 0x826B, "GL_DEBUG_SEVERITY_NOTIFICATION", }, - { 0x826C, "GL_MAX_DEBUG_GROUP_STACK_DEPTH", }, - { 0x8B59, "GL_BOOL_VEC4", }, - { 0x8B58, "GL_BOOL_VEC3", }, - { 0x8B57, "GL_BOOL_VEC2", }, - { 0x8DF1, "GL_MEDIUM_FLOAT", }, - { 0x8B55, "GL_INT_VEC4", }, - { 0x8B54, "GL_INT_VEC3", }, - { 0x8DF4, "GL_MEDIUM_INT", }, - { 0x8DF5, "GL_HIGH_INT", }, - { 0x8DF6, "GL_UNSIGNED_INT_10_10_10_2_OES", }, - { 0x8B50, "GL_FLOAT_VEC2", }, - { 0x806F, "GL_TEXTURE_3D_OES", }, - { 0x92E0, "GL_DEBUG_OUTPUT", }, - { 0x806A, "GL_TEXTURE_BINDING_3D_OES", }, - { 0x93D9, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR", }, - { 0x8CE3, "GL_COLOR_ATTACHMENT3_NV", }, - { 0x8069, "GL_TEXTURE_BINDING_2D", }, - { 0x8261, "GL_NO_RESET_NOTIFICATION_EXT", }, - { 0x8DFA, "GL_SHADER_COMPILER", }, - { 0x8DFB, "GL_MAX_VERTEX_UNIFORM_VECTORS", }, - { 0x8DFC, "GL_MAX_VARYING_VECTORS", }, - { 0x8B5C, "GL_FLOAT_MAT4", }, - { 0x8B5B, "GL_FLOAT_MAT3", }, - { 0x8B5A, "GL_FLOAT_MAT2", }, - { 0x0D05, "GL_PACK_ALIGNMENT", }, - { 0x87FF, "GL_PROGRAM_BINARY_FORMATS_OES", }, - { 0x87FE, "GL_NUM_PROGRAM_BINARY_FORMATS_OES", }, - { 0x2600, "GL_NEAREST", }, - { 0x2601, "GL_LINEAR", }, - { 0x8C03, "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG", }, - { 0x9242, "GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM", }, - { 0x88BA, "GL_READ_WRITE", }, - { 0x88BB, "GL_BUFFER_ACCESS_OES", }, - { 0x88BC, "GL_BUFFER_MAPPED_OES", }, - { 0x88BD, "GL_BUFFER_MAP_POINTER_OES", }, - { 0x0C10, "GL_SCISSOR_BOX", }, - { 0x0C11, "GL_SCISSOR_TEST", }, - { 0x80000000, "GL_MULTISAMPLE_BUFFER_BIT7_QCOM", }, - { 0x300E, "GL_CONTEXT_LOST", }, - { 0x02000000, "GL_MULTISAMPLE_BUFFER_BIT1_QCOM", }, - { 0x8C2F, "GL_ANY_SAMPLES_PASSED_EXT", }, - { 0x8BD2, "GL_TEXTURE_WIDTH_QCOM", }, - { 0x8BD3, "GL_TEXTURE_HEIGHT_QCOM", }, - { 0x8BD4, "GL_TEXTURE_DEPTH_QCOM", }, - { 0x8BD5, "GL_TEXTURE_INTERNAL_FORMAT_QCOM", }, - { 0x8BD6, "GL_TEXTURE_FORMAT_QCOM", }, - { 0x8BD7, "GL_TEXTURE_TYPE_QCOM", }, - { 0x8B8D, "GL_CURRENT_PROGRAM", }, - { 0x8BD9, "GL_TEXTURE_NUM_LEVELS_QCOM", }, - { 0x8B8A, "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH", }, - { 0x8B8B, "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES", }, - { 0x8B8C, "GL_SHADING_LANGUAGE_VERSION", }, - { 0x8BDA, "GL_TEXTURE_TARGET_QCOM", }, - { 0x8BDB, "GL_TEXTURE_OBJECT_VALID_QCOM", }, - { 0x8BDC, "GL_STATE_RESTORE", }, - { 0x8B88, "GL_SHADER_SOURCE_LENGTH", }, - { 0x8B89, "GL_ACTIVE_ATTRIBUTES", }, - { 0x8B84, "GL_INFO_LOG_LENGTH", }, - { 0x8B85, "GL_ATTACHED_SHADERS", }, - { 0x8B86, "GL_ACTIVE_UNIFORMS", }, - { 0x8B87, "GL_ACTIVE_UNIFORM_MAX_LENGTH", }, - { 0x8B80, "GL_DELETE_STATUS", }, - { 0x8B81, "GL_COMPILE_STATUS", }, - { 0x8B82, "GL_LINK_STATUS", }, - { 0x8B83, "GL_VALIDATE_STATUS", }, - { 0x93D2, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR", }, - { 0x8D48, "GL_STENCIL_INDEX8", }, - { 0x8D46, "GL_STENCIL_INDEX1_OES", }, - { 0x8D47, "GL_STENCIL_INDEX4_OES", }, - { 0x8D44, "GL_RENDERBUFFER_INTERNAL_FORMAT", }, - { 0x00000100, "GL_DEPTH_BUFFER_BIT", }, - { 0x8D42, "GL_RENDERBUFFER_WIDTH", }, - { 0x8D43, "GL_RENDERBUFFER_HEIGHT", }, - { 0x8D40, "GL_FRAMEBUFFER", }, - { 0x8D41, "GL_RENDERBUFFER", }, - { 0x0BD0, "GL_DITHER", }, - { 0x93D3, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR", }, - { 0x9144, "GL_MAX_DEBUG_LOGGED_MESSAGES", }, - { 0x1801, "GL_DEPTH_EXT", }, - { 0x1800, "GL_COLOR_EXT", }, - { 0x1802, "GL_STENCIL_EXT", }, - { 0x0B21, "GL_LINE_WIDTH", }, - { 0x81A5, "GL_DEPTH_COMPONENT16", }, - { 0x81A6, "GL_DEPTH_COMPONENT24_OES", }, - { 0x81A7, "GL_DEPTH_COMPONENT32_OES", }, - { 0x88FE, "GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE", }, - { 0x93D0, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR", }, - { 0x9143, "GL_MAX_DEBUG_MESSAGE_LENGTH", }, - { 0x8DFD, "GL_MAX_FRAGMENT_UNIFORM_VECTORS", }, - { 0x9145, "GL_DEBUG_LOGGED_MESSAGES", }, - { 0x9146, "GL_DEBUG_SEVERITY_HIGH", }, - { 0x9147, "GL_DEBUG_SEVERITY_MEDIUM", }, - { 0x9148, "GL_DEBUG_SEVERITY_LOW", }, - { 0x8F60, "GL_MALI_SHADER_BINARY_ARM", }, - { 0x8F61, "GL_MALI_PROGRAM_BINARY_ARM", }, - { 0x87EE, "GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD", }, - { 0x822B, "GL_RG8_EXT", }, - { 0x93D1, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR", }, - { 0x822D, "GL_R16F_EXT", }, - { 0x822E, "GL_R32F_EXT", }, - { 1, "GL_ES_VERSION_2_0", }, - { 0x84F9, "GL_DEPTH_STENCIL_OES", }, - { 0x8368, "GL_UNSIGNED_INT_2_10_10_10_REV_EXT", }, - { 0x8819, "GL_LUMINANCE_ALPHA32F_EXT", }, - { 0x8818, "GL_LUMINANCE32F_EXT", }, - { 0x8363, "GL_UNSIGNED_SHORT_5_6_5", }, - { 0x8814, "GL_RGBA32F_EXT", }, - { 0x84F2, "GL_ALL_COMPLETED_NV", }, - { 0x8816, "GL_ALPHA32F_EXT", }, - { 0x84F4, "GL_FENCE_CONDITION_NV", }, - { 0x8366, "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT", }, - { 0x8365, "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT", }, - { 0x881E, "GL_LUMINANCE16F_EXT", }, - { 0x84FA, "GL_UNSIGNED_INT_24_8_OES", }, - { 0x881F, "GL_LUMINANCE_ALPHA16F_EXT", }, - { 0x881A, "GL_RGBA16F_EXT", }, - { 0x84FE, "GL_TEXTURE_MAX_ANISOTROPY_EXT", }, - { 0x0901, "GL_CCW", }, - { 0x0900, "GL_CW", }, - { 0x8229, "GL_R8_EXT", }, - { 0x8227, "GL_RG_EXT", }, - { 0x8B62, "GL_SAMPLER_2D_SHADOW_EXT", }, - { 0x8B63, "GL_SAMPLER_2D_RECT_ARB", }, - { 0x8B60, "GL_SAMPLER_CUBE", }, - { 0x93D7, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR", }, - { 0x00001000, "GL_DEPTH_BUFFER_BIT4_QCOM", }, - { 0x83F0, "GL_COMPRESSED_RGB_S3TC_DXT1_EXT", }, - { 0x00000080, "GL_COLOR_BUFFER_BIT7_QCOM", }, - { 0x88F0, "GL_DEPTH24_STENCIL8_OES", }, - { 0x80A0, "GL_SAMPLE_COVERAGE", }, - { 0x93D4, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR", }, - { 0x822F, "GL_RG16F_EXT", }, - { 0x80A9, "GL_SAMPLES", }, - { 0x80A8, "GL_SAMPLE_BUFFERS", }, - { 0x0D55, "GL_ALPHA_BITS", }, - { 0x0D54, "GL_BLUE_BITS", }, - { 0x0D57, "GL_STENCIL_BITS", }, - { 0x0D56, "GL_DEPTH_BITS", }, - { 0x8CD5, "GL_FRAMEBUFFER_COMPLETE", }, - { 0x0D50, "GL_SUBPIXEL_BITS", }, - { 0x0D53, "GL_GREEN_BITS", }, - { 0x0D52, "GL_RED_BITS", }, - { 0x8037, "GL_POLYGON_OFFSET_FILL", }, - { 0x8034, "GL_UNSIGNED_SHORT_5_5_5_1", }, - { 0x8033, "GL_UNSIGNED_SHORT_4_4_4_4", }, - { 0x0305, "GL_ONE_MINUS_DST_ALPHA", }, - { 0x0304, "GL_DST_ALPHA", }, - { 0x0307, "GL_ONE_MINUS_DST_COLOR", }, - { 0x0306, "GL_DST_COLOR", }, - { 0x0301, "GL_ONE_MINUS_SRC_COLOR", }, - { 0x0300, "GL_SRC_COLOR", }, - { 0x0303, "GL_ONE_MINUS_SRC_ALPHA", }, - { 0x0302, "GL_SRC_ALPHA", }, - { 0x0308, "GL_SRC_ALPHA_SATURATE", }, - { 0x2A00, "GL_POLYGON_OFFSET_UNITS", }, - { 0xFFFFFFFF, "GL_ALL_SHADER_BITS_EXT", }, - { 0x00800000, "GL_STENCIL_BUFFER_BIT7_QCOM", }, - { 0x00020000, "GL_STENCIL_BUFFER_BIT1_QCOM", }, - { 0x8D00, "GL_DEPTH_ATTACHMENT", }, - { 0x8FA0, "GL_PERFMON_GLOBAL_MODE_QCOM", }, - { 0x8815, "GL_RGB32F_EXT", }, - { 0x813D, "GL_TEXTURE_MAX_LEVEL_APPLE", }, - { 0x84F3, "GL_FENCE_STATUS_NV", }, - { 0x8CDD, "GL_FRAMEBUFFER_UNSUPPORTED", }, - { 0x8CDF, "GL_MAX_COLOR_ATTACHMENTS_NV", }, - { 0x90F3, "GL_CONTEXT_ROBUST_ACCESS_EXT", }, - { 0x90F2, "GL_MAX_MULTIVIEW_BUFFERS_EXT", }, - { 0x90F1, "GL_MULTIVIEW_EXT", }, - { 0x90F0, "GL_COLOR_ATTACHMENT_EXT", }, - { 0x803C, "GL_ALPHA8_OES", }, - { 0x84F5, "GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM", }, - { 0x882A, "GL_DRAW_BUFFER5_NV", }, - { 0x80AA, "GL_SAMPLE_COVERAGE_VALUE", }, - { 0x84F6, "GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM", }, - { 0x80AB, "GL_SAMPLE_COVERAGE_INVERT", }, - { 0x8FC4, "GL_SHADER_BINARY_VIV", }, - { 0x882B, "GL_DRAW_BUFFER6_NV", }, - { 0x8C17, "GL_UNSIGNED_NORMALIZED_EXT", }, - { 0x8A4F, "GL_PROGRAM_PIPELINE_OBJECT_EXT", }, - { 0x882C, "GL_DRAW_BUFFER7_NV", }, - { 0x0010, "GL_MAP_FLUSH_EXPLICIT_BIT_EXT", }, - { 0x882D, "GL_DRAW_BUFFER8_NV", }, - { 0x84FF, "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT", }, - { 0x0B74, "GL_DEPTH_FUNC", }, - { 0x881B, "GL_RGB16F_EXT", }, - { 0x0B71, "GL_DEPTH_TEST", }, - { 0x0B70, "GL_DEPTH_RANGE", }, - { 0x0B73, "GL_DEPTH_CLEAR_VALUE", }, - { 0x0B72, "GL_DEPTH_WRITEMASK", }, - { 0x85BA, "GL_UNSIGNED_SHORT_8_8_APPLE", }, - { 0x882E, "GL_DRAW_BUFFER9_NV", }, - { 0x8073, "GL_MAX_3D_TEXTURE_SIZE_OES", }, - { 0x8072, "GL_TEXTURE_WRAP_R_OES", }, - { 0x882F, "GL_DRAW_BUFFER10_NV", }, - { 0x80E1, "GL_BGRA_EXT", }, - { 0x8ED7, "GL_COVERAGE_AUTOMATIC_NV", }, - { 0x8ED6, "GL_COVERAGE_EDGE_FRAGMENTS_NV", }, - { 0x8ED5, "GL_COVERAGE_ALL_FRAGMENTS_NV", }, - { 0x8ED4, "GL_COVERAGE_SAMPLES_NV", }, - { 0x8ED3, "GL_COVERAGE_BUFFERS_NV", }, - { 0x8ED2, "GL_COVERAGE_ATTACHMENT_NV", }, - { 0x8ED1, "GL_COVERAGE_COMPONENT4_NV", }, - { 0x8ED0, "GL_COVERAGE_COMPONENT_NV", }, - { 0x800B, "GL_FUNC_REVERSE_SUBTRACT", }, - { 0x00000400, "GL_STENCIL_BUFFER_BIT", }, - { 0x800A, "GL_FUNC_SUBTRACT", }, - { 0x8E2C, "GL_DEPTH_COMPONENT16_NONLINEAR_NV", }, - { 0x889F, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING", }, - { 0x8219, "GL_FRAMEBUFFER_UNDEFINED_OES", }, - { 0x8006, "GL_FUNC_ADD", }, - { 0x8007, "GL_MIN_EXT", }, - { 0x8004, "GL_ONE_MINUS_CONSTANT_ALPHA", }, - { 0x8005, "GL_BLEND_COLOR", }, - { 0x8002, "GL_ONE_MINUS_CONSTANT_COLOR", }, - { 0x8003, "GL_CONSTANT_ALPHA", }, - { 0x8000, "GL_COVERAGE_BUFFER_BIT_NV", }, - { 0x8001, "GL_CONSTANT_COLOR", }, - { 0x0204, "GL_GREATER", }, - { 0x0205, "GL_NOTEQUAL", }, - { 0x0206, "GL_GEQUAL", }, - { 0x0207, "GL_ALWAYS", }, - { 0x0200, "GL_NEVER", }, - { 0x0201, "GL_LESS", }, - { 0x0202, "GL_EQUAL", }, - { 0x0203, "GL_LEQUAL", }, - { 0x2901, "GL_REPEAT", }, - { 0x8B99, "GL_PALETTE8_RGB5_A1_OES", }, - { 0x8B98, "GL_PALETTE8_RGBA4_OES", }, - { 0x8FB2, "GL_GPU_OPTIMIZED_QCOM", }, - { 0x190A, "GL_LUMINANCE_ALPHA", }, - { 0x8FB0, "GL_BINNING_CONTROL_HINT_QCOM", }, - { 0x8FB1, "GL_CPU_OPTIMIZED_QCOM", }, - { 0x8B93, "GL_PALETTE4_RGBA4_OES", }, - { 0x8B92, "GL_PALETTE4_R5_G6_B5_OES", }, - { 0x8B91, "GL_PALETTE4_RGBA8_OES", }, - { 0x8B90, "GL_PALETTE4_RGB8_OES", }, - { 0x8B97, "GL_PALETTE8_R5_G6_B5_OES", }, - { 0x8B96, "GL_PALETTE8_RGBA8_OES", }, - { 0x8B95, "GL_PALETTE8_RGB8_OES", }, - { 0x8B94, "GL_PALETTE4_RGB5_A1_OES", }, - { 0x0BE2, "GL_BLEND", }, - { 0x84CB, "GL_TEXTURE11", }, - { 0x8D55, "GL_RENDERBUFFER_STENCIL_SIZE", }, - { 0x8D54, "GL_RENDERBUFFER_DEPTH_SIZE", }, - { 0x8D57, "GL_MAX_SAMPLES_ANGLE", }, - { 0x8D56, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE", }, - { 0x8D51, "GL_RENDERBUFFER_GREEN_SIZE", }, - { 0x8D50, "GL_RENDERBUFFER_RED_SIZE", }, - { 0x8D53, "GL_RENDERBUFFER_ALPHA_SIZE", }, - { 0x8D52, "GL_RENDERBUFFER_BLUE_SIZE", }, - { 0x00080000, "GL_STENCIL_BUFFER_BIT3_QCOM", }, - { 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED", }, - { 0x0C01, "GL_DRAW_BUFFER_EXT", }, - { 0x9250, "GL_SHADER_BINARY_DMP", }, - { 0x10000000, "GL_MULTISAMPLE_BUFFER_BIT4_QCOM", }, - { 0x8C92, "GL_ATC_RGB_AMD", }, - { 0x9154, "GL_VERTEX_ARRAY_OBJECT_EXT", }, - { 0x9153, "GL_QUERY_OBJECT_EXT", }, - { 0x9151, "GL_BUFFER_OBJECT_EXT", }, - { 0x8C93, "GL_ATC_RGBA_EXPLICIT_ALPHA_AMD", }, - { 0x00000002, "GL_CONTEXT_FLAG_DEBUG_BIT", }, - { 0x00000001, "GL_SYNC_FLUSH_COMMANDS_BIT_APPLE", }, - { 0x00000004, "GL_COLOR_BUFFER_BIT2_QCOM", }, - { 0x1702, "GL_TEXTURE", }, - { 0x00000008, "GL_COLOR_BUFFER_BIT3_QCOM", }, - { 0x826A, "GL_DEBUG_TYPE_POP_GROUP", }, - { 0x8828, "GL_DRAW_BUFFER3_NV", }, - { 0x8DF0, "GL_LOW_FLOAT", }, - { 0x1906, "GL_ALPHA", }, - { 0x1907, "GL_RGB", }, - { 0x1902, "GL_DEPTH_COMPONENT", }, - { 0x8B56, "GL_BOOL", }, - { 0x93DB, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR", }, - { 0x8B9B, "GL_IMPLEMENTATION_COLOR_READ_FORMAT", }, - { 0x8B9A, "GL_IMPLEMENTATION_COLOR_READ_TYPE", }, - { 0x93DA, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR", }, - { 0x1908, "GL_RGBA", }, - { 0x8DF2, "GL_HIGH_FLOAT", }, - { 0x93DD, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR", }, - { 0x8827, "GL_DRAW_BUFFER2_NV", }, - { 0x9243, "GL_UNPACK_COLORSPACE_CONVERSION_CHROMIUM", }, - { 0x8DF3, "GL_LOW_INT", }, - { 0x82E8, "GL_MAX_LABEL_LENGTH", }, - { 0x8B53, "GL_INT_VEC2", }, - { 0x0C02, "GL_READ_BUFFER_EXT", }, - { 0x82E3, "GL_QUERY", }, - { 0x82E2, "GL_PROGRAM", }, - { 0x82E1, "GL_SHADER", }, - { 0x8B52, "GL_FLOAT_VEC4", }, - { 0x9240, "GL_UNPACK_FLIP_Y_CHROMIUM", }, - { 0x8B51, "GL_FLOAT_VEC3", }, - { 0x8230, "GL_RG32F_EXT", }, - { 0x8DF7, "GL_INT_10_10_10_2_OES", }, - { 0x812F, "GL_CLAMP_TO_EDGE", }, - { 0x86A3, "GL_COMPRESSED_TEXTURE_FORMATS", }, - { 0x86A2, "GL_NUM_COMPRESSED_TEXTURE_FORMATS", }, - { 0x0CF3, "GL_UNPACK_SKIP_ROWS", }, - { 0x0CF2, "GL_UNPACK_ROW_LENGTH", }, - { 0x140C, "GL_FIXED", }, - { 0x8008, "GL_MAX_EXT", }, - { 0x0CF5, "GL_UNPACK_ALIGNMENT", }, - { 0x0CF4, "GL_UNPACK_SKIP_PIXELS", }, - { 0x8009, "GL_BLEND_EQUATION", }, - { 0x1401, "GL_UNSIGNED_BYTE", }, - { 0x1400, "GL_BYTE", }, - { 0x1403, "GL_UNSIGNED_SHORT", }, - { 0x1402, "GL_SHORT", }, - { 0x1405, "GL_UNSIGNED_INT", }, - { 0x1404, "GL_INT", }, - { 0x1406, "GL_FLOAT", }, - { 0x8043, "GL_LUMINANCE4_ALPHA4_OES", }, - { 0x8040, "GL_LUMINANCE8_OES", }, - { 0x8045, "GL_LUMINANCE8_ALPHA8_OES", }, - { 0x8CD1, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME", }, - { 0x00040000, "GL_STENCIL_BUFFER_BIT2_QCOM", }, - { 0x8CD0, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE", }, - { 0x8CE4, "GL_COLOR_ATTACHMENT4_NV", }, - { 0x8CD3, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE", }, - { 0x0B90, "GL_STENCIL_TEST", }, - { 0x8CD2, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL", }, - { 0x881C, "GL_ALPHA16F_EXT", }, - { 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES", }, - { 0x8CD7, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT", }, - { 0x9112, "GL_OBJECT_TYPE_APPLE", }, - { 0x8038, "GL_POLYGON_OFFSET_FACTOR", }, - { 0x851A, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z", }, - { 0x851C, "GL_MAX_CUBE_MAP_TEXTURE_SIZE", }, - { 0x8CD9, "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS", }, - { 0x84CC, "GL_TEXTURE12", }, - { 0x0BA2, "GL_VIEWPORT", }, - { 0x84CA, "GL_TEXTURE10", }, - { 0x84CF, "GL_TEXTURE15", }, - { 0x84CE, "GL_TEXTURE14", }, - { 0x84CD, "GL_TEXTURE13", }, - { 0x9115, "GL_SYNC_FLAGS_APPLE", }, - { 0x83F3, "GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE", }, - { 0x83F2, "GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE", }, - { 0x83F1, "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT", }, - { 0x9114, "GL_SYNC_STATUS_APPLE", }, - { 0x8C0A, "GL_SGX_BINARY_IMG", }, - { 0x911C, "GL_CONDITION_SATISFIED_APPLE", }, - { 0x911B, "GL_TIMEOUT_EXPIRED_APPLE", }, - { 0x911A, "GL_ALREADY_SIGNALED_APPLE", }, - { 0x911D, "GL_WAIT_FAILED_APPLE", }, - { 0x846D, "GL_ALIASED_POINT_SIZE_RANGE", }, - { 0x846E, "GL_ALIASED_LINE_WIDTH_RANGE", }, - { 0x9113, "GL_SYNC_CONDITION_APPLE", }, - { 0x93A4, "GL_PACK_REVERSE_ROW_ORDER_ANGLE", }, - { 0x9111, "GL_MAX_SERVER_WAIT_TIMEOUT_APPLE", }, - { 0x9117, "GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE", }, - { 0x93A0, "GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE", }, - { 0x93A3, "GL_FRAMEBUFFER_ATTACHMENT_ANGLE", }, - { 0x93A2, "GL_TEXTURE_USAGE_ANGLE", }, - { 0x8802, "GL_STENCIL_BACK_PASS_DEPTH_FAIL", }, - { 0x9119, "GL_SIGNALED_APPLE", }, - { 0x9118, "GL_UNSIGNALED_APPLE", }, - { 0x8C01, "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG", }, - { 0x8C00, "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG", }, - { 0x8A52, "GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT", }, - { 0x8C02, "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG", }, - { 0x84C9, "GL_TEXTURE9", }, - { 0x84C8, "GL_TEXTURE8", }, - { 0x8869, "GL_MAX_VERTEX_ATTRIBS", }, - { 0x84C3, "GL_TEXTURE3", }, - { 0x84C2, "GL_TEXTURE2", }, - { 0x84C1, "GL_TEXTURE1", }, - { 0x84C0, "GL_TEXTURE0", }, - { 0x84C7, "GL_TEXTURE7", }, - { 0x84C6, "GL_TEXTURE6", }, - { 0x84C5, "GL_TEXTURE5", }, - { 0x8803, "GL_STENCIL_BACK_PASS_DEPTH_PASS", }, - { 0x8518, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y", }, - { 0x8519, "GL_TEXTURE_CUBE_MAP_POSITIVE_Z", }, - { 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP", }, - { 0x8515, "GL_TEXTURE_CUBE_MAP_POSITIVE_X", }, - { 0x8516, "GL_TEXTURE_CUBE_MAP_NEGATIVE_X", }, - { 0x8517, "GL_TEXTURE_CUBE_MAP_POSITIVE_Y", }, - { 0x8513, "GL_TEXTURE_CUBE_MAP", }, - { 0x8626, "GL_CURRENT_VERTEX_ATTRIB", }, - { 0x8765, "GL_BUFFER_USAGE", }, - { 0x8764, "GL_BUFFER_SIZE", }, - { 0x93D8, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR", }, - { 0x0503, "GL_STACK_OVERFLOW", }, - { 0x0502, "GL_INVALID_OPERATION", }, - { 0x0501, "GL_INVALID_VALUE", }, - { 0x0500, "GL_INVALID_ENUM", }, - { 64, "GL_MAILBOX_SIZE_CHROMIUM", }, - { 0x0506, "GL_INVALID_FRAMEBUFFER_OPERATION", }, - { 0x0505, "GL_OUT_OF_MEMORY", }, - { 0x8B5F, "GL_SAMPLER_3D_OES", }, - { 0x0B44, "GL_CULL_FACE", }, - { 0x8B5E, "GL_SAMPLER_2D", }, - { 0x0B46, "GL_FRONT_FACE", }, - { 0x8FB3, "GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM", }, - { 0x824A, "GL_DEBUG_SOURCE_APPLICATION", }, - { 0x824B, "GL_DEBUG_SOURCE_OTHER", }, - { 0x824C, "GL_DEBUG_TYPE_ERROR", }, - { 0x824D, "GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR", }, - { 0x824E, "GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR", }, - { 0x824F, "GL_DEBUG_TYPE_PORTABILITY", }, - { 0x8B31, "GL_VERTEX_SHADER", }, - { 0x8B30, "GL_FRAGMENT_SHADER", }, - { 0x1E00, "GL_KEEP", }, - { 0x8268, "GL_DEBUG_TYPE_MARKER", }, - { 0x84D8, "GL_TEXTURE24", }, - { 0x84D9, "GL_TEXTURE25", }, - { 0x84D6, "GL_TEXTURE22", }, - { 0x84D7, "GL_TEXTURE23", }, - { 0x84D4, "GL_TEXTURE20", }, - { 0x84D5, "GL_TEXTURE21", }, - { 0x84D2, "GL_TEXTURE18", }, - { 0x84D3, "GL_TEXTURE19", }, - { 0x84D0, "GL_TEXTURE16", }, - { 0x84D1, "GL_TEXTURE17", }, - { 0x1E03, "GL_DECR", }, - { 0x84DF, "GL_TEXTURE31", }, - { 0x93D6, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR", }, - { 0x84DD, "GL_TEXTURE29", }, - { 0x84DE, "GL_TEXTURE30", }, - { 0x84DB, "GL_TEXTURE27", }, - { 0x84DC, "GL_TEXTURE28", }, - { 0x6002, "GL_TEXTURE_POOL_UNMANAGED_CHROMIUM", }, - { 0x84DA, "GL_TEXTURE26", }, - { 0x8242, "GL_DEBUG_OUTPUT_SYNCHRONOUS", }, - { 0x8243, "GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH", }, - { 0x8244, "GL_DEBUG_CALLBACK_FUNCTION", }, - { 0x8245, "GL_DEBUG_CALLBACK_USER_PARAM", }, - { 0x8246, "GL_DEBUG_SOURCE_API", }, - { 0x8247, "GL_DEBUG_SOURCE_WINDOW_SYSTEM", }, - { 0x8248, "GL_DEBUG_SOURCE_SHADER_COMPILER", }, - { 0x8249, "GL_DEBUG_SOURCE_THIRD_PARTY", }, - { 0x93D5, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR", }, - { 0x00000040, "GL_COLOR_BUFFER_BIT6_QCOM", }, - { 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER", }, - { 0x8865, "GL_CURRENT_QUERY_EXT", }, - { 0x8866, "GL_QUERY_RESULT_EXT", }, - { 0x8867, "GL_QUERY_RESULT_AVAILABLE_EXT", }, - { 0x08000000, "GL_MULTISAMPLE_BUFFER_BIT3_QCOM", }, - { 0x87FA, "GL_3DC_XY_AMD", }, - { 0x84C4, "GL_TEXTURE4", }, - { 0x85B5, "GL_VERTEX_ARRAY_BINDING_OES", }, - { 0x8D6A, "GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT", }, - { 0x8D6C, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT", }, - { 0x8252, "GL_LOSE_CONTEXT_ON_RESET_EXT", }, - { 0x8251, "GL_DEBUG_TYPE_OTHER", }, - { 0x8C40, "GL_SRGB_EXT", }, - { 0x8C43, "GL_SRGB8_ALPHA8_EXT", }, - { 0x8C42, "GL_SRGB_ALPHA_EXT", }, - { 0x00200000, "GL_STENCIL_BUFFER_BIT5_QCOM", }, - { 0x8D68, "GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES", }, - { 0x85BB, "GL_UNSIGNED_SHORT_8_8_REV_APPLE", }, - { 0x8D61, "GL_HALF_FLOAT_OES", }, - { 0x8D62, "GL_RGB565", }, - { 0x8D64, "GL_ETC1_RGB8_OES", }, - { 0x8D65, "GL_TEXTURE_EXTERNAL_OES", }, - { 0x8D66, "GL_SAMPLER_EXTERNAL_OES", }, - { 0x8D67, "GL_TEXTURE_BINDING_EXTERNAL_OES", }, - { 0x04000000, "GL_MULTISAMPLE_BUFFER_BIT2_QCOM", }, - { 0x8CEE, "GL_COLOR_ATTACHMENT14_NV", }, - { 0x2800, "GL_TEXTURE_MAG_FILTER", }, - { 0x2801, "GL_TEXTURE_MIN_FILTER", }, - { 0x2802, "GL_TEXTURE_WRAP_S", }, - { 0x2803, "GL_TEXTURE_WRAP_T", }, - { 0x2703, "GL_LINEAR_MIPMAP_LINEAR", }, - { 0x2702, "GL_NEAREST_MIPMAP_LINEAR", }, - { 0x1F03, "GL_EXTENSIONS", }, - { 0x1F02, "GL_VERSION", }, - { 0x1F01, "GL_RENDERER", }, - { 0x1F00, "GL_VENDOR", }, - { 0x2701, "GL_LINEAR_MIPMAP_NEAREST", }, - { 0x0B94, "GL_STENCIL_FAIL", }, - { 0x8B4C, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS", }, - { 0x8B4D, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS", }, - { 0x8B4F, "GL_SHADER_TYPE", }, - { 0x00004000, "GL_COLOR_BUFFER_BIT", }, - { 0x00000010, "GL_COLOR_BUFFER_BIT4_QCOM", }, - { 0x8834, "GL_DRAW_BUFFER15_NV", }, - { 0x8833, "GL_DRAW_BUFFER14_NV", }, - { 0x8832, "GL_DRAW_BUFFER13_NV", }, - { 0x8831, "GL_DRAW_BUFFER12_NV", }, - { 0x8830, "GL_DRAW_BUFFER11_NV", }, - { 0x93B8, "GL_COMPRESSED_RGBA_ASTC_10x5_KHR", }, - { 0x9241, "GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM", }, - { 0x00010000, "GL_STENCIL_BUFFER_BIT0_QCOM", }, - { 0x0B93, "GL_STENCIL_VALUE_MASK", }, - { 0x0B92, "GL_STENCIL_FUNC", }, - { 0x0B91, "GL_STENCIL_CLEAR_VALUE", }, - { 0x883D, "GL_BLEND_EQUATION_ALPHA", }, - { 0x0B97, "GL_STENCIL_REF", }, - { 0x0B96, "GL_STENCIL_PASS_DEPTH_PASS", }, - { 0x0B95, "GL_STENCIL_PASS_DEPTH_FAIL", }, - { 0x2700, "GL_NEAREST_MIPMAP_NEAREST", }, - { 0x0B98, "GL_STENCIL_WRITEMASK", }, - { 0x8B40, "GL_PROGRAM_OBJECT_EXT", }, - { 0x8B48, "GL_SHADER_OBJECT_EXT", }, - { 0x912F, "GL_TEXTURE_IMMUTABLE_FORMAT_EXT", }, - { 0x20000000, "GL_MULTISAMPLE_BUFFER_BIT5_QCOM", }, - { 0x0DE1, "GL_TEXTURE_2D", }, - { 0x80C9, "GL_BLEND_SRC_RGB", }, - { 0x80C8, "GL_BLEND_DST_RGB", }, - { 0x0504, "GL_STACK_UNDERFLOW", }, - { 0x8059, "GL_RGB10_A2_EXT", }, - { 0x8058, "GL_RGBA8_OES", }, - { 0x00002000, "GL_DEPTH_BUFFER_BIT5_QCOM", }, - { 0x8051, "GL_RGB8_OES", }, - { 0x8052, "GL_RGB10_EXT", }, - { 0x8CAB, "GL_RENDERBUFFER_SAMPLES_ANGLE", }, - { 0x8057, "GL_RGB5_A1", }, - { 0x8056, "GL_RGBA4", }, - { 0x150A, "GL_INVERT", }, - { 0x01000000, "GL_MULTISAMPLE_BUFFER_BIT0_QCOM", }, - { 0x78ED, "GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM", }, - { 0x78EE, "GL_PIXEL_PACK_TRANSFER_BUFFER_BINDING_CHROMIUM", }, - { 0x8269, "GL_DEBUG_TYPE_PUSH_GROUP", }, - { 0x0B45, "GL_CULL_FACE_MODE", }, - { 0x00100000, "GL_STENCIL_BUFFER_BIT4_QCOM", }, - { 0x8D20, "GL_STENCIL_ATTACHMENT", }, - { 0x00000200, "GL_DEPTH_BUFFER_BIT1_QCOM", }, - { 0x00008000, "GL_DEPTH_BUFFER_BIT7_QCOM", }, - { 0x8CA8, "GL_READ_FRAMEBUFFER_ANGLE", }, - { 0x8CA9, "GL_DRAW_FRAMEBUFFER_ANGLE", }, - { 0x8CA6, "GL_FRAMEBUFFER_BINDING", }, - { 0x8CA7, "GL_RENDERBUFFER_BINDING", }, - { 0x8CA4, "GL_STENCIL_BACK_VALUE_MASK", }, - { 0x8CA5, "GL_STENCIL_BACK_WRITEMASK", }, - { 0x8CA3, "GL_STENCIL_BACK_REF", }, - { 0x80CB, "GL_BLEND_SRC_ALPHA", }, - { 0x80CA, "GL_BLEND_DST_ALPHA", }, - { 0x93B0, "GL_COMPRESSED_RGBA_ASTC_4x4_KHR", }, - { 0x93B1, "GL_COMPRESSED_RGBA_ASTC_5x4_KHR", }, - { 0x93B2, "GL_COMPRESSED_RGBA_ASTC_5x5_KHR", }, - { 0x93B3, "GL_COMPRESSED_RGBA_ASTC_6x5_KHR", }, - { 0x93B4, "GL_COMPRESSED_RGBA_ASTC_6x6_KHR", }, - { 0x93B5, "GL_COMPRESSED_RGBA_ASTC_8x5_KHR", }, - { 0x93B6, "GL_COMPRESSED_RGBA_ASTC_8x6_KHR", }, - { 0x93B7, "GL_COMPRESSED_RGBA_ASTC_8x8_KHR", }, - { 0x8CD6, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT", }, - { 0x93B9, "GL_COMPRESSED_RGBA_ASTC_10x6_KHR", }, - { 0x8253, "GL_GUILTY_CONTEXT_RESET_EXT", }, - { 0x8CE5, "GL_COLOR_ATTACHMENT5_NV", }, - { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS", }, - { 0x8508, "GL_DECR_WRAP", }, - { 0x8507, "GL_INCR_WRAP", }, - { 0x8895, "GL_ELEMENT_ARRAY_BUFFER_BINDING", }, - { 0x8894, "GL_ARRAY_BUFFER_BINDING", }, - { 0x8893, "GL_ELEMENT_ARRAY_BUFFER", }, - { 0x8892, "GL_ARRAY_BUFFER", }, - { 0x8BD8, "GL_TEXTURE_IMAGE_VALID_QCOM", }, - { 0x93BA, "GL_COMPRESSED_RGBA_ASTC_10x8_KHR", }, - { 0x93BB, "GL_COMPRESSED_RGBA_ASTC_10x10_KHR", }, - { 0x93BC, "GL_COMPRESSED_RGBA_ASTC_12x10_KHR", }, - { 0x93BD, "GL_COMPRESSED_RGBA_ASTC_12x12_KHR", }, - { 0x84E8, "GL_MAX_RENDERBUFFER_SIZE", }, - { 0x8370, "GL_MIRRORED_REPEAT", }, - { 0x84E0, "GL_ACTIVE_TEXTURE", }, - { 0x8800, "GL_STENCIL_BACK_FUNC", }, - { 0x8801, "GL_STENCIL_BACK_FAIL", }, - { 0x0D33, "GL_MAX_TEXTURE_SIZE", }, - { 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE", }, - { 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE", }, - { 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED", }, - { 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE", }, - { 0x8259, "GL_ACTIVE_PROGRAM_EXT", }, - { 0x8258, "GL_PROGRAM_SEPARABLE_EXT", }, - { 0x8256, "GL_RESET_NOTIFICATION_STRATEGY_EXT", }, - { 0x8255, "GL_UNKNOWN_CONTEXT_RESET_EXT", }, - { 0x8254, "GL_INNOCENT_CONTEXT_RESET_EXT", }, - { 0x1100, "GL_DONT_CARE", }, - { 0x1101, "GL_FASTEST", }, - { 0x1102, "GL_NICEST", }, - { 0x8250, "GL_DEBUG_TYPE_PERFORMANCE", }, - { 0x8CEB, "GL_COLOR_ATTACHMENT11_NV", }, - { 0x8CEC, "GL_COLOR_ATTACHMENT12_NV", }, - { 0x0408, "GL_FRONT_AND_BACK", }, - { 0x8CEA, "GL_COLOR_ATTACHMENT10_NV", }, - { 0x8CEF, "GL_COLOR_ATTACHMENT15_NV", }, - { 0x8CED, "GL_COLOR_ATTACHMENT13_NV", }, - { 0x8829, "GL_DRAW_BUFFER4_NV", }, - { 0x0404, "GL_FRONT", }, - { 0x0405, "GL_BACK", }, - { 0x88E1, "GL_STREAM_READ", }, - { 0x88E0, "GL_STREAM_DRAW", }, - { 0x88E4, "GL_STATIC_DRAW", }, - { 0x88E8, "GL_DYNAMIC_DRAW", }, - { 0x8CAA, "GL_READ_FRAMEBUFFER_BINDING_ANGLE", }, - { 0x40000000, "GL_MULTISAMPLE_BUFFER_BIT6_QCOM", }, - { 0x9116, "GL_SYNC_FENCE_APPLE", }, - { 0x6000, "GL_TEXTURE_POOL_CHROMIUM", }, - { 0x00000800, "GL_DEPTH_BUFFER_BIT3_QCOM", }, - { 0x1903, "GL_RED_EXT", }, - { 0x6001, "GL_TEXTURE_POOL_MANAGED_CHROMIUM", }, - { 0x8CE2, "GL_COLOR_ATTACHMENT2_NV", }, - { 0x8BC1, "GL_COUNTER_RANGE_AMD", }, - { 0x8CE0, "GL_COLOR_ATTACHMENT0", }, - { 0x8CE1, "GL_COLOR_ATTACHMENT1_NV", }, - { 0x8CE6, "GL_COLOR_ATTACHMENT6_NV", }, - { 0x8CE7, "GL_COLOR_ATTACHMENT7_NV", }, - { 0x8A1F, "GL_RGB_422_APPLE", }, - { 0x93DC, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR", }, - { 0x8CE8, "GL_COLOR_ATTACHMENT8_NV", }, - { 0x8CE9, "GL_COLOR_ATTACHMENT9_NV", }, - { 0x0C23, "GL_COLOR_WRITEMASK", }, - { 0x0C22, "GL_COLOR_CLEAR_VALUE", }, - { 0x8823, "GL_WRITEONLY_RENDERING_QCOM", }, - { 0x8824, "GL_MAX_DRAW_BUFFERS_NV", }, - { 0x825A, "GL_PROGRAM_PIPELINE_BINDING_EXT", }, - { 0x1909, "GL_LUMINANCE", }, - { 0x0D3A, "GL_MAX_VIEWPORT_DIMS", }, - { 0x0020, "GL_MAP_UNSYNCHRONIZED_BIT_EXT", }, - { 0x809E, "GL_SAMPLE_ALPHA_TO_COVERAGE", }, - { 0x8BC0, "GL_COUNTER_TYPE_AMD", }, - { 0x8BC3, "GL_PERCENTAGE_AMD", }, - { 0x8BC2, "GL_UNSIGNED_INT64_AMD", }, - { 0x8BC5, "GL_PERFMON_RESULT_SIZE_AMD", }, - { 0x8BC4, "GL_PERFMON_RESULT_AVAILABLE_AMD", }, - { 0x8BC6, "GL_PERFMON_RESULT_AMD", }, + { + 0x78EC, "GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM", + }, + { + 0x8825, "GL_DRAW_BUFFER0_EXT", + }, + { + 0x0BC1, "GL_ALPHA_TEST_FUNC_QCOM", + }, + { + 0x884C, "GL_TEXTURE_COMPARE_MODE_EXT", + }, + { + 0x0BC2, "GL_ALPHA_TEST_REF_QCOM", + }, + { + 0x884D, "GL_TEXTURE_COMPARE_FUNC_EXT", + }, + { + 0x884E, "GL_COMPARE_REF_TO_TEXTURE_EXT", + }, + { + 0x93A1, "GL_BGRA8_EXT", + }, + { + 0, "GL_FALSE", + }, + { + 0x00400000, "GL_STENCIL_BUFFER_BIT6_QCOM", + }, + { + 0x9138, "GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG", + }, + { + 0x8FC4, "GL_SHADER_BINARY_VIV", + }, + { + 0x9130, "GL_SGX_PROGRAM_BINARY_IMG", + }, + { + 0x9133, "GL_RENDERBUFFER_SAMPLES_IMG", + }, + { + 0x82E0, "GL_BUFFER_KHR", + }, + { + 0x9135, "GL_MAX_SAMPLES_IMG", + }, + { + 0x9134, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG", + }, + { + 0x9137, "GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG", + }, + { + 0x9136, "GL_TEXTURE_SAMPLES_IMG", + }, + { + 0x00000020, "GL_COLOR_BUFFER_BIT5_QCOM", + }, + { + 0x0008, "GL_MAP_INVALIDATE_BUFFER_BIT_EXT", + }, + { + 0x0BC0, "GL_ALPHA_TEST_QCOM", + }, + { + 0x0006, "GL_TRIANGLE_FAN", + }, + { + 0x0004, "GL_TRIANGLES", + }, + { + 0x0005, "GL_TRIANGLE_STRIP", + }, + { + 0x0002, "GL_LINE_LOOP", + }, + { + 0x0003, "GL_LINE_STRIP", + }, + { + 0x0000, "GL_POINTS", + }, + { + 0x0001, "GL_LINES", + }, + { + 0x78F0, "GL_IMAGE_ROWBYTES_CHROMIUM", + }, + { + 0x88B8, "GL_READ_ONLY", + }, + { + 0x88B9, "GL_WRITE_ONLY_OES", + }, + { + 0x8211, "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT", + }, + { + 0x8210, "GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT", + }, + { + 0x8741, "GL_PROGRAM_BINARY_LENGTH_OES", + }, + { + 0x8740, "GL_Z400_BINARY_AMD", + }, + { + 0x8192, "GL_GENERATE_MIPMAP_HINT", + }, + { + 0x8A54, "GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT", + }, + { + 0x8A55, "GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT", + }, + { + 0x8A56, "GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT", + }, + { + 0x8A57, "GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT", + }, + { + 0x8A51, "GL_RGB_RAW_422_APPLE", + }, + { + 0x87F9, "GL_3DC_X_AMD", + }, + { + 0x8A53, "GL_SYNC_OBJECT_APPLE", + }, + { + 0x8DF8, "GL_SHADER_BINARY_FORMATS", + }, + { + 0x8DF9, "GL_NUM_SHADER_BINARY_FORMATS", + }, + { + 0x826D, "GL_DEBUG_GROUP_STACK_DEPTH_KHR", + }, + { + 0x826B, "GL_DEBUG_SEVERITY_NOTIFICATION_KHR", + }, + { + 0x826C, "GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR", + }, + { + 0x8B59, "GL_BOOL_VEC4", + }, + { + 0x826A, "GL_DEBUG_TYPE_POP_GROUP_KHR", + }, + { + 0x8B57, "GL_BOOL_VEC2", + }, + { + 0x8DF1, "GL_MEDIUM_FLOAT", + }, + { + 0x8B55, "GL_INT_VEC4", + }, + { + 0x8B54, "GL_INT_VEC3", + }, + { + 0x8DF4, "GL_MEDIUM_INT", + }, + { + 0x8DF5, "GL_HIGH_INT", + }, + { + 0x8B51, "GL_FLOAT_VEC3", + }, + { + 0x8B50, "GL_FLOAT_VEC2", + }, + { + 0x806F, "GL_TEXTURE_3D_OES", + }, + { + 0x92E0, "GL_DEBUG_OUTPUT_KHR", + }, + { + 0x806A, "GL_TEXTURE_BINDING_3D_OES", + }, + { + 0x8CE3, "GL_COLOR_ATTACHMENT3_EXT", + }, + { + 0x1904, "GL_GREEN_NV", + }, + { + 0x928D, "GL_DST_OUT_NV", + }, + { + 0x8069, "GL_TEXTURE_BINDING_2D", + }, + { + 0x8261, "GL_NO_RESET_NOTIFICATION_EXT", + }, + { + 0x8DFA, "GL_SHADER_COMPILER", + }, + { + 0x8DFB, "GL_MAX_VERTEX_UNIFORM_VECTORS", + }, + { + 0x8DFC, "GL_MAX_VARYING_VECTORS", + }, + { + 0x8B5C, "GL_FLOAT_MAT4", + }, + { + 0x8B5B, "GL_FLOAT_MAT3", + }, + { + 0x8268, "GL_DEBUG_TYPE_MARKER_KHR", + }, + { + 0x8269, "GL_DEBUG_TYPE_PUSH_GROUP_KHR", + }, + { + 0x1905, "GL_BLUE_NV", + }, + { + 0x87FF, "GL_PROGRAM_BINARY_FORMATS_OES", + }, + { + 0x87FE, "GL_NUM_PROGRAM_BINARY_FORMATS_OES", + }, + { + 0x2600, "GL_NEAREST", + }, + { + 0x2601, "GL_LINEAR", + }, + { + 0x8C03, "GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG", + }, + { + 0x9242, "GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM", + }, + { + 0x88BB, "GL_BUFFER_ACCESS_OES", + }, + { + 0x88BC, "GL_BUFFER_MAPPED_OES", + }, + { + 0x88BD, "GL_BUFFER_MAP_POINTER_OES", + }, + { + 0x88BF, "GL_TIME_ELAPSED_EXT", + }, + { + 0x0C10, "GL_SCISSOR_BOX", + }, + { + 0x0C11, "GL_SCISSOR_TEST", + }, + { + 0x80000000, "GL_MULTISAMPLE_BUFFER_BIT7_QCOM", + }, + { + 0x8A48, "GL_TEXTURE_SRGB_DECODE_EXT", + }, + { + 0x300E, "GL_CONTEXT_LOST", + }, + { + 0x02000000, "GL_MULTISAMPLE_BUFFER_BIT1_QCOM", + }, + { + 0x8C2F, "GL_ANY_SAMPLES_PASSED_EXT", + }, + { + 0x8BD2, "GL_TEXTURE_WIDTH_QCOM", + }, + { + 0x8BD3, "GL_TEXTURE_HEIGHT_QCOM", + }, + { + 0x8BD4, "GL_TEXTURE_DEPTH_QCOM", + }, + { + 0x8BD5, "GL_TEXTURE_INTERNAL_FORMAT_QCOM", + }, + { + 0x8BD6, "GL_TEXTURE_FORMAT_QCOM", + }, + { + 0x8BD7, "GL_TEXTURE_TYPE_QCOM", + }, + { + 0x8B8D, "GL_CURRENT_PROGRAM", + }, + { + 0x8BD9, "GL_TEXTURE_NUM_LEVELS_QCOM", + }, + { + 0x00200000, "GL_STENCIL_BUFFER_BIT5_QCOM", + }, + { + 0x8B8A, "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH", + }, + { + 0x8B8B, "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES", + }, + { + 0x8B8C, "GL_SHADING_LANGUAGE_VERSION", + }, + { + 0x8BDA, "GL_TEXTURE_TARGET_QCOM", + }, + { + 0x8BDB, "GL_TEXTURE_OBJECT_VALID_QCOM", + }, + { + 0x8BDC, "GL_STATE_RESTORE", + }, + { + 0x8B88, "GL_SHADER_SOURCE_LENGTH", + }, + { + 0x8B89, "GL_ACTIVE_ATTRIBUTES", + }, + { + 0x93C9, "GL_COMPRESSED_RGBA_ASTC_6x6x6_OES", + }, + { + 0x93C8, "GL_COMPRESSED_RGBA_ASTC_6x6x5_OES", + }, + { + 0x8B84, "GL_INFO_LOG_LENGTH", + }, + { + 0x8B85, "GL_ATTACHED_SHADERS", + }, + { + 0x8B86, "GL_ACTIVE_UNIFORMS", + }, + { + 0x8B87, "GL_ACTIVE_UNIFORM_MAX_LENGTH", + }, + { + 0x8B80, "GL_DELETE_STATUS", + }, + { + 0x8B81, "GL_COMPILE_STATUS", + }, + { + 0x8B82, "GL_LINK_STATUS", + }, + { + 0x8B83, "GL_VALIDATE_STATUS", + }, + { + 0x8D48, "GL_STENCIL_INDEX8", + }, + { + 0x8D46, "GL_STENCIL_INDEX1_OES", + }, + { + 0x8D47, "GL_STENCIL_INDEX4_OES", + }, + { + 0x8D44, "GL_RENDERBUFFER_INTERNAL_FORMAT", + }, + { + 0x00000100, "GL_DEPTH_BUFFER_BIT", + }, + { + 0x8D42, "GL_RENDERBUFFER_WIDTH", + }, + { + 0x8D43, "GL_RENDERBUFFER_HEIGHT", + }, + { + 0x8D40, "GL_FRAMEBUFFER", + }, + { + 0x8D41, "GL_RENDERBUFFER", + }, + { + 0x0BD0, "GL_DITHER", + }, + { + 0x93D3, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR", + }, + { + 0x1801, "GL_DEPTH_EXT", + }, + { + 0x1800, "GL_COLOR_EXT", + }, + { + 0x1802, "GL_STENCIL_EXT", + }, + { + 0x0B21, "GL_LINE_WIDTH", + }, + { + 0x81A5, "GL_DEPTH_COMPONENT16", + }, + { + 0x81A6, "GL_DEPTH_COMPONENT24_OES", + }, + { + 0x81A7, "GL_DEPTH_COMPONENT32_OES", + }, + { + 0x88FE, "GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE", + }, + { + 0x8B6A, "GL_FLOAT_MAT4x3_NV", + }, + { + 0x93D0, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR", + }, + { + 0x9143, "GL_MAX_DEBUG_MESSAGE_LENGTH_KHR", + }, + { + 0x9144, "GL_MAX_DEBUG_LOGGED_MESSAGES_KHR", + }, + { + 0x9145, "GL_DEBUG_LOGGED_MESSAGES_KHR", + }, + { + 0x9146, "GL_DEBUG_SEVERITY_HIGH_KHR", + }, + { + 0x9147, "GL_DEBUG_SEVERITY_MEDIUM_KHR", + }, + { + 0x9148, "GL_DEBUG_SEVERITY_LOW_KHR", + }, + { + 0x9260, "GL_GCCSO_SHADER_BINARY_FJ", + }, + { + 0x8F60, "GL_MALI_SHADER_BINARY_ARM", + }, + { + 0x8F61, "GL_MALI_PROGRAM_BINARY_ARM", + }, + { + 0x87EE, "GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD", + }, + { + 0x822B, "GL_RG8_EXT", + }, + { + 0x822F, "GL_RG16F_EXT", + }, + { + 0x822D, "GL_R16F_EXT", + }, + { + 0x822E, "GL_R32F_EXT", + }, + { + 1, "GL_ES_VERSION_2_0", + }, + { + 0x84F9, "GL_DEPTH_STENCIL_OES", + }, + { + 0x8368, "GL_UNSIGNED_INT_2_10_10_10_REV_EXT", + }, + { + 0x8819, "GL_LUMINANCE_ALPHA32F_EXT", + }, + { + 0x8818, "GL_LUMINANCE32F_EXT", + }, + { + 0x8363, "GL_UNSIGNED_SHORT_5_6_5", + }, + { + 0x8814, "GL_RGBA32F_EXT", + }, + { + 0x84F2, "GL_ALL_COMPLETED_NV", + }, + { + 0x8816, "GL_ALPHA32F_EXT", + }, + { + 0x84F4, "GL_FENCE_CONDITION_NV", + }, + { + 0x8366, "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT", + }, + { + 0x8365, "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT", + }, + { + 0x84F7, "GL_COMMANDS_COMPLETED_CHROMIUM", + }, + { + 0x881E, "GL_LUMINANCE16F_EXT", + }, + { + 0x84FA, "GL_UNSIGNED_INT_24_8_OES", + }, + { + 0x881F, "GL_LUMINANCE_ALPHA16F_EXT", + }, + { + 0x881A, "GL_RGBA16F_EXT", + }, + { + 0x84FE, "GL_TEXTURE_MAX_ANISOTROPY_EXT", + }, + { + 0x0901, "GL_CCW", + }, + { + 0x0900, "GL_CW", + }, + { + 0x8229, "GL_R8_EXT", + }, + { + 0x9283, "GL_DISJOINT_NV", + }, + { + 0x8227, "GL_RG_EXT", + }, + { + 0x8B66, "GL_FLOAT_MAT2x4_NV", + }, + { + 0x8B67, "GL_FLOAT_MAT3x2_NV", + }, + { + 0x8B65, "GL_FLOAT_MAT2x3_NV", + }, + { + 0x8B62, "GL_SAMPLER_2D_SHADOW_EXT", + }, + { + 0x8B63, "GL_SAMPLER_2D_RECT_ARB", + }, + { + 0x8B60, "GL_SAMPLER_CUBE", + }, + { + 0x00001000, "GL_DEPTH_BUFFER_BIT4_QCOM", + }, + { + 0x8B68, "GL_FLOAT_MAT3x4_NV", + }, + { + 0x83F0, "GL_COMPRESSED_RGB_S3TC_DXT1_EXT", + }, + { + 0x00000080, "GL_COLOR_BUFFER_BIT7_QCOM", + }, + { + 0x88F0, "GL_DEPTH24_STENCIL8_OES", + }, + { + 0x80A0, "GL_SAMPLE_COVERAGE", + }, + { + 0x928F, "GL_DST_ATOP_NV", + }, + { + 0x80A9, "GL_SAMPLES", + }, + { + 0x80A8, "GL_SAMPLE_BUFFERS", + }, + { + 0x0D55, "GL_ALPHA_BITS", + }, + { + 0x0D54, "GL_BLUE_BITS", + }, + { + 0x0D57, "GL_STENCIL_BITS", + }, + { + 0x0D56, "GL_DEPTH_BITS", + }, + { + 0x8CD5, "GL_FRAMEBUFFER_COMPLETE", + }, + { + 0x0D50, "GL_SUBPIXEL_BITS", + }, + { + 0x0D53, "GL_GREEN_BITS", + }, + { + 0x0D52, "GL_RED_BITS", + }, + { + 0x8037, "GL_POLYGON_OFFSET_FILL", + }, + { + 0x928C, "GL_SRC_OUT_NV", + }, + { + 0x8034, "GL_UNSIGNED_SHORT_5_5_5_1", + }, + { + 0x8033, "GL_UNSIGNED_SHORT_4_4_4_4", + }, + { + 0x928B, "GL_DST_IN_NV", + }, + { + 0x0305, "GL_ONE_MINUS_DST_ALPHA", + }, + { + 0x0304, "GL_DST_ALPHA", + }, + { + 0x0307, "GL_ONE_MINUS_DST_COLOR", + }, + { + 0x0306, "GL_DST_COLOR", + }, + { + 0x0301, "GL_ONE_MINUS_SRC_COLOR", + }, + { + 0x0300, "GL_SRC_COLOR", + }, + { + 0x0303, "GL_ONE_MINUS_SRC_ALPHA", + }, + { + 0x0302, "GL_SRC_ALPHA", + }, + { + 0x0308, "GL_SRC_ALPHA_SATURATE", + }, + { + 0x2A00, "GL_POLYGON_OFFSET_UNITS", + }, + { + 0xFFFFFFFF, "GL_ALL_SHADER_BITS_EXT", + }, + { + 0x00800000, "GL_STENCIL_BUFFER_BIT7_QCOM", + }, + { + 0x8C4D, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV", + }, + { + 0x00020000, "GL_STENCIL_BUFFER_BIT1_QCOM", + }, + { + 0x8D00, "GL_DEPTH_ATTACHMENT", + }, + { + 0x8FA0, "GL_PERFMON_GLOBAL_MODE_QCOM", + }, + { + 0x8815, "GL_RGB32F_EXT", + }, + { + 0x813D, "GL_TEXTURE_MAX_LEVEL_APPLE", + }, + { + 0x8DFD, "GL_MAX_FRAGMENT_UNIFORM_VECTORS", + }, + { + 0x8CDD, "GL_FRAMEBUFFER_UNSUPPORTED", + }, + { + 0x8CDF, "GL_MAX_COLOR_ATTACHMENTS_EXT", + }, + { + 0x90F3, "GL_CONTEXT_ROBUST_ACCESS_EXT", + }, + { + 0x90F2, "GL_MAX_MULTIVIEW_BUFFERS_EXT", + }, + { + 0x90F1, "GL_MULTIVIEW_EXT", + }, + { + 0x90F0, "GL_COLOR_ATTACHMENT_EXT", + }, + { + 0x803C, "GL_ALPHA8_OES", + }, + { + 0x84F5, "GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM", + }, + { + 0x882A, "GL_DRAW_BUFFER5_EXT", + }, + { + 0x80AA, "GL_SAMPLE_COVERAGE_VALUE", + }, + { + 0x84F6, "GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM", + }, + { + 0x80AB, "GL_SAMPLE_COVERAGE_INVERT", + }, + { + 0x8C41, "GL_SRGB8_NV", + }, + { + 0x8C40, "GL_SRGB_EXT", + }, + { + 0x882B, "GL_DRAW_BUFFER6_EXT", + }, + { + 0x8C17, "GL_UNSIGNED_NORMALIZED_EXT", + }, + { + 0x8A4A, "GL_SKIP_DECODE_EXT", + }, + { + 0x8A4F, "GL_PROGRAM_PIPELINE_OBJECT_EXT", + }, + { + 0x882C, "GL_DRAW_BUFFER7_EXT", + }, + { + 0x0010, "GL_MAP_FLUSH_EXPLICIT_BIT_EXT", + }, + { + 0x882D, "GL_DRAW_BUFFER8_EXT", + }, + { + 0x8F37, "GL_COPY_WRITE_BUFFER_NV", + }, + { + 0x8F36, "GL_COPY_READ_BUFFER_NV", + }, + { + 0x84FF, "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT", + }, + { + 0x6000, "GL_TEXTURE_POOL_CHROMIUM", + }, + { + 0x0B74, "GL_DEPTH_FUNC", + }, + { + 0x8A49, "GL_DECODE_EXT", + }, + { + 0x881B, "GL_RGB16F_EXT", + }, + { + 0x0B71, "GL_DEPTH_TEST", + }, + { + 0x0B70, "GL_DEPTH_RANGE", + }, + { + 0x0B73, "GL_DEPTH_CLEAR_VALUE", + }, + { + 0x0B72, "GL_DEPTH_WRITEMASK", + }, + { + 0x85BA, "GL_UNSIGNED_SHORT_8_8_APPLE", + }, + { + 0x882E, "GL_DRAW_BUFFER9_EXT", + }, + { + 0x6001, "GL_TEXTURE_POOL_MANAGED_CHROMIUM", + }, + { + 0x8073, "GL_MAX_3D_TEXTURE_SIZE_OES", + }, + { + 0x8072, "GL_TEXTURE_WRAP_R_OES", + }, + { + 0x9289, "GL_DST_OVER_NV", + }, + { + 0x882F, "GL_DRAW_BUFFER10_EXT", + }, + { + 0x8074, "GL_VERTEX_ARRAY_KHR", + }, + { + 0x80E1, "GL_BGRA_EXT", + }, + { + 0x8ED7, "GL_COVERAGE_AUTOMATIC_NV", + }, + { + 0x8ED6, "GL_COVERAGE_EDGE_FRAGMENTS_NV", + }, + { + 0x8ED5, "GL_COVERAGE_ALL_FRAGMENTS_NV", + }, + { + 0x8ED4, "GL_COVERAGE_SAMPLES_NV", + }, + { + 0x8ED3, "GL_COVERAGE_BUFFERS_NV", + }, + { + 0x8ED2, "GL_COVERAGE_ATTACHMENT_NV", + }, + { + 0x8ED1, "GL_COVERAGE_COMPONENT4_NV", + }, + { + 0x8ED0, "GL_COVERAGE_COMPONENT_NV", + }, + { + 0x9288, "GL_SRC_OVER_NV", + }, + { + 0x800B, "GL_FUNC_REVERSE_SUBTRACT", + }, + { + 0x00000400, "GL_STENCIL_BUFFER_BIT", + }, + { + 0x800A, "GL_FUNC_SUBTRACT", + }, + { + 0x8E2C, "GL_DEPTH_COMPONENT16_NONLINEAR_NV", + }, + { + 0x889F, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING", + }, + { + 0x8219, "GL_FRAMEBUFFER_UNDEFINED_OES", + }, + { + 0x8E22, "GL_TRANSFORM_FEEDBACK", + }, + { + 0x8E28, "GL_TIMESTAMP_EXT", + }, + { + 0x8006, "GL_FUNC_ADD", + }, + { + 0x8007, "GL_MIN_EXT", + }, + { + 0x8004, "GL_ONE_MINUS_CONSTANT_ALPHA", + }, + { + 0x8005, "GL_BLEND_COLOR", + }, + { + 0x8002, "GL_ONE_MINUS_CONSTANT_COLOR", + }, + { + 0x8003, "GL_CONSTANT_ALPHA", + }, + { + 0x8001, "GL_CONSTANT_COLOR", + }, + { + 0x0204, "GL_GREATER", + }, + { + 0x0205, "GL_NOTEQUAL", + }, + { + 0x0206, "GL_GEQUAL", + }, + { + 0x0207, "GL_ALWAYS", + }, + { + 0x0200, "GL_NEVER", + }, + { + 0x0201, "GL_LESS", + }, + { + 0x0202, "GL_EQUAL", + }, + { + 0x0203, "GL_LEQUAL", + }, + { + 0x2901, "GL_REPEAT", + }, + { + 0x92A0, "GL_EXCLUSION_NV", + }, + { + 0x93D8, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR", + }, + { + 0x93D9, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR", + }, + { + 0x8FB2, "GL_GPU_OPTIMIZED_QCOM", + }, + { + 0x190A, "GL_LUMINANCE_ALPHA", + }, + { + 0x8FB0, "GL_BINNING_CONTROL_HINT_QCOM", + }, + { + 0x92A1, "GL_CONTRAST_NV", + }, + { + 0x1E00, "GL_KEEP", + }, + { + 0x1E01, "GL_REPLACE", + }, + { + 0x1E02, "GL_INCR", + }, + { + 0x1E03, "GL_DECR", + }, + { + 0x93D6, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR", + }, + { + 0x93D7, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR", + }, + { + 0x93D4, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR", + }, + { + 0x93D5, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR", + }, + { + 0x0BE2, "GL_BLEND", + }, + { + 0x84CB, "GL_TEXTURE11", + }, + { + 0x8D55, "GL_RENDERBUFFER_STENCIL_SIZE", + }, + { + 0x8D54, "GL_RENDERBUFFER_DEPTH_SIZE", + }, + { + 0x8D57, "GL_MAX_SAMPLES_ANGLE", + }, + { + 0x8D56, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE", + }, + { + 0x8D51, "GL_RENDERBUFFER_GREEN_SIZE", + }, + { + 0x8D50, "GL_RENDERBUFFER_RED_SIZE", + }, + { + 0x8D53, "GL_RENDERBUFFER_ALPHA_SIZE", + }, + { + 0x8D52, "GL_RENDERBUFFER_BLUE_SIZE", + }, + { + 0x92A6, "GL_VIVIDLIGHT_NV", + }, + { + 0x00080000, "GL_STENCIL_BUFFER_BIT3_QCOM", + }, + { + 0x92A7, "GL_LINEARLIGHT_NV", + }, + { + 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED", + }, + { + 0x0C01, "GL_DRAW_BUFFER_EXT", + }, + { + 0x78F2, "GL_IMAGE_SCANOUT_CHROMIUM", + }, + { + 0x93C7, "GL_COMPRESSED_RGBA_ASTC_6x5x5_OES", + }, + { + 0x8B5F, "GL_SAMPLER_3D_OES", + }, + { + 0x8B95, "GL_PALETTE8_RGB8_OES", + }, + { + 0x9250, "GL_SHADER_BINARY_DMP", + }, + { + 0x10000000, "GL_MULTISAMPLE_BUFFER_BIT4_QCOM", + }, + { + 0x8C92, "GL_ATC_RGB_AMD", + }, + { + 0x9154, "GL_VERTEX_ARRAY_OBJECT_EXT", + }, + { + 0x9153, "GL_QUERY_OBJECT_EXT", + }, + { + 0x8864, "GL_QUERY_COUNTER_BITS_EXT", + }, + { + 0x9151, "GL_BUFFER_OBJECT_EXT", + }, + { + 0x8C93, "GL_ATC_RGBA_EXPLICIT_ALPHA_AMD", + }, + { + 0x00000002, "GL_CONTEXT_FLAG_DEBUG_BIT_KHR", + }, + { + 0x00000001, "GL_SYNC_FLUSH_COMMANDS_BIT_APPLE", + }, + { + 0x9248, "GL_OVERLAY_TRANSFORM_ROTATE_90_CHROMIUM", + }, + { + 0x00000004, "GL_COLOR_BUFFER_BIT2_QCOM", + }, + { + 0x1702, "GL_TEXTURE", + }, + { + 0x00000008, "GL_COLOR_BUFFER_BIT3_QCOM", + }, + { + 0x8B58, "GL_BOOL_VEC3", + }, + { + 0x8828, "GL_DRAW_BUFFER3_EXT", + }, + { + 0x8DF0, "GL_LOW_FLOAT", + }, + { + 0x1906, "GL_ALPHA", + }, + { + 0x1907, "GL_RGB", + }, + { + 0x8FBB, "GL_GPU_DISJOINT_EXT", + }, + { + 0x1902, "GL_DEPTH_COMPONENT", + }, + { + 0x8B56, "GL_BOOL", + }, + { + 0x93DB, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR", + }, + { + 0x8B9B, "GL_IMPLEMENTATION_COLOR_READ_FORMAT", + }, + { + 0x8B9A, "GL_IMPLEMENTATION_COLOR_READ_TYPE", + }, + { + 0x93DA, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR", + }, + { + 0x1908, "GL_RGBA", + }, + { + 0x8DF2, "GL_HIGH_FLOAT", + }, + { + 0x93DD, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR", + }, + { + 0x8827, "GL_DRAW_BUFFER2_EXT", + }, + { + 0x9243, "GL_UNPACK_COLORSPACE_CONVERSION_CHROMIUM", + }, + { + 0x8DF3, "GL_LOW_INT", + }, + { + 0x82E8, "GL_MAX_LABEL_LENGTH_KHR", + }, + { + 0x82E6, "GL_SAMPLER_KHR", + }, + { + 0x0C02, "GL_READ_BUFFER_EXT", + }, + { + 0x82E3, "GL_QUERY_KHR", + }, + { + 0x82E2, "GL_PROGRAM_KHR", + }, + { + 0x82E1, "GL_SHADER_KHR", + }, + { + 0x8B52, "GL_FLOAT_VEC4", + }, + { + 0x9240, "GL_UNPACK_FLIP_Y_CHROMIUM", + }, + { + 0x8DF6, "GL_UNSIGNED_INT_10_10_10_2_OES", + }, + { + 0x8230, "GL_RG32F_EXT", + }, + { + 0x8DF7, "GL_INT_10_10_10_2_OES", + }, + { + 0x9246, "GL_OVERLAY_TRANSFORM_FLIP_HORIZONTAL_CHROMIUM", + }, + { + 0x8B69, "GL_FLOAT_MAT4x2_NV", + }, + { + 0x812D, "GL_CLAMP_TO_BORDER_NV", + }, + { + 0x812F, "GL_CLAMP_TO_EDGE", + }, + { + 0x86A3, "GL_COMPRESSED_TEXTURE_FORMATS", + }, + { + 0x9244, "GL_BIND_GENERATES_RESOURCE_CHROMIUM", + }, + { + 0x86A2, "GL_NUM_COMPRESSED_TEXTURE_FORMATS", + }, + { + 0x0CF3, "GL_UNPACK_SKIP_ROWS_EXT", + }, + { + 0x0CF2, "GL_UNPACK_ROW_LENGTH_EXT", + }, + { + 0x140C, "GL_FIXED", + }, + { + 0x8008, "GL_MAX_EXT", + }, + { + 0x0CF5, "GL_UNPACK_ALIGNMENT", + }, + { + 0x0CF4, "GL_UNPACK_SKIP_PIXELS_EXT", + }, + { + 0x8009, "GL_BLEND_EQUATION", + }, + { + 0x1401, "GL_UNSIGNED_BYTE", + }, + { + 0x1400, "GL_BYTE", + }, + { + 0x1403, "GL_UNSIGNED_SHORT", + }, + { + 0x1402, "GL_SHORT", + }, + { + 0x1405, "GL_UNSIGNED_INT", + }, + { + 0x1404, "GL_INT", + }, + { + 0x1406, "GL_FLOAT", + }, + { + 0x8043, "GL_LUMINANCE4_ALPHA4_OES", + }, + { + 0x8040, "GL_LUMINANCE8_OES", + }, + { + 0x8045, "GL_LUMINANCE8_ALPHA8_OES", + }, + { + 0x8CD1, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME", + }, + { + 0x00040000, "GL_STENCIL_BUFFER_BIT2_QCOM", + }, + { + 0x8CD0, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE", + }, + { + 0x8CE4, "GL_COLOR_ATTACHMENT4_EXT", + }, + { + 0x8CD3, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE", + }, + { + 0x929E, "GL_DIFFERENCE_NV", + }, + { + 0x0B90, "GL_STENCIL_TEST", + }, + { + 0x8CD2, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL", + }, + { + 0x881C, "GL_ALPHA16F_EXT", + }, + { + 0x928E, "GL_SRC_ATOP_NV", + }, + { + 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES", + }, + { + 0x9298, "GL_LIGHTEN_NV", + }, + { + 0x8CD7, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT", + }, + { + 0x9112, "GL_OBJECT_TYPE_APPLE", + }, + { + 0x8038, "GL_POLYGON_OFFSET_FACTOR", + }, + { + 0x851A, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z", + }, + { + 0x851C, "GL_MAX_CUBE_MAP_TEXTURE_SIZE", + }, + { + 0x8CD9, "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS", + }, + { + 0x84CC, "GL_TEXTURE12", + }, + { + 0x0BA2, "GL_VIEWPORT", + }, + { + 0x84CA, "GL_TEXTURE10", + }, + { + 0x78F1, "GL_IMAGE_MAP_CHROMIUM", + }, + { + 0x84CF, "GL_TEXTURE15", + }, + { + 0x84CE, "GL_TEXTURE14", + }, + { + 0x84CD, "GL_TEXTURE13", + }, + { + 0x9115, "GL_SYNC_FLAGS_APPLE", + }, + { + 0x9286, "GL_SRC_NV", + }, + { + 0x83F3, "GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE", + }, + { + 0x83F2, "GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE", + }, + { + 0x83F1, "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT", + }, + { + 0x9114, "GL_SYNC_STATUS_APPLE", + }, + { + 0x8C0A, "GL_SGX_BINARY_IMG", + }, + { + 0x9285, "GL_BLEND_ADVANCED_COHERENT_NV", + }, + { + 0x911C, "GL_CONDITION_SATISFIED_APPLE", + }, + { + 0x911B, "GL_TIMEOUT_EXPIRED_APPLE", + }, + { + 0x911A, "GL_ALREADY_SIGNALED_APPLE", + }, + { + 0x9284, "GL_CONJOINT_NV", + }, + { + 0x911D, "GL_WAIT_FAILED_APPLE", + }, + { + 0x929A, "GL_COLORBURN_NV", + }, + { + 0x929B, "GL_HARDLIGHT_NV", + }, + { + 0x929C, "GL_SOFTLIGHT_NV", + }, + { + 0x846D, "GL_ALIASED_POINT_SIZE_RANGE", + }, + { + 0x846E, "GL_ALIASED_LINE_WIDTH_RANGE", + }, + { + 0x929F, "GL_MINUS_NV", + }, + { + 0x9282, "GL_UNCORRELATED_NV", + }, + { + 0x9113, "GL_SYNC_CONDITION_APPLE", + }, + { + 0x93A4, "GL_PACK_REVERSE_ROW_ORDER_ANGLE", + }, + { + 0x9111, "GL_MAX_SERVER_WAIT_TIMEOUT_APPLE", + }, + { + 0x93A6, "GL_PROGRAM_BINARY_ANGLE", + }, + { + 0x9117, "GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE", + }, + { + 0x93A0, "GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE", + }, + { + 0x93A3, "GL_FRAMEBUFFER_ATTACHMENT_ANGLE", + }, + { + 0x93A2, "GL_TEXTURE_USAGE_ANGLE", + }, + { + 0x8802, "GL_STENCIL_BACK_PASS_DEPTH_FAIL", + }, + { + 0x9119, "GL_SIGNALED_APPLE", + }, + { + 0x9118, "GL_UNSIGNALED_APPLE", + }, + { + 0x9294, "GL_MULTIPLY_NV", + }, + { + 0x9295, "GL_SCREEN_NV", + }, + { + 0x9296, "GL_OVERLAY_NV", + }, + { + 0x9297, "GL_DARKEN_NV", + }, + { + 0x0020, "GL_MAP_UNSYNCHRONIZED_BIT_EXT", + }, + { + 0x8C01, "GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG", + }, + { + 0x8C00, "GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG", + }, + { + 0x8A52, "GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT", + }, + { + 0x8C02, "GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG", + }, + { + 0x84C9, "GL_TEXTURE9", + }, + { + 0x84C8, "GL_TEXTURE8", + }, + { + 0x8869, "GL_MAX_VERTEX_ATTRIBS", + }, + { + 0x84C3, "GL_TEXTURE3", + }, + { + 0x84C2, "GL_TEXTURE2", + }, + { + 0x84C1, "GL_TEXTURE1", + }, + { + 0x84C0, "GL_TEXTURE0", + }, + { + 0x84C7, "GL_TEXTURE7", + }, + { + 0x84C6, "GL_TEXTURE6", + }, + { + 0x84C5, "GL_TEXTURE5", + }, + { + 0x8803, "GL_STENCIL_BACK_PASS_DEPTH_PASS", + }, + { + 0x928A, "GL_SRC_IN_NV", + }, + { + 0x8518, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y", + }, + { + 0x8519, "GL_TEXTURE_CUBE_MAP_POSITIVE_Z", + }, + { + 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP", + }, + { + 0x8515, "GL_TEXTURE_CUBE_MAP_POSITIVE_X", + }, + { + 0x8516, "GL_TEXTURE_CUBE_MAP_NEGATIVE_X", + }, + { + 0x8517, "GL_TEXTURE_CUBE_MAP_POSITIVE_Y", + }, + { + 0x8513, "GL_TEXTURE_CUBE_MAP", + }, + { + 0x8626, "GL_CURRENT_VERTEX_ATTRIB", + }, + { + 0x92B1, "GL_PLUS_CLAMPED_NV", + }, + { + 0x92B0, "GL_HSL_LUMINOSITY_NV", + }, + { + 0x92B3, "GL_MINUS_CLAMPED_NV", + }, + { + 0x92B2, "GL_PLUS_CLAMPED_ALPHA_NV", + }, + { + 0x8765, "GL_BUFFER_USAGE", + }, + { + 0x8764, "GL_BUFFER_SIZE", + }, + { + 0x8B99, "GL_PALETTE8_RGB5_A1_OES", + }, + { + 0x0503, "GL_STACK_OVERFLOW_KHR", + }, + { + 0x0502, "GL_INVALID_OPERATION", + }, + { + 0x0501, "GL_INVALID_VALUE", + }, + { + 0x0500, "GL_INVALID_ENUM", + }, + { + 64, "GL_MAILBOX_SIZE_CHROMIUM", + }, + { + 0x0506, "GL_INVALID_FRAMEBUFFER_OPERATION", + }, + { + 0x0505, "GL_OUT_OF_MEMORY", + }, + { + 0x0504, "GL_STACK_UNDERFLOW_KHR", + }, + { + 0x0B44, "GL_CULL_FACE", + }, + { + 0x8B5E, "GL_SAMPLER_2D", + }, + { + 0x0B46, "GL_FRONT_FACE", + }, + { + 0x8FB3, "GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM", + }, + { + 0x824A, "GL_DEBUG_SOURCE_APPLICATION_KHR", + }, + { + 0x824B, "GL_DEBUG_SOURCE_OTHER_KHR", + }, + { + 0x824C, "GL_DEBUG_TYPE_ERROR_KHR", + }, + { + 0x824D, "GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR", + }, + { + 0x824E, "GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR", + }, + { + 0x824F, "GL_DEBUG_TYPE_PORTABILITY_KHR", + }, + { + 0x8B31, "GL_VERTEX_SHADER", + }, + { + 0x8B30, "GL_FRAGMENT_SHADER", + }, + { + 0x8FB1, "GL_CPU_OPTIMIZED_QCOM", + }, + { + 0x93D2, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR", + }, + { + 0x8B5A, "GL_FLOAT_MAT2", + }, + { + 0x84D8, "GL_TEXTURE24", + }, + { + 0x84D9, "GL_TEXTURE25", + }, + { + 0x84D6, "GL_TEXTURE22", + }, + { + 0x84D7, "GL_TEXTURE23", + }, + { + 0x84D4, "GL_TEXTURE20", + }, + { + 0x0D05, "GL_PACK_ALIGNMENT", + }, + { + 0x84D2, "GL_TEXTURE18", + }, + { + 0x84D3, "GL_TEXTURE19", + }, + { + 0x84D0, "GL_TEXTURE16", + }, + { + 0x84D1, "GL_TEXTURE17", + }, + { + 0x93D1, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR", + }, + { + 0x84DF, "GL_TEXTURE31", + }, + { + 0x8B97, "GL_PALETTE8_R5_G6_B5_OES", + }, + { + 0x84DD, "GL_TEXTURE29", + }, + { + 0x84DE, "GL_TEXTURE30", + }, + { + 0x84DB, "GL_TEXTURE27", + }, + { + 0x84DC, "GL_TEXTURE28", + }, + { + 0x6002, "GL_TEXTURE_POOL_UNMANAGED_CHROMIUM", + }, + { + 0x84DA, "GL_TEXTURE26", + }, + { + 0x8242, "GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR", + }, + { + 0x8243, "GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR", + }, + { + 0x8244, "GL_DEBUG_CALLBACK_FUNCTION_KHR", + }, + { + 0x8245, "GL_DEBUG_CALLBACK_USER_PARAM_KHR", + }, + { + 0x8246, "GL_DEBUG_SOURCE_API_KHR", + }, + { + 0x8247, "GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR", + }, + { + 0x8248, "GL_DEBUG_SOURCE_SHADER_COMPILER_KHR", + }, + { + 0x8249, "GL_DEBUG_SOURCE_THIRD_PARTY_KHR", + }, + { + 0x8B94, "GL_PALETTE4_RGB5_A1_OES", + }, + { + 0x00000040, "GL_COLOR_BUFFER_BIT6_QCOM", + }, + { + 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER", + }, + { + 0x8865, "GL_CURRENT_QUERY_EXT", + }, + { + 0x8866, "GL_QUERY_RESULT_EXT", + }, + { + 0x8867, "GL_QUERY_RESULT_AVAILABLE_EXT", + }, + { + 0x08000000, "GL_MULTISAMPLE_BUFFER_BIT3_QCOM", + }, + { + 0x87FA, "GL_3DC_XY_AMD", + }, + { + 0x84C4, "GL_TEXTURE4", + }, + { + 0x85B5, "GL_VERTEX_ARRAY_BINDING_OES", + }, + { + 0x8D6A, "GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT", + }, + { + 0x8D6C, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT", + }, + { + 0x8252, "GL_LOSE_CONTEXT_ON_RESET_EXT", + }, + { + 0x8C4C, "GL_COMPRESSED_SRGB_S3TC_DXT1_NV", + }, + { + 0x8C4E, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV", + }, + { + 0x1102, "GL_NICEST", + }, + { + 0x8C4F, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV", + }, + { + 0x93E9, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES", + }, + { + 0x93E8, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES", + }, + { + 0x8C43, "GL_SRGB8_ALPHA8_EXT", + }, + { + 0x8C42, "GL_SRGB_ALPHA_EXT", + }, + { + 0x8C45, "GL_SLUMINANCE8_ALPHA8_NV", + }, + { + 0x8C44, "GL_SLUMINANCE_ALPHA_NV", + }, + { + 0x8C47, "GL_SLUMINANCE8_NV", + }, + { + 0x8C46, "GL_SLUMINANCE_NV", + }, + { + 0x93E1, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES", + }, + { + 0x93E0, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES", + }, + { + 0x93E3, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES", + }, + { + 0x93E2, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES", + }, + { + 0x93E5, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES", + }, + { + 0x93E4, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES", + }, + { + 0x93E7, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES", + }, + { + 0x93E6, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES", + }, + { + 0x8D68, "GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES", + }, + { + 0x85BB, "GL_UNSIGNED_SHORT_8_8_REV_APPLE", + }, + { + 0x8D61, "GL_HALF_FLOAT_OES", + }, + { + 0x8D62, "GL_RGB565", + }, + { + 0x8D64, "GL_ETC1_RGB8_OES", + }, + { + 0x8D65, "GL_TEXTURE_EXTERNAL_OES", + }, + { + 0x8D66, "GL_SAMPLER_EXTERNAL_OES", + }, + { + 0x8D67, "GL_TEXTURE_BINDING_EXTERNAL_OES", + }, + { + 0x04000000, "GL_MULTISAMPLE_BUFFER_BIT2_QCOM", + }, + { + 0x8CEE, "GL_COLOR_ATTACHMENT14_EXT", + }, + { + 0x2800, "GL_TEXTURE_MAG_FILTER", + }, + { + 0x2801, "GL_TEXTURE_MIN_FILTER", + }, + { + 0x2802, "GL_TEXTURE_WRAP_S", + }, + { + 0x2803, "GL_TEXTURE_WRAP_T", + }, + { + 0x2703, "GL_LINEAR_MIPMAP_LINEAR", + }, + { + 0x8B98, "GL_PALETTE8_RGBA4_OES", + }, + { + 0x84F3, "GL_FENCE_STATUS_NV", + }, + { + 0x2702, "GL_NEAREST_MIPMAP_LINEAR", + }, + { + 0x1F03, "GL_EXTENSIONS", + }, + { + 0x1F02, "GL_VERSION", + }, + { + 0x1F01, "GL_RENDERER", + }, + { + 0x1F00, "GL_VENDOR", + }, + { + 0x9247, "GL_OVERLAY_TRANSFORM_FLIP_VERTICAL_CHROMIUM", + }, + { + 0x2701, "GL_LINEAR_MIPMAP_NEAREST", + }, + { + 0x9245, "GL_OVERLAY_TRANSFORM_NONE_CHROMIUM", + }, + { + 0x92B4, "GL_INVERT_OVG_NV", + }, + { + 0x9249, "GL_OVERLAY_TRANSFORM_ROTATE_180_CHROMIUM", + }, + { + 0x0B94, "GL_STENCIL_FAIL", + }, + { + 0x8B4C, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS", + }, + { + 0x8B4D, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS", + }, + { + 0x8B4F, "GL_SHADER_TYPE", + }, + { + 0x00004000, "GL_COLOR_BUFFER_BIT", + }, + { + 0x00000010, "GL_COLOR_BUFFER_BIT4_QCOM", + }, + { + 0x8834, "GL_DRAW_BUFFER15_EXT", + }, + { + 0x8833, "GL_DRAW_BUFFER14_EXT", + }, + { + 0x8832, "GL_DRAW_BUFFER13_EXT", + }, + { + 0x8831, "GL_DRAW_BUFFER12_EXT", + }, + { + 0x8830, "GL_DRAW_BUFFER11_EXT", + }, + { + 0x8DC5, "GL_SAMPLER_CUBE_SHADOW_NV", + }, + { + 0x93B8, "GL_COMPRESSED_RGBA_ASTC_10x5_KHR", + }, + { + 0x9241, "GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM", + }, + { + 0x00010000, "GL_STENCIL_BUFFER_BIT0_QCOM", + }, + { + 0x0B93, "GL_STENCIL_VALUE_MASK", + }, + { + 0x0B92, "GL_STENCIL_FUNC", + }, + { + 0x0B91, "GL_STENCIL_CLEAR_VALUE", + }, + { + 0x883D, "GL_BLEND_EQUATION_ALPHA", + }, + { + 0x0B97, "GL_STENCIL_REF", + }, + { + 0x0B96, "GL_STENCIL_PASS_DEPTH_PASS", + }, + { + 0x0B95, "GL_STENCIL_PASS_DEPTH_FAIL", + }, + { + 0x2700, "GL_NEAREST_MIPMAP_NEAREST", + }, + { + 0x0B98, "GL_STENCIL_WRITEMASK", + }, + { + 0x8B40, "GL_PROGRAM_OBJECT_EXT", + }, + { + 0x1004, "GL_TEXTURE_BORDER_COLOR_NV", + }, + { + 0x8B48, "GL_SHADER_OBJECT_EXT", + }, + { + 0x912F, "GL_TEXTURE_IMMUTABLE_FORMAT_EXT", + }, + { + 0x924A, "GL_OVERLAY_TRANSFORM_ROTATE_270_CHROMIUM", + }, + { + 0x20000000, "GL_MULTISAMPLE_BUFFER_BIT5_QCOM", + }, + { + 0x0DE1, "GL_TEXTURE_2D", + }, + { + 0x80C9, "GL_BLEND_SRC_RGB", + }, + { + 0x80C8, "GL_BLEND_DST_RGB", + }, + { + 0x8059, "GL_RGB10_A2_EXT", + }, + { + 0x8058, "GL_RGBA8_OES", + }, + { + 0x8B93, "GL_PALETTE4_RGBA4_OES", + }, + { + 0x00002000, "GL_DEPTH_BUFFER_BIT5_QCOM", + }, + { + 0x8051, "GL_RGB8_OES", + }, + { + 0x8052, "GL_RGB10_EXT", + }, + { + 0x8CAB, "GL_RENDERBUFFER_SAMPLES_ANGLE", + }, + { + 0x8057, "GL_RGB5_A1", + }, + { + 0x8056, "GL_RGBA4", + }, + { + 0x150A, "GL_INVERT", + }, + { + 0x01000000, "GL_MULTISAMPLE_BUFFER_BIT0_QCOM", + }, + { + 0x78ED, "GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM", + }, + { + 0x78EE, "GL_PIXEL_PACK_TRANSFER_BUFFER_BINDING_CHROMIUM", + }, + { + 0x78EF, "GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM", + }, + { + 0x0B45, "GL_CULL_FACE_MODE", + }, + { + 0x8B92, "GL_PALETTE4_R5_G6_B5_OES", + }, + { + 0x00100000, "GL_STENCIL_BUFFER_BIT4_QCOM", + }, + { + 0x9299, "GL_COLORDODGE_NV", + }, + { + 0x8D20, "GL_STENCIL_ATTACHMENT", + }, + { + 0x8B91, "GL_PALETTE4_RGBA8_OES", + }, + { + 0x00000200, "GL_DEPTH_BUFFER_BIT1_QCOM", + }, + { + 0x00008000, "GL_COVERAGE_BUFFER_BIT_NV", + }, + { + 0x1506, "GL_XOR_NV", + }, + { + 0x8CA8, "GL_READ_FRAMEBUFFER_ANGLE", + }, + { + 0x8CA9, "GL_DRAW_FRAMEBUFFER_ANGLE", + }, + { + 0x8CA6, "GL_FRAMEBUFFER_BINDING", + }, + { + 0x8CA7, "GL_RENDERBUFFER_BINDING", + }, + { + 0x8CA4, "GL_STENCIL_BACK_VALUE_MASK", + }, + { + 0x8CA5, "GL_STENCIL_BACK_WRITEMASK", + }, + { + 0x8B90, "GL_PALETTE4_RGB8_OES", + }, + { + 0x8CA3, "GL_STENCIL_BACK_REF", + }, + { + 0x80CB, "GL_BLEND_SRC_ALPHA", + }, + { + 0x80CA, "GL_BLEND_DST_ALPHA", + }, + { + 0x8CE7, "GL_COLOR_ATTACHMENT7_EXT", + }, + { + 0x93B0, "GL_COMPRESSED_RGBA_ASTC_4x4_KHR", + }, + { + 0x93B1, "GL_COMPRESSED_RGBA_ASTC_5x4_KHR", + }, + { + 0x93B2, "GL_COMPRESSED_RGBA_ASTC_5x5_KHR", + }, + { + 0x93B3, "GL_COMPRESSED_RGBA_ASTC_6x5_KHR", + }, + { + 0x93B4, "GL_COMPRESSED_RGBA_ASTC_6x6_KHR", + }, + { + 0x93B5, "GL_COMPRESSED_RGBA_ASTC_8x5_KHR", + }, + { + 0x93B6, "GL_COMPRESSED_RGBA_ASTC_8x6_KHR", + }, + { + 0x93B7, "GL_COMPRESSED_RGBA_ASTC_8x8_KHR", + }, + { + 0x8CD6, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT", + }, + { + 0x93B9, "GL_COMPRESSED_RGBA_ASTC_10x6_KHR", + }, + { + 0x8253, "GL_GUILTY_CONTEXT_RESET_EXT", + }, + { + 0x8CE5, "GL_COLOR_ATTACHMENT5_EXT", + }, + { + 0x8CE9, "GL_COLOR_ATTACHMENT9_EXT", + }, + { + 0x8B96, "GL_PALETTE8_RGBA8_OES", + }, + { + 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS", + }, + { + 0x8508, "GL_DECR_WRAP", + }, + { + 0x92AD, "GL_HSL_HUE_NV", + }, + { + 0x92AE, "GL_HSL_SATURATION_NV", + }, + { + 0x92AF, "GL_HSL_COLOR_NV", + }, + { + 0x8DC4, "GL_SAMPLER_2D_ARRAY_SHADOW_NV", + }, + { + 0x8507, "GL_INCR_WRAP", + }, + { + 0x8895, "GL_ELEMENT_ARRAY_BUFFER_BINDING", + }, + { + 0x8894, "GL_ARRAY_BUFFER_BINDING", + }, + { + 0x92A3, "GL_INVERT_RGB_NV", + }, + { + 0x92A4, "GL_LINEARDODGE_NV", + }, + { + 0x92A5, "GL_LINEARBURN_NV", + }, + { + 0x8893, "GL_ELEMENT_ARRAY_BUFFER", + }, + { + 0x8892, "GL_ARRAY_BUFFER", + }, + { + 0x92A8, "GL_PINLIGHT_NV", + }, + { + 0x92A9, "GL_HARDMIX_NV", + }, + { + 0x8BD8, "GL_TEXTURE_IMAGE_VALID_QCOM", + }, + { + 0x84D5, "GL_TEXTURE21", + }, + { + 0x9287, "GL_DST_NV", + }, + { + 0x93BA, "GL_COMPRESSED_RGBA_ASTC_10x8_KHR", + }, + { + 0x93BB, "GL_COMPRESSED_RGBA_ASTC_10x10_KHR", + }, + { + 0x93BC, "GL_COMPRESSED_RGBA_ASTC_12x10_KHR", + }, + { + 0x93BD, "GL_COMPRESSED_RGBA_ASTC_12x12_KHR", + }, + { + 0x84E8, "GL_MAX_RENDERBUFFER_SIZE", + }, + { + 0x9281, "GL_BLEND_OVERLAP_NV", + }, + { + 0x9280, "GL_BLEND_PREMULTIPLIED_SRC_NV", + }, + { + 0x8370, "GL_MIRRORED_REPEAT", + }, + { + 0x84E0, "GL_ACTIVE_TEXTURE", + }, + { + 0x8800, "GL_STENCIL_BACK_FUNC", + }, + { + 0x8801, "GL_STENCIL_BACK_FAIL", + }, + { + 0x0D33, "GL_MAX_TEXTURE_SIZE", + }, + { + 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE", + }, + { + 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE", + }, + { + 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED", + }, + { + 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE", + }, + { + 0x8DB9, "GL_FRAMEBUFFER_SRGB_EXT", + }, + { + 0x8259, "GL_ACTIVE_PROGRAM_EXT", + }, + { + 0x8258, "GL_PROGRAM_SEPARABLE_EXT", + }, + { + 0x8256, "GL_RESET_NOTIFICATION_STRATEGY_EXT", + }, + { + 0x8255, "GL_UNKNOWN_CONTEXT_RESET_EXT", + }, + { + 0x8254, "GL_INNOCENT_CONTEXT_RESET_EXT", + }, + { + 0x1100, "GL_DONT_CARE", + }, + { + 0x1101, "GL_FASTEST", + }, + { + 0x8251, "GL_DEBUG_TYPE_OTHER_KHR", + }, + { + 0x8250, "GL_DEBUG_TYPE_PERFORMANCE_KHR", + }, + { + 0x8CEB, "GL_COLOR_ATTACHMENT11_EXT", + }, + { + 0x8CEC, "GL_COLOR_ATTACHMENT12_EXT", + }, + { + 0x0408, "GL_FRONT_AND_BACK", + }, + { + 0x8CEA, "GL_COLOR_ATTACHMENT10_EXT", + }, + { + 0x8CEF, "GL_COLOR_ATTACHMENT15_EXT", + }, + { + 0x8CED, "GL_COLOR_ATTACHMENT13_EXT", + }, + { + 0x8829, "GL_DRAW_BUFFER4_EXT", + }, + { + 0x0404, "GL_FRONT", + }, + { + 0x0405, "GL_BACK", + }, + { + 0x88E1, "GL_STREAM_READ", + }, + { + 0x88E0, "GL_STREAM_DRAW", + }, + { + 0x88E4, "GL_STATIC_DRAW", + }, + { + 0x93C6, "GL_COMPRESSED_RGBA_ASTC_5x5x5_OES", + }, + { + 0x88E8, "GL_DYNAMIC_DRAW", + }, + { + 0x9291, "GL_PLUS_NV", + }, + { + 0x8CAA, "GL_READ_FRAMEBUFFER_BINDING_ANGLE", + }, + { + 0x93C5, "GL_COMPRESSED_RGBA_ASTC_5x5x4_OES", + }, + { + 0x40000000, "GL_MULTISAMPLE_BUFFER_BIT6_QCOM", + }, + { + 0x9116, "GL_SYNC_FENCE_APPLE", + }, + { + 0x93C4, "GL_COMPRESSED_RGBA_ASTC_5x4x4_OES", + }, + { + 0x88EE, "GL_ETC1_SRGB8_NV", + }, + { + 0x93C3, "GL_COMPRESSED_RGBA_ASTC_4x4x4_OES", + }, + { + 0x00000800, "GL_DEPTH_BUFFER_BIT3_QCOM", + }, + { + 0x1903, "GL_RED_EXT", + }, + { + 0x93C2, "GL_COMPRESSED_RGBA_ASTC_4x4x3_OES", + }, + { + 0x8CE2, "GL_COLOR_ATTACHMENT2_EXT", + }, + { + 0x8BC1, "GL_COUNTER_RANGE_AMD", + }, + { + 0x8CE0, "GL_COLOR_ATTACHMENT0", + }, + { + 0x8CE1, "GL_COLOR_ATTACHMENT1_EXT", + }, + { + 0x8CE6, "GL_COLOR_ATTACHMENT6_EXT", + }, + { + 0x93C1, "GL_COMPRESSED_RGBA_ASTC_4x3x3_OES", + }, + { + 0x8A1F, "GL_RGB_422_APPLE", + }, + { + 0x93DC, "GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR", + }, + { + 0x9292, "GL_PLUS_DARKER_NV", + }, + { + 0x8CE8, "GL_COLOR_ATTACHMENT8_EXT", + }, + { + 0x93C0, "GL_COMPRESSED_RGBA_ASTC_3x3x3_OES", + }, + { + 0x0C23, "GL_COLOR_WRITEMASK", + }, + { + 0x0C22, "GL_COLOR_CLEAR_VALUE", + }, + { + 0x8823, "GL_WRITEONLY_RENDERING_QCOM", + }, + { + 0x8824, "GL_MAX_DRAW_BUFFERS_EXT", + }, + { + 0x825A, "GL_PROGRAM_PIPELINE_BINDING_EXT", + }, + { + 0x1909, "GL_LUMINANCE", + }, + { + 0x0D3A, "GL_MAX_VIEWPORT_DIMS", + }, + { + 0x8B53, "GL_INT_VEC2", + }, + { + 0x8826, "GL_DRAW_BUFFER1_EXT", + }, + { + 0x809E, "GL_SAMPLE_ALPHA_TO_COVERAGE", + }, + { + 0x8BC0, "GL_COUNTER_TYPE_AMD", + }, + { + 0x8BC3, "GL_PERCENTAGE_AMD", + }, + { + 0x8BC2, "GL_UNSIGNED_INT64_AMD", + }, + { + 0x8BC5, "GL_PERFMON_RESULT_SIZE_AMD", + }, + { + 0x8BC4, "GL_PERFMON_RESULT_AVAILABLE_AMD", + }, + { + 0x8BC6, "GL_PERFMON_RESULT_AMD", + }, }; const GLES2Util::EnumToString* const GLES2Util::enum_to_string_table_ = @@ -678,731 +2356,717 @@ const GLES2Util::EnumToString* const GLES2Util::enum_to_string_table_ = const size_t GLES2Util::enum_to_string_table_len_ = sizeof(enum_to_string_table) / sizeof(enum_to_string_table[0]); -std::string GLES2Util::GetStringAttachment(uint32 value) { +std::string GLES2Util::GetStringAttachment(uint32_t value) { static const EnumToString string_table[] = { - { GL_COLOR_ATTACHMENT0, "GL_COLOR_ATTACHMENT0" }, - { GL_DEPTH_ATTACHMENT, "GL_DEPTH_ATTACHMENT" }, - { GL_STENCIL_ATTACHMENT, "GL_STENCIL_ATTACHMENT" }, + {GL_COLOR_ATTACHMENT0, "GL_COLOR_ATTACHMENT0"}, + {GL_DEPTH_ATTACHMENT, "GL_DEPTH_ATTACHMENT"}, + {GL_STENCIL_ATTACHMENT, "GL_STENCIL_ATTACHMENT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringBackbufferAttachment(uint32 value) { +std::string GLES2Util::GetStringBackbufferAttachment(uint32_t value) { static const EnumToString string_table[] = { - { GL_COLOR_EXT, "GL_COLOR_EXT" }, - { GL_DEPTH_EXT, "GL_DEPTH_EXT" }, - { GL_STENCIL_EXT, "GL_STENCIL_EXT" }, + {GL_COLOR_EXT, "GL_COLOR_EXT"}, + {GL_DEPTH_EXT, "GL_DEPTH_EXT"}, + {GL_STENCIL_EXT, "GL_STENCIL_EXT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringBlitFilter(uint32 value) { +std::string GLES2Util::GetStringBlitFilter(uint32_t value) { static const EnumToString string_table[] = { - { GL_NEAREST, "GL_NEAREST" }, - { GL_LINEAR, "GL_LINEAR" }, + {GL_NEAREST, "GL_NEAREST"}, {GL_LINEAR, "GL_LINEAR"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringBufferParameter(uint32 value) { +std::string GLES2Util::GetStringBufferParameter(uint32_t value) { static const EnumToString string_table[] = { - { GL_BUFFER_SIZE, "GL_BUFFER_SIZE" }, - { GL_BUFFER_USAGE, "GL_BUFFER_USAGE" }, + {GL_BUFFER_SIZE, "GL_BUFFER_SIZE"}, {GL_BUFFER_USAGE, "GL_BUFFER_USAGE"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringBufferTarget(uint32 value) { +std::string GLES2Util::GetStringBufferTarget(uint32_t value) { static const EnumToString string_table[] = { - { GL_ARRAY_BUFFER, "GL_ARRAY_BUFFER" }, - { GL_ELEMENT_ARRAY_BUFFER, "GL_ELEMENT_ARRAY_BUFFER" }, + {GL_ARRAY_BUFFER, "GL_ARRAY_BUFFER"}, + {GL_ELEMENT_ARRAY_BUFFER, "GL_ELEMENT_ARRAY_BUFFER"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringBufferUsage(uint32 value) { +std::string GLES2Util::GetStringBufferUsage(uint32_t value) { static const EnumToString string_table[] = { - { GL_STREAM_DRAW, "GL_STREAM_DRAW" }, - { GL_STATIC_DRAW, "GL_STATIC_DRAW" }, - { GL_DYNAMIC_DRAW, "GL_DYNAMIC_DRAW" }, + {GL_STREAM_DRAW, "GL_STREAM_DRAW"}, + {GL_STATIC_DRAW, "GL_STATIC_DRAW"}, + {GL_DYNAMIC_DRAW, "GL_DYNAMIC_DRAW"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringCapability(uint32 value) { +std::string GLES2Util::GetStringCapability(uint32_t value) { static const EnumToString string_table[] = { - { GL_BLEND, "GL_BLEND" }, - { GL_CULL_FACE, "GL_CULL_FACE" }, - { GL_DEPTH_TEST, "GL_DEPTH_TEST" }, - { GL_DITHER, "GL_DITHER" }, - { GL_POLYGON_OFFSET_FILL, "GL_POLYGON_OFFSET_FILL" }, - { GL_SAMPLE_ALPHA_TO_COVERAGE, "GL_SAMPLE_ALPHA_TO_COVERAGE" }, - { GL_SAMPLE_COVERAGE, "GL_SAMPLE_COVERAGE" }, - { GL_SCISSOR_TEST, "GL_SCISSOR_TEST" }, - { GL_STENCIL_TEST, "GL_STENCIL_TEST" }, + {GL_BLEND, "GL_BLEND"}, + {GL_CULL_FACE, "GL_CULL_FACE"}, + {GL_DEPTH_TEST, "GL_DEPTH_TEST"}, + {GL_DITHER, "GL_DITHER"}, + {GL_POLYGON_OFFSET_FILL, "GL_POLYGON_OFFSET_FILL"}, + {GL_SAMPLE_ALPHA_TO_COVERAGE, "GL_SAMPLE_ALPHA_TO_COVERAGE"}, + {GL_SAMPLE_COVERAGE, "GL_SAMPLE_COVERAGE"}, + {GL_SCISSOR_TEST, "GL_SCISSOR_TEST"}, + {GL_STENCIL_TEST, "GL_STENCIL_TEST"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringCmpFunction(uint32 value) { +std::string GLES2Util::GetStringCmpFunction(uint32_t value) { static const EnumToString string_table[] = { - { GL_NEVER, "GL_NEVER" }, - { GL_LESS, "GL_LESS" }, - { GL_EQUAL, "GL_EQUAL" }, - { GL_LEQUAL, "GL_LEQUAL" }, - { GL_GREATER, "GL_GREATER" }, - { GL_NOTEQUAL, "GL_NOTEQUAL" }, - { GL_GEQUAL, "GL_GEQUAL" }, - { GL_ALWAYS, "GL_ALWAYS" }, + {GL_NEVER, "GL_NEVER"}, + {GL_LESS, "GL_LESS"}, + {GL_EQUAL, "GL_EQUAL"}, + {GL_LEQUAL, "GL_LEQUAL"}, + {GL_GREATER, "GL_GREATER"}, + {GL_NOTEQUAL, "GL_NOTEQUAL"}, + {GL_GEQUAL, "GL_GEQUAL"}, + {GL_ALWAYS, "GL_ALWAYS"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringCompressedTextureFormat(uint32 value) { - return GLES2Util::GetQualifiedEnumString( - NULL, 0, value); +std::string GLES2Util::GetStringCompressedTextureFormat(uint32_t value) { + return GLES2Util::GetQualifiedEnumString(NULL, 0, value); } -std::string GLES2Util::GetStringDrawMode(uint32 value) { +std::string GLES2Util::GetStringDrawMode(uint32_t value) { static const EnumToString string_table[] = { - { GL_POINTS, "GL_POINTS" }, - { GL_LINE_STRIP, "GL_LINE_STRIP" }, - { GL_LINE_LOOP, "GL_LINE_LOOP" }, - { GL_LINES, "GL_LINES" }, - { GL_TRIANGLE_STRIP, "GL_TRIANGLE_STRIP" }, - { GL_TRIANGLE_FAN, "GL_TRIANGLE_FAN" }, - { GL_TRIANGLES, "GL_TRIANGLES" }, + {GL_POINTS, "GL_POINTS"}, + {GL_LINE_STRIP, "GL_LINE_STRIP"}, + {GL_LINE_LOOP, "GL_LINE_LOOP"}, + {GL_LINES, "GL_LINES"}, + {GL_TRIANGLE_STRIP, "GL_TRIANGLE_STRIP"}, + {GL_TRIANGLE_FAN, "GL_TRIANGLE_FAN"}, + {GL_TRIANGLES, "GL_TRIANGLES"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringDstBlendFactor(uint32 value) { +std::string GLES2Util::GetStringDstBlendFactor(uint32_t value) { static const EnumToString string_table[] = { - { GL_ZERO, "GL_ZERO" }, - { GL_ONE, "GL_ONE" }, - { GL_SRC_COLOR, "GL_SRC_COLOR" }, - { GL_ONE_MINUS_SRC_COLOR, "GL_ONE_MINUS_SRC_COLOR" }, - { GL_DST_COLOR, "GL_DST_COLOR" }, - { GL_ONE_MINUS_DST_COLOR, "GL_ONE_MINUS_DST_COLOR" }, - { GL_SRC_ALPHA, "GL_SRC_ALPHA" }, - { GL_ONE_MINUS_SRC_ALPHA, "GL_ONE_MINUS_SRC_ALPHA" }, - { GL_DST_ALPHA, "GL_DST_ALPHA" }, - { GL_ONE_MINUS_DST_ALPHA, "GL_ONE_MINUS_DST_ALPHA" }, - { GL_CONSTANT_COLOR, "GL_CONSTANT_COLOR" }, - { GL_ONE_MINUS_CONSTANT_COLOR, "GL_ONE_MINUS_CONSTANT_COLOR" }, - { GL_CONSTANT_ALPHA, "GL_CONSTANT_ALPHA" }, - { GL_ONE_MINUS_CONSTANT_ALPHA, "GL_ONE_MINUS_CONSTANT_ALPHA" }, + {GL_ZERO, "GL_ZERO"}, + {GL_ONE, "GL_ONE"}, + {GL_SRC_COLOR, "GL_SRC_COLOR"}, + {GL_ONE_MINUS_SRC_COLOR, "GL_ONE_MINUS_SRC_COLOR"}, + {GL_DST_COLOR, "GL_DST_COLOR"}, + {GL_ONE_MINUS_DST_COLOR, "GL_ONE_MINUS_DST_COLOR"}, + {GL_SRC_ALPHA, "GL_SRC_ALPHA"}, + {GL_ONE_MINUS_SRC_ALPHA, "GL_ONE_MINUS_SRC_ALPHA"}, + {GL_DST_ALPHA, "GL_DST_ALPHA"}, + {GL_ONE_MINUS_DST_ALPHA, "GL_ONE_MINUS_DST_ALPHA"}, + {GL_CONSTANT_COLOR, "GL_CONSTANT_COLOR"}, + {GL_ONE_MINUS_CONSTANT_COLOR, "GL_ONE_MINUS_CONSTANT_COLOR"}, + {GL_CONSTANT_ALPHA, "GL_CONSTANT_ALPHA"}, + {GL_ONE_MINUS_CONSTANT_ALPHA, "GL_ONE_MINUS_CONSTANT_ALPHA"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringEquation(uint32 value) { +std::string GLES2Util::GetStringEquation(uint32_t value) { static const EnumToString string_table[] = { - { GL_FUNC_ADD, "GL_FUNC_ADD" }, - { GL_FUNC_SUBTRACT, "GL_FUNC_SUBTRACT" }, - { GL_FUNC_REVERSE_SUBTRACT, "GL_FUNC_REVERSE_SUBTRACT" }, + {GL_FUNC_ADD, "GL_FUNC_ADD"}, + {GL_FUNC_SUBTRACT, "GL_FUNC_SUBTRACT"}, + {GL_FUNC_REVERSE_SUBTRACT, "GL_FUNC_REVERSE_SUBTRACT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringFaceMode(uint32 value) { +std::string GLES2Util::GetStringFaceMode(uint32_t value) { static const EnumToString string_table[] = { - { GL_CW, "GL_CW" }, - { GL_CCW, "GL_CCW" }, + {GL_CW, "GL_CW"}, {GL_CCW, "GL_CCW"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringFaceType(uint32 value) { +std::string GLES2Util::GetStringFaceType(uint32_t value) { static const EnumToString string_table[] = { - { GL_FRONT, "GL_FRONT" }, - { GL_BACK, "GL_BACK" }, - { GL_FRONT_AND_BACK, "GL_FRONT_AND_BACK" }, + {GL_FRONT, "GL_FRONT"}, + {GL_BACK, "GL_BACK"}, + {GL_FRONT_AND_BACK, "GL_FRONT_AND_BACK"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringFrameBufferParameter(uint32 value) { +std::string GLES2Util::GetStringFrameBufferParameter(uint32_t value) { static const EnumToString string_table[] = { - { GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, - "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE" }, - { GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, - "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME" }, - { GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, - "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL" }, - { GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, - "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE" }, + {GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, + "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE"}, + {GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, + "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"}, + {GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, + "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"}, + {GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, + "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringFrameBufferTarget(uint32 value) { +std::string GLES2Util::GetStringFrameBufferTarget(uint32_t value) { static const EnumToString string_table[] = { - { GL_FRAMEBUFFER, "GL_FRAMEBUFFER" }, + {GL_FRAMEBUFFER, "GL_FRAMEBUFFER"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringGLState(uint32 value) { +std::string GLES2Util::GetStringGLState(uint32_t value) { static const EnumToString string_table[] = { - { GL_ACTIVE_TEXTURE, "GL_ACTIVE_TEXTURE" }, - { GL_ALIASED_LINE_WIDTH_RANGE, "GL_ALIASED_LINE_WIDTH_RANGE" }, - { GL_ALIASED_POINT_SIZE_RANGE, "GL_ALIASED_POINT_SIZE_RANGE" }, - { GL_ALPHA_BITS, "GL_ALPHA_BITS" }, - { GL_ARRAY_BUFFER_BINDING, "GL_ARRAY_BUFFER_BINDING" }, - { GL_BLUE_BITS, "GL_BLUE_BITS" }, - { GL_COMPRESSED_TEXTURE_FORMATS, "GL_COMPRESSED_TEXTURE_FORMATS" }, - { GL_CURRENT_PROGRAM, "GL_CURRENT_PROGRAM" }, - { GL_DEPTH_BITS, "GL_DEPTH_BITS" }, - { GL_DEPTH_RANGE, "GL_DEPTH_RANGE" }, - { GL_ELEMENT_ARRAY_BUFFER_BINDING, "GL_ELEMENT_ARRAY_BUFFER_BINDING" }, - { GL_FRAMEBUFFER_BINDING, "GL_FRAMEBUFFER_BINDING" }, - { GL_GENERATE_MIPMAP_HINT, "GL_GENERATE_MIPMAP_HINT" }, - { GL_GREEN_BITS, "GL_GREEN_BITS" }, - { GL_IMPLEMENTATION_COLOR_READ_FORMAT, - "GL_IMPLEMENTATION_COLOR_READ_FORMAT" }, - { GL_IMPLEMENTATION_COLOR_READ_TYPE, "GL_IMPLEMENTATION_COLOR_READ_TYPE" }, - { GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, - "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS" }, - { GL_MAX_CUBE_MAP_TEXTURE_SIZE, "GL_MAX_CUBE_MAP_TEXTURE_SIZE" }, - { GL_MAX_FRAGMENT_UNIFORM_VECTORS, "GL_MAX_FRAGMENT_UNIFORM_VECTORS" }, - { GL_MAX_RENDERBUFFER_SIZE, "GL_MAX_RENDERBUFFER_SIZE" }, - { GL_MAX_TEXTURE_IMAGE_UNITS, "GL_MAX_TEXTURE_IMAGE_UNITS" }, - { GL_MAX_TEXTURE_SIZE, "GL_MAX_TEXTURE_SIZE" }, - { GL_MAX_VARYING_VECTORS, "GL_MAX_VARYING_VECTORS" }, - { GL_MAX_VERTEX_ATTRIBS, "GL_MAX_VERTEX_ATTRIBS" }, - { GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS" }, - { GL_MAX_VERTEX_UNIFORM_VECTORS, "GL_MAX_VERTEX_UNIFORM_VECTORS" }, - { GL_MAX_VIEWPORT_DIMS, "GL_MAX_VIEWPORT_DIMS" }, - { GL_NUM_COMPRESSED_TEXTURE_FORMATS, "GL_NUM_COMPRESSED_TEXTURE_FORMATS" }, - { GL_NUM_SHADER_BINARY_FORMATS, "GL_NUM_SHADER_BINARY_FORMATS" }, - { GL_PACK_ALIGNMENT, "GL_PACK_ALIGNMENT" }, - { GL_RED_BITS, "GL_RED_BITS" }, - { GL_RENDERBUFFER_BINDING, "GL_RENDERBUFFER_BINDING" }, - { GL_SAMPLE_BUFFERS, "GL_SAMPLE_BUFFERS" }, - { GL_SAMPLE_COVERAGE_INVERT, "GL_SAMPLE_COVERAGE_INVERT" }, - { GL_SAMPLE_COVERAGE_VALUE, "GL_SAMPLE_COVERAGE_VALUE" }, - { GL_SAMPLES, "GL_SAMPLES" }, - { GL_SCISSOR_BOX, "GL_SCISSOR_BOX" }, - { GL_SHADER_BINARY_FORMATS, "GL_SHADER_BINARY_FORMATS" }, - { GL_SHADER_COMPILER, "GL_SHADER_COMPILER" }, - { GL_SUBPIXEL_BITS, "GL_SUBPIXEL_BITS" }, - { GL_STENCIL_BITS, "GL_STENCIL_BITS" }, - { GL_TEXTURE_BINDING_2D, "GL_TEXTURE_BINDING_2D" }, - { GL_TEXTURE_BINDING_CUBE_MAP, "GL_TEXTURE_BINDING_CUBE_MAP" }, - { GL_UNPACK_ALIGNMENT, "GL_UNPACK_ALIGNMENT" }, - { GL_UNPACK_FLIP_Y_CHROMIUM, "GL_UNPACK_FLIP_Y_CHROMIUM" }, - { GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, - "GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM" }, - { GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, - "GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM" }, - { GL_VERTEX_ARRAY_BINDING_OES, "GL_VERTEX_ARRAY_BINDING_OES" }, - { GL_VIEWPORT, "GL_VIEWPORT" }, - { GL_BLEND_COLOR, "GL_BLEND_COLOR" }, - { GL_BLEND_EQUATION_RGB, "GL_BLEND_EQUATION_RGB" }, - { GL_BLEND_EQUATION_ALPHA, "GL_BLEND_EQUATION_ALPHA" }, - { GL_BLEND_SRC_RGB, "GL_BLEND_SRC_RGB" }, - { GL_BLEND_DST_RGB, "GL_BLEND_DST_RGB" }, - { GL_BLEND_SRC_ALPHA, "GL_BLEND_SRC_ALPHA" }, - { GL_BLEND_DST_ALPHA, "GL_BLEND_DST_ALPHA" }, - { GL_COLOR_CLEAR_VALUE, "GL_COLOR_CLEAR_VALUE" }, - { GL_DEPTH_CLEAR_VALUE, "GL_DEPTH_CLEAR_VALUE" }, - { GL_STENCIL_CLEAR_VALUE, "GL_STENCIL_CLEAR_VALUE" }, - { GL_COLOR_WRITEMASK, "GL_COLOR_WRITEMASK" }, - { GL_CULL_FACE_MODE, "GL_CULL_FACE_MODE" }, - { GL_DEPTH_FUNC, "GL_DEPTH_FUNC" }, - { GL_DEPTH_WRITEMASK, "GL_DEPTH_WRITEMASK" }, - { GL_DEPTH_RANGE, "GL_DEPTH_RANGE" }, - { GL_FRONT_FACE, "GL_FRONT_FACE" }, - { GL_GENERATE_MIPMAP_HINT, "GL_GENERATE_MIPMAP_HINT" }, - { GL_LINE_WIDTH, "GL_LINE_WIDTH" }, - { GL_PACK_ALIGNMENT, "GL_PACK_ALIGNMENT" }, - { GL_UNPACK_ALIGNMENT, "GL_UNPACK_ALIGNMENT" }, - { GL_POLYGON_OFFSET_FACTOR, "GL_POLYGON_OFFSET_FACTOR" }, - { GL_POLYGON_OFFSET_UNITS, "GL_POLYGON_OFFSET_UNITS" }, - { GL_SAMPLE_COVERAGE_VALUE, "GL_SAMPLE_COVERAGE_VALUE" }, - { GL_SAMPLE_COVERAGE_INVERT, "GL_SAMPLE_COVERAGE_INVERT" }, - { GL_SCISSOR_BOX, "GL_SCISSOR_BOX" }, - { GL_STENCIL_FUNC, "GL_STENCIL_FUNC" }, - { GL_STENCIL_REF, "GL_STENCIL_REF" }, - { GL_STENCIL_VALUE_MASK, "GL_STENCIL_VALUE_MASK" }, - { GL_STENCIL_BACK_FUNC, "GL_STENCIL_BACK_FUNC" }, - { GL_STENCIL_BACK_REF, "GL_STENCIL_BACK_REF" }, - { GL_STENCIL_BACK_VALUE_MASK, "GL_STENCIL_BACK_VALUE_MASK" }, - { GL_STENCIL_WRITEMASK, "GL_STENCIL_WRITEMASK" }, - { GL_STENCIL_BACK_WRITEMASK, "GL_STENCIL_BACK_WRITEMASK" }, - { GL_STENCIL_FAIL, "GL_STENCIL_FAIL" }, - { GL_STENCIL_PASS_DEPTH_FAIL, "GL_STENCIL_PASS_DEPTH_FAIL" }, - { GL_STENCIL_PASS_DEPTH_PASS, "GL_STENCIL_PASS_DEPTH_PASS" }, - { GL_STENCIL_BACK_FAIL, "GL_STENCIL_BACK_FAIL" }, - { GL_STENCIL_BACK_PASS_DEPTH_FAIL, "GL_STENCIL_BACK_PASS_DEPTH_FAIL" }, - { GL_STENCIL_BACK_PASS_DEPTH_PASS, "GL_STENCIL_BACK_PASS_DEPTH_PASS" }, - { GL_VIEWPORT, "GL_VIEWPORT" }, - { GL_BLEND, "GL_BLEND" }, - { GL_CULL_FACE, "GL_CULL_FACE" }, - { GL_DEPTH_TEST, "GL_DEPTH_TEST" }, - { GL_DITHER, "GL_DITHER" }, - { GL_POLYGON_OFFSET_FILL, "GL_POLYGON_OFFSET_FILL" }, - { GL_SAMPLE_ALPHA_TO_COVERAGE, "GL_SAMPLE_ALPHA_TO_COVERAGE" }, - { GL_SAMPLE_COVERAGE, "GL_SAMPLE_COVERAGE" }, - { GL_SCISSOR_TEST, "GL_SCISSOR_TEST" }, - { GL_STENCIL_TEST, "GL_STENCIL_TEST" }, + {GL_ACTIVE_TEXTURE, "GL_ACTIVE_TEXTURE"}, + {GL_ALIASED_LINE_WIDTH_RANGE, "GL_ALIASED_LINE_WIDTH_RANGE"}, + {GL_ALIASED_POINT_SIZE_RANGE, "GL_ALIASED_POINT_SIZE_RANGE"}, + {GL_ALPHA_BITS, "GL_ALPHA_BITS"}, + {GL_ARRAY_BUFFER_BINDING, "GL_ARRAY_BUFFER_BINDING"}, + {GL_BLUE_BITS, "GL_BLUE_BITS"}, + {GL_COMPRESSED_TEXTURE_FORMATS, "GL_COMPRESSED_TEXTURE_FORMATS"}, + {GL_CURRENT_PROGRAM, "GL_CURRENT_PROGRAM"}, + {GL_DEPTH_BITS, "GL_DEPTH_BITS"}, + {GL_DEPTH_RANGE, "GL_DEPTH_RANGE"}, + {GL_ELEMENT_ARRAY_BUFFER_BINDING, "GL_ELEMENT_ARRAY_BUFFER_BINDING"}, + {GL_FRAMEBUFFER_BINDING, "GL_FRAMEBUFFER_BINDING"}, + {GL_GENERATE_MIPMAP_HINT, "GL_GENERATE_MIPMAP_HINT"}, + {GL_GREEN_BITS, "GL_GREEN_BITS"}, + {GL_IMPLEMENTATION_COLOR_READ_FORMAT, + "GL_IMPLEMENTATION_COLOR_READ_FORMAT"}, + {GL_IMPLEMENTATION_COLOR_READ_TYPE, "GL_IMPLEMENTATION_COLOR_READ_TYPE"}, + {GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, + "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS"}, + {GL_MAX_CUBE_MAP_TEXTURE_SIZE, "GL_MAX_CUBE_MAP_TEXTURE_SIZE"}, + {GL_MAX_FRAGMENT_UNIFORM_VECTORS, "GL_MAX_FRAGMENT_UNIFORM_VECTORS"}, + {GL_MAX_RENDERBUFFER_SIZE, "GL_MAX_RENDERBUFFER_SIZE"}, + {GL_MAX_TEXTURE_IMAGE_UNITS, "GL_MAX_TEXTURE_IMAGE_UNITS"}, + {GL_MAX_TEXTURE_SIZE, "GL_MAX_TEXTURE_SIZE"}, + {GL_MAX_VARYING_VECTORS, "GL_MAX_VARYING_VECTORS"}, + {GL_MAX_VERTEX_ATTRIBS, "GL_MAX_VERTEX_ATTRIBS"}, + {GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS"}, + {GL_MAX_VERTEX_UNIFORM_VECTORS, "GL_MAX_VERTEX_UNIFORM_VECTORS"}, + {GL_MAX_VIEWPORT_DIMS, "GL_MAX_VIEWPORT_DIMS"}, + {GL_NUM_COMPRESSED_TEXTURE_FORMATS, "GL_NUM_COMPRESSED_TEXTURE_FORMATS"}, + {GL_NUM_SHADER_BINARY_FORMATS, "GL_NUM_SHADER_BINARY_FORMATS"}, + {GL_PACK_ALIGNMENT, "GL_PACK_ALIGNMENT"}, + {GL_RED_BITS, "GL_RED_BITS"}, + {GL_RENDERBUFFER_BINDING, "GL_RENDERBUFFER_BINDING"}, + {GL_SAMPLE_BUFFERS, "GL_SAMPLE_BUFFERS"}, + {GL_SAMPLE_COVERAGE_INVERT, "GL_SAMPLE_COVERAGE_INVERT"}, + {GL_SAMPLE_COVERAGE_VALUE, "GL_SAMPLE_COVERAGE_VALUE"}, + {GL_SAMPLES, "GL_SAMPLES"}, + {GL_SCISSOR_BOX, "GL_SCISSOR_BOX"}, + {GL_SHADER_BINARY_FORMATS, "GL_SHADER_BINARY_FORMATS"}, + {GL_SHADER_COMPILER, "GL_SHADER_COMPILER"}, + {GL_SUBPIXEL_BITS, "GL_SUBPIXEL_BITS"}, + {GL_STENCIL_BITS, "GL_STENCIL_BITS"}, + {GL_TEXTURE_BINDING_2D, "GL_TEXTURE_BINDING_2D"}, + {GL_TEXTURE_BINDING_CUBE_MAP, "GL_TEXTURE_BINDING_CUBE_MAP"}, + {GL_UNPACK_ALIGNMENT, "GL_UNPACK_ALIGNMENT"}, + {GL_UNPACK_FLIP_Y_CHROMIUM, "GL_UNPACK_FLIP_Y_CHROMIUM"}, + {GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, + "GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM"}, + {GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, + "GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM"}, + {GL_BIND_GENERATES_RESOURCE_CHROMIUM, + "GL_BIND_GENERATES_RESOURCE_CHROMIUM"}, + {GL_VERTEX_ARRAY_BINDING_OES, "GL_VERTEX_ARRAY_BINDING_OES"}, + {GL_VIEWPORT, "GL_VIEWPORT"}, + {GL_BLEND_COLOR, "GL_BLEND_COLOR"}, + {GL_BLEND_EQUATION_RGB, "GL_BLEND_EQUATION_RGB"}, + {GL_BLEND_EQUATION_ALPHA, "GL_BLEND_EQUATION_ALPHA"}, + {GL_BLEND_SRC_RGB, "GL_BLEND_SRC_RGB"}, + {GL_BLEND_DST_RGB, "GL_BLEND_DST_RGB"}, + {GL_BLEND_SRC_ALPHA, "GL_BLEND_SRC_ALPHA"}, + {GL_BLEND_DST_ALPHA, "GL_BLEND_DST_ALPHA"}, + {GL_COLOR_CLEAR_VALUE, "GL_COLOR_CLEAR_VALUE"}, + {GL_DEPTH_CLEAR_VALUE, "GL_DEPTH_CLEAR_VALUE"}, + {GL_STENCIL_CLEAR_VALUE, "GL_STENCIL_CLEAR_VALUE"}, + {GL_COLOR_WRITEMASK, "GL_COLOR_WRITEMASK"}, + {GL_CULL_FACE_MODE, "GL_CULL_FACE_MODE"}, + {GL_DEPTH_FUNC, "GL_DEPTH_FUNC"}, + {GL_DEPTH_WRITEMASK, "GL_DEPTH_WRITEMASK"}, + {GL_FRONT_FACE, "GL_FRONT_FACE"}, + {GL_LINE_WIDTH, "GL_LINE_WIDTH"}, + {GL_POLYGON_OFFSET_FACTOR, "GL_POLYGON_OFFSET_FACTOR"}, + {GL_POLYGON_OFFSET_UNITS, "GL_POLYGON_OFFSET_UNITS"}, + {GL_STENCIL_FUNC, "GL_STENCIL_FUNC"}, + {GL_STENCIL_REF, "GL_STENCIL_REF"}, + {GL_STENCIL_VALUE_MASK, "GL_STENCIL_VALUE_MASK"}, + {GL_STENCIL_BACK_FUNC, "GL_STENCIL_BACK_FUNC"}, + {GL_STENCIL_BACK_REF, "GL_STENCIL_BACK_REF"}, + {GL_STENCIL_BACK_VALUE_MASK, "GL_STENCIL_BACK_VALUE_MASK"}, + {GL_STENCIL_WRITEMASK, "GL_STENCIL_WRITEMASK"}, + {GL_STENCIL_BACK_WRITEMASK, "GL_STENCIL_BACK_WRITEMASK"}, + {GL_STENCIL_FAIL, "GL_STENCIL_FAIL"}, + {GL_STENCIL_PASS_DEPTH_FAIL, "GL_STENCIL_PASS_DEPTH_FAIL"}, + {GL_STENCIL_PASS_DEPTH_PASS, "GL_STENCIL_PASS_DEPTH_PASS"}, + {GL_STENCIL_BACK_FAIL, "GL_STENCIL_BACK_FAIL"}, + {GL_STENCIL_BACK_PASS_DEPTH_FAIL, "GL_STENCIL_BACK_PASS_DEPTH_FAIL"}, + {GL_STENCIL_BACK_PASS_DEPTH_PASS, "GL_STENCIL_BACK_PASS_DEPTH_PASS"}, + {GL_BLEND, "GL_BLEND"}, + {GL_CULL_FACE, "GL_CULL_FACE"}, + {GL_DEPTH_TEST, "GL_DEPTH_TEST"}, + {GL_DITHER, "GL_DITHER"}, + {GL_POLYGON_OFFSET_FILL, "GL_POLYGON_OFFSET_FILL"}, + {GL_SAMPLE_ALPHA_TO_COVERAGE, "GL_SAMPLE_ALPHA_TO_COVERAGE"}, + {GL_SAMPLE_COVERAGE, "GL_SAMPLE_COVERAGE"}, + {GL_SCISSOR_TEST, "GL_SCISSOR_TEST"}, + {GL_STENCIL_TEST, "GL_STENCIL_TEST"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringGetMaxIndexType(uint32 value) { +std::string GLES2Util::GetStringGetMaxIndexType(uint32_t value) { static const EnumToString string_table[] = { - { GL_UNSIGNED_BYTE, "GL_UNSIGNED_BYTE" }, - { GL_UNSIGNED_SHORT, "GL_UNSIGNED_SHORT" }, - { GL_UNSIGNED_INT, "GL_UNSIGNED_INT" }, + {GL_UNSIGNED_BYTE, "GL_UNSIGNED_BYTE"}, + {GL_UNSIGNED_SHORT, "GL_UNSIGNED_SHORT"}, + {GL_UNSIGNED_INT, "GL_UNSIGNED_INT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringGetTexParamTarget(uint32 value) { +std::string GLES2Util::GetStringGetTexParamTarget(uint32_t value) { static const EnumToString string_table[] = { - { GL_TEXTURE_2D, "GL_TEXTURE_2D" }, - { GL_TEXTURE_CUBE_MAP, "GL_TEXTURE_CUBE_MAP" }, + {GL_TEXTURE_2D, "GL_TEXTURE_2D"}, + {GL_TEXTURE_CUBE_MAP, "GL_TEXTURE_CUBE_MAP"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringHintMode(uint32 value) { +std::string GLES2Util::GetStringHintMode(uint32_t value) { static const EnumToString string_table[] = { - { GL_FASTEST, "GL_FASTEST" }, - { GL_NICEST, "GL_NICEST" }, - { GL_DONT_CARE, "GL_DONT_CARE" }, + {GL_FASTEST, "GL_FASTEST"}, + {GL_NICEST, "GL_NICEST"}, + {GL_DONT_CARE, "GL_DONT_CARE"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringHintTarget(uint32 value) { +std::string GLES2Util::GetStringHintTarget(uint32_t value) { static const EnumToString string_table[] = { - { GL_GENERATE_MIPMAP_HINT, "GL_GENERATE_MIPMAP_HINT" }, + {GL_GENERATE_MIPMAP_HINT, "GL_GENERATE_MIPMAP_HINT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringIndexType(uint32 value) { +std::string GLES2Util::GetStringIndexType(uint32_t value) { static const EnumToString string_table[] = { - { GL_UNSIGNED_BYTE, "GL_UNSIGNED_BYTE" }, - { GL_UNSIGNED_SHORT, "GL_UNSIGNED_SHORT" }, + {GL_UNSIGNED_BYTE, "GL_UNSIGNED_BYTE"}, + {GL_UNSIGNED_SHORT, "GL_UNSIGNED_SHORT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringPixelStore(uint32 value) { +std::string GLES2Util::GetStringPixelStore(uint32_t value) { static const EnumToString string_table[] = { - { GL_PACK_ALIGNMENT, "GL_PACK_ALIGNMENT" }, - { GL_UNPACK_ALIGNMENT, "GL_UNPACK_ALIGNMENT" }, - { GL_UNPACK_FLIP_Y_CHROMIUM, "GL_UNPACK_FLIP_Y_CHROMIUM" }, - { GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, - "GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM" }, - { GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, - "GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM" }, + {GL_PACK_ALIGNMENT, "GL_PACK_ALIGNMENT"}, + {GL_UNPACK_ALIGNMENT, "GL_UNPACK_ALIGNMENT"}, + {GL_UNPACK_FLIP_Y_CHROMIUM, "GL_UNPACK_FLIP_Y_CHROMIUM"}, + {GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, + "GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM"}, + {GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, + "GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringPixelType(uint32 value) { +std::string GLES2Util::GetStringPixelType(uint32_t value) { static const EnumToString string_table[] = { - { GL_UNSIGNED_BYTE, "GL_UNSIGNED_BYTE" }, - { GL_UNSIGNED_SHORT_5_6_5, "GL_UNSIGNED_SHORT_5_6_5" }, - { GL_UNSIGNED_SHORT_4_4_4_4, "GL_UNSIGNED_SHORT_4_4_4_4" }, - { GL_UNSIGNED_SHORT_5_5_5_1, "GL_UNSIGNED_SHORT_5_5_5_1" }, + {GL_UNSIGNED_BYTE, "GL_UNSIGNED_BYTE"}, + {GL_UNSIGNED_SHORT_5_6_5, "GL_UNSIGNED_SHORT_5_6_5"}, + {GL_UNSIGNED_SHORT_4_4_4_4, "GL_UNSIGNED_SHORT_4_4_4_4"}, + {GL_UNSIGNED_SHORT_5_5_5_1, "GL_UNSIGNED_SHORT_5_5_5_1"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringProgramParameter(uint32 value) { +std::string GLES2Util::GetStringProgramParameter(uint32_t value) { static const EnumToString string_table[] = { - { GL_DELETE_STATUS, "GL_DELETE_STATUS" }, - { GL_LINK_STATUS, "GL_LINK_STATUS" }, - { GL_VALIDATE_STATUS, "GL_VALIDATE_STATUS" }, - { GL_INFO_LOG_LENGTH, "GL_INFO_LOG_LENGTH" }, - { GL_ATTACHED_SHADERS, "GL_ATTACHED_SHADERS" }, - { GL_ACTIVE_ATTRIBUTES, "GL_ACTIVE_ATTRIBUTES" }, - { GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH" }, - { GL_ACTIVE_UNIFORMS, "GL_ACTIVE_UNIFORMS" }, - { GL_ACTIVE_UNIFORM_MAX_LENGTH, "GL_ACTIVE_UNIFORM_MAX_LENGTH" }, + {GL_DELETE_STATUS, "GL_DELETE_STATUS"}, + {GL_LINK_STATUS, "GL_LINK_STATUS"}, + {GL_VALIDATE_STATUS, "GL_VALIDATE_STATUS"}, + {GL_INFO_LOG_LENGTH, "GL_INFO_LOG_LENGTH"}, + {GL_ATTACHED_SHADERS, "GL_ATTACHED_SHADERS"}, + {GL_ACTIVE_ATTRIBUTES, "GL_ACTIVE_ATTRIBUTES"}, + {GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH"}, + {GL_ACTIVE_UNIFORMS, "GL_ACTIVE_UNIFORMS"}, + {GL_ACTIVE_UNIFORM_MAX_LENGTH, "GL_ACTIVE_UNIFORM_MAX_LENGTH"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringQueryObjectParameter(uint32 value) { +std::string GLES2Util::GetStringQueryObjectParameter(uint32_t value) { static const EnumToString string_table[] = { - { GL_QUERY_RESULT_EXT, "GL_QUERY_RESULT_EXT" }, - { GL_QUERY_RESULT_AVAILABLE_EXT, "GL_QUERY_RESULT_AVAILABLE_EXT" }, + {GL_QUERY_RESULT_EXT, "GL_QUERY_RESULT_EXT"}, + {GL_QUERY_RESULT_AVAILABLE_EXT, "GL_QUERY_RESULT_AVAILABLE_EXT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringQueryParameter(uint32 value) { +std::string GLES2Util::GetStringQueryParameter(uint32_t value) { static const EnumToString string_table[] = { - { GL_CURRENT_QUERY_EXT, "GL_CURRENT_QUERY_EXT" }, + {GL_CURRENT_QUERY_EXT, "GL_CURRENT_QUERY_EXT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringQueryTarget(uint32 value) { +std::string GLES2Util::GetStringQueryTarget(uint32_t value) { static const EnumToString string_table[] = { - { GL_ANY_SAMPLES_PASSED_EXT, "GL_ANY_SAMPLES_PASSED_EXT" }, - { GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, - "GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT" }, - { GL_COMMANDS_ISSUED_CHROMIUM, "GL_COMMANDS_ISSUED_CHROMIUM" }, - { GL_LATENCY_QUERY_CHROMIUM, "GL_LATENCY_QUERY_CHROMIUM" }, - { GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, - "GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM" }, - { GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, - "GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM" }, + {GL_ANY_SAMPLES_PASSED_EXT, "GL_ANY_SAMPLES_PASSED_EXT"}, + {GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, + "GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT"}, + {GL_COMMANDS_ISSUED_CHROMIUM, "GL_COMMANDS_ISSUED_CHROMIUM"}, + {GL_LATENCY_QUERY_CHROMIUM, "GL_LATENCY_QUERY_CHROMIUM"}, + {GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, + "GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM"}, + {GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, + "GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM"}, + {GL_COMMANDS_COMPLETED_CHROMIUM, "GL_COMMANDS_COMPLETED_CHROMIUM"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringReadPixelFormat(uint32 value) { +std::string GLES2Util::GetStringReadPixelFormat(uint32_t value) { static const EnumToString string_table[] = { - { GL_ALPHA, "GL_ALPHA" }, - { GL_RGB, "GL_RGB" }, - { GL_RGBA, "GL_RGBA" }, + {GL_ALPHA, "GL_ALPHA"}, {GL_RGB, "GL_RGB"}, {GL_RGBA, "GL_RGBA"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringReadPixelType(uint32 value) { +std::string GLES2Util::GetStringReadPixelType(uint32_t value) { static const EnumToString string_table[] = { - { GL_UNSIGNED_BYTE, "GL_UNSIGNED_BYTE" }, - { GL_UNSIGNED_SHORT_5_6_5, "GL_UNSIGNED_SHORT_5_6_5" }, - { GL_UNSIGNED_SHORT_4_4_4_4, "GL_UNSIGNED_SHORT_4_4_4_4" }, - { GL_UNSIGNED_SHORT_5_5_5_1, "GL_UNSIGNED_SHORT_5_5_5_1" }, + {GL_UNSIGNED_BYTE, "GL_UNSIGNED_BYTE"}, + {GL_UNSIGNED_SHORT_5_6_5, "GL_UNSIGNED_SHORT_5_6_5"}, + {GL_UNSIGNED_SHORT_4_4_4_4, "GL_UNSIGNED_SHORT_4_4_4_4"}, + {GL_UNSIGNED_SHORT_5_5_5_1, "GL_UNSIGNED_SHORT_5_5_5_1"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringRenderBufferFormat(uint32 value) { +std::string GLES2Util::GetStringRenderBufferFormat(uint32_t value) { static const EnumToString string_table[] = { - { GL_RGBA4, "GL_RGBA4" }, - { GL_RGB565, "GL_RGB565" }, - { GL_RGB5_A1, "GL_RGB5_A1" }, - { GL_DEPTH_COMPONENT16, "GL_DEPTH_COMPONENT16" }, - { GL_STENCIL_INDEX8, "GL_STENCIL_INDEX8" }, + {GL_RGBA4, "GL_RGBA4"}, + {GL_RGB565, "GL_RGB565"}, + {GL_RGB5_A1, "GL_RGB5_A1"}, + {GL_DEPTH_COMPONENT16, "GL_DEPTH_COMPONENT16"}, + {GL_STENCIL_INDEX8, "GL_STENCIL_INDEX8"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringRenderBufferParameter(uint32 value) { +std::string GLES2Util::GetStringRenderBufferParameter(uint32_t value) { static const EnumToString string_table[] = { - { GL_RENDERBUFFER_RED_SIZE, "GL_RENDERBUFFER_RED_SIZE" }, - { GL_RENDERBUFFER_GREEN_SIZE, "GL_RENDERBUFFER_GREEN_SIZE" }, - { GL_RENDERBUFFER_BLUE_SIZE, "GL_RENDERBUFFER_BLUE_SIZE" }, - { GL_RENDERBUFFER_ALPHA_SIZE, "GL_RENDERBUFFER_ALPHA_SIZE" }, - { GL_RENDERBUFFER_DEPTH_SIZE, "GL_RENDERBUFFER_DEPTH_SIZE" }, - { GL_RENDERBUFFER_STENCIL_SIZE, "GL_RENDERBUFFER_STENCIL_SIZE" }, - { GL_RENDERBUFFER_WIDTH, "GL_RENDERBUFFER_WIDTH" }, - { GL_RENDERBUFFER_HEIGHT, "GL_RENDERBUFFER_HEIGHT" }, - { GL_RENDERBUFFER_INTERNAL_FORMAT, "GL_RENDERBUFFER_INTERNAL_FORMAT" }, + {GL_RENDERBUFFER_RED_SIZE, "GL_RENDERBUFFER_RED_SIZE"}, + {GL_RENDERBUFFER_GREEN_SIZE, "GL_RENDERBUFFER_GREEN_SIZE"}, + {GL_RENDERBUFFER_BLUE_SIZE, "GL_RENDERBUFFER_BLUE_SIZE"}, + {GL_RENDERBUFFER_ALPHA_SIZE, "GL_RENDERBUFFER_ALPHA_SIZE"}, + {GL_RENDERBUFFER_DEPTH_SIZE, "GL_RENDERBUFFER_DEPTH_SIZE"}, + {GL_RENDERBUFFER_STENCIL_SIZE, "GL_RENDERBUFFER_STENCIL_SIZE"}, + {GL_RENDERBUFFER_WIDTH, "GL_RENDERBUFFER_WIDTH"}, + {GL_RENDERBUFFER_HEIGHT, "GL_RENDERBUFFER_HEIGHT"}, + {GL_RENDERBUFFER_INTERNAL_FORMAT, "GL_RENDERBUFFER_INTERNAL_FORMAT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringRenderBufferTarget(uint32 value) { +std::string GLES2Util::GetStringRenderBufferTarget(uint32_t value) { static const EnumToString string_table[] = { - { GL_RENDERBUFFER, "GL_RENDERBUFFER" }, + {GL_RENDERBUFFER, "GL_RENDERBUFFER"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringResetStatus(uint32 value) { +std::string GLES2Util::GetStringResetStatus(uint32_t value) { static const EnumToString string_table[] = { - { GL_GUILTY_CONTEXT_RESET_ARB, "GL_GUILTY_CONTEXT_RESET_ARB" }, - { GL_INNOCENT_CONTEXT_RESET_ARB, "GL_INNOCENT_CONTEXT_RESET_ARB" }, - { GL_UNKNOWN_CONTEXT_RESET_ARB, "GL_UNKNOWN_CONTEXT_RESET_ARB" }, + {GL_GUILTY_CONTEXT_RESET_ARB, "GL_GUILTY_CONTEXT_RESET_ARB"}, + {GL_INNOCENT_CONTEXT_RESET_ARB, "GL_INNOCENT_CONTEXT_RESET_ARB"}, + {GL_UNKNOWN_CONTEXT_RESET_ARB, "GL_UNKNOWN_CONTEXT_RESET_ARB"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringShaderBinaryFormat(uint32 value) { - return GLES2Util::GetQualifiedEnumString( - NULL, 0, value); +std::string GLES2Util::GetStringShaderBinaryFormat(uint32_t value) { + return GLES2Util::GetQualifiedEnumString(NULL, 0, value); } -std::string GLES2Util::GetStringShaderParameter(uint32 value) { +std::string GLES2Util::GetStringShaderParameter(uint32_t value) { static const EnumToString string_table[] = { - { GL_SHADER_TYPE, "GL_SHADER_TYPE" }, - { GL_DELETE_STATUS, "GL_DELETE_STATUS" }, - { GL_COMPILE_STATUS, "GL_COMPILE_STATUS" }, - { GL_INFO_LOG_LENGTH, "GL_INFO_LOG_LENGTH" }, - { GL_SHADER_SOURCE_LENGTH, "GL_SHADER_SOURCE_LENGTH" }, - { GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, - "GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE" }, + {GL_SHADER_TYPE, "GL_SHADER_TYPE"}, + {GL_DELETE_STATUS, "GL_DELETE_STATUS"}, + {GL_COMPILE_STATUS, "GL_COMPILE_STATUS"}, + {GL_INFO_LOG_LENGTH, "GL_INFO_LOG_LENGTH"}, + {GL_SHADER_SOURCE_LENGTH, "GL_SHADER_SOURCE_LENGTH"}, + {GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, + "GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringShaderPrecision(uint32 value) { +std::string GLES2Util::GetStringShaderPrecision(uint32_t value) { static const EnumToString string_table[] = { - { GL_LOW_FLOAT, "GL_LOW_FLOAT" }, - { GL_MEDIUM_FLOAT, "GL_MEDIUM_FLOAT" }, - { GL_HIGH_FLOAT, "GL_HIGH_FLOAT" }, - { GL_LOW_INT, "GL_LOW_INT" }, - { GL_MEDIUM_INT, "GL_MEDIUM_INT" }, - { GL_HIGH_INT, "GL_HIGH_INT" }, + {GL_LOW_FLOAT, "GL_LOW_FLOAT"}, + {GL_MEDIUM_FLOAT, "GL_MEDIUM_FLOAT"}, + {GL_HIGH_FLOAT, "GL_HIGH_FLOAT"}, + {GL_LOW_INT, "GL_LOW_INT"}, + {GL_MEDIUM_INT, "GL_MEDIUM_INT"}, + {GL_HIGH_INT, "GL_HIGH_INT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringShaderType(uint32 value) { +std::string GLES2Util::GetStringShaderType(uint32_t value) { static const EnumToString string_table[] = { - { GL_VERTEX_SHADER, "GL_VERTEX_SHADER" }, - { GL_FRAGMENT_SHADER, "GL_FRAGMENT_SHADER" }, + {GL_VERTEX_SHADER, "GL_VERTEX_SHADER"}, + {GL_FRAGMENT_SHADER, "GL_FRAGMENT_SHADER"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringSrcBlendFactor(uint32 value) { +std::string GLES2Util::GetStringSrcBlendFactor(uint32_t value) { static const EnumToString string_table[] = { - { GL_ZERO, "GL_ZERO" }, - { GL_ONE, "GL_ONE" }, - { GL_SRC_COLOR, "GL_SRC_COLOR" }, - { GL_ONE_MINUS_SRC_COLOR, "GL_ONE_MINUS_SRC_COLOR" }, - { GL_DST_COLOR, "GL_DST_COLOR" }, - { GL_ONE_MINUS_DST_COLOR, "GL_ONE_MINUS_DST_COLOR" }, - { GL_SRC_ALPHA, "GL_SRC_ALPHA" }, - { GL_ONE_MINUS_SRC_ALPHA, "GL_ONE_MINUS_SRC_ALPHA" }, - { GL_DST_ALPHA, "GL_DST_ALPHA" }, - { GL_ONE_MINUS_DST_ALPHA, "GL_ONE_MINUS_DST_ALPHA" }, - { GL_CONSTANT_COLOR, "GL_CONSTANT_COLOR" }, - { GL_ONE_MINUS_CONSTANT_COLOR, "GL_ONE_MINUS_CONSTANT_COLOR" }, - { GL_CONSTANT_ALPHA, "GL_CONSTANT_ALPHA" }, - { GL_ONE_MINUS_CONSTANT_ALPHA, "GL_ONE_MINUS_CONSTANT_ALPHA" }, - { GL_SRC_ALPHA_SATURATE, "GL_SRC_ALPHA_SATURATE" }, + {GL_ZERO, "GL_ZERO"}, + {GL_ONE, "GL_ONE"}, + {GL_SRC_COLOR, "GL_SRC_COLOR"}, + {GL_ONE_MINUS_SRC_COLOR, "GL_ONE_MINUS_SRC_COLOR"}, + {GL_DST_COLOR, "GL_DST_COLOR"}, + {GL_ONE_MINUS_DST_COLOR, "GL_ONE_MINUS_DST_COLOR"}, + {GL_SRC_ALPHA, "GL_SRC_ALPHA"}, + {GL_ONE_MINUS_SRC_ALPHA, "GL_ONE_MINUS_SRC_ALPHA"}, + {GL_DST_ALPHA, "GL_DST_ALPHA"}, + {GL_ONE_MINUS_DST_ALPHA, "GL_ONE_MINUS_DST_ALPHA"}, + {GL_CONSTANT_COLOR, "GL_CONSTANT_COLOR"}, + {GL_ONE_MINUS_CONSTANT_COLOR, "GL_ONE_MINUS_CONSTANT_COLOR"}, + {GL_CONSTANT_ALPHA, "GL_CONSTANT_ALPHA"}, + {GL_ONE_MINUS_CONSTANT_ALPHA, "GL_ONE_MINUS_CONSTANT_ALPHA"}, + {GL_SRC_ALPHA_SATURATE, "GL_SRC_ALPHA_SATURATE"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringStencilOp(uint32 value) { +std::string GLES2Util::GetStringStencilOp(uint32_t value) { static const EnumToString string_table[] = { - { GL_KEEP, "GL_KEEP" }, - { GL_ZERO, "GL_ZERO" }, - { GL_REPLACE, "GL_REPLACE" }, - { GL_INCR, "GL_INCR" }, - { GL_INCR_WRAP, "GL_INCR_WRAP" }, - { GL_DECR, "GL_DECR" }, - { GL_DECR_WRAP, "GL_DECR_WRAP" }, - { GL_INVERT, "GL_INVERT" }, + {GL_KEEP, "GL_KEEP"}, + {GL_ZERO, "GL_ZERO"}, + {GL_REPLACE, "GL_REPLACE"}, + {GL_INCR, "GL_INCR"}, + {GL_INCR_WRAP, "GL_INCR_WRAP"}, + {GL_DECR, "GL_DECR"}, + {GL_DECR_WRAP, "GL_DECR_WRAP"}, + {GL_INVERT, "GL_INVERT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringStringType(uint32 value) { +std::string GLES2Util::GetStringStringType(uint32_t value) { static const EnumToString string_table[] = { - { GL_VENDOR, "GL_VENDOR" }, - { GL_RENDERER, "GL_RENDERER" }, - { GL_VERSION, "GL_VERSION" }, - { GL_SHADING_LANGUAGE_VERSION, "GL_SHADING_LANGUAGE_VERSION" }, - { GL_EXTENSIONS, "GL_EXTENSIONS" }, + {GL_VENDOR, "GL_VENDOR"}, + {GL_RENDERER, "GL_RENDERER"}, + {GL_VERSION, "GL_VERSION"}, + {GL_SHADING_LANGUAGE_VERSION, "GL_SHADING_LANGUAGE_VERSION"}, + {GL_EXTENSIONS, "GL_EXTENSIONS"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringTextureBindTarget(uint32 value) { +std::string GLES2Util::GetStringTextureBindTarget(uint32_t value) { static const EnumToString string_table[] = { - { GL_TEXTURE_2D, "GL_TEXTURE_2D" }, - { GL_TEXTURE_CUBE_MAP, "GL_TEXTURE_CUBE_MAP" }, + {GL_TEXTURE_2D, "GL_TEXTURE_2D"}, + {GL_TEXTURE_CUBE_MAP, "GL_TEXTURE_CUBE_MAP"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringTextureFormat(uint32 value) { +std::string GLES2Util::GetStringTextureFormat(uint32_t value) { static const EnumToString string_table[] = { - { GL_ALPHA, "GL_ALPHA" }, - { GL_LUMINANCE, "GL_LUMINANCE" }, - { GL_LUMINANCE_ALPHA, "GL_LUMINANCE_ALPHA" }, - { GL_RGB, "GL_RGB" }, - { GL_RGBA, "GL_RGBA" }, + {GL_ALPHA, "GL_ALPHA"}, + {GL_LUMINANCE, "GL_LUMINANCE"}, + {GL_LUMINANCE_ALPHA, "GL_LUMINANCE_ALPHA"}, + {GL_RGB, "GL_RGB"}, + {GL_RGBA, "GL_RGBA"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringTextureInternalFormat(uint32 value) { +std::string GLES2Util::GetStringTextureInternalFormat(uint32_t value) { static const EnumToString string_table[] = { - { GL_ALPHA, "GL_ALPHA" }, - { GL_LUMINANCE, "GL_LUMINANCE" }, - { GL_LUMINANCE_ALPHA, "GL_LUMINANCE_ALPHA" }, - { GL_RGB, "GL_RGB" }, - { GL_RGBA, "GL_RGBA" }, + {GL_ALPHA, "GL_ALPHA"}, + {GL_LUMINANCE, "GL_LUMINANCE"}, + {GL_LUMINANCE_ALPHA, "GL_LUMINANCE_ALPHA"}, + {GL_RGB, "GL_RGB"}, + {GL_RGBA, "GL_RGBA"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringTextureInternalFormatStorage(uint32 value) { +std::string GLES2Util::GetStringTextureInternalFormatStorage(uint32_t value) { static const EnumToString string_table[] = { - { GL_RGB565, "GL_RGB565" }, - { GL_RGBA4, "GL_RGBA4" }, - { GL_RGB5_A1, "GL_RGB5_A1" }, - { GL_ALPHA8_EXT, "GL_ALPHA8_EXT" }, - { GL_LUMINANCE8_EXT, "GL_LUMINANCE8_EXT" }, - { GL_LUMINANCE8_ALPHA8_EXT, "GL_LUMINANCE8_ALPHA8_EXT" }, - { GL_RGB8_OES, "GL_RGB8_OES" }, - { GL_RGBA8_OES, "GL_RGBA8_OES" }, + {GL_RGB565, "GL_RGB565"}, + {GL_RGBA4, "GL_RGBA4"}, + {GL_RGB5_A1, "GL_RGB5_A1"}, + {GL_ALPHA8_EXT, "GL_ALPHA8_EXT"}, + {GL_LUMINANCE8_EXT, "GL_LUMINANCE8_EXT"}, + {GL_LUMINANCE8_ALPHA8_EXT, "GL_LUMINANCE8_ALPHA8_EXT"}, + {GL_RGB8_OES, "GL_RGB8_OES"}, + {GL_RGBA8_OES, "GL_RGBA8_OES"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringTextureMagFilterMode(uint32 value) { +std::string GLES2Util::GetStringTextureMagFilterMode(uint32_t value) { static const EnumToString string_table[] = { - { GL_NEAREST, "GL_NEAREST" }, - { GL_LINEAR, "GL_LINEAR" }, + {GL_NEAREST, "GL_NEAREST"}, {GL_LINEAR, "GL_LINEAR"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringTextureMinFilterMode(uint32 value) { +std::string GLES2Util::GetStringTextureMinFilterMode(uint32_t value) { static const EnumToString string_table[] = { - { GL_NEAREST, "GL_NEAREST" }, - { GL_LINEAR, "GL_LINEAR" }, - { GL_NEAREST_MIPMAP_NEAREST, "GL_NEAREST_MIPMAP_NEAREST" }, - { GL_LINEAR_MIPMAP_NEAREST, "GL_LINEAR_MIPMAP_NEAREST" }, - { GL_NEAREST_MIPMAP_LINEAR, "GL_NEAREST_MIPMAP_LINEAR" }, - { GL_LINEAR_MIPMAP_LINEAR, "GL_LINEAR_MIPMAP_LINEAR" }, + {GL_NEAREST, "GL_NEAREST"}, + {GL_LINEAR, "GL_LINEAR"}, + {GL_NEAREST_MIPMAP_NEAREST, "GL_NEAREST_MIPMAP_NEAREST"}, + {GL_LINEAR_MIPMAP_NEAREST, "GL_LINEAR_MIPMAP_NEAREST"}, + {GL_NEAREST_MIPMAP_LINEAR, "GL_NEAREST_MIPMAP_LINEAR"}, + {GL_LINEAR_MIPMAP_LINEAR, "GL_LINEAR_MIPMAP_LINEAR"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringTextureParameter(uint32 value) { +std::string GLES2Util::GetStringTextureParameter(uint32_t value) { static const EnumToString string_table[] = { - { GL_TEXTURE_MAG_FILTER, "GL_TEXTURE_MAG_FILTER" }, - { GL_TEXTURE_MIN_FILTER, "GL_TEXTURE_MIN_FILTER" }, - { GL_TEXTURE_POOL_CHROMIUM, "GL_TEXTURE_POOL_CHROMIUM" }, - { GL_TEXTURE_WRAP_S, "GL_TEXTURE_WRAP_S" }, - { GL_TEXTURE_WRAP_T, "GL_TEXTURE_WRAP_T" }, + {GL_TEXTURE_MAG_FILTER, "GL_TEXTURE_MAG_FILTER"}, + {GL_TEXTURE_MIN_FILTER, "GL_TEXTURE_MIN_FILTER"}, + {GL_TEXTURE_POOL_CHROMIUM, "GL_TEXTURE_POOL_CHROMIUM"}, + {GL_TEXTURE_WRAP_S, "GL_TEXTURE_WRAP_S"}, + {GL_TEXTURE_WRAP_T, "GL_TEXTURE_WRAP_T"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringTexturePool(uint32 value) { +std::string GLES2Util::GetStringTexturePool(uint32_t value) { static const EnumToString string_table[] = { - { GL_TEXTURE_POOL_MANAGED_CHROMIUM, "GL_TEXTURE_POOL_MANAGED_CHROMIUM" }, - { GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, - "GL_TEXTURE_POOL_UNMANAGED_CHROMIUM" }, + {GL_TEXTURE_POOL_MANAGED_CHROMIUM, "GL_TEXTURE_POOL_MANAGED_CHROMIUM"}, + {GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, + "GL_TEXTURE_POOL_UNMANAGED_CHROMIUM"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringTextureTarget(uint32 value) { +std::string GLES2Util::GetStringTextureTarget(uint32_t value) { static const EnumToString string_table[] = { - { GL_TEXTURE_2D, "GL_TEXTURE_2D" }, - { GL_TEXTURE_CUBE_MAP_POSITIVE_X, "GL_TEXTURE_CUBE_MAP_POSITIVE_X" }, - { GL_TEXTURE_CUBE_MAP_NEGATIVE_X, "GL_TEXTURE_CUBE_MAP_NEGATIVE_X" }, - { GL_TEXTURE_CUBE_MAP_POSITIVE_Y, "GL_TEXTURE_CUBE_MAP_POSITIVE_Y" }, - { GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y" }, - { GL_TEXTURE_CUBE_MAP_POSITIVE_Z, "GL_TEXTURE_CUBE_MAP_POSITIVE_Z" }, - { GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z" }, + {GL_TEXTURE_2D, "GL_TEXTURE_2D"}, + {GL_TEXTURE_CUBE_MAP_POSITIVE_X, "GL_TEXTURE_CUBE_MAP_POSITIVE_X"}, + {GL_TEXTURE_CUBE_MAP_NEGATIVE_X, "GL_TEXTURE_CUBE_MAP_NEGATIVE_X"}, + {GL_TEXTURE_CUBE_MAP_POSITIVE_Y, "GL_TEXTURE_CUBE_MAP_POSITIVE_Y"}, + {GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"}, + {GL_TEXTURE_CUBE_MAP_POSITIVE_Z, "GL_TEXTURE_CUBE_MAP_POSITIVE_Z"}, + {GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringTextureUsage(uint32 value) { +std::string GLES2Util::GetStringTextureUsage(uint32_t value) { static const EnumToString string_table[] = { - { GL_NONE, "GL_NONE" }, - { GL_FRAMEBUFFER_ATTACHMENT_ANGLE, "GL_FRAMEBUFFER_ATTACHMENT_ANGLE" }, + {GL_NONE, "GL_NONE"}, + {GL_FRAMEBUFFER_ATTACHMENT_ANGLE, "GL_FRAMEBUFFER_ATTACHMENT_ANGLE"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringTextureWrapMode(uint32 value) { +std::string GLES2Util::GetStringTextureWrapMode(uint32_t value) { static const EnumToString string_table[] = { - { GL_CLAMP_TO_EDGE, "GL_CLAMP_TO_EDGE" }, - { GL_MIRRORED_REPEAT, "GL_MIRRORED_REPEAT" }, - { GL_REPEAT, "GL_REPEAT" }, + {GL_CLAMP_TO_EDGE, "GL_CLAMP_TO_EDGE"}, + {GL_MIRRORED_REPEAT, "GL_MIRRORED_REPEAT"}, + {GL_REPEAT, "GL_REPEAT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringVertexAttribType(uint32 value) { +std::string GLES2Util::GetStringVertexAttribType(uint32_t value) { static const EnumToString string_table[] = { - { GL_BYTE, "GL_BYTE" }, - { GL_UNSIGNED_BYTE, "GL_UNSIGNED_BYTE" }, - { GL_SHORT, "GL_SHORT" }, - { GL_UNSIGNED_SHORT, "GL_UNSIGNED_SHORT" }, - { GL_FLOAT, "GL_FLOAT" }, + {GL_BYTE, "GL_BYTE"}, + {GL_UNSIGNED_BYTE, "GL_UNSIGNED_BYTE"}, + {GL_SHORT, "GL_SHORT"}, + {GL_UNSIGNED_SHORT, "GL_UNSIGNED_SHORT"}, + {GL_FLOAT, "GL_FLOAT"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringVertexAttribute(uint32 value) { +std::string GLES2Util::GetStringVertexAttribute(uint32_t value) { static const EnumToString string_table[] = { - { GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED" }, - { GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, - "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING" }, - { GL_VERTEX_ATTRIB_ARRAY_ENABLED, "GL_VERTEX_ATTRIB_ARRAY_ENABLED" }, - { GL_VERTEX_ATTRIB_ARRAY_SIZE, "GL_VERTEX_ATTRIB_ARRAY_SIZE" }, - { GL_VERTEX_ATTRIB_ARRAY_STRIDE, "GL_VERTEX_ATTRIB_ARRAY_STRIDE" }, - { GL_VERTEX_ATTRIB_ARRAY_TYPE, "GL_VERTEX_ATTRIB_ARRAY_TYPE" }, - { GL_CURRENT_VERTEX_ATTRIB, "GL_CURRENT_VERTEX_ATTRIB" }, + {GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED"}, + {GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, + "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING"}, + {GL_VERTEX_ATTRIB_ARRAY_ENABLED, "GL_VERTEX_ATTRIB_ARRAY_ENABLED"}, + {GL_VERTEX_ATTRIB_ARRAY_SIZE, "GL_VERTEX_ATTRIB_ARRAY_SIZE"}, + {GL_VERTEX_ATTRIB_ARRAY_STRIDE, "GL_VERTEX_ATTRIB_ARRAY_STRIDE"}, + {GL_VERTEX_ATTRIB_ARRAY_TYPE, "GL_VERTEX_ATTRIB_ARRAY_TYPE"}, + {GL_CURRENT_VERTEX_ATTRIB, "GL_CURRENT_VERTEX_ATTRIB"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } -std::string GLES2Util::GetStringVertexPointer(uint32 value) { +std::string GLES2Util::GetStringVertexPointer(uint32_t value) { static const EnumToString string_table[] = { - { GL_VERTEX_ATTRIB_ARRAY_POINTER, "GL_VERTEX_ATTRIB_ARRAY_POINTER" }, + {GL_VERTEX_ATTRIB_ARRAY_POINTER, "GL_VERTEX_ATTRIB_ARRAY_POINTER"}, }; return GLES2Util::GetQualifiedEnumString( string_table, arraysize(string_table), value); } #endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_UTILS_IMPLEMENTATION_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc b/chromium/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc index 864c8811d2a..d0e7e037ebc 100644 --- a/chromium/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc +++ b/chromium/gpu/command_buffer/common/gles2_cmd_utils_unittest.cc @@ -20,7 +20,7 @@ class GLES2UtilTest : public testing:: Test { }; TEST_F(GLES2UtilTest, SafeMultiplyUint32) { - uint32 result = 0; + uint32_t result = 0; EXPECT_TRUE(SafeMultiplyUint32(2u, 3u, &result)); EXPECT_EQ(6u, result); EXPECT_FALSE(SafeMultiplyUint32(0x80000000u, 2u, &result)); @@ -32,7 +32,7 @@ TEST_F(GLES2UtilTest, SafeMultiplyUint32) { } TEST_F(GLES2UtilTest, SafeAddUint32) { - uint32 result = 0; + uint32_t result = 0; EXPECT_TRUE(SafeAddUint32(2u, 3u, &result)); EXPECT_EQ(5u, result); EXPECT_FALSE(SafeAddUint32(0x80000000u, 0x80000000u, &result)); @@ -48,9 +48,9 @@ TEST_F(GLES2UtilTest, SafeAddUint32) { } TEST_F(GLES2UtilTest, SafeAddInt32) { - int32 result = 0; - const int32 kMax = std::numeric_limits<int32>::max(); - const int32 kMin = std::numeric_limits<int32>::min(); + int32_t result = 0; + const int32_t kMax = std::numeric_limits<int32_t>::max(); + const int32_t kMin = std::numeric_limits<int32_t>::min(); EXPECT_TRUE(SafeAddInt32(2, 3, &result)); EXPECT_EQ(5, result); EXPECT_FALSE(SafeAddInt32(kMax, 1, &result)); @@ -89,11 +89,11 @@ TEST_F(GLES2UtilTest, GLGetNumValuesReturned) { } TEST_F(GLES2UtilTest, ComputeImageDataSizesFormats) { - const uint32 kWidth = 16; - const uint32 kHeight = 12; - uint32 size; - uint32 unpadded_row_size; - uint32 padded_row_size; + const uint32_t kWidth = 16; + const uint32_t kHeight = 12; + uint32_t size; + uint32_t unpadded_row_size; + uint32_t padded_row_size; EXPECT_TRUE(GLES2Util::ComputeImageDataSizes( kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, 1, &size, &unpadded_row_size, &padded_row_size)); @@ -146,11 +146,11 @@ TEST_F(GLES2UtilTest, ComputeImageDataSizesFormats) { } TEST_F(GLES2UtilTest, ComputeImageDataSizeTypes) { - const uint32 kWidth = 16; - const uint32 kHeight = 12; - uint32 size; - uint32 unpadded_row_size; - uint32 padded_row_size; + const uint32_t kWidth = 16; + const uint32_t kHeight = 12; + uint32_t size; + uint32_t unpadded_row_size; + uint32_t padded_row_size; EXPECT_TRUE(GLES2Util::ComputeImageDataSizes( kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, 1, &size, &unpadded_row_size, &padded_row_size)); @@ -184,11 +184,11 @@ TEST_F(GLES2UtilTest, ComputeImageDataSizeTypes) { } TEST_F(GLES2UtilTest, ComputeImageDataSizesUnpackAlignment) { - const uint32 kWidth = 19; - const uint32 kHeight = 12; - uint32 size; - uint32 unpadded_row_size; - uint32 padded_row_size; + const uint32_t kWidth = 19; + const uint32_t kHeight = 12; + uint32_t size; + uint32_t unpadded_row_size; + uint32_t padded_row_size; EXPECT_TRUE(GLES2Util::ComputeImageDataSizes( kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, 1, &size, &unpadded_row_size, &padded_row_size)); @@ -245,6 +245,19 @@ TEST_F(GLES2UtilTest, GetChannelsForCompressedFormat) { GL_COMPRESSED_RGBA_S3TC_DXT3_EXT)); EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat( GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)); + EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat(GL_ATC_RGB_AMD)); + EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat( + GL_ATC_RGBA_EXPLICIT_ALPHA_AMD)); + EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat( + GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD)); + EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat( + GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG)); + EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat( + GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG)); + EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat( + GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG)); + EXPECT_EQ(0u, GLES2Util::GetChannelsForFormat( + GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG)); } namespace { diff --git a/chromium/gpu/command_buffer/common/gpu_memory_allocation.h b/chromium/gpu/command_buffer/common/gpu_memory_allocation.h index 57be4c5490f..facbd7ff885 100644 --- a/chromium/gpu/command_buffer/common/gpu_memory_allocation.h +++ b/chromium/gpu/command_buffer/common/gpu_memory_allocation.h @@ -25,6 +25,7 @@ struct MemoryAllocation { CUTOFF_ALLOW_NICE_TO_HAVE, // Allow all allocations. CUTOFF_ALLOW_EVERYTHING, + CUTOFF_LAST = CUTOFF_ALLOW_EVERYTHING }; // Limits when this renderer is visible. @@ -48,48 +49,6 @@ struct MemoryAllocation { } }; -// Memory Allocation request which is sent by a client, to help GpuMemoryManager -// more ideally split memory allocations across clients. -struct ManagedMemoryStats { - // Bytes required for correct rendering. - uint64 bytes_required; - - // Bytes that are not strictly required for correctness, but, if allocated, - // will provide good performance. - uint64 bytes_nice_to_have; - - // The number of bytes currently allocated. - uint64 bytes_allocated; - - // Whether or not a backbuffer is currently requested (the memory usage - // of the buffer is known by the GPU process). - bool backbuffer_requested; - - ManagedMemoryStats() - : bytes_required(0), - bytes_nice_to_have(0), - bytes_allocated(0), - backbuffer_requested(false) { - } - - ManagedMemoryStats(uint64 bytes_required, - uint64 bytes_nice_to_have, - uint64 bytes_allocated, - bool backbuffer_requested) - : bytes_required(bytes_required), - bytes_nice_to_have(bytes_nice_to_have), - bytes_allocated(bytes_allocated), - backbuffer_requested(backbuffer_requested) { - } - - bool Equals(const ManagedMemoryStats& other) const { - return bytes_required == other.bytes_required && - bytes_nice_to_have == other.bytes_nice_to_have && - bytes_allocated == other.bytes_allocated && - backbuffer_requested == other.backbuffer_requested; - } -}; - } // namespace content #endif // GPU_COMMAND_BUFFER_COMMON_GPU_MEMORY_ALLOCATION_H_ diff --git a/chromium/gpu/command_buffer/common/id_allocator.h b/chromium/gpu/command_buffer/common/id_allocator.h index 46fcd1acf03..3f2dc4a65e2 100644 --- a/chromium/gpu/command_buffer/common/id_allocator.h +++ b/chromium/gpu/command_buffer/common/id_allocator.h @@ -7,17 +7,19 @@ #ifndef GPU_COMMAND_BUFFER_CLIENT_ID_ALLOCATOR_H_ #define GPU_COMMAND_BUFFER_CLIENT_ID_ALLOCATOR_H_ +#include <stdint.h> + #include <set> #include <utility> #include "base/compiler_specific.h" -#include "gpu/command_buffer/common/types.h" +#include "base/macros.h" #include "gpu/gpu_export.h" namespace gpu { // A resource ID, key to the resource maps. -typedef uint32 ResourceId; +typedef uint32_t ResourceId; // Invalid resource ID. static const ResourceId kInvalidResource = 0u; diff --git a/chromium/gpu/command_buffer/common/mailbox.cc b/chromium/gpu/command_buffer/common/mailbox.cc index 8d8393fa63c..21602ab6d4d 100644 --- a/chromium/gpu/command_buffer/common/mailbox.cc +++ b/chromium/gpu/command_buffer/common/mailbox.cc @@ -7,6 +7,7 @@ #include <string.h> #include "base/logging.h" +#include "base/rand_util.h" namespace gpu { @@ -31,4 +32,28 @@ void Mailbox::SetName(const int8* n) { memcpy(name, n, sizeof(name)); } +Mailbox Mailbox::Generate() { + Mailbox result; + // Generates cryptographically-secure bytes. + base::RandBytes(result.name, sizeof(result.name)); +#if !defined(NDEBUG) + int8 value = 1; + for (size_t i = 1; i < sizeof(result.name); ++i) + value ^= result.name[i]; + result.name[0] = value; +#endif + return result; +} + +bool Mailbox::Verify() const { +#if !defined(NDEBUG) + int8 value = 1; + for (size_t i = 0; i < sizeof(name); ++i) + value ^= name[i]; + return value == 0; +#else + return true; +#endif +} + } // namespace gpu diff --git a/chromium/gpu/command_buffer/common/mailbox.h b/chromium/gpu/command_buffer/common/mailbox.h index 938167f5cf8..a45c91f279b 100644 --- a/chromium/gpu/command_buffer/common/mailbox.h +++ b/chromium/gpu/command_buffer/common/mailbox.h @@ -5,22 +5,42 @@ #ifndef GPU_COMMAND_BUFFER_MAILBOX_H_ #define GPU_COMMAND_BUFFER_MAILBOX_H_ +#include <stdint.h> #include <string.h> -#include "gpu/command_buffer/common/types.h" #include "gpu/gpu_export.h" +// From gl2/gl2ext.h. +#ifndef GL_MAILBOX_SIZE_CHROMIUM +#define GL_MAILBOX_SIZE_CHROMIUM 64 +#endif + namespace gpu { struct GPU_EXPORT Mailbox { Mailbox(); bool IsZero() const; void SetZero(); - void SetName(const int8* name); - int8 name[64]; + void SetName(const int8_t* name); + + // Generate a unique unguessable mailbox name. + static Mailbox Generate(); + + // Verify that the mailbox was created through Mailbox::Generate. This only + // works in Debug (always returns true in Release). This is not a secure + // check, only to catch bugs where clients forgot to call Mailbox::Generate. + bool Verify() const; + + int8_t name[GL_MAILBOX_SIZE_CHROMIUM]; bool operator<(const Mailbox& other) const { return memcmp(this, &other, sizeof other) < 0; } + bool operator==(const Mailbox& other) const { + return memcmp(this, &other, sizeof other) == 0; + } + bool operator!=(const Mailbox& other) const { + return !operator==(other); + } }; } // namespace gpu diff --git a/chromium/gpu/command_buffer/common/mailbox_holder.cc b/chromium/gpu/command_buffer/common/mailbox_holder.cc new file mode 100644 index 00000000000..87dec36fe23 --- /dev/null +++ b/chromium/gpu/command_buffer/common/mailbox_holder.cc @@ -0,0 +1,18 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/common/mailbox_holder.h" + +namespace gpu { + +MailboxHolder::MailboxHolder() : texture_target(0), sync_point(0) {} + +MailboxHolder::MailboxHolder(const Mailbox& mailbox, + uint32_t texture_target, + uint32_t sync_point) + : mailbox(mailbox), + texture_target(texture_target), + sync_point(sync_point) {} + +} // namespace gpu diff --git a/chromium/gpu/command_buffer/common/mailbox_holder.h b/chromium/gpu/command_buffer/common/mailbox_holder.h new file mode 100644 index 00000000000..7c7a0e23123 --- /dev/null +++ b/chromium/gpu/command_buffer/common/mailbox_holder.h @@ -0,0 +1,28 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GPU_COMMAND_BUFFER_MAILBOX_HOLDER_H_ +#define GPU_COMMAND_BUFFER_MAILBOX_HOLDER_H_ + +#include <stdint.h> +#include <string.h> + +#include "gpu/command_buffer/common/mailbox.h" +#include "gpu/gpu_export.h" + +namespace gpu { + +struct GPU_EXPORT MailboxHolder { + MailboxHolder(); + MailboxHolder(const gpu::Mailbox& mailbox, + uint32_t texture_target, + uint32_t sync_point); + gpu::Mailbox mailbox; + uint32_t texture_target; + uint32_t sync_point; +}; + +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_MAILBOX_HOLDER_H_ diff --git a/chromium/gpu/command_buffer/common/types.h b/chromium/gpu/command_buffer/common/types.h deleted file mode 100644 index 718ecca6763..00000000000 --- a/chromium/gpu/command_buffer/common/types.h +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// This file contains cross-platform basic type definitions - -#ifndef GPU_COMMAND_BUFFER_COMMON_TYPES_H_ -#define GPU_COMMAND_BUFFER_COMMON_TYPES_H_ - -#if !defined(_MSC_VER) -#include <stdint.h> -#endif -#include <cstddef> -#include <string> - -typedef signed char schar; -typedef signed char int8; -// TODO(mbelshe) Remove these type guards. These are -// temporary to avoid conflicts with npapi.h. -#ifndef _INT16 -#define _INT16 -typedef short int16; -#endif -#ifndef _INT32 -#define _INT32 -typedef int int32; -#endif - -// The NSPR system headers define 64-bit as |long| when possible. In order to -// not have typedef mismatches, we do the same on LP64. -#if defined(__LP64__) && !defined(__APPLE__) && !defined(__OpenBSD__) -typedef long int64; -#else -typedef long long int64; -#endif - -// NOTE: unsigned types are DANGEROUS in loops and other arithmetical -// places. Use the signed types unless your variable represents a bit -// pattern (eg a hash value) or you really need the extra bit. Do NOT -// use 'unsigned' to express "this value should always be positive"; -// use assertions for this. - -typedef unsigned char uint8; -// TODO(mbelshe) Remove these type guards. These are -// temporary to avoid conflicts with npapi.h. -#ifndef _UINT16 -#define _UINT16 -typedef unsigned short uint16; -#endif -#ifndef _UINT32 -#define _UINT32 -typedef unsigned int uint32; -#endif - -// See the comment above about NSPR and 64-bit. -#if defined(__LP64__) && !defined(__APPLE__) && !defined(__OpenBSD__) -typedef unsigned long uint64; -#else -typedef unsigned long long uint64; -#endif - -// A macro to disallow the copy constructor and operator= functions -// This should be used in the private: declarations for a class -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - void operator=(const TypeName&) - -// A macro to disallow all the implicit constructors, namely the -// default constructor, copy constructor and operator= functions. -// -// This should be used in the private: declarations for a class -// that wants to prevent anyone from instantiating it. This is -// especially useful for classes containing only static methods. -#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ - TypeName(); \ - DISALLOW_COPY_AND_ASSIGN(TypeName) - -// The arraysize(arr) macro returns the # of elements in an array arr. -// The expression is a compile-time constant, and therefore can be -// used in defining new arrays, for example. If you use arraysize on -// a pointer by mistake, you will get a compile-time error. -// -// One caveat is that arraysize() doesn't accept any array of an -// anonymous type or a type defined inside a function. In these rare -// cases, you have to use the unsafe ARRAYSIZE_UNSAFE() macro below. This is -// due to a limitation in C++'s template system. The limitation might -// eventually be removed, but it hasn't happened yet. - -// This template function declaration is used in defining arraysize. -// Note that the function doesn't need an implementation, as we only -// use its type. -template <typename T, size_t N> -char (&ArraySizeHelper(T (&array)[N]))[N]; - -// That gcc wants both of these prototypes seems mysterious. VC, for -// its part, can't decide which to use (another mystery). Matching of -// template overloads: the final frontier. -#if !defined(_MSC_VER) -template <typename T, size_t N> -char (&ArraySizeHelper(const T (&array)[N]))[N]; -#endif - -#define arraysize(array) (sizeof(ArraySizeHelper(array))) - -// The COMPILE_ASSERT macro can be used to verify that a compile time -// expression is true. For example, you could use it to verify the -// size of a static array: -// -// COMPILE_ASSERT(ARRAYSIZE_UNSAFE(content_type_names) == CONTENT_NUM_TYPES, -// content_type_names_incorrect_size); -// -// or to make sure a struct is smaller than a certain size: -// -// COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large); -// -// The second argument to the macro is the name of the variable. If -// the expression is false, most compilers will issue a warning/error -// containing the name of the variable. - -template <bool> -struct GpuCompileAssert { -}; - -#undef COMPILE_ASSERT -#define COMPILE_ASSERT(expr, msg) \ - typedef GpuCompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] - -// Implementation details of COMPILE_ASSERT: -// -// - COMPILE_ASSERT works by defining an array type that has -1 -// elements (and thus is invalid) when the expression is false. -// -// - The simpler definition -// -// #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1] -// -// does not work, as gcc supports variable-length arrays whose sizes -// are determined at run-time (this is gcc's extension and not part -// of the C++ standard). As a result, gcc fails to reject the -// following code with the simple definition: -// -// int foo; -// COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is -// // not a compile-time constant. -// -// - By using the type CompileAssert<(bool(expr))>, we ensures that -// expr is a compile-time constant. (Template arguments must be -// determined at compile-time.) -// -// - The outter parentheses in CompileAssert<(bool(expr))> are necessary -// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written -// -// CompileAssert<bool(expr)> -// -// instead, these compilers will refuse to compile -// -// COMPILE_ASSERT(5 > 0, some_message); -// -// (They seem to think the ">" in "5 > 0" marks the end of the -// template argument list.) -// -// - The array size is (bool(expr) ? 1 : -1), instead of simply -// -// ((expr) ? 1 : -1). -// -// This is to avoid running into a bug in MS VC 7.1, which -// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. - -namespace gpu { -#if defined(_MSC_VER) -typedef short Int16; -typedef unsigned short Uint16; -typedef int Int32; -typedef unsigned int Uint32; -#else -typedef int16_t Int16; -typedef uint16_t Uint16; -typedef int32_t Int32; -typedef uint32_t Uint32; -#endif - -typedef std::string String; - -} // namespace gpu - -#endif // GPU_COMMAND_BUFFER_COMMON_TYPES_H_ diff --git a/chromium/gpu/command_buffer/common/unittest_main.cc b/chromium/gpu/command_buffer/common/unittest_main.cc index db22191fde2..2d6a2d116ea 100644 --- a/chromium/gpu/command_buffer/common/unittest_main.cc +++ b/chromium/gpu/command_buffer/common/unittest_main.cc @@ -9,7 +9,6 @@ #include "base/test/test_suite.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/gl/gl_implementation.h" namespace { @@ -34,7 +33,6 @@ int main(int argc, char** argv) { base::AtExitManager exit_manager; #endif CommandLine::Init(argc, argv); - gfx::InitializeGLBindings(gfx::kGLImplementationMockGL); testing::InitGoogleMock(&argc, argv); return base::LaunchUnitTests(argc, argv, diff --git a/chromium/gpu/command_buffer/service/BUILD.gn b/chromium/gpu/command_buffer/service/BUILD.gn new file mode 100644 index 00000000000..c9f8f57e9dc --- /dev/null +++ b/chromium/gpu/command_buffer/service/BUILD.gn @@ -0,0 +1,155 @@ +# Copyright 2014 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ui.gni") +import("//third_party/protobuf/proto_library.gni") + +source_set("service") { + sources = [ + "async_pixel_transfer_delegate.cc", + "async_pixel_transfer_delegate.h", + "async_pixel_transfer_manager_android.cc", + "async_pixel_transfer_manager_idle.cc", + "async_pixel_transfer_manager_idle.h", + "async_pixel_transfer_manager_linux.cc", + "async_pixel_transfer_manager_mac.cc", + "async_pixel_transfer_manager_share_group.cc", + "async_pixel_transfer_manager_share_group.h", + "async_pixel_transfer_manager_stub.cc", + "async_pixel_transfer_manager_stub.h", + "async_pixel_transfer_manager_sync.cc", + "async_pixel_transfer_manager_sync.h", + "async_pixel_transfer_manager_win.cc", + "async_pixel_transfer_manager.cc", + "async_pixel_transfer_manager.h", + "buffer_manager.h", + "buffer_manager.cc", + "cmd_buffer_engine.h", + "cmd_parser.cc", + "cmd_parser.h", + "command_buffer_service.cc", + "command_buffer_service.h", + "common_decoder.cc", + "common_decoder.h", + "context_group.h", + "context_group.cc", + "context_state.h", + "context_state_autogen.h", + "context_state_impl_autogen.h", + "context_state.cc", + "error_state.cc", + "error_state.h", + "feature_info.h", + "feature_info.cc", + "framebuffer_manager.h", + "framebuffer_manager.cc", + "gles2_cmd_copy_texture_chromium.cc", + "gles2_cmd_copy_texture_chromium.h", + "gles2_cmd_decoder.h", + "gles2_cmd_decoder_autogen.h", + "gles2_cmd_decoder.cc", + "gles2_cmd_validation.h", + "gles2_cmd_validation.cc", + "gles2_cmd_validation_autogen.h", + "gles2_cmd_validation_implementation_autogen.h", + "gl_context_virtual.cc", + "gl_context_virtual.h", + "gl_state_restorer_impl.cc", + "gl_state_restorer_impl.h", + "gl_utils.h", + "gpu_control_service.cc", + "gpu_control_service.h", + "gpu_memory_buffer_manager.h", + "gpu_scheduler.cc", + "gpu_scheduler.h", + "gpu_scheduler_mock.h", + "gpu_state_tracer.cc", + "gpu_state_tracer.h", + "gpu_switches.cc", + "gpu_switches.h", + "gpu_tracer.cc", + "gpu_tracer.h", + "id_manager.h", + "id_manager.cc", + "image_manager.cc", + "image_manager.h", + "in_process_command_buffer.cc", + "in_process_command_buffer.h", + "logger.cc", + "logger.h", + "mailbox_manager.cc", + "mailbox_manager.h", + "mailbox_synchronizer.cc", + "mailbox_synchronizer.h", + "memory_program_cache.h", + "memory_program_cache.cc", + "mocks.h", + "program_manager.h", + "program_manager.cc", + "query_manager.h", + "query_manager.cc", + "renderbuffer_manager.h", + "renderbuffer_manager.cc", + "program_cache.h", + "program_cache.cc", + "shader_manager.h", + "shader_manager.cc", + "shader_translator.h", + "shader_translator.cc", + "shader_translator_cache.h", + "shader_translator_cache.cc", + "stream_texture_manager_in_process_android.h", + "stream_texture_manager_in_process_android.cc", + "texture_definition.h", + "texture_definition.cc", + "texture_manager.h", + "texture_manager.cc", + "transfer_buffer_manager.cc", + "transfer_buffer_manager.h", + "vertex_array_manager.h", + "vertex_array_manager.cc", + "vertex_attrib_manager.h", + "vertex_attrib_manager.cc", + ] + + configs += [ + "//third_party/khronos:khronos_headers", + ] + + deps = [ + ":disk_cache_proto", + "//base", + "//base/third_party/dynamic_annotations", + "//crypto", + "//gpu/command_buffer/common", + "//third_party/angle:translator", + "//third_party/protobuf:protobuf_lite", + "//third_party/re2", + "//third_party/smhasher:cityhash", + "//ui/gfx", + "//ui/gfx/geometry", + "//ui/gl", + ] + + if (ui_compositor_image_transport) { + include_dirs = [ "//third_party/khronos" ] + } + + if (is_win || is_android || (is_linux && use_x11)) { + sources += [ + "async_pixel_transfer_manager_egl.cc", + "async_pixel_transfer_manager_egl.h", + ] + } + + if (is_android && !is_debug) { + # On Android optimize more since this component can be a bottleneck. + configs -= [ "//build/config/compiler:optimize" ] + configs += [ "//build/config/compiler:optimize_max" ] + } +} + +proto_library("disk_cache_proto") { + sources = [ "disk_cache_proto.proto" ] +} diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_delegate.cc b/chromium/gpu/command_buffer/service/async_pixel_transfer_delegate.cc index 074f6752dd8..6b1dbc6eb3b 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_delegate.cc +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_delegate.cc @@ -4,26 +4,18 @@ #include "gpu/command_buffer/service/async_pixel_transfer_delegate.h" -#include "base/memory/shared_memory.h" -#include "gpu/command_buffer/service/safe_shared_memory_pool.h" - namespace gpu { -namespace { - -void* GetAddressImpl(base::SharedMemory* shared_memory, - uint32 shm_size, - uint32 shm_data_offset, - uint32 shm_data_size) { - // Memory bounds have already been validated, so there - // are just DCHECKS here. - DCHECK(shared_memory); - DCHECK(shared_memory->memory()); - DCHECK_LE(shm_data_offset + shm_data_size, shm_size); - return static_cast<int8*>(shared_memory->memory()) + shm_data_offset; +AsyncMemoryParams::AsyncMemoryParams(scoped_refptr<Buffer> buffer, + uint32 data_offset, + uint32 data_size) + : buffer_(buffer), data_offset_(data_offset), data_size_(data_size) { + DCHECK(buffer_); + DCHECK(buffer_->memory()); } -} // namespace +AsyncMemoryParams::~AsyncMemoryParams() { +} AsyncPixelTransferUploadStats::AsyncPixelTransferUploadStats() : texture_upload_count_(0) {} @@ -44,27 +36,8 @@ int AsyncPixelTransferUploadStats::GetStats( return texture_upload_count_; } -AsyncPixelTransferDelegate::AsyncPixelTransferDelegate(){} - -AsyncPixelTransferDelegate::~AsyncPixelTransferDelegate(){} +AsyncPixelTransferDelegate::AsyncPixelTransferDelegate() {} -// static -void* AsyncPixelTransferDelegate::GetAddress( - const AsyncMemoryParams& mem_params) { - return GetAddressImpl(mem_params.shared_memory, - mem_params.shm_size, - mem_params.shm_data_offset, - mem_params.shm_data_size); -} - -// static -void* AsyncPixelTransferDelegate::GetAddress( - ScopedSafeSharedMemory* safe_shared_memory, - const AsyncMemoryParams& mem_params) { - return GetAddressImpl(safe_shared_memory->shared_memory(), - mem_params.shm_size, - mem_params.shm_data_offset, - mem_params.shm_data_size); -} +AsyncPixelTransferDelegate::~AsyncPixelTransferDelegate() {} } // namespace gpu diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_delegate.h b/chromium/gpu/command_buffer/service/async_pixel_transfer_delegate.h index dc0f2d7b62f..b41bcd52444 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_delegate.h +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_delegate.h @@ -11,6 +11,7 @@ #include "base/memory/scoped_ptr.h" #include "base/synchronization/lock.h" #include "base/time/time.h" +#include "gpu/command_buffer/common/buffer.h" #include "gpu/gpu_export.h" #include "ui/gl/gl_bindings.h" @@ -20,8 +21,6 @@ class SharedMemory; namespace gpu { -class ScopedSafeSharedMemory; - struct AsyncTexImage2DParams { GLenum target; GLint level; @@ -44,11 +43,24 @@ struct AsyncTexSubImage2DParams { GLenum type; }; -struct AsyncMemoryParams { - base::SharedMemory* shared_memory; - uint32 shm_size; - uint32 shm_data_offset; - uint32 shm_data_size; +class AsyncMemoryParams { + public: + AsyncMemoryParams(scoped_refptr<Buffer> buffer, + uint32 data_offset, + uint32 data_size); + ~AsyncMemoryParams(); + + scoped_refptr<Buffer> buffer() const { return buffer_; } + uint32 data_size() const { return data_size_; } + uint32 data_offset() const { return data_offset_; } + void* GetDataAddress() const { + return buffer_->GetDataAddress(data_offset_, data_size_); + } + + private: + scoped_refptr<Buffer> buffer_; + uint32 data_offset_; + uint32 data_size_; }; class AsyncPixelTransferUploadStats @@ -92,13 +104,6 @@ class GPU_EXPORT AsyncPixelTransferDelegate { // Block until the specified transfer completes. virtual void WaitForTransferCompletion() = 0; - // Gets the address of the data from shared memory. - static void* GetAddress(const AsyncMemoryParams& mem_params); - - // Sometimes the |safe_shared_memory| is duplicate to prevent use after free. - static void* GetAddress(ScopedSafeSharedMemory* safe_shared_memory, - const AsyncMemoryParams& mem_params); - protected: AsyncPixelTransferDelegate(); diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager.cc b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager.cc index 3084dd61964..efc893a40ca 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager.cc +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager.cc @@ -17,6 +17,12 @@ AsyncPixelTransferManager::AsyncPixelTransferManager() {} AsyncPixelTransferManager::~AsyncPixelTransferManager() { if (manager_) manager_->RemoveObserver(this); + + for (TextureToDelegateMap::iterator ref = delegate_map_.begin(); + ref != delegate_map_.end(); + ref++) { + ref->first->RemoveObserver(); + } } void AsyncPixelTransferManager::Initialize(gles2::TextureManager* manager) { @@ -32,6 +38,7 @@ AsyncPixelTransferManager::CreatePixelTransferDelegate( AsyncPixelTransferDelegate* delegate = CreatePixelTransferDelegateImpl(ref, define_params); delegate_map_[ref] = make_linked_ptr(delegate); + ref->AddObserver(); return delegate; } @@ -49,8 +56,10 @@ AsyncPixelTransferManager::GetPixelTransferDelegate( void AsyncPixelTransferManager::ClearPixelTransferDelegateForTest( gles2::TextureRef* ref) { TextureToDelegateMap::iterator it = delegate_map_.find(ref); - if (it != delegate_map_.end()) + if (it != delegate_map_.end()) { delegate_map_.erase(it); + ref->RemoveObserver(); + } } bool AsyncPixelTransferManager::AsyncTransferIsInProgress( @@ -69,8 +78,10 @@ void AsyncPixelTransferManager::OnTextureManagerDestroying( void AsyncPixelTransferManager::OnTextureRefDestroying( gles2::TextureRef* texture) { TextureToDelegateMap::iterator it = delegate_map_.find(texture); - if (it != delegate_map_.end()) + if (it != delegate_map_.end()) { delegate_map_.erase(it); + texture->RemoveObserver(); + } } } // namespace gpu diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager.h b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager.h index d0ea5da153c..1a818f3c1ad 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager.h +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager.h @@ -32,7 +32,7 @@ class GLContext; namespace gpu { class AsyncPixelTransferDelegate; -struct AsyncMemoryParams; +class AsyncMemoryParams; struct AsyncTexImage2DParams; class AsyncPixelTransferCompletionObserver @@ -78,6 +78,9 @@ class GPU_EXPORT AsyncPixelTransferManager virtual void ProcessMorePendingTransfers() = 0; virtual bool NeedsProcessMorePendingTransfers() = 0; + // Wait for all AsyncTex(Sub)Image2D uploads to finish before returning. + virtual void WaitAllAsyncTexImage2D() = 0; + AsyncPixelTransferDelegate* CreatePixelTransferDelegate( gles2::TextureRef* ref, const AsyncTexImage2DParams& define_params); diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc index 5aaabf4ea8a..a2b22552a46 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_android.cc @@ -30,6 +30,14 @@ bool IsImagination() { return false; } +bool IsNvidia31() { + const char* vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR)); + const char* version = reinterpret_cast<const char*>(glGetString(GL_VERSION)); + return vendor && version && + std::string(vendor).find("NVIDIA") != std::string::npos && + std::string(version).find("OpenGL ES 3.1") != std::string::npos; +} + } // We only used threaded uploads when we can: @@ -54,10 +62,12 @@ AsyncPixelTransferManager* AsyncPixelTransferManager::Create( context->HasExtension("GL_OES_EGL_image") && !IsBroadcom() && !IsImagination() && + !IsNvidia31() && !base::android::SysUtils::IsLowEndDevice()) { return new AsyncPixelTransferManagerEGL; } - LOG(INFO) << "Async pixel transfers not supported"; + return new AsyncPixelTransferManagerIdle; + case gfx::kGLImplementationOSMesaGL: return new AsyncPixelTransferManagerIdle; case gfx::kGLImplementationMockGL: return new AsyncPixelTransferManagerStub; diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc index 7e0d515e49c..2bbe76b3371 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_egl.cc @@ -9,13 +9,13 @@ #include "base/bind.h" #include "base/debug/trace_event.h" +#include "base/debug/trace_event_synthetic_delay.h" #include "base/lazy_instance.h" #include "base/logging.h" #include "base/memory/ref_counted.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" #include "gpu/command_buffer/service/async_pixel_transfer_delegate.h" -#include "gpu/command_buffer/service/safe_shared_memory_pool.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_surface_egl.h" #include "ui/gl/scoped_binders.h" @@ -80,12 +80,9 @@ void SetGlParametersForEglImageTexture() { void PerformNotifyCompletion( AsyncMemoryParams mem_params, - ScopedSafeSharedMemory* safe_shared_memory, scoped_refptr<AsyncPixelTransferCompletionObserver> observer) { TRACE_EVENT0("gpu", "PerformNotifyCompletion"); - AsyncMemoryParams safe_mem_params = mem_params; - safe_mem_params.shared_memory = safe_shared_memory->shared_memory(); - observer->DidComplete(safe_mem_params); + observer->DidComplete(mem_params); } class TransferThread : public base::Thread { @@ -116,16 +113,10 @@ class TransferThread : public base::Thread { context_ = NULL; } - SafeSharedMemoryPool* safe_shared_memory_pool() { - return &safe_shared_memory_pool_; - } - private: scoped_refptr<gfx::GLContext> context_; scoped_refptr<gfx::GLSurface> surface_; - SafeSharedMemoryPool safe_shared_memory_pool_; - DISALLOW_COPY_AND_ASSIGN(TransferThread); }; @@ -136,10 +127,6 @@ base::MessageLoopProxy* transfer_message_loop_proxy() { return g_transfer_thread.Pointer()->message_loop_proxy().get(); } -SafeSharedMemoryPool* safe_shared_memory_pool() { - return g_transfer_thread.Pointer()->safe_shared_memory_pool(); -} - // Class which holds async pixel transfers state (EGLImage). // The EGLImage is accessed by either thread, but everything // else accessed only on the main thread. @@ -234,10 +221,12 @@ class TransferStateInternal } void MarkAsTransferIsInProgress() { + TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); transfer_completion_.Reset(); } void MarkAsCompleted() { + TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); transfer_completion_.Signal(); } @@ -251,7 +240,6 @@ class TransferStateInternal void PerformAsyncTexImage2D( AsyncTexImage2DParams tex_params, AsyncMemoryParams mem_params, - ScopedSafeSharedMemory* safe_shared_memory, scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats) { TRACE_EVENT2("gpu", "PerformAsyncTexImage", @@ -266,8 +254,7 @@ class TransferStateInternal return; } - void* data = - AsyncPixelTransferDelegate::GetAddress(safe_shared_memory, mem_params); + void* data = mem_params.GetDataAddress(); base::TimeTicks begin_time; if (texture_upload_stats.get()) @@ -314,7 +301,6 @@ class TransferStateInternal void PerformAsyncTexSubImage2D( AsyncTexSubImage2DParams tex_params, AsyncMemoryParams mem_params, - ScopedSafeSharedMemory* safe_shared_memory, scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats) { TRACE_EVENT2("gpu", "PerformAsyncTexSubImage2D", @@ -326,8 +312,7 @@ class TransferStateInternal DCHECK_NE(EGL_NO_IMAGE_KHR, egl_image_); DCHECK_EQ(0, tex_params.level); - void* data = - AsyncPixelTransferDelegate::GetAddress(safe_shared_memory, mem_params); + void* data = mem_params.GetDataAddress(); base::TimeTicks begin_time; if (texture_upload_stats.get()) @@ -506,9 +491,6 @@ void AsyncPixelTransferDelegateEGL::AsyncTexImage2D( if (WorkAroundAsyncTexImage2D(tex_params, mem_params, bind_callback)) return; - DCHECK(mem_params.shared_memory); - DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, - mem_params.shm_size); DCHECK(!state_->TransferIsInProgress()); DCHECK_EQ(state_->egl_image_, EGL_NO_IMAGE_KHR); DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); @@ -530,9 +512,6 @@ void AsyncPixelTransferDelegateEGL::AsyncTexImage2D( state_, tex_params, mem_params, - base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), - mem_params.shared_memory, - mem_params.shm_size)), shared_state_->texture_upload_stats)); DCHECK(CHECK_GL()); @@ -547,9 +526,6 @@ void AsyncPixelTransferDelegateEGL::AsyncTexSubImage2D( if (WorkAroundAsyncTexSubImage2D(tex_params, mem_params)) return; DCHECK(!state_->TransferIsInProgress()); - DCHECK(mem_params.shared_memory); - DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, - mem_params.shm_size); DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); DCHECK_EQ(tex_params.level, 0); @@ -568,9 +544,6 @@ void AsyncPixelTransferDelegateEGL::AsyncTexSubImage2D( state_, tex_params, mem_params, - base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), - mem_params.shared_memory, - mem_params.shm_size)), shared_state_->texture_upload_stats)); DCHECK(CHECK_GL()); @@ -618,7 +591,7 @@ bool AsyncPixelTransferDelegateEGL::WorkAroundAsyncTexImage2D( // On imagination we allocate synchronously all the time, even // if the dimensions support fast uploads. This is for part a.) // above, so allocations occur on a different thread/context as uploads. - void* data = GetAddress(mem_params); + void* data = mem_params.GetDataAddress(); SetGlParametersForEglImageTexture(); { @@ -669,7 +642,7 @@ bool AsyncPixelTransferDelegateEGL::WorkAroundAsyncTexSubImage2D( DCHECK_EQ(state_->define_params_.format, tex_params.format); DCHECK_EQ(state_->define_params_.type, tex_params.type); - void* data = GetAddress(mem_params); + void* data = mem_params.GetDataAddress(); base::TimeTicks begin_time; if (shared_state_->texture_upload_stats.get()) begin_time = base::TimeTicks::HighResNow(); @@ -730,19 +703,12 @@ void AsyncPixelTransferManagerEGL::BindCompletedAsyncTransfers() { void AsyncPixelTransferManagerEGL::AsyncNotifyCompletion( const AsyncMemoryParams& mem_params, AsyncPixelTransferCompletionObserver* observer) { - DCHECK(mem_params.shared_memory); - DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, - mem_params.shm_size); // Post a PerformNotifyCompletion task to the upload thread. This task // will run after all async transfers are complete. transfer_message_loop_proxy()->PostTask( FROM_HERE, base::Bind(&PerformNotifyCompletion, mem_params, - base::Owned( - new ScopedSafeSharedMemory(safe_shared_memory_pool(), - mem_params.shared_memory, - mem_params.shm_size)), make_scoped_refptr(observer))); } @@ -763,6 +729,16 @@ bool AsyncPixelTransferManagerEGL::NeedsProcessMorePendingTransfers() { return false; } +void AsyncPixelTransferManagerEGL::WaitAllAsyncTexImage2D() { + if (shared_state_.pending_allocations.empty()) + return; + + AsyncPixelTransferDelegateEGL* delegate = + shared_state_.pending_allocations.back().get(); + if (delegate) + delegate->WaitForTransferCompletion(); +} + AsyncPixelTransferDelegate* AsyncPixelTransferManagerEGL::CreatePixelTransferDelegateImpl( gles2::TextureRef* ref, diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_egl.h b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_egl.h index 4c273fe7f52..8f0c4b3d7ec 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_egl.h +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_egl.h @@ -27,6 +27,7 @@ class AsyncPixelTransferManagerEGL : public AsyncPixelTransferManager { virtual base::TimeDelta GetTotalTextureUploadTime() OVERRIDE; virtual void ProcessMorePendingTransfers() OVERRIDE; virtual bool NeedsProcessMorePendingTransfers() OVERRIDE; + virtual void WaitAllAsyncTexImage2D() OVERRIDE; // State shared between Managers and Delegates. struct SharedState { diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc index 88aff575b08..40ec87f6896 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_idle.cc @@ -6,32 +6,22 @@ #include "base/bind.h" #include "base/debug/trace_event.h" +#include "base/debug/trace_event_synthetic_delay.h" #include "base/lazy_instance.h" #include "base/memory/weak_ptr.h" -#include "gpu/command_buffer/service/safe_shared_memory_pool.h" #include "ui/gl/scoped_binders.h" namespace gpu { namespace { -base::LazyInstance<SafeSharedMemoryPool> g_safe_shared_memory_pool = - LAZY_INSTANCE_INITIALIZER; - -SafeSharedMemoryPool* safe_shared_memory_pool() { - return g_safe_shared_memory_pool.Pointer(); -} - static uint64 g_next_pixel_transfer_state_id = 1; void PerformNotifyCompletion( AsyncMemoryParams mem_params, - ScopedSafeSharedMemory* safe_shared_memory, scoped_refptr<AsyncPixelTransferCompletionObserver> observer) { TRACE_EVENT0("gpu", "PerformNotifyCompletion"); - AsyncMemoryParams safe_mem_params = mem_params; - safe_mem_params.shared_memory = safe_shared_memory->shared_memory(); - observer->DidComplete(safe_mem_params); + observer->DidComplete(mem_params); } } // namespace @@ -60,15 +50,11 @@ class AsyncPixelTransferDelegateIdle virtual void WaitForTransferCompletion() OVERRIDE; private: - void PerformAsyncTexImage2D( - AsyncTexImage2DParams tex_params, - AsyncMemoryParams mem_params, - const base::Closure& bind_callback, - ScopedSafeSharedMemory* safe_shared_memory); - void PerformAsyncTexSubImage2D( - AsyncTexSubImage2DParams tex_params, - AsyncMemoryParams mem_params, - ScopedSafeSharedMemory* safe_shared_memory); + void PerformAsyncTexImage2D(AsyncTexImage2DParams tex_params, + AsyncMemoryParams mem_params, + const base::Closure& bind_callback); + void PerformAsyncTexSubImage2D(AsyncTexSubImage2DParams tex_params, + AsyncMemoryParams mem_params); uint64 id_; GLuint texture_id_; @@ -98,22 +84,17 @@ void AsyncPixelTransferDelegateIdle::AsyncTexImage2D( const AsyncTexImage2DParams& tex_params, const AsyncMemoryParams& mem_params, const base::Closure& bind_callback) { + TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); - DCHECK(mem_params.shared_memory); - DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, - mem_params.shm_size); shared_state_->tasks.push_back(AsyncPixelTransferManagerIdle::Task( id_, - base::Bind( - &AsyncPixelTransferDelegateIdle::PerformAsyncTexImage2D, - AsWeakPtr(), - tex_params, - mem_params, - bind_callback, - base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), - mem_params.shared_memory, - mem_params.shm_size))))); + this, + base::Bind(&AsyncPixelTransferDelegateIdle::PerformAsyncTexImage2D, + AsWeakPtr(), + tex_params, + mem_params, + bind_callback))); transfer_in_progress_ = true; } @@ -121,21 +102,16 @@ void AsyncPixelTransferDelegateIdle::AsyncTexImage2D( void AsyncPixelTransferDelegateIdle::AsyncTexSubImage2D( const AsyncTexSubImage2DParams& tex_params, const AsyncMemoryParams& mem_params) { + TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); - DCHECK(mem_params.shared_memory); - DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, - mem_params.shm_size); shared_state_->tasks.push_back(AsyncPixelTransferManagerIdle::Task( id_, - base::Bind( - &AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D, - AsWeakPtr(), - tex_params, - mem_params, - base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), - mem_params.shared_memory, - mem_params.shm_size))))); + this, + base::Bind(&AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D, + AsWeakPtr(), + tex_params, + mem_params))); transfer_in_progress_ = true; } @@ -163,13 +139,12 @@ void AsyncPixelTransferDelegateIdle::WaitForTransferCompletion() { void AsyncPixelTransferDelegateIdle::PerformAsyncTexImage2D( AsyncTexImage2DParams tex_params, AsyncMemoryParams mem_params, - const base::Closure& bind_callback, - ScopedSafeSharedMemory* safe_shared_memory) { + const base::Closure& bind_callback) { TRACE_EVENT2("gpu", "PerformAsyncTexImage2D", "width", tex_params.width, "height", tex_params.height); - void* data = GetAddress(safe_shared_memory, mem_params); + void* data = mem_params.GetDataAddress(); base::TimeTicks begin_time(base::TimeTicks::HighResNow()); gfx::ScopedTextureBinder texture_binder(tex_params.target, texture_id_); @@ -188,6 +163,7 @@ void AsyncPixelTransferDelegateIdle::PerformAsyncTexImage2D( data); } + TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); transfer_in_progress_ = false; shared_state_->texture_upload_count++; shared_state_->total_texture_upload_time += @@ -199,13 +175,12 @@ void AsyncPixelTransferDelegateIdle::PerformAsyncTexImage2D( void AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D( AsyncTexSubImage2DParams tex_params, - AsyncMemoryParams mem_params, - ScopedSafeSharedMemory* safe_shared_memory) { + AsyncMemoryParams mem_params) { TRACE_EVENT2("gpu", "PerformAsyncTexSubImage2D", "width", tex_params.width, "height", tex_params.height); - void* data = GetAddress(safe_shared_memory, mem_params); + void* data = mem_params.GetDataAddress(); base::TimeTicks begin_time(base::TimeTicks::HighResNow()); gfx::ScopedTextureBinder texture_binder(tex_params.target, texture_id_); @@ -243,6 +218,7 @@ void AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D( data); } + TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); transfer_in_progress_ = false; shared_state_->texture_upload_count++; shared_state_->total_texture_upload_time += @@ -250,8 +226,11 @@ void AsyncPixelTransferDelegateIdle::PerformAsyncTexSubImage2D( } AsyncPixelTransferManagerIdle::Task::Task( - uint64 transfer_id, const base::Closure& task) + uint64 transfer_id, + AsyncPixelTransferDelegate* delegate, + const base::Closure& task) : transfer_id(transfer_id), + delegate(delegate), task(task) { } @@ -293,12 +272,10 @@ void AsyncPixelTransferManagerIdle::AsyncNotifyCompletion( shared_state_.tasks.push_back( Task(0, // 0 transfer_id for notification tasks. + NULL, base::Bind( &PerformNotifyCompletion, mem_params, - base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), - mem_params.shared_memory, - mem_params.shm_size)), make_scoped_refptr(observer)))); } @@ -326,6 +303,15 @@ bool AsyncPixelTransferManagerIdle::NeedsProcessMorePendingTransfers() { return !shared_state_.tasks.empty(); } +void AsyncPixelTransferManagerIdle::WaitAllAsyncTexImage2D() { + if (shared_state_.tasks.empty()) + return; + + const Task& task = shared_state_.tasks.back(); + if (task.delegate) + task.delegate->WaitForTransferCompletion(); +} + AsyncPixelTransferDelegate* AsyncPixelTransferManagerIdle::CreatePixelTransferDelegateImpl( gles2::TextureRef* ref, diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_idle.h b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_idle.h index e7f990e317a..af3262f2889 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_idle.h +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_idle.h @@ -25,14 +25,19 @@ class AsyncPixelTransferManagerIdle : public AsyncPixelTransferManager { virtual base::TimeDelta GetTotalTextureUploadTime() OVERRIDE; virtual void ProcessMorePendingTransfers() OVERRIDE; virtual bool NeedsProcessMorePendingTransfers() OVERRIDE; + virtual void WaitAllAsyncTexImage2D() OVERRIDE; struct Task { - Task(uint64 transfer_id, const base::Closure& task); + Task(uint64 transfer_id, + AsyncPixelTransferDelegate* delegate, + const base::Closure& task); ~Task(); // This is non-zero if pixel transfer task. uint64 transfer_id; + AsyncPixelTransferDelegate* delegate; + base::Closure task; }; diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_mock.h b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_mock.h index adc2a6f939e..3bc8b6bd036 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_mock.h +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_mock.h @@ -24,6 +24,7 @@ class MockAsyncPixelTransferManager : public AsyncPixelTransferManager { MOCK_METHOD0(GetTotalTextureUploadTime, base::TimeDelta()); MOCK_METHOD0(ProcessMorePendingTransfers, void()); MOCK_METHOD0(NeedsProcessMorePendingTransfers, bool()); + MOCK_METHOD0(WaitAllAsyncTexImage2D, void()); MOCK_METHOD2( CreatePixelTransferDelegateImpl, AsyncPixelTransferDelegate*(gles2::TextureRef* ref, diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.cc b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.cc index f71e07e76ee..99103b81c65 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.cc +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.cc @@ -8,6 +8,7 @@ #include "base/bind.h" #include "base/debug/trace_event.h" +#include "base/debug/trace_event_synthetic_delay.h" #include "base/lazy_instance.h" #include "base/logging.h" #include "base/memory/ref_counted.h" @@ -18,7 +19,6 @@ #include "base/threading/thread.h" #include "base/threading/thread_checker.h" #include "gpu/command_buffer/service/async_pixel_transfer_delegate.h" -#include "gpu/command_buffer/service/safe_shared_memory_pool.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_surface.h" @@ -33,12 +33,9 @@ const char kAsyncTransferThreadName[] = "AsyncTransferThread"; void PerformNotifyCompletion( AsyncMemoryParams mem_params, - ScopedSafeSharedMemory* safe_shared_memory, scoped_refptr<AsyncPixelTransferCompletionObserver> observer) { TRACE_EVENT0("gpu", "PerformNotifyCompletion"); - AsyncMemoryParams safe_mem_params = mem_params; - safe_mem_params.shared_memory = safe_shared_memory->shared_memory(); - observer->DidComplete(safe_mem_params); + observer->DidComplete(mem_params); } // TODO(backer): Factor out common thread scheduling logic from the EGL and @@ -79,16 +76,11 @@ class TransferThread : public base::Thread { context_ = NULL; } - SafeSharedMemoryPool* safe_shared_memory_pool() { - return &safe_shared_memory_pool_; - } - private: bool initialized_; scoped_refptr<gfx::GLSurface> surface_; scoped_refptr<gfx::GLContext> context_; - SafeSharedMemoryPool safe_shared_memory_pool_; void InitializeOnTransferThread(gfx::GLContext* parent_context, base::WaitableEvent* caller_wait) { @@ -135,10 +127,6 @@ base::MessageLoopProxy* transfer_message_loop_proxy() { return g_transfer_thread.Pointer()->message_loop_proxy().get(); } -SafeSharedMemoryPool* safe_shared_memory_pool() { - return g_transfer_thread.Pointer()->safe_shared_memory_pool(); -} - class PendingTask : public base::RefCountedThreadSafe<PendingTask> { public: explicit PendingTask(const base::Closure& task) @@ -251,16 +239,12 @@ class TransferStateInternal const AsyncMemoryParams mem_params, scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats, const base::Closure& bind_callback) { + TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); pending_upload_task_ = new PendingTask(base::Bind( &TransferStateInternal::PerformAsyncTexImage2D, this, tex_params, mem_params, - // Duplicate the shared memory so there is no way we can get - // a use-after-free of the raw pixels. - base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), - mem_params.shared_memory, - mem_params.shm_size)), texture_upload_stats)); transfer_message_loop_proxy()->PostTask( FROM_HERE, @@ -276,14 +260,12 @@ class TransferStateInternal AsyncTexSubImage2DParams tex_params, AsyncMemoryParams mem_params, scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats) { + TRACE_EVENT_SYNTHETIC_DELAY_BEGIN("gpu.AsyncTexImage"); pending_upload_task_ = new PendingTask(base::Bind( &TransferStateInternal::PerformAsyncTexSubImage2D, this, tex_params, mem_params, - base::Owned(new ScopedSafeSharedMemory(safe_shared_memory_pool(), - mem_params.shared_memory, - mem_params.shm_size)), texture_upload_stats)); transfer_message_loop_proxy()->PostTask( FROM_HERE, @@ -300,7 +282,6 @@ class TransferStateInternal void PerformAsyncTexImage2D( AsyncTexImage2DParams tex_params, AsyncMemoryParams mem_params, - ScopedSafeSharedMemory* safe_shared_memory, scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats) { TRACE_EVENT2("gpu", "PerformAsyncTexImage", @@ -314,8 +295,7 @@ class TransferStateInternal if (texture_upload_stats.get()) begin_time = base::TimeTicks::HighResNow(); - void* data = - AsyncPixelTransferDelegate::GetAddress(safe_shared_memory, mem_params); + void* data = mem_params.GetDataAddress(); { TRACE_EVENT0("gpu", "glTexImage2D"); @@ -328,6 +308,7 @@ class TransferStateInternal tex_params.format, tex_params.type, data); + TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); } if (texture_upload_stats.get()) { @@ -339,7 +320,6 @@ class TransferStateInternal void PerformAsyncTexSubImage2D( AsyncTexSubImage2DParams tex_params, AsyncMemoryParams mem_params, - ScopedSafeSharedMemory* safe_shared_memory, scoped_refptr<AsyncPixelTransferUploadStats> texture_upload_stats) { TRACE_EVENT2("gpu", "PerformAsyncTexSubImage2D", @@ -353,9 +333,7 @@ class TransferStateInternal if (texture_upload_stats.get()) begin_time = base::TimeTicks::HighResNow(); - void* data = - AsyncPixelTransferDelegate::GetAddress(safe_shared_memory, mem_params); - + void* data = mem_params.GetDataAddress(); { TRACE_EVENT0("gpu", "glTexSubImage2D"); glTexSubImage2D(GL_TEXTURE_2D, @@ -367,6 +345,7 @@ class TransferStateInternal tex_params.format, tex_params.type, data); + TRACE_EVENT_SYNTHETIC_DELAY_END("gpu.AsyncTexImage"); } if (texture_upload_stats.get()) { @@ -462,9 +441,6 @@ void AsyncPixelTransferDelegateShareGroup::AsyncTexImage2D( const AsyncTexImage2DParams& tex_params, const AsyncMemoryParams& mem_params, const base::Closure& bind_callback) { - DCHECK(mem_params.shared_memory); - DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, - mem_params.shm_size); DCHECK(!state_->TransferIsInProgress()); DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); DCHECK_EQ(tex_params.level, 0); @@ -483,9 +459,6 @@ void AsyncPixelTransferDelegateShareGroup::AsyncTexSubImage2D( "width", tex_params.width, "height", tex_params.height); DCHECK(!state_->TransferIsInProgress()); - DCHECK(mem_params.shared_memory); - DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, - mem_params.shm_size); DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D), tex_params.target); DCHECK_EQ(tex_params.level, 0); @@ -534,19 +507,12 @@ void AsyncPixelTransferManagerShareGroup::BindCompletedAsyncTransfers() { void AsyncPixelTransferManagerShareGroup::AsyncNotifyCompletion( const AsyncMemoryParams& mem_params, AsyncPixelTransferCompletionObserver* observer) { - DCHECK(mem_params.shared_memory); - DCHECK_LE(mem_params.shm_data_offset + mem_params.shm_data_size, - mem_params.shm_size); // Post a PerformNotifyCompletion task to the upload thread. This task // will run after all async transfers are complete. transfer_message_loop_proxy()->PostTask( FROM_HERE, base::Bind(&PerformNotifyCompletion, mem_params, - base::Owned( - new ScopedSafeSharedMemory(safe_shared_memory_pool(), - mem_params.shared_memory, - mem_params.shm_size)), make_scoped_refptr(observer))); } @@ -568,6 +534,16 @@ bool AsyncPixelTransferManagerShareGroup::NeedsProcessMorePendingTransfers() { return false; } +void AsyncPixelTransferManagerShareGroup::WaitAllAsyncTexImage2D() { + if (shared_state_.pending_allocations.empty()) + return; + + AsyncPixelTransferDelegateShareGroup* delegate = + shared_state_.pending_allocations.back().get(); + if (delegate) + delegate->WaitForTransferCompletion(); +} + AsyncPixelTransferDelegate* AsyncPixelTransferManagerShareGroup::CreatePixelTransferDelegateImpl( gles2::TextureRef* ref, diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.h b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.h index 173b5322faf..64daffe60f7 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.h +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_share_group.h @@ -31,6 +31,7 @@ class AsyncPixelTransferManagerShareGroup : public AsyncPixelTransferManager { virtual base::TimeDelta GetTotalTextureUploadTime() OVERRIDE; virtual void ProcessMorePendingTransfers() OVERRIDE; virtual bool NeedsProcessMorePendingTransfers() OVERRIDE; + virtual void WaitAllAsyncTexImage2D() OVERRIDE; // State shared between Managers and Delegates. struct SharedState { diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_stub.cc b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_stub.cc index ccd5d3d3e60..d5f96b03b73 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_stub.cc +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_stub.cc @@ -78,6 +78,9 @@ bool AsyncPixelTransferManagerStub::NeedsProcessMorePendingTransfers() { return false; } +void AsyncPixelTransferManagerStub::WaitAllAsyncTexImage2D() { +} + AsyncPixelTransferDelegate* AsyncPixelTransferManagerStub::CreatePixelTransferDelegateImpl( gles2::TextureRef* ref, diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_stub.h b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_stub.h index 0f4e4ba95cd..a93ce9499e5 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_stub.h +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_stub.h @@ -23,6 +23,7 @@ class AsyncPixelTransferManagerStub : public AsyncPixelTransferManager { virtual base::TimeDelta GetTotalTextureUploadTime() OVERRIDE; virtual void ProcessMorePendingTransfers() OVERRIDE; virtual bool NeedsProcessMorePendingTransfers() OVERRIDE; + virtual void WaitAllAsyncTexImage2D() OVERRIDE; private: // AsyncPixelTransferManager implementation: diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_sync.cc b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_sync.cc index ffe55849358..cd7d087730f 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_sync.cc +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_sync.cc @@ -46,7 +46,7 @@ void AsyncPixelTransferDelegateSync::AsyncTexImage2D( const base::Closure& bind_callback) { // Save the define params to return later during deferred // binding of the transfer texture. - void* data = GetAddress(mem_params); + void* data = mem_params.GetDataAddress(); base::TimeTicks begin_time(base::TimeTicks::HighResNow()); glTexImage2D( tex_params.target, @@ -68,7 +68,7 @@ void AsyncPixelTransferDelegateSync::AsyncTexImage2D( void AsyncPixelTransferDelegateSync::AsyncTexSubImage2D( const AsyncTexSubImage2DParams& tex_params, const AsyncMemoryParams& mem_params) { - void* data = GetAddress(mem_params); + void* data = mem_params.GetDataAddress(); base::TimeTicks begin_time(base::TimeTicks::HighResNow()); glTexSubImage2D( tex_params.target, @@ -128,6 +128,9 @@ bool AsyncPixelTransferManagerSync::NeedsProcessMorePendingTransfers() { return false; } +void AsyncPixelTransferManagerSync::WaitAllAsyncTexImage2D() { +} + AsyncPixelTransferDelegate* AsyncPixelTransferManagerSync::CreatePixelTransferDelegateImpl( gles2::TextureRef* ref, diff --git a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_sync.h b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_sync.h index cb62062a860..7d0b8b6636b 100644 --- a/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_sync.h +++ b/chromium/gpu/command_buffer/service/async_pixel_transfer_manager_sync.h @@ -23,6 +23,7 @@ class AsyncPixelTransferManagerSync : public AsyncPixelTransferManager { virtual base::TimeDelta GetTotalTextureUploadTime() OVERRIDE; virtual void ProcessMorePendingTransfers() OVERRIDE; virtual bool NeedsProcessMorePendingTransfers() OVERRIDE; + virtual void WaitAllAsyncTexImage2D() OVERRIDE; // State shared between Managers and Delegates. struct SharedState { diff --git a/chromium/gpu/command_buffer/service/buffer_manager_unittest.cc b/chromium/gpu/command_buffer/service/buffer_manager_unittest.cc index 444c3935bf5..77f32dcc416 100644 --- a/chromium/gpu/command_buffer/service/buffer_manager_unittest.cc +++ b/chromium/gpu/command_buffer/service/buffer_manager_unittest.cc @@ -5,6 +5,7 @@ #include "gpu/command_buffer/service/buffer_manager.h" #include "gpu/command_buffer/service/error_state_mock.h" #include "gpu/command_buffer/service/feature_info.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/mocks.h" #include "gpu/command_buffer/service/test_helper.h" #include "testing/gtest/include/gtest/gtest.h" @@ -17,14 +18,13 @@ using ::testing::StrictMock; namespace gpu { namespace gles2 { -class BufferManagerTestBase : public testing::Test { +class BufferManagerTestBase : public GpuServiceTest { protected: void SetUpBase( MemoryTracker* memory_tracker, FeatureInfo* feature_info, const char* extensions) { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); + GpuServiceTest::SetUp(); if (feature_info) { TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), extensions); feature_info->Initialize(); @@ -36,9 +36,8 @@ class BufferManagerTestBase : public testing::Test { virtual void TearDown() { manager_->Destroy(false); manager_.reset(); - ::gfx::GLInterface::SetGLInterface(NULL); error_state_.reset(); - gl_.reset(); + GpuServiceTest::TearDown(); } GLenum GetTarget(const Buffer* buffer) const { @@ -73,8 +72,6 @@ class BufferManagerTestBase : public testing::Test { return success; } - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; scoped_ptr<BufferManager> manager_; scoped_ptr<MockErrorState> error_state_; }; diff --git a/chromium/gpu/command_buffer/service/cmd_buffer_engine.h b/chromium/gpu/command_buffer/service/cmd_buffer_engine.h index 6aefe82e35e..75e60691f51 100644 --- a/chromium/gpu/command_buffer/service/cmd_buffer_engine.h +++ b/chromium/gpu/command_buffer/service/cmd_buffer_engine.h @@ -24,7 +24,7 @@ class CommandBufferEngine { // Gets the base address and size of a registered shared memory buffer. // Parameters: // shm_id: the identifier for the shared memory buffer. - virtual Buffer GetSharedMemoryBuffer(int32 shm_id) = 0; + virtual scoped_refptr<gpu::Buffer> GetSharedMemoryBuffer(int32 shm_id) = 0; // Sets the token value. virtual void set_token(int32 token) = 0; diff --git a/chromium/gpu/command_buffer/service/command_buffer_service.cc b/chromium/gpu/command_buffer/service/command_buffer_service.cc index bae2d801dd5..c9c07822e81 100644 --- a/chromium/gpu/command_buffer/service/command_buffer_service.cc +++ b/chromium/gpu/command_buffer/service/command_buffer_service.cc @@ -37,7 +37,7 @@ bool CommandBufferService::Initialize() { return true; } -CommandBufferService::State CommandBufferService::GetState() { +CommandBufferService::State CommandBufferService::GetLastState() { State state; state.num_entries = num_entries_; state.get_offset = get_offset_; @@ -50,34 +50,23 @@ CommandBufferService::State CommandBufferService::GetState() { return state; } -CommandBufferService::State CommandBufferService::GetLastState() { - return GetState(); -} - int32 CommandBufferService::GetLastToken() { - return GetState().token; + return GetLastState().token; } void CommandBufferService::UpdateState() { if (shared_state_) { - CommandBufferService::State state = GetState(); + CommandBufferService::State state = GetLastState(); shared_state_->Write(state); } } -CommandBufferService::State CommandBufferService::FlushSync( - int32 put_offset, int32 last_known_get) { - if (put_offset < 0 || put_offset > num_entries_) { - error_ = gpu::error::kOutOfBounds; - return GetState(); - } - - put_offset_ = put_offset; - - if (!put_offset_change_callback_.is_null()) - put_offset_change_callback_.Run(); +void CommandBufferService::WaitForTokenInRange(int32 start, int32 end) { + DCHECK(error_ != error::kNoError || InRange(start, end, token_)); +} - return GetState(); +void CommandBufferService::WaitForGetOffsetInRange(int32 start, int32 end) { + DCHECK(error_ != error::kNoError || InRange(start, end, get_offset_)); } void CommandBufferService::Flush(int32 put_offset) { @@ -95,10 +84,12 @@ void CommandBufferService::Flush(int32 put_offset) { void CommandBufferService::SetGetBuffer(int32 transfer_buffer_id) { DCHECK_EQ(-1, ring_buffer_id_); DCHECK_EQ(put_offset_, get_offset_); // Only if it's empty. + // If the buffer is invalid we handle it gracefully. + // This means ring_buffer_ can be NULL. ring_buffer_ = GetTransferBuffer(transfer_buffer_id); - DCHECK(ring_buffer_.ptr); ring_buffer_id_ = transfer_buffer_id; - num_entries_ = ring_buffer_.size / sizeof(CommandBufferEntry); + int32 size = ring_buffer_ ? ring_buffer_->size() : 0; + num_entries_ = size / sizeof(CommandBufferEntry); put_offset_ = 0; SetGetOffset(0); if (!get_buffer_change_callback_.is_null()) { @@ -108,17 +99,15 @@ void CommandBufferService::SetGetBuffer(int32 transfer_buffer_id) { UpdateState(); } -bool CommandBufferService::SetSharedStateBuffer( - scoped_ptr<base::SharedMemory> shared_state_shm) { - shared_state_shm_.reset(shared_state_shm.release()); - if (!shared_state_shm_->Map(sizeof(*shared_state_))) - return false; +void CommandBufferService::SetSharedStateBuffer( + scoped_ptr<BufferBacking> shared_state_buffer) { + shared_state_buffer_ = shared_state_buffer.Pass(); + DCHECK(shared_state_buffer_->GetSize() >= sizeof(*shared_state_)); shared_state_ = - static_cast<CommandBufferSharedState*>(shared_state_shm_->memory()); + static_cast<CommandBufferSharedState*>(shared_state_buffer_->GetMemory()); UpdateState(); - return true; } void CommandBufferService::SetGetOffset(int32 get_offset) { @@ -126,20 +115,21 @@ void CommandBufferService::SetGetOffset(int32 get_offset) { get_offset_ = get_offset; } -Buffer CommandBufferService::CreateTransferBuffer(size_t size, - int32* id) { +scoped_refptr<Buffer> CommandBufferService::CreateTransferBuffer(size_t size, + int32* id) { *id = -1; - SharedMemory buffer; - if (!buffer.CreateAnonymous(size)) - return Buffer(); + scoped_ptr<SharedMemory> shared_memory(new SharedMemory()); + if (!shared_memory->CreateAndMapAnonymous(size)) + return NULL; static int32 next_id = 1; *id = next_id++; - if (!RegisterTransferBuffer(*id, &buffer, size)) { + if (!RegisterTransferBuffer( + *id, MakeBackingFromSharedMemory(shared_memory.Pass(), size))) { *id = -1; - return Buffer(); + return NULL; } return GetTransferBuffer(*id); @@ -149,24 +139,21 @@ void CommandBufferService::DestroyTransferBuffer(int32 id) { transfer_buffer_manager_->DestroyTransferBuffer(id); if (id == ring_buffer_id_) { ring_buffer_id_ = -1; - ring_buffer_ = Buffer(); + ring_buffer_ = NULL; num_entries_ = 0; get_offset_ = 0; put_offset_ = 0; } } -Buffer CommandBufferService::GetTransferBuffer(int32 id) { +scoped_refptr<Buffer> CommandBufferService::GetTransferBuffer(int32 id) { return transfer_buffer_manager_->GetTransferBuffer(id); } bool CommandBufferService::RegisterTransferBuffer( int32 id, - base::SharedMemory* shared_memory, - size_t size) { - return transfer_buffer_manager_->RegisterTransferBuffer(id, - shared_memory, - size); + scoped_ptr<BufferBacking> buffer) { + return transfer_buffer_manager_->RegisterTransferBuffer(id, buffer.Pass()); } void CommandBufferService::SetToken(int32 token) { diff --git a/chromium/gpu/command_buffer/service/command_buffer_service.h b/chromium/gpu/command_buffer/service/command_buffer_service.h index b1f8fa15fea..ac2330100b8 100644 --- a/chromium/gpu/command_buffer/service/command_buffer_service.h +++ b/chromium/gpu/command_buffer/service/command_buffer_service.h @@ -14,9 +14,30 @@ namespace gpu { class TransferBufferManagerInterface; +class GPU_EXPORT CommandBufferServiceBase : public CommandBuffer { + public: + // Sets the current get offset. This can be called from any thread. + virtual void SetGetOffset(int32 get_offset) = 0; + + // Get the transfer buffer associated with an ID. Returns a null buffer for + // ID 0. + virtual scoped_refptr<gpu::Buffer> GetTransferBuffer(int32 id) = 0; + + // Allows the reader to update the current token value. + virtual void SetToken(int32 token) = 0; + + // Allows the reader to set the current parse error. + virtual void SetParseError(error::Error) = 0; + + // Allows the reader to set the current context lost reason. + // NOTE: if calling this in conjunction with SetParseError, + // call this first. + virtual void SetContextLostReason(error::ContextLostReason) = 0; +}; + // An object that implements a shared memory command buffer and a synchronous // API to manage the put and get pointers. -class GPU_EXPORT CommandBufferService : public CommandBuffer { +class GPU_EXPORT CommandBufferService : public CommandBufferServiceBase { public: typedef base::Callback<bool(int32)> GetBufferChangedCallback; explicit CommandBufferService( @@ -25,16 +46,19 @@ class GPU_EXPORT CommandBufferService : public CommandBuffer { // CommandBuffer implementation: virtual bool Initialize() OVERRIDE; - virtual State GetState() OVERRIDE; virtual State GetLastState() OVERRIDE; virtual int32 GetLastToken() OVERRIDE; virtual void Flush(int32 put_offset) OVERRIDE; - virtual State FlushSync(int32 put_offset, int32 last_known_get) OVERRIDE; + virtual void WaitForTokenInRange(int32 start, int32 end) OVERRIDE; + virtual void WaitForGetOffsetInRange(int32 start, int32 end) OVERRIDE; virtual void SetGetBuffer(int32 transfer_buffer_id) OVERRIDE; - virtual void SetGetOffset(int32 get_offset) OVERRIDE; - virtual Buffer CreateTransferBuffer(size_t size, int32* id) OVERRIDE; + virtual scoped_refptr<Buffer> CreateTransferBuffer(size_t size, + int32* id) OVERRIDE; virtual void DestroyTransferBuffer(int32 id) OVERRIDE; - virtual Buffer GetTransferBuffer(int32 id) OVERRIDE; + + // CommandBufferServiceBase implementation: + virtual void SetGetOffset(int32 get_offset) OVERRIDE; + virtual scoped_refptr<Buffer> GetTransferBuffer(int32 id) OVERRIDE; virtual void SetToken(int32 token) OVERRIDE; virtual void SetParseError(error::Error error) OVERRIDE; virtual void SetContextLostReason(error::ContextLostReason) OVERRIDE; @@ -54,22 +78,19 @@ class GPU_EXPORT CommandBufferService : public CommandBuffer { virtual void SetParseErrorCallback(const base::Closure& callback); // Setup the shared memory that shared state should be copied into. - bool SetSharedStateBuffer(scoped_ptr<base::SharedMemory> shared_state_shm); + void SetSharedStateBuffer(scoped_ptr<BufferBacking> shared_state_buffer); // Copy the current state into the shared state transfer buffer. void UpdateState(); - // Register an existing shared memory object and get an ID that can be used - // to identify it in the command buffer. Callee dups the handle until - // DestroyTransferBuffer is called. - bool RegisterTransferBuffer(int32 id, - base::SharedMemory* shared_memory, - size_t size); + // Registers an existing shared memory object and get an ID that can be used + // to identify it in the command buffer. + bool RegisterTransferBuffer(int32 id, scoped_ptr<BufferBacking> buffer); private: int32 ring_buffer_id_; - Buffer ring_buffer_; - scoped_ptr<base::SharedMemory> shared_state_shm_; + scoped_refptr<Buffer> ring_buffer_; + scoped_ptr<BufferBacking> shared_state_buffer_; CommandBufferSharedState* shared_state_; int32 num_entries_; int32 get_offset_; diff --git a/chromium/gpu/command_buffer/service/command_buffer_service_unittest.cc b/chromium/gpu/command_buffer/service/command_buffer_service_unittest.cc index bf4d619f819..229aafaf1d0 100644 --- a/chromium/gpu/command_buffer/service/command_buffer_service_unittest.cc +++ b/chromium/gpu/command_buffer/service/command_buffer_service_unittest.cc @@ -34,19 +34,19 @@ class CommandBufferServiceTest : public testing::Test { } int32 GetGetOffset() { - return command_buffer_->GetState().get_offset; + return command_buffer_->GetLastState().get_offset; } int32 GetPutOffset() { - return command_buffer_->GetState().put_offset; + return command_buffer_->GetLastState().put_offset; } int32 GetToken() { - return command_buffer_->GetState().token; + return command_buffer_->GetLastState().token; } int32 GetError() { - return command_buffer_->GetState().error; + return command_buffer_->GetLastState().error; } bool Initialize(size_t size) { @@ -63,7 +63,7 @@ class CommandBufferServiceTest : public testing::Test { TEST_F(CommandBufferServiceTest, InitializesCommandBuffer) { EXPECT_TRUE(Initialize(1024)); - CommandBuffer::State state = command_buffer_->GetState(); + CommandBuffer::State state = command_buffer_->GetLastState(); EXPECT_EQ(0, state.get_offset); EXPECT_EQ(0, state.put_offset); EXPECT_EQ(0, state.token); diff --git a/chromium/gpu/command_buffer/service/common_decoder.cc b/chromium/gpu/command_buffer/service/common_decoder.cc index 72f30a30bfc..06cf3a4bb37 100644 --- a/chromium/gpu/command_buffer/service/common_decoder.cc +++ b/chromium/gpu/command_buffer/service/common_decoder.cc @@ -61,20 +61,17 @@ CommonDecoder::CommonDecoder() : engine_(NULL) {} CommonDecoder::~CommonDecoder() {} void* CommonDecoder::GetAddressAndCheckSize(unsigned int shm_id, - unsigned int offset, - unsigned int size) { + unsigned int data_offset, + unsigned int data_size) { CHECK(engine_); - Buffer buffer = engine_->GetSharedMemoryBuffer(shm_id); - if (!buffer.ptr) + scoped_refptr<gpu::Buffer> buffer = engine_->GetSharedMemoryBuffer(shm_id); + if (!buffer) return NULL; - unsigned int end = offset + size; - if (end > buffer.size || end < offset) { - return NULL; - } - return static_cast<int8*>(buffer.ptr) + offset; + return buffer->GetDataAddress(data_offset, data_size); } -Buffer CommonDecoder::GetSharedMemoryBuffer(unsigned int shm_id) { +scoped_refptr<gpu::Buffer> CommonDecoder::GetSharedMemoryBuffer( + unsigned int shm_id) { return engine_->GetSharedMemoryBuffer(shm_id); } @@ -111,17 +108,23 @@ RETURN_TYPE GetImmediateDataAs(const COMMAND_TYPE& pod) { return static_cast<RETURN_TYPE>(const_cast<void*>(AddressAfterStruct(pod))); } +// TODO(vmiura): Looks like this g_command_info is duplicated in +// common_decoder.cc +// and gles2_cmd_decoder.cc. Fix it! + // A struct to hold info about each command. struct CommandInfo { - int arg_flags; // How to handle the arguments for this command - int arg_count; // How many arguments are expected for this command. + uint8 arg_flags; // How to handle the arguments for this command + uint8 cmd_flags; // How to handle this command + uint16 arg_count; // How many arguments are expected for this command. }; // A table of CommandInfo for all the commands. const CommandInfo g_command_info[] = { #define COMMON_COMMAND_BUFFER_CMD_OP(name) { \ cmd::name::kArgFlags, \ - sizeof(cmd::name) / sizeof(CommandBufferEntry) - 1, }, /* NOLINT */ \ + cmd::name::cmd_flags, \ + sizeof(cmd::name) / sizeof(CommandBufferEntry) - 1, }, /* NOLINT */ COMMON_COMMAND_BUFFER_CMDS(COMMON_COMMAND_BUFFER_CMD_OP) diff --git a/chromium/gpu/command_buffer/service/common_decoder.h b/chromium/gpu/command_buffer/service/common_decoder.h index 03002c8b06f..2132afbf4fb 100644 --- a/chromium/gpu/command_buffer/service/common_decoder.h +++ b/chromium/gpu/command_buffer/service/common_decoder.h @@ -132,7 +132,7 @@ class GPU_EXPORT CommonDecoder : NON_EXPORTED_BASE(public AsyncAPIInterface) { } // Get the actual shared memory buffer. - Buffer GetSharedMemoryBuffer(unsigned int shm_id); + scoped_refptr<gpu::Buffer> GetSharedMemoryBuffer(unsigned int shm_id); protected: // Executes a common command. diff --git a/chromium/gpu/command_buffer/service/common_decoder_unittest.cc b/chromium/gpu/command_buffer/service/common_decoder_unittest.cc index d90e34bf93b..11274e05f07 100644 --- a/chromium/gpu/command_buffer/service/common_decoder_unittest.cc +++ b/chromium/gpu/command_buffer/service/common_decoder_unittest.cc @@ -81,26 +81,29 @@ class MockCommandBufferEngine : public CommandBufferEngine { : CommandBufferEngine(), token_(), get_offset_(0) { + scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); + shared_memory->CreateAndMapAnonymous(kBufferSize); + buffer_ = MakeBufferFromSharedMemory(shared_memory.Pass(), kBufferSize); } // Overridden from CommandBufferEngine. - virtual Buffer GetSharedMemoryBuffer(int32 shm_id) OVERRIDE { - Buffer buffer; - if (IsValidSharedMemoryId(shm_id)) { - buffer.ptr = buffer_; - buffer.size = kBufferSize; - } - return buffer; + virtual scoped_refptr<gpu::Buffer> GetSharedMemoryBuffer(int32 shm_id) + OVERRIDE { + if (IsValidSharedMemoryId(shm_id)) + return buffer_; + return NULL; } template <typename T> T GetSharedMemoryAs(uint32 offset) { DCHECK_LT(offset, kBufferSize); - return reinterpret_cast<T>(&buffer_[offset]); + int8* buffer_memory = static_cast<int8*>(buffer_->memory()); + return reinterpret_cast<T>(&buffer_memory[offset]); } int32 GetSharedMemoryOffset(const void* memory) { - ptrdiff_t offset = reinterpret_cast<const int8*>(memory) - &buffer_[0]; + int8* buffer_memory = static_cast<int8*>(buffer_->memory()); + ptrdiff_t offset = static_cast<const int8*>(memory) - &buffer_memory[0]; DCHECK_GE(offset, 0); DCHECK_LT(static_cast<size_t>(offset), kBufferSize); return static_cast<int32>(offset); @@ -140,7 +143,7 @@ class MockCommandBufferEngine : public CommandBufferEngine { return shm_id == kValidShmId || shm_id == kStartValidShmId; } - int8 buffer_[kBufferSize]; + scoped_refptr<gpu::Buffer> buffer_; int32 token_; int32 get_offset_; }; diff --git a/chromium/gpu/command_buffer/service/context_group.cc b/chromium/gpu/command_buffer/service/context_group.cc index 27af0abafad..ba0437bfd4e 100644 --- a/chromium/gpu/command_buffer/service/context_group.cc +++ b/chromium/gpu/command_buffer/service/context_group.cc @@ -32,13 +32,13 @@ ContextGroup::ContextGroup( MailboxManager* mailbox_manager, ImageManager* image_manager, MemoryTracker* memory_tracker, - StreamTextureManager* stream_texture_manager, + ShaderTranslatorCache* shader_translator_cache, FeatureInfo* feature_info, bool bind_generates_resource) : mailbox_manager_(mailbox_manager ? mailbox_manager : new MailboxManager), image_manager_(image_manager ? image_manager : new ImageManager), memory_tracker_(memory_tracker), - stream_texture_manager_(stream_texture_manager), + shader_translator_cache_(shader_translator_cache), enforce_gl_minimums_(CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnforceGLMinimums)), bind_generates_resource_(bind_generates_resource), @@ -178,9 +178,9 @@ bool ContextGroup::Initialize( texture_manager_.reset(new TextureManager(memory_tracker_.get(), feature_info_.get(), max_texture_size, - max_cube_map_texture_size)); + max_cube_map_texture_size, + bind_generates_resource_)); texture_manager_->set_framebuffer_manager(framebuffer_manager_.get()); - texture_manager_->set_stream_texture_manager(stream_texture_manager_); const GLint kMinTextureImageUnits = 8; const GLint kMinVertexTextureImageUnits = 0; @@ -223,18 +223,24 @@ bool ContextGroup::Initialize( return false; } - // TODO(gman): Use workarounds similar to max_texture_size above to implement. - if (gfx::GetGLImplementation() == gfx::kGLImplementationOSMesaGL) { - // Some shaders in Skia needed more than the min. - max_fragment_uniform_vectors_ = - std::min(static_cast<uint32>(kMinFragmentUniformVectors * 2), - max_fragment_uniform_vectors_); - max_varying_vectors_ = - std::min(static_cast<uint32>(kMinVaryingVectors * 2), - max_varying_vectors_); + // Some shaders in Skia need more than the min available vertex and + // fragment shader uniform vectors in case of OSMesa GL Implementation + if (feature_info_->workarounds().max_fragment_uniform_vectors) { + max_fragment_uniform_vectors_ = std::min( + max_fragment_uniform_vectors_, + static_cast<uint32>( + feature_info_->workarounds().max_fragment_uniform_vectors)); + } + if (feature_info_->workarounds().max_varying_vectors) { + max_varying_vectors_ = std::min( + max_varying_vectors_, + static_cast<uint32>(feature_info_->workarounds().max_varying_vectors)); + } + if (feature_info_->workarounds().max_vertex_uniform_vectors) { max_vertex_uniform_vectors_ = - std::min(static_cast<uint32>(kMinVertexUniformVectors * 2), - max_vertex_uniform_vectors_); + std::min(max_vertex_uniform_vectors_, + static_cast<uint32>( + feature_info_->workarounds().max_vertex_uniform_vectors)); } program_manager_.reset(new ProgramManager( @@ -319,7 +325,6 @@ void ContextGroup::Destroy(GLES2Decoder* decoder, bool have_context) { } memory_tracker_ = NULL; - stream_texture_manager_ = NULL; } IdAllocatorInterface* ContextGroup::GetIdAllocator(unsigned namespace_id) { diff --git a/chromium/gpu/command_buffer/service/context_group.h b/chromium/gpu/command_buffer/service/context_group.h index 391db1a4ace..924527f87de 100644 --- a/chromium/gpu/command_buffer/service/context_group.h +++ b/chromium/gpu/command_buffer/service/context_group.h @@ -16,12 +16,12 @@ #include "gpu/command_buffer/common/gles2_cmd_format.h" #include "gpu/command_buffer/service/feature_info.h" #include "gpu/command_buffer/service/gles2_cmd_validation.h" +#include "gpu/command_buffer/service/shader_translator_cache.h" #include "gpu/gpu_export.h" namespace gpu { class IdAllocatorInterface; -class StreamTextureManager; class TransferBufferManagerInterface; namespace gles2 { @@ -47,7 +47,7 @@ class GPU_EXPORT ContextGroup : public base::RefCounted<ContextGroup> { MailboxManager* mailbox_manager, ImageManager* image_manager, MemoryTracker* memory_tracker, - StreamTextureManager* stream_texture_manager, + ShaderTranslatorCache* shader_translator_cache, FeatureInfo* feature_info, bool bind_generates_resource); @@ -73,8 +73,8 @@ class GPU_EXPORT ContextGroup : public base::RefCounted<ContextGroup> { return memory_tracker_.get(); } - StreamTextureManager* stream_texture_manager() const { - return stream_texture_manager_; + ShaderTranslatorCache* shader_translator_cache() const { + return shader_translator_cache_.get(); } bool bind_generates_resource() { @@ -185,7 +185,7 @@ class GPU_EXPORT ContextGroup : public base::RefCounted<ContextGroup> { scoped_refptr<MailboxManager> mailbox_manager_; scoped_refptr<ImageManager> image_manager_; scoped_refptr<MemoryTracker> memory_tracker_; - StreamTextureManager* stream_texture_manager_; + scoped_refptr<ShaderTranslatorCache> shader_translator_cache_; scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; bool enforce_gl_minimums_; diff --git a/chromium/gpu/command_buffer/service/context_group_unittest.cc b/chromium/gpu/command_buffer/service/context_group_unittest.cc index 0c710362d69..608109dffd0 100644 --- a/chromium/gpu/command_buffer/service/context_group_unittest.cc +++ b/chromium/gpu/command_buffer/service/context_group_unittest.cc @@ -6,12 +6,12 @@ #include "base/memory/scoped_ptr.h" #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/test_helper.h" #include "gpu/command_buffer/service/texture_manager.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_mock.h" -using ::gfx::MockGLInterface; using ::testing::_; using ::testing::DoAll; using ::testing::HasSubstr; @@ -23,31 +23,24 @@ using ::testing::Return; using ::testing::SetArrayArgument; using ::testing::SetArgumentPointee; using ::testing::StrEq; -using ::testing::StrictMock; namespace gpu { namespace gles2 { -class ContextGroupTest : public testing::Test { +class ContextGroupTest : public GpuServiceTest { public: - ContextGroupTest() { - } + static const bool kBindGeneratesResource = false; + + ContextGroupTest() {} protected: virtual void SetUp() { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); + GpuServiceTest::SetUp(); decoder_.reset(new MockGLES2Decoder()); group_ = scoped_refptr<ContextGroup>( - new ContextGroup(NULL, NULL, NULL, NULL, NULL, true)); - } - - virtual void TearDown() { - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); + new ContextGroup(NULL, NULL, NULL, NULL, NULL, kBindGeneratesResource)); } - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; scoped_ptr<MockGLES2Decoder> decoder_; scoped_refptr<ContextGroup> group_; }; @@ -70,8 +63,8 @@ TEST_F(ContextGroupTest, Basic) { } TEST_F(ContextGroupTest, InitializeNoExtensions) { - TestHelper::SetupContextGroupInitExpectations(gl_.get(), - DisallowedFeatures(), ""); + TestHelper::SetupContextGroupInitExpectations( + gl_.get(), DisallowedFeatures(), "", "", kBindGeneratesResource); group_->Initialize(decoder_.get(), DisallowedFeatures()); EXPECT_EQ(static_cast<uint32>(TestHelper::kNumVertexAttribs), group_->max_vertex_attribs()); @@ -105,8 +98,8 @@ TEST_F(ContextGroupTest, InitializeNoExtensions) { TEST_F(ContextGroupTest, MultipleContexts) { scoped_ptr<MockGLES2Decoder> decoder2_(new MockGLES2Decoder()); - TestHelper::SetupContextGroupInitExpectations(gl_.get(), - DisallowedFeatures(), ""); + TestHelper::SetupContextGroupInitExpectations( + gl_.get(), DisallowedFeatures(), "", "", kBindGeneratesResource); group_->Initialize(decoder_.get(), DisallowedFeatures()); group_->Initialize(decoder2_.get(), DisallowedFeatures()); diff --git a/chromium/gpu/command_buffer/service/context_state.cc b/chromium/gpu/command_buffer/service/context_state.cc index e8912cfe162..77d1f9286d1 100644 --- a/chromium/gpu/command_buffer/service/context_state.cc +++ b/chromium/gpu/command_buffer/service/context_state.cc @@ -18,7 +18,7 @@ namespace gles2 { namespace { -void EnableDisable(GLenum pname, bool enable) { +static void EnableDisable(GLenum pname, bool enable) { if (enable) { glEnable(pname); } else { @@ -26,6 +26,58 @@ void EnableDisable(GLenum pname, bool enable) { } } +GLuint Get2dServiceId(const TextureUnit& unit) { + return unit.bound_texture_2d.get() + ? unit.bound_texture_2d->service_id() : 0; +} + +GLuint GetCubeServiceId(const TextureUnit& unit) { + return unit.bound_texture_cube_map.get() + ? unit.bound_texture_cube_map->service_id() : 0; +} + +GLuint GetOesServiceId(const TextureUnit& unit) { + return unit.bound_texture_external_oes.get() + ? unit.bound_texture_external_oes->service_id() : 0; +} + +GLuint GetArbServiceId(const TextureUnit& unit) { + return unit.bound_texture_rectangle_arb.get() + ? unit.bound_texture_rectangle_arb->service_id() : 0; +} + +GLuint GetServiceId(const TextureUnit& unit, GLuint target) { + switch (target) { + case GL_TEXTURE_2D: + return Get2dServiceId(unit); + case GL_TEXTURE_CUBE_MAP: + return GetCubeServiceId(unit); + case GL_TEXTURE_RECTANGLE_ARB: + return GetArbServiceId(unit); + case GL_TEXTURE_EXTERNAL_OES: + return GetOesServiceId(unit); + default: + NOTREACHED(); + return 0; + } +} + +bool TargetIsSupported(const FeatureInfo* feature_info, GLuint target) { + switch (target) { + case GL_TEXTURE_2D: + return true; + case GL_TEXTURE_CUBE_MAP: + return true; + case GL_TEXTURE_RECTANGLE_ARB: + return feature_info->feature_flags().arb_texture_rectangle; + case GL_TEXTURE_EXTERNAL_OES: + return feature_info->feature_flags().oes_egl_image_external; + default: + NOTREACHED(); + return false; + } +} + } // anonymous namespace. TextureUnit::TextureUnit() @@ -35,43 +87,63 @@ TextureUnit::TextureUnit() TextureUnit::~TextureUnit() { } -ContextState::ContextState(FeatureInfo* feature_info, Logger* logger) +ContextState::ContextState(FeatureInfo* feature_info, + ErrorStateClient* error_state_client, + Logger* logger) : active_texture_unit(0), pack_reverse_row_order(false), + ignore_cached_state(false), fbo_binding_for_scissor_workaround_dirty_(false), feature_info_(feature_info), - error_state_(ErrorState::Create(logger)) { + error_state_(ErrorState::Create(error_state_client, logger)) { Initialize(); } ContextState::~ContextState() { } -void ContextState::RestoreTextureUnitBindings(GLuint unit) const { +void ContextState::RestoreTextureUnitBindings( + GLuint unit, const ContextState* prev_state) const { DCHECK_LT(unit, texture_units.size()); const TextureUnit& texture_unit = texture_units[unit]; - glActiveTexture(GL_TEXTURE0 + unit); - GLuint service_id = texture_unit.bound_texture_2d.get() - ? texture_unit.bound_texture_2d->service_id() - : 0; - glBindTexture(GL_TEXTURE_2D, service_id); - service_id = texture_unit.bound_texture_cube_map.get() - ? texture_unit.bound_texture_cube_map->service_id() - : 0; - glBindTexture(GL_TEXTURE_CUBE_MAP, service_id); - - if (feature_info_->feature_flags().oes_egl_image_external) { - service_id = texture_unit.bound_texture_external_oes.get() - ? texture_unit.bound_texture_external_oes->service_id() - : 0; - glBindTexture(GL_TEXTURE_EXTERNAL_OES, service_id); + GLuint service_id_2d = Get2dServiceId(texture_unit); + GLuint service_id_cube = GetCubeServiceId(texture_unit); + GLuint service_id_oes = GetOesServiceId(texture_unit); + GLuint service_id_arb = GetArbServiceId(texture_unit); + + bool bind_texture_2d = true; + bool bind_texture_cube = true; + bool bind_texture_oes = feature_info_->feature_flags().oes_egl_image_external; + bool bind_texture_arb = feature_info_->feature_flags().arb_texture_rectangle; + + if (prev_state) { + const TextureUnit& prev_unit = prev_state->texture_units[unit]; + bind_texture_2d = service_id_2d != Get2dServiceId(prev_unit); + bind_texture_cube = service_id_cube != GetCubeServiceId(prev_unit); + bind_texture_oes = + bind_texture_oes && service_id_oes != GetOesServiceId(prev_unit); + bind_texture_arb = + bind_texture_arb && service_id_arb != GetArbServiceId(prev_unit); + } + + // Early-out if nothing has changed from the previous state. + if (!bind_texture_2d && !bind_texture_cube + && !bind_texture_oes && !bind_texture_arb) { + return; } - if (feature_info_->feature_flags().arb_texture_rectangle) { - service_id = texture_unit.bound_texture_rectangle_arb.get() - ? texture_unit.bound_texture_rectangle_arb->service_id() - : 0; - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, service_id); + glActiveTexture(GL_TEXTURE0 + unit); + if (bind_texture_2d) { + glBindTexture(GL_TEXTURE_2D, service_id_2d); + } + if (bind_texture_cube) { + glBindTexture(GL_TEXTURE_CUBE_MAP, service_id_cube); + } + if (bind_texture_oes) { + glBindTexture(GL_TEXTURE_EXTERNAL_OES, service_id_oes); + } + if (bind_texture_arb) { + glBindTexture(GL_TEXTURE_RECTANGLE_ARB, service_id_arb); } } @@ -101,62 +173,117 @@ void ContextState::RestoreActiveTexture() const { glActiveTexture(GL_TEXTURE0 + active_texture_unit); } -void ContextState::RestoreAllTextureUnitBindings() const { +void ContextState::RestoreAllTextureUnitBindings( + const ContextState* prev_state) const { // Restore Texture state. for (size_t ii = 0; ii < texture_units.size(); ++ii) { - RestoreTextureUnitBindings(ii); + RestoreTextureUnitBindings(ii, prev_state); } RestoreActiveTexture(); } -void ContextState::RestoreAttribute(GLuint attrib_index) const { - const VertexAttrib* attrib = - vertex_attrib_manager->GetVertexAttrib(attrib_index); - const void* ptr = reinterpret_cast<const void*>(attrib->offset()); - Buffer* buffer = attrib->buffer(); - glBindBuffer(GL_ARRAY_BUFFER, buffer ? buffer->service_id() : 0); - glVertexAttribPointer( - attrib_index, attrib->size(), attrib->type(), attrib->normalized(), - attrib->gl_stride(), ptr); - if (attrib->divisor()) - glVertexAttribDivisorANGLE(attrib_index, attrib->divisor()); - // Never touch vertex attribute 0's state (in particular, never - // disable it) when running on desktop GL because it will never be - // re-enabled. - if (attrib_index != 0 || - gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) { - if (attrib->enabled()) { - glEnableVertexAttribArray(attrib_index); - } else { - glDisableVertexAttribArray(attrib_index); - } - } - glVertexAttrib4fv(attrib_index, attrib_values[attrib_index].v); +void ContextState::RestoreActiveTextureUnitBinding(unsigned int target) const { + DCHECK_LT(active_texture_unit, texture_units.size()); + const TextureUnit& texture_unit = texture_units[active_texture_unit]; + if (TargetIsSupported(feature_info_, target)) + glBindTexture(target, GetServiceId(texture_unit, target)); } -void ContextState::RestoreGlobalState() const { - InitCapabilities(); - InitState(); +void ContextState::RestoreVertexAttribValues() const { + for (size_t attrib = 0; attrib < vertex_attrib_manager->num_attribs(); + ++attrib) { + glVertexAttrib4fv(attrib, attrib_values[attrib].v); + } } -void ContextState::RestoreState() const { - RestoreAllTextureUnitBindings(); +void ContextState::RestoreVertexAttribArrays( + const scoped_refptr<VertexAttribManager> attrib_manager) const { + // This is expected to be called only for VAO with service_id 0, + // either to restore the default VAO or a virtual VAO with service_id 0. + GLuint vao_service_id = attrib_manager->service_id(); + DCHECK(vao_service_id == 0); + + // Bind VAO if supported. + if (feature_info_->feature_flags().native_vertex_array_object) + glBindVertexArrayOES(vao_service_id); + + // Restore vertex attrib arrays. + for (size_t attrib_index = 0; attrib_index < attrib_manager->num_attribs(); + ++attrib_index) { + const VertexAttrib* attrib = attrib_manager->GetVertexAttrib(attrib_index); + + // Restore vertex array. + Buffer* buffer = attrib->buffer(); + GLuint buffer_service_id = buffer ? buffer->service_id() : 0; + glBindBuffer(GL_ARRAY_BUFFER, buffer_service_id); + const void* ptr = reinterpret_cast<const void*>(attrib->offset()); + glVertexAttribPointer(attrib_index, + attrib->size(), + attrib->type(), + attrib->normalized(), + attrib->gl_stride(), + ptr); + + // Restore attrib divisor if supported. + if (feature_info_->feature_flags().angle_instanced_arrays) + glVertexAttribDivisorANGLE(attrib_index, attrib->divisor()); - // Restore Attrib State + // Never touch vertex attribute 0's state (in particular, never + // disable it) when running on desktop GL because it will never be + // re-enabled. + if (attrib_index != 0 || + gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) { + if (attrib->enabled()) { + glEnableVertexAttribArray(attrib_index); + } else { + glDisableVertexAttribArray(attrib_index); + } + } + } +} + +void ContextState::RestoreVertexAttribs() const { + // Restore Vertex Attrib Arrays // TODO: This if should not be needed. RestoreState is getting called // before GLES2Decoder::Initialize which is a bug. if (vertex_attrib_manager.get()) { - // TODO(gman): Move this restoration to VertexAttribManager. - for (size_t attrib = 0; attrib < vertex_attrib_manager->num_attribs(); - ++attrib) { - RestoreAttribute(attrib); + // Restore VAOs. + if (feature_info_->feature_flags().native_vertex_array_object) { + // If default VAO is still using shared id 0 instead of unique ids + // per-context, default VAO state must be restored. + GLuint default_vao_service_id = + default_vertex_attrib_manager->service_id(); + if (default_vao_service_id == 0) + RestoreVertexAttribArrays(default_vertex_attrib_manager); + + // Restore the current VAO binding, unless it's the same as the + // default above. + GLuint curr_vao_service_id = vertex_attrib_manager->service_id(); + if (curr_vao_service_id != 0) + glBindVertexArrayOES(curr_vao_service_id); + } else { + // If native VAO isn't supported, emulated VAOs are used. + // Restore to the currently bound VAO. + RestoreVertexAttribArrays(vertex_attrib_manager); } } + // glVertexAttrib4fv aren't part of VAO state and must be restored. + RestoreVertexAttribValues(); +} + +void ContextState::RestoreGlobalState(const ContextState* prev_state) const { + InitCapabilities(prev_state); + InitState(prev_state); +} + +void ContextState::RestoreState(const ContextState* prev_state) const { + RestoreAllTextureUnitBindings(prev_state); + RestoreVertexAttribs(); RestoreBufferBindings(); RestoreRenderbufferBindings(); RestoreProgramBindings(); - RestoreGlobalState(); + RestoreGlobalState(prev_state); } ErrorState* ContextState::GetErrorState() { diff --git a/chromium/gpu/command_buffer/service/context_state.h b/chromium/gpu/command_buffer/service/context_state.h index 8d5edcaea61..e436e74e280 100644 --- a/chromium/gpu/command_buffer/service/context_state.h +++ b/chromium/gpu/command_buffer/service/context_state.h @@ -22,6 +22,7 @@ namespace gles2 { class Buffer; class ErrorState; +class ErrorStateClient; class FeatureInfo; class Framebuffer; class Program; @@ -93,23 +94,34 @@ struct Vec4 { }; struct GPU_EXPORT ContextState { - ContextState(FeatureInfo* feature_info, Logger* logger); + ContextState(FeatureInfo* feature_info, + ErrorStateClient* error_state_client, + Logger* logger); ~ContextState(); void Initialize(); - void RestoreState() const; - void InitCapabilities() const; - void InitState() const; + void SetIgnoreCachedStateForTest(bool ignore) { + ignore_cached_state = ignore; + } + + void RestoreState(const ContextState* prev_state) const; + void InitCapabilities(const ContextState* prev_state) const; + void InitState(const ContextState* prev_state) const; void RestoreActiveTexture() const; - void RestoreAllTextureUnitBindings() const; - void RestoreAttribute(GLuint index) const; + void RestoreAllTextureUnitBindings(const ContextState* prev_state) const; + void RestoreActiveTextureUnitBinding(unsigned int target) const; + void RestoreVertexAttribValues() const; + void RestoreVertexAttribArrays( + const scoped_refptr<VertexAttribManager> attrib_manager) const; + void RestoreVertexAttribs() const; void RestoreBufferBindings() const; - void RestoreGlobalState() const; + void RestoreGlobalState(const ContextState* prev_state) const; void RestoreProgramBindings() const; void RestoreRenderbufferBindings() const; - void RestoreTextureUnitBindings(GLuint unit) const; + void RestoreTextureUnitBindings( + GLuint unit, const ContextState* prev_state) const; // Helper for getting cached state. bool GetStateAsGLint( @@ -118,6 +130,44 @@ struct GPU_EXPORT ContextState { GLenum pname, GLfloat* params, GLsizei* num_written) const; bool GetEnabled(GLenum cap) const; + inline void SetDeviceColorMask(GLboolean red, + GLboolean green, + GLboolean blue, + GLboolean alpha) { + if (cached_color_mask_red == red && cached_color_mask_green == green && + cached_color_mask_blue == blue && cached_color_mask_alpha == alpha && + !ignore_cached_state) + return; + cached_color_mask_red = red; + cached_color_mask_green = green; + cached_color_mask_blue = blue; + cached_color_mask_alpha = alpha; + glColorMask(red, green, blue, alpha); + } + + inline void SetDeviceDepthMask(GLboolean mask) { + if (cached_depth_mask == mask && !ignore_cached_state) + return; + cached_depth_mask = mask; + glDepthMask(mask); + } + + inline void SetDeviceStencilMaskSeparate(GLenum op, GLuint mask) { + if (op == GL_FRONT) { + if (cached_stencil_front_writemask == mask && !ignore_cached_state) + return; + cached_stencil_front_writemask = mask; + } else if (op == GL_BACK) { + if (cached_stencil_back_writemask == mask && !ignore_cached_state) + return; + cached_stencil_back_writemask = mask; + } else { + NOTREACHED(); + return; + } + glStencilMaskSeparate(op, mask); + } + ErrorState* GetErrorState(); #include "gpu/command_buffer/service/context_state_autogen.h" @@ -141,6 +191,7 @@ struct GPU_EXPORT ContextState { // Class that manages vertex attribs. scoped_refptr<VertexAttribManager> vertex_attrib_manager; + scoped_refptr<VertexAttribManager> default_vertex_attrib_manager; // The program in use by glUseProgram scoped_refptr<Program> current_program; @@ -148,9 +199,12 @@ struct GPU_EXPORT ContextState { // The currently bound renderbuffer scoped_refptr<Renderbuffer> bound_renderbuffer; - scoped_refptr<QueryManager::Query> current_query; + // A map of of target -> Query for current queries + typedef std::map<GLuint, scoped_refptr<QueryManager::Query> > QueryMap; + QueryMap current_queries; bool pack_reverse_row_order; + bool ignore_cached_state; mutable bool fbo_binding_for_scissor_workaround_dirty_; FeatureInfo* feature_info_; diff --git a/chromium/gpu/command_buffer/service/context_state_autogen.h b/chromium/gpu/command_buffer/service/context_state_autogen.h index a76aabccac7..309301f1b28 100644 --- a/chromium/gpu/command_buffer/service/context_state_autogen.h +++ b/chromium/gpu/command_buffer/service/context_state_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // It is included by context_state.h @@ -13,14 +15,23 @@ struct EnableFlags { EnableFlags(); bool blend; + bool cached_blend; bool cull_face; + bool cached_cull_face; bool depth_test; + bool cached_depth_test; bool dither; + bool cached_dither; bool polygon_offset_fill; + bool cached_polygon_offset_fill; bool sample_alpha_to_coverage; + bool cached_sample_alpha_to_coverage; bool sample_coverage; + bool cached_sample_coverage; bool scissor_test; + bool cached_scissor_test; bool stencil_test; + bool cached_stencil_test; }; GLfloat blend_color_red; @@ -40,12 +51,17 @@ GLfloat color_clear_alpha; GLclampf depth_clear; GLint stencil_clear; GLboolean color_mask_red; +GLboolean cached_color_mask_red; GLboolean color_mask_green; +GLboolean cached_color_mask_green; GLboolean color_mask_blue; +GLboolean cached_color_mask_blue; GLboolean color_mask_alpha; +GLboolean cached_color_mask_alpha; GLenum cull_mode; GLenum depth_func; GLboolean depth_mask; +GLboolean cached_depth_mask; GLclampf z_near; GLclampf z_far; GLenum front_face; @@ -69,7 +85,9 @@ GLenum stencil_back_func; GLint stencil_back_ref; GLuint stencil_back_mask; GLuint stencil_front_writemask; +GLuint cached_stencil_front_writemask; GLuint stencil_back_writemask; +GLuint cached_stencil_back_writemask; GLenum stencil_front_fail_op; GLenum stencil_front_z_fail_op; GLenum stencil_front_z_pass_op; @@ -81,5 +99,62 @@ GLint viewport_y; GLsizei viewport_width; GLsizei viewport_height; +inline void SetDeviceCapabilityState(GLenum cap, bool enable) { + switch (cap) { + case GL_BLEND: + if (enable_flags.cached_blend == enable && !ignore_cached_state) + return; + enable_flags.cached_blend = enable; + break; + case GL_CULL_FACE: + if (enable_flags.cached_cull_face == enable && !ignore_cached_state) + return; + enable_flags.cached_cull_face = enable; + break; + case GL_DEPTH_TEST: + if (enable_flags.cached_depth_test == enable && !ignore_cached_state) + return; + enable_flags.cached_depth_test = enable; + break; + case GL_DITHER: + if (enable_flags.cached_dither == enable && !ignore_cached_state) + return; + enable_flags.cached_dither = enable; + break; + case GL_POLYGON_OFFSET_FILL: + if (enable_flags.cached_polygon_offset_fill == enable && + !ignore_cached_state) + return; + enable_flags.cached_polygon_offset_fill = enable; + break; + case GL_SAMPLE_ALPHA_TO_COVERAGE: + if (enable_flags.cached_sample_alpha_to_coverage == enable && + !ignore_cached_state) + return; + enable_flags.cached_sample_alpha_to_coverage = enable; + break; + case GL_SAMPLE_COVERAGE: + if (enable_flags.cached_sample_coverage == enable && !ignore_cached_state) + return; + enable_flags.cached_sample_coverage = enable; + break; + case GL_SCISSOR_TEST: + if (enable_flags.cached_scissor_test == enable && !ignore_cached_state) + return; + enable_flags.cached_scissor_test = enable; + break; + case GL_STENCIL_TEST: + if (enable_flags.cached_stencil_test == enable && !ignore_cached_state) + return; + enable_flags.cached_stencil_test = enable; + break; + default: + NOTREACHED(); + return; + } + if (enable) + glEnable(cap); + else + glDisable(cap); +} #endif // GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/service/context_state_impl_autogen.h b/chromium/gpu/command_buffer/service/context_state_impl_autogen.h index 100199c6b49..056a382d24d 100644 --- a/chromium/gpu/command_buffer/service/context_state_impl_autogen.h +++ b/chromium/gpu/command_buffer/service/context_state_impl_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // It is included by context_state.cc @@ -12,14 +14,23 @@ ContextState::EnableFlags::EnableFlags() : blend(false), + cached_blend(false), cull_face(false), + cached_cull_face(false), depth_test(false), + cached_depth_test(false), dither(true), + cached_dither(true), polygon_offset_fill(false), + cached_polygon_offset_fill(false), sample_alpha_to_coverage(false), + cached_sample_alpha_to_coverage(false), sample_coverage(false), + cached_sample_coverage(false), scissor_test(false), - stencil_test(false) { + cached_scissor_test(false), + stencil_test(false), + cached_stencil_test(false) { } void ContextState::Initialize() { @@ -40,12 +51,17 @@ void ContextState::Initialize() { depth_clear = 1.0f; stencil_clear = 0; color_mask_red = true; + cached_color_mask_red = true; color_mask_green = true; + cached_color_mask_green = true; color_mask_blue = true; + cached_color_mask_blue = true; color_mask_alpha = true; + cached_color_mask_alpha = true; cull_mode = GL_BACK; depth_func = GL_LESS; depth_mask = true; + cached_depth_mask = true; z_near = 0.0f; z_far = 1.0f; front_face = GL_CCW; @@ -69,7 +85,9 @@ void ContextState::Initialize() { stencil_back_ref = 0; stencil_back_mask = 0xFFFFFFFFU; stencil_front_writemask = 0xFFFFFFFFU; + cached_stencil_front_writemask = 0xFFFFFFFFU; stencil_back_writemask = 0xFFFFFFFFU; + cached_stencil_back_writemask = 0xFFFFFFFFU; stencil_front_fail_op = GL_KEEP; stencil_front_z_fail_op = GL_KEEP; stencil_front_z_pass_op = GL_KEEP; @@ -82,59 +100,209 @@ void ContextState::Initialize() { viewport_height = 1; } -void ContextState::InitCapabilities() const { - EnableDisable(GL_BLEND, enable_flags.blend); - EnableDisable(GL_CULL_FACE, enable_flags.cull_face); - EnableDisable(GL_DEPTH_TEST, enable_flags.depth_test); - EnableDisable(GL_DITHER, enable_flags.dither); - EnableDisable(GL_POLYGON_OFFSET_FILL, enable_flags.polygon_offset_fill); - EnableDisable( - GL_SAMPLE_ALPHA_TO_COVERAGE, enable_flags.sample_alpha_to_coverage); - EnableDisable(GL_SAMPLE_COVERAGE, enable_flags.sample_coverage); - EnableDisable(GL_SCISSOR_TEST, enable_flags.scissor_test); - EnableDisable(GL_STENCIL_TEST, enable_flags.stencil_test); +void ContextState::InitCapabilities(const ContextState* prev_state) const { + if (prev_state) { + if (prev_state->enable_flags.cached_blend != enable_flags.cached_blend) + EnableDisable(GL_BLEND, enable_flags.cached_blend); + if (prev_state->enable_flags.cached_cull_face != + enable_flags.cached_cull_face) + EnableDisable(GL_CULL_FACE, enable_flags.cached_cull_face); + if (prev_state->enable_flags.cached_depth_test != + enable_flags.cached_depth_test) + EnableDisable(GL_DEPTH_TEST, enable_flags.cached_depth_test); + if (prev_state->enable_flags.cached_dither != enable_flags.cached_dither) + EnableDisable(GL_DITHER, enable_flags.cached_dither); + if (prev_state->enable_flags.cached_polygon_offset_fill != + enable_flags.cached_polygon_offset_fill) + EnableDisable(GL_POLYGON_OFFSET_FILL, + enable_flags.cached_polygon_offset_fill); + if (prev_state->enable_flags.cached_sample_alpha_to_coverage != + enable_flags.cached_sample_alpha_to_coverage) + EnableDisable(GL_SAMPLE_ALPHA_TO_COVERAGE, + enable_flags.cached_sample_alpha_to_coverage); + if (prev_state->enable_flags.cached_sample_coverage != + enable_flags.cached_sample_coverage) + EnableDisable(GL_SAMPLE_COVERAGE, enable_flags.cached_sample_coverage); + if (prev_state->enable_flags.cached_scissor_test != + enable_flags.cached_scissor_test) + EnableDisable(GL_SCISSOR_TEST, enable_flags.cached_scissor_test); + if (prev_state->enable_flags.cached_stencil_test != + enable_flags.cached_stencil_test) + EnableDisable(GL_STENCIL_TEST, enable_flags.cached_stencil_test); + } else { + EnableDisable(GL_BLEND, enable_flags.cached_blend); + EnableDisable(GL_CULL_FACE, enable_flags.cached_cull_face); + EnableDisable(GL_DEPTH_TEST, enable_flags.cached_depth_test); + EnableDisable(GL_DITHER, enable_flags.cached_dither); + EnableDisable(GL_POLYGON_OFFSET_FILL, + enable_flags.cached_polygon_offset_fill); + EnableDisable(GL_SAMPLE_ALPHA_TO_COVERAGE, + enable_flags.cached_sample_alpha_to_coverage); + EnableDisable(GL_SAMPLE_COVERAGE, enable_flags.cached_sample_coverage); + EnableDisable(GL_SCISSOR_TEST, enable_flags.cached_scissor_test); + EnableDisable(GL_STENCIL_TEST, enable_flags.cached_stencil_test); + } } -void ContextState::InitState() const { - glBlendColor( - blend_color_red, blend_color_green, blend_color_blue, blend_color_alpha); - glBlendEquationSeparate(blend_equation_rgb, blend_equation_alpha); - glBlendFuncSeparate( - blend_source_rgb, blend_dest_rgb, blend_source_alpha, blend_dest_alpha); - glClearColor( - color_clear_red, color_clear_green, color_clear_blue, color_clear_alpha); - glClearDepth(depth_clear); - glClearStencil(stencil_clear); - glColorMask( - color_mask_red, color_mask_green, color_mask_blue, color_mask_alpha); - glCullFace(cull_mode); - glDepthFunc(depth_func); - glDepthMask(depth_mask); - glDepthRange(z_near, z_far); - glFrontFace(front_face); - glHint(GL_GENERATE_MIPMAP_HINT, hint_generate_mipmap); - if (feature_info_->feature_flags().oes_standard_derivatives) - glHint( - GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, hint_fragment_shader_derivative); - glLineWidth(line_width); - glPixelStorei(GL_PACK_ALIGNMENT, pack_alignment); - glPixelStorei(GL_UNPACK_ALIGNMENT, unpack_alignment); - glPolygonOffset(polygon_offset_factor, polygon_offset_units); - glSampleCoverage(sample_coverage_value, sample_coverage_invert); - glScissor(scissor_x, scissor_y, scissor_width, scissor_height); - glStencilFuncSeparate( - GL_FRONT, stencil_front_func, stencil_front_ref, stencil_front_mask); - glStencilFuncSeparate( - GL_BACK, stencil_back_func, stencil_back_ref, stencil_back_mask); - glStencilMaskSeparate(GL_FRONT, stencil_front_writemask); - glStencilMaskSeparate(GL_BACK, stencil_back_writemask); - glStencilOpSeparate( - GL_FRONT, stencil_front_fail_op, stencil_front_z_fail_op, - stencil_front_z_pass_op); - glStencilOpSeparate( - GL_BACK, stencil_back_fail_op, stencil_back_z_fail_op, - stencil_back_z_pass_op); - glViewport(viewport_x, viewport_y, viewport_width, viewport_height); +void ContextState::InitState(const ContextState* prev_state) const { + if (prev_state) { + if ((blend_color_red != prev_state->blend_color_red) || + (blend_color_green != prev_state->blend_color_green) || + (blend_color_blue != prev_state->blend_color_blue) || + (blend_color_alpha != prev_state->blend_color_alpha)) + glBlendColor(blend_color_red, + blend_color_green, + blend_color_blue, + blend_color_alpha); + if ((blend_equation_rgb != prev_state->blend_equation_rgb) || + (blend_equation_alpha != prev_state->blend_equation_alpha)) + glBlendEquationSeparate(blend_equation_rgb, blend_equation_alpha); + if ((blend_source_rgb != prev_state->blend_source_rgb) || + (blend_dest_rgb != prev_state->blend_dest_rgb) || + (blend_source_alpha != prev_state->blend_source_alpha) || + (blend_dest_alpha != prev_state->blend_dest_alpha)) + glBlendFuncSeparate(blend_source_rgb, + blend_dest_rgb, + blend_source_alpha, + blend_dest_alpha); + if ((color_clear_red != prev_state->color_clear_red) || + (color_clear_green != prev_state->color_clear_green) || + (color_clear_blue != prev_state->color_clear_blue) || + (color_clear_alpha != prev_state->color_clear_alpha)) + glClearColor(color_clear_red, + color_clear_green, + color_clear_blue, + color_clear_alpha); + if ((depth_clear != prev_state->depth_clear)) + glClearDepth(depth_clear); + if ((stencil_clear != prev_state->stencil_clear)) + glClearStencil(stencil_clear); + if ((cached_color_mask_red != prev_state->cached_color_mask_red) || + (cached_color_mask_green != prev_state->cached_color_mask_green) || + (cached_color_mask_blue != prev_state->cached_color_mask_blue) || + (cached_color_mask_alpha != prev_state->cached_color_mask_alpha)) + glColorMask(cached_color_mask_red, + cached_color_mask_green, + cached_color_mask_blue, + cached_color_mask_alpha); + if ((cull_mode != prev_state->cull_mode)) + glCullFace(cull_mode); + if ((depth_func != prev_state->depth_func)) + glDepthFunc(depth_func); + if ((cached_depth_mask != prev_state->cached_depth_mask)) + glDepthMask(cached_depth_mask); + if ((z_near != prev_state->z_near) || (z_far != prev_state->z_far)) + glDepthRange(z_near, z_far); + if ((front_face != prev_state->front_face)) + glFrontFace(front_face); + if (prev_state->hint_generate_mipmap != hint_generate_mipmap) + glHint(GL_GENERATE_MIPMAP_HINT, hint_generate_mipmap); + if (feature_info_->feature_flags().oes_standard_derivatives) + if (prev_state->hint_fragment_shader_derivative != + hint_fragment_shader_derivative) + glHint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, + hint_fragment_shader_derivative); + if ((line_width != prev_state->line_width)) + glLineWidth(line_width); + if (prev_state->pack_alignment != pack_alignment) + glPixelStorei(GL_PACK_ALIGNMENT, pack_alignment); + if (prev_state->unpack_alignment != unpack_alignment) + glPixelStorei(GL_UNPACK_ALIGNMENT, unpack_alignment); + if ((polygon_offset_factor != prev_state->polygon_offset_factor) || + (polygon_offset_units != prev_state->polygon_offset_units)) + glPolygonOffset(polygon_offset_factor, polygon_offset_units); + if ((sample_coverage_value != prev_state->sample_coverage_value) || + (sample_coverage_invert != prev_state->sample_coverage_invert)) + glSampleCoverage(sample_coverage_value, sample_coverage_invert); + if ((scissor_x != prev_state->scissor_x) || + (scissor_y != prev_state->scissor_y) || + (scissor_width != prev_state->scissor_width) || + (scissor_height != prev_state->scissor_height)) + glScissor(scissor_x, scissor_y, scissor_width, scissor_height); + if ((stencil_front_func != prev_state->stencil_front_func) || + (stencil_front_ref != prev_state->stencil_front_ref) || + (stencil_front_mask != prev_state->stencil_front_mask)) + glStencilFuncSeparate( + GL_FRONT, stencil_front_func, stencil_front_ref, stencil_front_mask); + if ((stencil_back_func != prev_state->stencil_back_func) || + (stencil_back_ref != prev_state->stencil_back_ref) || + (stencil_back_mask != prev_state->stencil_back_mask)) + glStencilFuncSeparate( + GL_BACK, stencil_back_func, stencil_back_ref, stencil_back_mask); + if ((cached_stencil_front_writemask != + prev_state->cached_stencil_front_writemask)) + glStencilMaskSeparate(GL_FRONT, cached_stencil_front_writemask); + if ((cached_stencil_back_writemask != + prev_state->cached_stencil_back_writemask)) + glStencilMaskSeparate(GL_BACK, cached_stencil_back_writemask); + if ((stencil_front_fail_op != prev_state->stencil_front_fail_op) || + (stencil_front_z_fail_op != prev_state->stencil_front_z_fail_op) || + (stencil_front_z_pass_op != prev_state->stencil_front_z_pass_op)) + glStencilOpSeparate(GL_FRONT, + stencil_front_fail_op, + stencil_front_z_fail_op, + stencil_front_z_pass_op); + if ((stencil_back_fail_op != prev_state->stencil_back_fail_op) || + (stencil_back_z_fail_op != prev_state->stencil_back_z_fail_op) || + (stencil_back_z_pass_op != prev_state->stencil_back_z_pass_op)) + glStencilOpSeparate(GL_BACK, + stencil_back_fail_op, + stencil_back_z_fail_op, + stencil_back_z_pass_op); + if ((viewport_x != prev_state->viewport_x) || + (viewport_y != prev_state->viewport_y) || + (viewport_width != prev_state->viewport_width) || + (viewport_height != prev_state->viewport_height)) + glViewport(viewport_x, viewport_y, viewport_width, viewport_height); + } else { + glBlendColor(blend_color_red, + blend_color_green, + blend_color_blue, + blend_color_alpha); + glBlendEquationSeparate(blend_equation_rgb, blend_equation_alpha); + glBlendFuncSeparate( + blend_source_rgb, blend_dest_rgb, blend_source_alpha, blend_dest_alpha); + glClearColor(color_clear_red, + color_clear_green, + color_clear_blue, + color_clear_alpha); + glClearDepth(depth_clear); + glClearStencil(stencil_clear); + glColorMask(cached_color_mask_red, + cached_color_mask_green, + cached_color_mask_blue, + cached_color_mask_alpha); + glCullFace(cull_mode); + glDepthFunc(depth_func); + glDepthMask(cached_depth_mask); + glDepthRange(z_near, z_far); + glFrontFace(front_face); + glHint(GL_GENERATE_MIPMAP_HINT, hint_generate_mipmap); + if (feature_info_->feature_flags().oes_standard_derivatives) + glHint(GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES, + hint_fragment_shader_derivative); + glLineWidth(line_width); + glPixelStorei(GL_PACK_ALIGNMENT, pack_alignment); + glPixelStorei(GL_UNPACK_ALIGNMENT, unpack_alignment); + glPolygonOffset(polygon_offset_factor, polygon_offset_units); + glSampleCoverage(sample_coverage_value, sample_coverage_invert); + glScissor(scissor_x, scissor_y, scissor_width, scissor_height); + glStencilFuncSeparate( + GL_FRONT, stencil_front_func, stencil_front_ref, stencil_front_mask); + glStencilFuncSeparate( + GL_BACK, stencil_back_func, stencil_back_ref, stencil_back_mask); + glStencilMaskSeparate(GL_FRONT, cached_stencil_front_writemask); + glStencilMaskSeparate(GL_BACK, cached_stencil_back_writemask); + glStencilOpSeparate(GL_FRONT, + stencil_front_fail_op, + stencil_front_z_fail_op, + stencil_front_z_pass_op); + glStencilOpSeparate(GL_BACK, + stencil_back_fail_op, + stencil_back_z_fail_op, + stencil_back_z_pass_op); + glViewport(viewport_x, viewport_y, viewport_width, viewport_height); + } } bool ContextState::GetEnabled(GLenum cap) const { switch (cap) { @@ -162,8 +330,9 @@ bool ContextState::GetEnabled(GLenum cap) const { } } -bool ContextState::GetStateAsGLint( - GLenum pname, GLint* params, GLsizei* num_written) const { +bool ContextState::GetStateAsGLint(GLenum pname, + GLint* params, + GLsizei* num_written) const { switch (pname) { case GL_BLEND_COLOR: *num_written = 4; @@ -486,8 +655,9 @@ bool ContextState::GetStateAsGLint( } } -bool ContextState::GetStateAsGLfloat( - GLenum pname, GLfloat* params, GLsizei* num_written) const { +bool ContextState::GetStateAsGLfloat(GLenum pname, + GLfloat* params, + GLsizei* num_written) const { switch (pname) { case GL_BLEND_COLOR: *num_written = 4; @@ -784,8 +954,7 @@ bool ContextState::GetStateAsGLfloat( case GL_SAMPLE_ALPHA_TO_COVERAGE: *num_written = 1; if (params) { - params[0] = - static_cast<GLfloat>(enable_flags.sample_alpha_to_coverage); + params[0] = static_cast<GLfloat>(enable_flags.sample_alpha_to_coverage); } return true; case GL_SAMPLE_COVERAGE: @@ -811,4 +980,3 @@ bool ContextState::GetStateAsGLfloat( } } #endif // GPU_COMMAND_BUFFER_SERVICE_CONTEXT_STATE_IMPL_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/service/error_state.cc b/chromium/gpu/command_buffer/service/error_state.cc index 524ea4f79ec..ce65aa194d0 100644 --- a/chromium/gpu/command_buffer/service/error_state.cc +++ b/chromium/gpu/command_buffer/service/error_state.cc @@ -16,7 +16,7 @@ namespace gles2 { class ErrorStateImpl : public ErrorState { public: - explicit ErrorStateImpl(Logger* logger); + explicit ErrorStateImpl(ErrorStateClient* client, Logger* logger); virtual ~ErrorStateImpl(); virtual uint32 GetGLError() OVERRIDE; @@ -33,13 +33,20 @@ class ErrorStateImpl : public ErrorState { const char* function_name, unsigned int value, const char* label) OVERRIDE; - virtual void SetGLErrorInvalidParam( + virtual void SetGLErrorInvalidParami( const char* filename, int line, unsigned int error, const char* function_name, unsigned int pname, int param) OVERRIDE; + virtual void SetGLErrorInvalidParamf( + const char* filename, + int line, + unsigned int error, + const char* function_name, + unsigned int pname, + float param) OVERRIDE; virtual unsigned int PeekGLError( const char* filename, int line, const char* function_name) OVERRIDE; @@ -56,6 +63,7 @@ class ErrorStateImpl : public ErrorState { // Current GL error bits. uint32 error_bits_; + ErrorStateClient* client_; Logger* logger_; DISALLOW_COPY_AND_ASSIGN(ErrorStateImpl); @@ -65,13 +73,12 @@ ErrorState::ErrorState() {} ErrorState::~ErrorState() {} -ErrorState* ErrorState::Create(Logger* logger) { - return new ErrorStateImpl(logger); +ErrorState* ErrorState::Create(ErrorStateClient* client, Logger* logger) { + return new ErrorStateImpl(client, logger); } -ErrorStateImpl::ErrorStateImpl(Logger* logger) - : error_bits_(0), - logger_(logger) {} +ErrorStateImpl::ErrorStateImpl(ErrorStateClient* client, Logger* logger) + : error_bits_(0), client_(client), logger_(logger) {} ErrorStateImpl::~ErrorStateImpl() {} @@ -118,6 +125,8 @@ void ErrorStateImpl::SetGLError( function_name + ": " + msg); } error_bits_ |= GLES2Util::GLErrorToErrorBit(error); + if (error == GL_OUT_OF_MEMORY) + client_->OnOutOfMemoryError(); } void ErrorStateImpl::SetGLErrorInvalidEnum( @@ -131,7 +140,7 @@ void ErrorStateImpl::SetGLErrorInvalidEnum( GLES2Util::GetStringEnum(value)).c_str()); } -void ErrorStateImpl::SetGLErrorInvalidParam( +void ErrorStateImpl::SetGLErrorInvalidParami( const char* filename, int line, unsigned int error, @@ -152,6 +161,19 @@ void ErrorStateImpl::SetGLErrorInvalidParam( } } +void ErrorStateImpl::SetGLErrorInvalidParamf( + const char* filename, + int line, + unsigned int error, + const char* function_name, + unsigned int pname, float param) { + SetGLError( + filename, line, error, function_name, + (std::string("trying to set ") + + GLES2Util::GetStringEnum(pname) + " to " + + base::StringPrintf("%G", param)).c_str()); +} + void ErrorStateImpl::CopyRealGLErrorsToWrapper( const char* filename, int line, const char* function_name) { GLenum error; diff --git a/chromium/gpu/command_buffer/service/error_state.h b/chromium/gpu/command_buffer/service/error_state.h index 507b7383670..95f118c53c9 100644 --- a/chromium/gpu/command_buffer/service/error_state.h +++ b/chromium/gpu/command_buffer/service/error_state.h @@ -7,8 +7,10 @@ #ifndef GPU_COMMAND_BUFFER_SERVICE_ERROR_STATE_H_ #define GPU_COMMAND_BUFFER_SERVICE_ERROR_STATE_H_ +#include <stdint.h> + #include "base/compiler_specific.h" -#include "gpu/command_buffer/common/types.h" +#include "base/macros.h" #include "gpu/gpu_export.h" namespace gpu { @@ -31,10 +33,17 @@ class Logger; __FILE__, __LINE__, function_name, value, label) // Use to synthesize a GL error on the error_state for an invalid enum based -// parameter. Will attempt to expand the parameter to a string. -#define ERRORSTATE_SET_GL_ERROR_INVALID_PARAM( \ +// integer parameter. Will attempt to expand the parameter to a string. +#define ERRORSTATE_SET_GL_ERROR_INVALID_PARAMI( \ + error_state, error, function_name, pname, param) \ + error_state->SetGLErrorInvalidParami( \ + __FILE__, __LINE__, error, function_name, pname, param) + +// Use to synthesize a GL error on the error_state for an invalid enum based +// float parameter. Will attempt to expand the parameter to a string. +#define ERRORSTATE_SET_GL_ERROR_INVALID_PARAMF( \ error_state, error, function_name, pname, param) \ - error_state->SetGLErrorInvalidParam( \ + error_state->SetGLErrorInvalidParamf( \ __FILE__, __LINE__, error, function_name, pname, param) // Use to move all pending error to the wrapper so on your next GL call @@ -48,14 +57,19 @@ class Logger; #define ERRORSTATE_CLEAR_REAL_GL_ERRORS(error_state, function_name) \ error_state->ClearRealGLErrors(__FILE__, __LINE__, function_name) +class GPU_EXPORT ErrorStateClient { + public: + // GL_OUT_OF_MEMORY can cause side effects such as losing the context. + virtual void OnOutOfMemoryError() = 0; +}; class GPU_EXPORT ErrorState { public: virtual ~ErrorState(); - static ErrorState* Create(Logger* logger); + static ErrorState* Create(ErrorStateClient* client, Logger* logger); - virtual uint32 GetGLError() = 0; + virtual uint32_t GetGLError() = 0; virtual void SetGLError( const char* filename, @@ -69,13 +83,20 @@ class GPU_EXPORT ErrorState { const char* function_name, unsigned int value, const char* label) = 0; - virtual void SetGLErrorInvalidParam( + virtual void SetGLErrorInvalidParami( const char* filename, int line, unsigned int error, const char* function_name, unsigned int pname, int param) = 0; + virtual void SetGLErrorInvalidParamf( + const char* filename, + int line, + unsigned int error, + const char* function_name, + unsigned int pname, + float param) = 0; // Gets the GLError and stores it in our wrapper. Effectively // this lets us peek at the error without losing it. diff --git a/chromium/gpu/command_buffer/service/error_state_mock.h b/chromium/gpu/command_buffer/service/error_state_mock.h index 00bed9a4712..eb056f34f4b 100644 --- a/chromium/gpu/command_buffer/service/error_state_mock.h +++ b/chromium/gpu/command_buffer/service/error_state_mock.h @@ -18,20 +18,27 @@ class MockErrorState : public ErrorState { MockErrorState(); virtual ~MockErrorState(); - MOCK_METHOD0(GetGLError, uint32()); + MOCK_METHOD0(GetGLError, uint32_t()); MOCK_METHOD5(SetGLError, void( const char* filename, int line, unsigned error, const char* function_name, const char* msg)); MOCK_METHOD5(SetGLErrorInvalidEnum, void( const char* filename, int line, const char* function_name, unsigned value, const char* label)); - MOCK_METHOD6(SetGLErrorInvalidParam, void( + MOCK_METHOD6(SetGLErrorInvalidParami, void( const char* filename, int line, unsigned error, const char* function_name, unsigned pname, int param)); + MOCK_METHOD6(SetGLErrorInvalidParamf, void( + const char* filename, + int line, + unsigned error, + const char* function_name, + unsigned pname, + float param)); MOCK_METHOD3(PeekGLError, unsigned( const char* file, int line, const char* filename)); MOCK_METHOD3(CopyRealGLErrorsToWrapper, void( diff --git a/chromium/gpu/command_buffer/service/feature_info.cc b/chromium/gpu/command_buffer/service/feature_info.cc index cbcf968adc2..94eb4cc0a23 100644 --- a/chromium/gpu/command_buffer/service/feature_info.cc +++ b/chromium/gpu/command_buffer/service/feature_info.cc @@ -7,6 +7,8 @@ #include <set> #include "base/command_line.h" +#include "base/macros.h" +#include "base/metrics/histogram.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" @@ -14,10 +16,6 @@ #include "gpu/command_buffer/service/gpu_switches.h" #include "ui/gl/gl_implementation.h" -#if defined(OS_MACOSX) -#include "ui/gl/io_surface_support_mac.h" -#endif - namespace gpu { namespace gles2 { @@ -94,12 +92,22 @@ void StringToWorkarounds( workarounds->max_cube_map_texture_size = 1024; if (workarounds->max_cube_map_texture_size_limit_512) workarounds->max_cube_map_texture_size = 512; + + if (workarounds->max_fragment_uniform_vectors_32) + workarounds->max_fragment_uniform_vectors = 32; + if (workarounds->max_varying_vectors_16) + workarounds->max_varying_vectors = 16; + if (workarounds->max_vertex_uniform_vectors_256) + workarounds->max_vertex_uniform_vectors = 256; } } // anonymous namespace. FeatureInfo::FeatureFlags::FeatureFlags() - : chromium_framebuffer_multisample(false), + : chromium_color_buffer_float_rgba(false), + chromium_color_buffer_float_rgb(false), + chromium_framebuffer_multisample(false), + chromium_sync_query(false), use_core_framebuffer_multisample(false), multisampled_render_to_texture(false), use_img_for_multisampled_render_to_texture(false), @@ -111,7 +119,6 @@ FeatureInfo::FeatureFlags::FeatureFlags() npot_ok(false), enable_texture_float_linear(false), enable_texture_half_float_linear(false), - chromium_stream_texture(false), angle_translated_shader_source(false), angle_pack_reverse_row_order(false), arb_texture_rectangle(false), @@ -125,6 +132,7 @@ FeatureInfo::FeatureFlags::FeatureFlags() enable_samplers(false), ext_draw_buffers(false), ext_frag_depth(false), + ext_shader_texture_lod(false), use_async_readpixels(false), map_buffer_range(false), ext_discard_framebuffer(false), @@ -140,7 +148,10 @@ FeatureInfo::Workarounds::Workarounds() : GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP) #undef GPU_OP max_texture_size(0), - max_cube_map_texture_size(0) { + max_cube_map_texture_size(0), + max_fragment_uniform_vectors(0), + max_varying_vectors(0), + max_vertex_uniform_vectors(0) { } FeatureInfo::FeatureInfo() { @@ -244,15 +255,9 @@ void FeatureInfo::InitializeFeatures() { AddExtensionString("GL_CHROMIUM_resize"); AddExtensionString("GL_CHROMIUM_resource_safe"); AddExtensionString("GL_CHROMIUM_strict_attribs"); - AddExtensionString("GL_CHROMIUM_stream_texture"); AddExtensionString("GL_CHROMIUM_texture_mailbox"); AddExtensionString("GL_EXT_debug_marker"); - if (workarounds_.enable_chromium_fast_npot_mo8_textures) - AddExtensionString("GL_CHROMIUM_fast_NPOT_MO8_textures"); - - feature_flags_.chromium_stream_texture = true; - // OES_vertex_array_object is emulated if not present natively, // so the extension string is always exposed. AddExtensionString("GL_OES_vertex_array_object"); @@ -444,26 +449,28 @@ void FeatureInfo::InitializeFeatures() { bool enable_texture_half_float = false; bool enable_texture_half_float_linear = false; - bool have_arb_texture_float = extensions.Contains("GL_ARB_texture_float"); + bool may_enable_chromium_color_buffer_float = false; - if (have_arb_texture_float) { + if (extensions.Contains("GL_ARB_texture_float")) { enable_texture_float = true; enable_texture_float_linear = true; enable_texture_half_float = true; enable_texture_half_float_linear = true; + may_enable_chromium_color_buffer_float = true; } else { - if (extensions.Contains("GL_OES_texture_float") || have_arb_texture_float) { + if (extensions.Contains("GL_OES_texture_float")) { enable_texture_float = true; - if (extensions.Contains("GL_OES_texture_float_linear") || - have_arb_texture_float) { + if (extensions.Contains("GL_OES_texture_float_linear")) { enable_texture_float_linear = true; } + if ((is_es3 && extensions.Contains("GL_EXT_color_buffer_float")) || + feature_flags_.is_angle) { + may_enable_chromium_color_buffer_float = true; + } } - if (extensions.Contains("GL_OES_texture_half_float") || - have_arb_texture_float) { + if (extensions.Contains("GL_OES_texture_half_float")) { enable_texture_half_float = true; - if (extensions.Contains("GL_OES_texture_half_float_linear") || - have_arb_texture_float) { + if (extensions.Contains("GL_OES_texture_half_float_linear")) { enable_texture_half_float_linear = true; } } @@ -497,9 +504,64 @@ void FeatureInfo::InitializeFeatures() { } } + if (may_enable_chromium_color_buffer_float) { + COMPILE_ASSERT(GL_RGBA32F_ARB == GL_RGBA32F && + GL_RGBA32F_EXT == GL_RGBA32F && + GL_RGB32F_ARB == GL_RGB32F && + GL_RGB32F_EXT == GL_RGB32F, + sized_float_internal_format_variations_must_match); + // We don't check extension support beyond ARB_texture_float on desktop GL, + // and format support varies between GL configurations. For example, spec + // prior to OpenGL 3.0 mandates framebuffer support only for one + // implementation-chosen format, and ES3.0 EXT_color_buffer_float does not + // support rendering to RGB32F. Check for framebuffer completeness with + // formats that the extensions expose, and only enable an extension when a + // framebuffer created with its texture format is reported as complete. + GLint fb_binding = 0; + GLint tex_binding = 0; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fb_binding); + glGetIntegerv(GL_TEXTURE_BINDING_2D, &tex_binding); + + GLuint tex_id = 0; + GLuint fb_id = 0; + GLsizei width = 16; + + glGenTextures(1, &tex_id); + glGenFramebuffersEXT(1, &fb_id); + glBindTexture(GL_TEXTURE_2D, tex_id); + // Nearest filter needed for framebuffer completeness on some drivers. + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, width, 0, GL_RGBA, + GL_FLOAT, NULL); + glBindFramebufferEXT(GL_FRAMEBUFFER, fb_id); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, tex_id, 0); + GLenum statusRGBA = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, width, width, 0, GL_RGB, + GL_FLOAT, NULL); + GLenum statusRGB = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); + glDeleteFramebuffersEXT(1, &fb_id); + glDeleteTextures(1, &tex_id); + + glBindFramebufferEXT(GL_FRAMEBUFFER, static_cast<GLuint>(fb_binding)); + glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(tex_binding)); + + DCHECK(glGetError() == GL_NO_ERROR); + + if (statusRGBA == GL_FRAMEBUFFER_COMPLETE) { + validators_.texture_internal_format.AddValue(GL_RGBA32F); + feature_flags_.chromium_color_buffer_float_rgba = true; + AddExtensionString("GL_CHROMIUM_color_buffer_float_rgba"); + } + if (statusRGB == GL_FRAMEBUFFER_COMPLETE) { + validators_.texture_internal_format.AddValue(GL_RGB32F); + feature_flags_.chromium_color_buffer_float_rgb = true; + AddExtensionString("GL_CHROMIUM_color_buffer_float_rgb"); + } + } + // Check for multisample support - if (!disallowed_features_.multisampling && - !workarounds_.disable_framebuffer_multisample) { + if (!workarounds_.disable_multisampling) { bool ext_has_multisample = extensions.Contains("GL_EXT_framebuffer_multisample") || is_es3; if (feature_flags_.is_angle) { @@ -515,21 +577,20 @@ void FeatureInfo::InitializeFeatures() { validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT); validators_.render_buffer_parameter.AddValue(GL_RENDERBUFFER_SAMPLES_EXT); AddExtensionString("GL_CHROMIUM_framebuffer_multisample"); - } else { - if (extensions.Contains("GL_EXT_multisampled_render_to_texture")) { - feature_flags_.multisampled_render_to_texture = true; - } else if (extensions.Contains("GL_IMG_multisampled_render_to_texture")) { - feature_flags_.multisampled_render_to_texture = true; - feature_flags_.use_img_for_multisampled_render_to_texture = true; - } - if (feature_flags_.multisampled_render_to_texture) { - validators_.render_buffer_parameter.AddValue( - GL_RENDERBUFFER_SAMPLES_EXT); - validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT); - validators_.frame_buffer_parameter.AddValue( - GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT); - AddExtensionString("GL_EXT_multisampled_render_to_texture"); - } + } + if (extensions.Contains("GL_EXT_multisampled_render_to_texture")) { + feature_flags_.multisampled_render_to_texture = true; + } else if (extensions.Contains("GL_IMG_multisampled_render_to_texture")) { + feature_flags_.multisampled_render_to_texture = true; + feature_flags_.use_img_for_multisampled_render_to_texture = true; + } + if (feature_flags_.multisampled_render_to_texture) { + validators_.render_buffer_parameter.AddValue( + GL_RENDERBUFFER_SAMPLES_EXT); + validators_.g_l_state.AddValue(GL_MAX_SAMPLES_EXT); + validators_.frame_buffer_parameter.AddValue( + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT); + AddExtensionString("GL_EXT_multisampled_render_to_texture"); } } @@ -564,6 +625,28 @@ void FeatureInfo::InitializeFeatures() { validators_.compressed_texture_format.AddValue(GL_ETC1_RGB8_OES); } + if (extensions.Contains("GL_AMD_compressed_ATC_texture")) { + AddExtensionString("GL_AMD_compressed_ATC_texture"); + validators_.compressed_texture_format.AddValue( + GL_ATC_RGB_AMD); + validators_.compressed_texture_format.AddValue( + GL_ATC_RGBA_EXPLICIT_ALPHA_AMD); + validators_.compressed_texture_format.AddValue( + GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD); + } + + if (extensions.Contains("GL_IMG_texture_compression_pvrtc")) { + AddExtensionString("GL_IMG_texture_compression_pvrtc"); + validators_.compressed_texture_format.AddValue( + GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG); + validators_.compressed_texture_format.AddValue( + GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG); + validators_.compressed_texture_format.AddValue( + GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG); + validators_.compressed_texture_format.AddValue( + GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG); + } + // Ideally we would only expose this extension on Mac OS X, to // support GL_CHROMIUM_iosurface and the compositor. We don't want // applications to start using it; they should use ordinary non- @@ -583,9 +666,7 @@ void FeatureInfo::InitializeFeatures() { } #if defined(OS_MACOSX) - if (IOSurfaceSupport::Initialize()) { - AddExtensionString("GL_CHROMIUM_iosurface"); - } + AddExtensionString("GL_CHROMIUM_iosurface"); #endif // TODO(gman): Add support for these extensions. @@ -658,7 +739,8 @@ void FeatureInfo::InitializeFeatures() { if (!workarounds_.disable_angle_instanced_arrays && (extensions.Contains("GL_ANGLE_instanced_arrays") || (extensions.Contains("GL_ARB_instanced_arrays") && - extensions.Contains("GL_ARB_draw_instanced")))) { + extensions.Contains("GL_ARB_draw_instanced")) || + is_es3)) { AddExtensionString("GL_ANGLE_instanced_arrays"); feature_flags_.angle_instanced_arrays = true; validators_.vertex_attribute.AddValue(GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE); @@ -689,14 +771,37 @@ void FeatureInfo::InitializeFeatures() { } } + if (extensions.Contains("GL_EXT_blend_minmax") || + gfx::HasDesktopGLFeatures()) { + AddExtensionString("GL_EXT_blend_minmax"); + validators_.equation.AddValue(GL_MIN_EXT); + validators_.equation.AddValue(GL_MAX_EXT); + } + if (extensions.Contains("GL_EXT_frag_depth") || gfx::HasDesktopGLFeatures()) { AddExtensionString("GL_EXT_frag_depth"); feature_flags_.ext_frag_depth = true; } - bool ui_gl_fence_works = extensions.Contains("GL_NV_fence") || - extensions.Contains("GL_ARB_sync") || - extensions.Contains("EGL_KHR_fence_sync"); + if (extensions.Contains("GL_EXT_shader_texture_lod") || + gfx::HasDesktopGLFeatures()) { + AddExtensionString("GL_EXT_shader_texture_lod"); + feature_flags_.ext_shader_texture_lod = true; + } + + bool egl_khr_fence_sync = false; +#if !defined(OS_MACOSX) + if (workarounds_.disable_egl_khr_fence_sync) { + gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync = false; + } + egl_khr_fence_sync = gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync; +#endif + if (workarounds_.disable_arb_sync) + gfx::g_driver_gl.ext.b_GL_ARB_sync = false; + bool ui_gl_fence_works = is_es3 || extensions.Contains("GL_NV_fence") || + gfx::g_driver_gl.ext.b_GL_ARB_sync || + egl_khr_fence_sync; + UMA_HISTOGRAM_BOOLEAN("GPU.FenceSupport", ui_gl_fence_works); feature_flags_.map_buffer_range = is_es3 || extensions.Contains("GL_ARB_map_buffer_range"); @@ -724,10 +829,22 @@ void FeatureInfo::InitializeFeatures() { AddExtensionString("GL_EXT_discard_framebuffer"); feature_flags_.ext_discard_framebuffer = true; } + + if (ui_gl_fence_works) { + AddExtensionString("GL_CHROMIUM_sync_query"); + feature_flags_.chromium_sync_query = true; + } } void FeatureInfo::AddExtensionString(const std::string& str) { - if (extensions_.find(str) == std::string::npos) { + size_t pos = extensions_.find(str); + while (pos != std::string::npos && + pos + str.length() < extensions_.length() && + extensions_.substr(pos + str.length(), 1) != " ") { + // This extension name is a substring of another. + pos = extensions_.find(str, pos + str.length()); + } + if (pos == std::string::npos) { extensions_ += (extensions_.empty() ? "" : " ") + str; } } diff --git a/chromium/gpu/command_buffer/service/feature_info.h b/chromium/gpu/command_buffer/service/feature_info.h index ca8c03c7328..8e9c07cac32 100644 --- a/chromium/gpu/command_buffer/service/feature_info.h +++ b/chromium/gpu/command_buffer/service/feature_info.h @@ -15,7 +15,9 @@ #include "gpu/config/gpu_driver_bug_workaround_type.h" #include "gpu/gpu_export.h" +namespace base { class CommandLine; +} namespace gpu { namespace gles2 { @@ -26,7 +28,10 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> { struct FeatureFlags { FeatureFlags(); + bool chromium_color_buffer_float_rgba; + bool chromium_color_buffer_float_rgb; bool chromium_framebuffer_multisample; + bool chromium_sync_query; // Use glBlitFramebuffer() and glRenderbufferStorageMultisample() with // GL_EXT_framebuffer_multisample-style semantics, since they are exposed // as core GL functions on this implementation. @@ -42,7 +47,6 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> { bool npot_ok; bool enable_texture_float_linear; bool enable_texture_half_float_linear; - bool chromium_stream_texture; bool angle_translated_shader_source; bool angle_pack_reverse_row_order; bool arb_texture_rectangle; @@ -56,6 +60,7 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> { bool enable_samplers; bool ext_draw_buffers; bool ext_frag_depth; + bool ext_shader_texture_lod; bool use_async_readpixels; bool map_buffer_range; bool ext_discard_framebuffer; @@ -76,13 +81,16 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> { // Note: 0 here means use driver limit. GLint max_texture_size; GLint max_cube_map_texture_size; + GLint max_fragment_uniform_vectors; + GLint max_varying_vectors; + GLint max_vertex_uniform_vectors; }; // Constructor with workarounds taken from the current process's CommandLine FeatureInfo(); // Constructor with workarounds taken from |command_line| - FeatureInfo(const CommandLine& command_line); + FeatureInfo(const base::CommandLine& command_line); // Initializes the feature information. Needs a current GL context. bool Initialize(); @@ -111,7 +119,6 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> { private: friend class base::RefCounted<FeatureInfo>; friend class BufferManagerClientSideArraysTest; - friend class GLES2DecoderTestBase; typedef base::hash_map<GLenum, ValueValidator<GLenum> > ValidatorMap; ValidatorMap texture_format_validators_; @@ -119,7 +126,7 @@ class GPU_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> { ~FeatureInfo(); void AddExtensionString(const std::string& str); - void InitializeBasicState(const CommandLine& command_line); + void InitializeBasicState(const base::CommandLine& command_line); void InitializeFeatures(); Validators validators_; diff --git a/chromium/gpu/command_buffer/service/feature_info_unittest.cc b/chromium/gpu/command_buffer/service/feature_info_unittest.cc index 8164b3580ac..be3e38a6715 100644 --- a/chromium/gpu/command_buffer/service/feature_info_unittest.cc +++ b/chromium/gpu/command_buffer/service/feature_info_unittest.cc @@ -7,6 +7,7 @@ #include "base/command_line.h" #include "base/memory/scoped_ptr.h" #include "base/strings/string_number_conversions.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/gpu_switches.h" #include "gpu/command_buffer/service/test_helper.h" #include "gpu/command_buffer/service/texture_manager.h" @@ -15,7 +16,6 @@ #include "ui/gl/gl_implementation.h" #include "ui/gl/gl_mock.h" -using ::gfx::MockGLInterface; using ::testing::_; using ::testing::DoAll; using ::testing::HasSubstr; @@ -27,7 +27,6 @@ using ::testing::Return; using ::testing::SetArrayArgument; using ::testing::SetArgumentPointee; using ::testing::StrEq; -using ::testing::StrictMock; namespace gpu { namespace gles2 { @@ -36,7 +35,7 @@ namespace { const char kGLRendererStringANGLE[] = "ANGLE (some renderer)"; } // anonymous namespace -class FeatureInfoTest : public testing::Test { +class FeatureInfoTest : public GpuServiceTest { public: FeatureInfoTest() { } @@ -70,18 +69,11 @@ class FeatureInfoTest : public testing::Test { } protected: - virtual void SetUp() { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); - } - virtual void TearDown() { info_ = NULL; - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); + GpuServiceTest::TearDown(); } - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; scoped_refptr<FeatureInfo> info_; }; @@ -110,7 +102,6 @@ TEST_F(FeatureInfoTest, Basic) { EXPECT_FALSE(info_->feature_flags().oes_egl_image_external); EXPECT_FALSE(info_->feature_flags().oes_depth24); EXPECT_FALSE(info_->feature_flags().packed_depth24_stencil8); - EXPECT_FALSE(info_->feature_flags().chromium_stream_texture); EXPECT_FALSE(info_->feature_flags().angle_translated_shader_source); EXPECT_FALSE(info_->feature_flags().angle_pack_reverse_row_order); EXPECT_FALSE(info_->feature_flags().arb_texture_rectangle); @@ -247,6 +238,10 @@ TEST_F(FeatureInfoTest, InitializeNoExtensions) { Not(HasSubstr("GL_EXT_texture_storage"))); EXPECT_THAT(info_->extensions(), Not(HasSubstr("GL_OES_compressed_ETC1_RGB8_texture"))); + EXPECT_THAT(info_->extensions(), + Not(HasSubstr("GL_AMD_compressed_ATC_texture"))); + EXPECT_THAT(info_->extensions(), + Not(HasSubstr("GL_IMG_texture_compression_pvrtc"))); EXPECT_FALSE(info_->feature_flags().npot_ok); EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( GL_COMPRESSED_RGB_S3TC_DXT1_EXT)); @@ -258,6 +253,20 @@ TEST_F(FeatureInfoTest, InitializeNoExtensions) { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)); EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( GL_ETC1_RGB8_OES)); + EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( + GL_ATC_RGB_AMD)); + EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( + GL_ATC_RGBA_EXPLICIT_ALPHA_AMD)); + EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( + GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD)); + EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( + GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG)); + EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( + GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG)); + EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( + GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG)); + EXPECT_FALSE(info_->validators()->compressed_texture_format.IsValid( + GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG)); EXPECT_FALSE(info_->validators()->read_pixel_format.IsValid( GL_BGRA_EXT)); EXPECT_FALSE(info_->validators()->texture_parameter.IsValid( @@ -281,6 +290,10 @@ TEST_F(FeatureInfoTest, InitializeNoExtensions) { GL_DEPTH24_STENCIL8)); EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid( GL_DEPTH_STENCIL)); + EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid( + GL_RGBA32F)); + EXPECT_FALSE(info_->validators()->texture_internal_format.IsValid( + GL_RGB32F)); EXPECT_FALSE(info_->validators()->texture_format.IsValid( GL_DEPTH_STENCIL)); EXPECT_FALSE(info_->validators()->pixel_type.IsValid( @@ -295,6 +308,8 @@ TEST_F(FeatureInfoTest, InitializeNoExtensions) { GL_DEPTH_COMPONENT32_OES)); EXPECT_FALSE(info_->validators()->texture_internal_format_storage.IsValid( GL_DEPTH24_STENCIL8_OES)); + EXPECT_FALSE(info_->validators()->equation.IsValid(GL_MIN_EXT)); + EXPECT_FALSE(info_->validators()->equation.IsValid(GL_MAX_EXT)); } TEST_F(FeatureInfoTest, InitializeWithANGLE) { @@ -408,6 +423,19 @@ TEST_F(FeatureInfoTest, InitializeEXT_read_format_bgra) { GL_BGRA8_EXT)); } +TEST_F(FeatureInfoTest, InitializeARB_texture_float) { + SetupInitExpectations("GL_ARB_texture_float"); + EXPECT_TRUE(info_->feature_flags().chromium_color_buffer_float_rgba); + EXPECT_TRUE(info_->feature_flags().chromium_color_buffer_float_rgb); + std::string extensions = info_->extensions() + " "; + EXPECT_THAT(extensions, HasSubstr("GL_CHROMIUM_color_buffer_float_rgb ")); + EXPECT_THAT(extensions, HasSubstr("GL_CHROMIUM_color_buffer_float_rgba")); + EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid( + GL_RGBA32F)); + EXPECT_TRUE(info_->validators()->texture_internal_format.IsValid( + GL_RGB32F)); +} + TEST_F(FeatureInfoTest, InitializeOES_texture_floatGLES2) { SetupInitExpectations("GL_OES_texture_float"); EXPECT_FALSE(info_->feature_flags().enable_texture_float_linear); @@ -618,7 +646,7 @@ TEST_F(FeatureInfoTest, InitializeEXT_multisampled_render_to_texture) { TEST_F(FeatureInfoTest, InitializeIMG_multisampled_render_to_texture) { SetupInitExpectations("GL_IMG_multisampled_render_to_texture"); EXPECT_TRUE(info_->feature_flags( - ).use_img_for_multisampled_render_to_texture); + ).multisampled_render_to_texture); EXPECT_TRUE(info_->feature_flags( ).use_img_for_multisampled_render_to_texture); EXPECT_THAT(info_->extensions(), @@ -810,11 +838,30 @@ TEST_F(FeatureInfoTest, InitializeOES_compressed_ETC1_RGB8_texture) { GL_ETC1_RGB8_OES)); } -TEST_F(FeatureInfoTest, InitializeCHROMIUM_stream_texture) { - SetupInitExpectations("GL_CHROMIUM_stream_texture"); +TEST_F(FeatureInfoTest, InitializeAMD_compressed_ATC_texture) { + SetupInitExpectations("GL_AMD_compressed_ATC_texture"); EXPECT_THAT(info_->extensions(), - HasSubstr("GL_CHROMIUM_stream_texture")); - EXPECT_TRUE(info_->feature_flags().chromium_stream_texture); + HasSubstr("GL_AMD_compressed_ATC_texture")); + EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( + GL_ATC_RGB_AMD)); + EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( + GL_ATC_RGBA_EXPLICIT_ALPHA_AMD)); + EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( + GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD)); +} + +TEST_F(FeatureInfoTest, InitializeIMG_texture_compression_pvrtc) { + SetupInitExpectations("GL_IMG_texture_compression_pvrtc"); + EXPECT_THAT(info_->extensions(), + HasSubstr("GL_IMG_texture_compression_pvrtc")); + EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( + GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG)); + EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( + GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG)); + EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( + GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG)); + EXPECT_TRUE(info_->validators()->compressed_texture_format.IsValid( + GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG)); } TEST_F(FeatureInfoTest, InitializeEXT_occlusion_query_boolean) { @@ -899,12 +946,25 @@ TEST_F(FeatureInfoTest, InitializeVAOsWithClientSideArrays) { EXPECT_FALSE(info_->feature_flags().native_vertex_array_object); } +TEST_F(FeatureInfoTest, InitializeEXT_blend_minmax) { + SetupInitExpectations("GL_EXT_blend_minmax"); + EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_blend_minmax")); + EXPECT_TRUE(info_->validators()->equation.IsValid(GL_MIN_EXT)); + EXPECT_TRUE(info_->validators()->equation.IsValid(GL_MAX_EXT)); +} + TEST_F(FeatureInfoTest, InitializeEXT_frag_depth) { SetupInitExpectations("GL_EXT_frag_depth"); EXPECT_TRUE(info_->feature_flags().ext_frag_depth); EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_frag_depth")); } +TEST_F(FeatureInfoTest, InitializeEXT_shader_texture_lod) { + SetupInitExpectations("GL_EXT_shader_texture_lod"); + EXPECT_TRUE(info_->feature_flags().ext_shader_texture_lod); + EXPECT_THAT(info_->extensions(), HasSubstr("GL_EXT_shader_texture_lod")); +} + TEST_F(FeatureInfoTest, InitializeEXT_discard_framebuffer) { SetupInitExpectations("GL_EXT_discard_framebuffer"); EXPECT_TRUE(info_->feature_flags().ext_discard_framebuffer); @@ -927,7 +987,7 @@ TEST_F(FeatureInfoTest, InitializeWithES3) { EXPECT_TRUE(info_->feature_flags().use_core_framebuffer_multisample); EXPECT_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_framebuffer_multisample")); - EXPECT_FALSE(info_->feature_flags().use_async_readpixels); + EXPECT_TRUE(info_->feature_flags().use_async_readpixels); EXPECT_TRUE(info_->feature_flags().oes_depth24); EXPECT_THAT(info_->extensions(), HasSubstr("GL_GOOGLE_depth_texture")); EXPECT_THAT(info_->extensions(), HasSubstr("GL_CHROMIUM_depth_texture")); diff --git a/chromium/gpu/command_buffer/service/framebuffer_manager.cc b/chromium/gpu/command_buffer/service/framebuffer_manager.cc index 48e503cb45b..4022b3defaa 100644 --- a/chromium/gpu/command_buffer/service/framebuffer_manager.cc +++ b/chromium/gpu/command_buffer/service/framebuffer_manager.cc @@ -119,6 +119,9 @@ class RenderbufferAttachment renderbuffer_->AddToSignature(signature); } + virtual void OnWillRenderTo() const OVERRIDE {} + virtual void OnDidRenderTo() const OVERRIDE {} + protected: virtual ~RenderbufferAttachment() { } @@ -243,6 +246,14 @@ class TextureAttachment texture_ref_.get(), target_, level_, signature); } + virtual void OnWillRenderTo() const OVERRIDE { + texture_ref_->texture()->OnWillModifyPixels(); + } + + virtual void OnDidRenderTo() const OVERRIDE { + texture_ref_->texture()->OnDidModifyPixels(); + } + protected: virtual ~TextureAttachment() {} @@ -349,6 +360,55 @@ bool Framebuffer::HasUnclearedAttachment( return false; } +bool Framebuffer::HasUnclearedColorAttachments() const { + for (AttachmentMap::const_iterator it = attachments_.begin(); + it != attachments_.end(); ++it) { + if (it->first >= GL_COLOR_ATTACHMENT0 && + it->first < GL_COLOR_ATTACHMENT0 + manager_->max_draw_buffers_) { + const Attachment* attachment = it->second.get(); + if (!attachment->cleared()) + return true; + } + } + return false; +} + +void Framebuffer::ChangeDrawBuffersHelper(bool recover) const { + scoped_ptr<GLenum[]> buffers(new GLenum[manager_->max_draw_buffers_]); + for (uint32 i = 0; i < manager_->max_draw_buffers_; ++i) + buffers[i] = GL_NONE; + for (AttachmentMap::const_iterator it = attachments_.begin(); + it != attachments_.end(); ++it) { + if (it->first >= GL_COLOR_ATTACHMENT0 && + it->first < GL_COLOR_ATTACHMENT0 + manager_->max_draw_buffers_) { + buffers[it->first - GL_COLOR_ATTACHMENT0] = it->first; + } + } + bool different = false; + for (uint32 i = 0; i < manager_->max_draw_buffers_; ++i) { + if (buffers[i] != draw_buffers_[i]) { + different = true; + break; + } + } + if (different) { + if (recover) + glDrawBuffersARB(manager_->max_draw_buffers_, draw_buffers_.get()); + else + glDrawBuffersARB(manager_->max_draw_buffers_, buffers.get()); + } +} + +void Framebuffer::PrepareDrawBuffersForClear() const { + bool recover = false; + ChangeDrawBuffersHelper(recover); +} + +void Framebuffer::RestoreDrawBuffersAfterClear() const { + bool recover = true; + ChangeDrawBuffersHelper(recover); +} + void Framebuffer::MarkAttachmentAsCleared( RenderbufferManager* renderbuffer_manager, TextureManager* texture_manager, @@ -505,6 +565,8 @@ void Framebuffer::SetDrawBuffers(GLsizei n, const GLenum* bufs) { draw_buffers_[i] = bufs[i]; } + + bool Framebuffer::HasAlphaMRT() const { for (uint32 i = 0; i < manager_->max_draw_buffers_; ++i) { if (draw_buffers_[i] != GL_NONE) { @@ -615,6 +677,20 @@ void Framebuffer::OnTextureRefDetached(TextureRef* texture) { manager_->OnTextureRefDetached(texture); } +void Framebuffer::OnWillRenderTo() const { + for (AttachmentMap::const_iterator it = attachments_.begin(); + it != attachments_.end(); ++it) { + it->second->OnWillRenderTo(); + } +} + +void Framebuffer::OnDidRenderTo() const { + for (AttachmentMap::const_iterator it = attachments_.begin(); + it != attachments_.end(); ++it) { + it->second->OnDidRenderTo(); + } +} + bool FramebufferManager::GetClientId( GLuint service_id, GLuint* client_id) const { // This doesn't need to be fast. It's only used during slow queries. diff --git a/chromium/gpu/command_buffer/service/framebuffer_manager.h b/chromium/gpu/command_buffer/service/framebuffer_manager.h index c469bf87435..b68ab7d9f12 100644 --- a/chromium/gpu/command_buffer/service/framebuffer_manager.h +++ b/chromium/gpu/command_buffer/service/framebuffer_manager.h @@ -49,6 +49,8 @@ class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> { GLenum attachment_type, uint32 max_color_attachments) = 0; virtual void AddToSignature( TextureManager* texture_manager, std::string* signature) const = 0; + virtual void OnWillRenderTo() const = 0; + virtual void OnDidRenderTo() const = 0; protected: friend class base::RefCounted<Attachment>; @@ -62,6 +64,7 @@ class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> { } bool HasUnclearedAttachment(GLenum attachment) const; + bool HasUnclearedColorAttachments() const; void MarkAttachmentAsCleared( RenderbufferManager* renderbuffer_manager, @@ -127,6 +130,14 @@ class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> { void SetDrawBuffers(GLsizei n, const GLenum* bufs); + // If a color buffer is attached to GL_COLOR_ATTACHMENTi, enable that + // draw buffer for glClear(). + void PrepareDrawBuffersForClear() const; + + // Restore draw buffers states that have been changed in + // PrepareDrawBuffersForClear(). + void RestoreDrawBuffersAfterClear() const; + // Return true if any draw buffers has an alpha channel. bool HasAlphaMRT() const; @@ -137,6 +148,8 @@ class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> { } void OnTextureRefDetached(TextureRef* texture); + void OnWillRenderTo() const; + void OnDidRenderTo() const; private: friend class FramebufferManager; @@ -159,6 +172,10 @@ class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> { return framebuffer_complete_state_count_id_; } + // Helper function for PrepareDrawBuffersForClear() and + // RestoreDrawBuffersAfterClear(). + void ChangeDrawBuffersHelper(bool recover) const; + // The managers that owns this. FramebufferManager* manager_; diff --git a/chromium/gpu/command_buffer/service/framebuffer_manager_unittest.cc b/chromium/gpu/command_buffer/service/framebuffer_manager_unittest.cc index 079325807d4..1ded5585e45 100644 --- a/chromium/gpu/command_buffer/service/framebuffer_manager_unittest.cc +++ b/chromium/gpu/command_buffer/service/framebuffer_manager_unittest.cc @@ -5,12 +5,14 @@ #include "gpu/command_buffer/service/error_state_mock.h" #include "gpu/command_buffer/service/framebuffer_manager.h" #include "gpu/command_buffer/service/feature_info.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/renderbuffer_manager.h" #include "gpu/command_buffer/service/test_helper.h" #include "gpu/command_buffer/service/texture_manager.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_mock.h" +using ::testing::_; using ::testing::Return; namespace gpu { @@ -21,20 +23,26 @@ const GLint kMaxTextureSize = 64; const GLint kMaxCubemapSize = 64; const GLint kMaxRenderbufferSize = 64; const GLint kMaxSamples = 4; +const uint32 kMaxDrawBuffers = 16; +const uint32 kMaxColorAttachments = 16; const bool kDepth24Supported = false; +const bool kUseDefaultTextures = false; } // namespace -class FramebufferManagerTest : public testing::Test { +class FramebufferManagerTest : public GpuServiceTest { public: FramebufferManagerTest() : manager_(1, 1), - texture_manager_( - NULL, new FeatureInfo(), kMaxTextureSize, kMaxCubemapSize), - renderbuffer_manager_(NULL, kMaxRenderbufferSize, kMaxSamples, - kDepth24Supported) { - - } + texture_manager_(NULL, + new FeatureInfo(), + kMaxTextureSize, + kMaxCubemapSize, + kUseDefaultTextures), + renderbuffer_manager_(NULL, + kMaxRenderbufferSize, + kMaxSamples, + kDepth24Supported) {} virtual ~FramebufferManagerTest() { manager_.Destroy(false); texture_manager_.Destroy(false); @@ -42,18 +50,7 @@ class FramebufferManagerTest : public testing::Test { } protected: - virtual void SetUp() { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); - } - - virtual void TearDown() { - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); - } - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; FramebufferManager manager_; TextureManager texture_manager_; RenderbufferManager renderbuffer_manager_; @@ -103,44 +100,48 @@ TEST_F(FramebufferManagerTest, Destroy) { ASSERT_TRUE(framebuffer1 == NULL); } -class FramebufferInfoTest : public testing::Test { +class FramebufferInfoTest : public GpuServiceTest { public: static const GLuint kClient1Id = 1; static const GLuint kService1Id = 11; FramebufferInfoTest() - : manager_(1, 1), - texture_manager_( - NULL, new FeatureInfo(), kMaxTextureSize, kMaxCubemapSize), + : manager_(kMaxDrawBuffers, kMaxColorAttachments), + feature_info_(new FeatureInfo()), renderbuffer_manager_(NULL, kMaxRenderbufferSize, kMaxSamples, kDepth24Supported) { + texture_manager_.reset(new TextureManager(NULL, + feature_info_.get(), + kMaxTextureSize, + kMaxCubemapSize, + kUseDefaultTextures)); } virtual ~FramebufferInfoTest() { manager_.Destroy(false); - texture_manager_.Destroy(false); + texture_manager_->Destroy(false); renderbuffer_manager_.Destroy(false); } protected: virtual void SetUp() { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); + InitializeContext("", ""); + } + + void InitializeContext(const char* gl_version, const char* extensions) { + GpuServiceTest::SetUp(); + TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(gl_.get(), + extensions, "", gl_version); + feature_info_->Initialize(); manager_.CreateFramebuffer(kClient1Id, kService1Id); error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>()); framebuffer_ = manager_.GetFramebuffer(kClient1Id); ASSERT_TRUE(framebuffer_ != NULL); } - virtual void TearDown() { - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); - } - - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; FramebufferManager manager_; Framebuffer* framebuffer_; - TextureManager texture_manager_; + scoped_refptr<FeatureInfo> feature_info_; + scoped_ptr<TextureManager> texture_manager_; RenderbufferManager renderbuffer_manager_; scoped_ptr<MockErrorState> error_state_; }; @@ -268,7 +269,7 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) { // check marking them as cleared. manager_.MarkAttachmentsAsCleared( - framebuffer_, &renderbuffer_manager_, &texture_manager_); + framebuffer_, &renderbuffer_manager_, texture_manager_.get()); EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)); EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT)); EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), @@ -319,7 +320,7 @@ TEST_F(FramebufferInfoTest, AttachRenderbuffer) { // Clear it. manager_.MarkAttachmentsAsCleared( - framebuffer_, &renderbuffer_manager_, &texture_manager_); + framebuffer_, &renderbuffer_manager_, texture_manager_.get()); EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)); EXPECT_TRUE(framebuffer_->IsCleared()); @@ -419,9 +420,9 @@ TEST_F(FramebufferInfoTest, AttachTexture) { EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT), framebuffer_->IsPossiblyComplete()); - texture_manager_.CreateTexture(kTextureClient1Id, kTextureService1Id); + texture_manager_->CreateTexture(kTextureClient1Id, kTextureService1Id); scoped_refptr<TextureRef> texture1( - texture_manager_.GetTexture(kTextureClient1Id)); + texture_manager_->GetTexture(kTextureClient1Id)); ASSERT_TRUE(texture1.get() != NULL); // check adding one attachment @@ -434,8 +435,8 @@ TEST_F(FramebufferInfoTest, AttachTexture) { EXPECT_EQ(static_cast<GLenum>(0), framebuffer_->GetColorAttachmentFormat()); // Try format that doesn't work with COLOR_ATTACHMENT0 - texture_manager_.SetTarget(texture1.get(), GL_TEXTURE_2D); - texture_manager_.SetLevelInfo(texture1.get(), + texture_manager_->SetTarget(texture1.get(), GL_TEXTURE_2D); + texture_manager_->SetLevelInfo(texture1.get(), GL_TEXTURE_2D, kLevel1, kBadFormat1, @@ -450,7 +451,7 @@ TEST_F(FramebufferInfoTest, AttachTexture) { framebuffer_->IsPossiblyComplete()); // Try a good format. - texture_manager_.SetLevelInfo(texture1.get(), + texture_manager_->SetLevelInfo(texture1.get(), GL_TEXTURE_2D, kLevel1, kFormat1, @@ -464,7 +465,7 @@ TEST_F(FramebufferInfoTest, AttachTexture) { EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), framebuffer_->IsPossiblyComplete()); EXPECT_FALSE(framebuffer_->IsCleared()); - texture_manager_.SetLevelInfo(texture1.get(), + texture_manager_->SetLevelInfo(texture1.get(), GL_TEXTURE_2D, kLevel1, kFormat1, @@ -491,12 +492,12 @@ TEST_F(FramebufferInfoTest, AttachTexture) { EXPECT_TRUE(attachment->cleared()); // Check replacing an attachment - texture_manager_.CreateTexture(kTextureClient2Id, kTextureService2Id); + texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id); scoped_refptr<TextureRef> texture2( - texture_manager_.GetTexture(kTextureClient2Id)); + texture_manager_->GetTexture(kTextureClient2Id)); ASSERT_TRUE(texture2.get() != NULL); - texture_manager_.SetTarget(texture2.get(), GL_TEXTURE_2D); - texture_manager_.SetLevelInfo(texture2.get(), + texture_manager_->SetTarget(texture2.get(), GL_TEXTURE_2D); + texture_manager_->SetLevelInfo(texture2.get(), GL_TEXTURE_2D, kLevel2, kFormat2, @@ -525,7 +526,7 @@ TEST_F(FramebufferInfoTest, AttachTexture) { EXPECT_TRUE(attachment->cleared()); // Check changing attachment - texture_manager_.SetLevelInfo(texture2.get(), + texture_manager_->SetLevelInfo(texture2.get(), GL_TEXTURE_2D, kLevel3, kFormat3, @@ -550,7 +551,7 @@ TEST_F(FramebufferInfoTest, AttachTexture) { EXPECT_FALSE(framebuffer_->IsCleared()); // Set to size 0 - texture_manager_.SetLevelInfo(texture2.get(), + texture_manager_->SetLevelInfo(texture2.get(), GL_TEXTURE_2D, kLevel3, kFormat3, @@ -574,6 +575,158 @@ TEST_F(FramebufferInfoTest, AttachTexture) { EXPECT_TRUE(framebuffer_->IsCleared()); } +TEST_F(FramebufferInfoTest, DrawBuffers) { + const GLuint kTextureClientId[] = { 33, 34 }; + const GLuint kTextureServiceId[] = { 333, 334 }; + + for (GLenum i = GL_COLOR_ATTACHMENT0; + i < GL_COLOR_ATTACHMENT0 + kMaxColorAttachments; ++i) { + EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(i)); + } + EXPECT_FALSE(framebuffer_->HasUnclearedColorAttachments()); + + EXPECT_EQ(static_cast<GLenum>(GL_COLOR_ATTACHMENT0), + framebuffer_->GetDrawBuffer(GL_DRAW_BUFFER0_ARB)); + for (GLenum i = GL_DRAW_BUFFER1_ARB; + i < GL_DRAW_BUFFER0_ARB + kMaxDrawBuffers; ++i) { + EXPECT_EQ(static_cast<GLenum>(GL_NONE), + framebuffer_->GetDrawBuffer(i)); + } + + for (size_t ii = 0; ii < arraysize(kTextureClientId); ++ii) { + texture_manager_->CreateTexture( + kTextureClientId[ii], kTextureServiceId[ii]); + scoped_refptr<TextureRef> texture( + texture_manager_->GetTexture(kTextureClientId[ii])); + ASSERT_TRUE(texture.get() != NULL); + + framebuffer_->AttachTexture( + GL_COLOR_ATTACHMENT0 + ii, texture.get(), GL_TEXTURE_2D, 0, 0); + EXPECT_FALSE( + framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0 + ii)); + + const Framebuffer::Attachment* attachment = + framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT0 + ii); + ASSERT_TRUE(attachment != NULL); + EXPECT_TRUE(attachment->cleared()); + } + EXPECT_TRUE(framebuffer_->IsCleared()); + EXPECT_FALSE(framebuffer_->HasUnclearedColorAttachments()); + + // Set a texture as uncleared. + scoped_refptr<TextureRef> texture1( + texture_manager_->GetTexture(kTextureClientId[1])); + texture_manager_->SetTarget(texture1.get(), GL_TEXTURE_2D); + texture_manager_->SetLevelInfo( + texture1.get(), GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, + 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, false); + + const Framebuffer::Attachment* attachment1 = + framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT1); + ASSERT_TRUE(attachment1 != NULL); + EXPECT_FALSE(attachment1->cleared()); + EXPECT_FALSE(framebuffer_->IsCleared()); + EXPECT_TRUE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT1)); + EXPECT_TRUE(framebuffer_->HasUnclearedColorAttachments()); + + GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }; + framebuffer_->SetDrawBuffers(2, buffers); + EXPECT_EQ(static_cast<GLenum>(GL_COLOR_ATTACHMENT0), + framebuffer_->GetDrawBuffer(GL_DRAW_BUFFER0_ARB)); + EXPECT_EQ(static_cast<GLenum>(GL_COLOR_ATTACHMENT1), + framebuffer_->GetDrawBuffer(GL_DRAW_BUFFER1_ARB)); + for (GLenum i = GL_DRAW_BUFFER2_ARB; + i < GL_DRAW_BUFFER0_ARB + kMaxDrawBuffers; ++i) { + EXPECT_EQ(static_cast<GLenum>(GL_NONE), + framebuffer_->GetDrawBuffer(i)); + } + + // Nothing happens. + framebuffer_->PrepareDrawBuffersForClear(); + framebuffer_->RestoreDrawBuffersAfterClear(); + + // Now we disable a draw buffer 1. + buffers[1] = GL_NONE; + framebuffer_->SetDrawBuffers(2, buffers); + // We will enable the disabled draw buffer for clear(), and disable it + // after the clear. + EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _)) + .Times(1) + .RetiresOnSaturation(); + framebuffer_->PrepareDrawBuffersForClear(); + EXPECT_CALL(*gl_, DrawBuffersARB(kMaxDrawBuffers, _)) + .Times(1) + .RetiresOnSaturation(); + framebuffer_->RestoreDrawBuffersAfterClear(); + + // Now remove draw buffer 1's attachment. + framebuffer_->AttachTexture(GL_COLOR_ATTACHMENT1, NULL, 0, 0, 0); + EXPECT_TRUE(framebuffer_->GetAttachment(GL_COLOR_ATTACHMENT1) == NULL); + + // Nothing happens. + framebuffer_->PrepareDrawBuffersForClear(); + framebuffer_->RestoreDrawBuffersAfterClear(); +} + +class FramebufferInfoFloatTest : public FramebufferInfoTest { + public: + FramebufferInfoFloatTest() + : FramebufferInfoTest() { + } + virtual ~FramebufferInfoFloatTest() { + } + + protected: + virtual void SetUp() { + InitializeContext("OpenGL ES 3.0", + "GL_OES_texture_float GL_EXT_color_buffer_float"); + } +}; + +TEST_F(FramebufferInfoFloatTest, AttachFloatTexture) { + const GLuint kTextureClientId = 33; + const GLuint kTextureServiceId = 333; + const GLint kDepth = 1; + const GLint kBorder = 0; + const GLenum kType = GL_FLOAT; + const GLsizei kWidth = 16; + const GLsizei kHeight = 32; + const GLint kLevel = 0; + const GLenum kFormat = GL_RGBA; + const GLenum kInternalFormat = GL_RGBA32F; + const GLenum kTarget = GL_TEXTURE_2D; + const GLsizei kSamples = 0; + EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)); + EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT)); + EXPECT_FALSE(framebuffer_->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT)); + + texture_manager_->CreateTexture(kTextureClientId, kTextureServiceId); + scoped_refptr<TextureRef> texture( + texture_manager_->GetTexture(kTextureClientId)); + ASSERT_TRUE(texture.get() != NULL); + + framebuffer_->AttachTexture( + GL_COLOR_ATTACHMENT0, texture.get(), kTarget, kLevel, kSamples); + EXPECT_EQ(static_cast<GLenum>(0), framebuffer_->GetColorAttachmentFormat()); + + texture_manager_->SetTarget(texture.get(), GL_TEXTURE_2D); + texture_manager_->SetLevelInfo(texture.get(), + GL_TEXTURE_2D, + kLevel, + kInternalFormat, + kWidth, + kHeight, + kDepth, + kBorder, + kFormat, + kType, + false); + // Texture with a sized float internalformat is allowed as an attachment + // since float color attachment extension is present. + EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), + framebuffer_->IsPossiblyComplete()); +} + TEST_F(FramebufferInfoTest, UnbindRenderbuffer) { const GLuint kRenderbufferClient1Id = 33; const GLuint kRenderbufferService1Id = 333; @@ -618,13 +771,13 @@ TEST_F(FramebufferInfoTest, UnbindTexture) { const GLint kLevel1 = 0; const GLint kSamples1 = 0; - texture_manager_.CreateTexture(kTextureClient1Id, kTextureService1Id); + texture_manager_->CreateTexture(kTextureClient1Id, kTextureService1Id); scoped_refptr<TextureRef> texture1( - texture_manager_.GetTexture(kTextureClient1Id)); + texture_manager_->GetTexture(kTextureClient1Id)); ASSERT_TRUE(texture1.get() != NULL); - texture_manager_.CreateTexture(kTextureClient2Id, kTextureService2Id); + texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id); scoped_refptr<TextureRef> texture2( - texture_manager_.GetTexture(kTextureClient2Id)); + texture_manager_->GetTexture(kTextureClient2Id)); ASSERT_TRUE(texture2.get() != NULL); // Attach to 2 attachment points. @@ -661,9 +814,9 @@ TEST_F(FramebufferInfoTest, IsCompleteMarkAsComplete) { Renderbuffer* renderbuffer1 = renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient1Id); ASSERT_TRUE(renderbuffer1 != NULL); - texture_manager_.CreateTexture(kTextureClient2Id, kTextureService2Id); + texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id); scoped_refptr<TextureRef> texture2( - texture_manager_.GetTexture(kTextureClient2Id)); + texture_manager_->GetTexture(kTextureClient2Id)); ASSERT_TRUE(texture2.get() != NULL); // Check MarkAsComlete marks as complete. @@ -681,7 +834,7 @@ TEST_F(FramebufferInfoTest, IsCompleteMarkAsComplete) { // Check MarkAttachmentsAsCleared marks as complete. manager_.MarkAttachmentsAsCleared( - framebuffer_, &renderbuffer_manager_, &texture_manager_); + framebuffer_, &renderbuffer_manager_, texture_manager_.get()); EXPECT_TRUE(manager_.IsComplete(framebuffer_)); // Check Unbind marks as not complete. @@ -707,16 +860,16 @@ TEST_F(FramebufferInfoTest, GetStatus) { Renderbuffer* renderbuffer1 = renderbuffer_manager_.GetRenderbuffer(kRenderbufferClient1Id); ASSERT_TRUE(renderbuffer1 != NULL); - texture_manager_.CreateTexture(kTextureClient2Id, kTextureService2Id); + texture_manager_->CreateTexture(kTextureClient2Id, kTextureService2Id); scoped_refptr<TextureRef> texture2( - texture_manager_.GetTexture(kTextureClient2Id)); + texture_manager_->GetTexture(kTextureClient2Id)); ASSERT_TRUE(texture2.get() != NULL); - texture_manager_.SetTarget(texture2.get(), GL_TEXTURE_2D); + texture_manager_->SetTarget(texture2.get(), GL_TEXTURE_2D); EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) .RetiresOnSaturation(); - framebuffer_->GetStatus(&texture_manager_, GL_FRAMEBUFFER); + framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER); // Check a second call for the same type does not call anything if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) { @@ -724,14 +877,14 @@ TEST_F(FramebufferInfoTest, GetStatus) { .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) .RetiresOnSaturation(); } - framebuffer_->GetStatus(&texture_manager_, GL_FRAMEBUFFER); + framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER); // Check changing the attachments calls CheckFramebufferStatus. framebuffer_->AttachTexture( GL_COLOR_ATTACHMENT0, texture2.get(), kTarget1, kLevel1, kSamples1); EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)).RetiresOnSaturation(); - framebuffer_->GetStatus(&texture_manager_, GL_FRAMEBUFFER); + framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER); // Check a second call for the same type does not call anything. if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) { @@ -739,13 +892,13 @@ TEST_F(FramebufferInfoTest, GetStatus) { .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) .RetiresOnSaturation(); } - framebuffer_->GetStatus(&texture_manager_, GL_FRAMEBUFFER); + framebuffer_->GetStatus(texture_manager_.get(), GL_FRAMEBUFFER); // Check a second call with a different target calls CheckFramebufferStatus. EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER)) .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) .RetiresOnSaturation(); - framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER); + framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); // Check a second call for the same type does not call anything. if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) { @@ -753,14 +906,14 @@ TEST_F(FramebufferInfoTest, GetStatus) { .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) .RetiresOnSaturation(); } - framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER); + framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); // Check adding another attachment calls CheckFramebufferStatus. framebuffer_->AttachRenderbuffer(GL_DEPTH_ATTACHMENT, renderbuffer1); EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER)) .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) .RetiresOnSaturation(); - framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER); + framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); // Check a second call for the same type does not call anything. if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) { @@ -768,26 +921,26 @@ TEST_F(FramebufferInfoTest, GetStatus) { .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) .RetiresOnSaturation(); } - framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER); + framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); // Check changing the format calls CheckFramebuffferStatus. - TestHelper::SetTexParameterWithExpectations(gl_.get(), - error_state_.get(), - &texture_manager_, - texture2.get(), - GL_TEXTURE_WRAP_S, - GL_CLAMP_TO_EDGE, - GL_NO_ERROR); + TestHelper::SetTexParameteriWithExpectations(gl_.get(), + error_state_.get(), + texture_manager_.get(), + texture2.get(), + GL_TEXTURE_WRAP_S, + GL_CLAMP_TO_EDGE, + GL_NO_ERROR); EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_READ_FRAMEBUFFER)) .WillOnce(Return(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)) .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) .RetiresOnSaturation(); - framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER); + framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); // Check since it did not return FRAMEBUFFER_COMPLETE that it calls // CheckFramebufferStatus - framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER); + framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); // Check putting it back does not call CheckFramebufferStatus. if (!framebuffer_->AllowFramebufferComboCompleteMapForTesting()) { @@ -795,14 +948,14 @@ TEST_F(FramebufferInfoTest, GetStatus) { .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) .RetiresOnSaturation(); } - TestHelper::SetTexParameterWithExpectations(gl_.get(), - error_state_.get(), - &texture_manager_, - texture2.get(), - GL_TEXTURE_WRAP_S, - GL_REPEAT, - GL_NO_ERROR); - framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER); + TestHelper::SetTexParameteriWithExpectations(gl_.get(), + error_state_.get(), + texture_manager_.get(), + texture2.get(), + GL_TEXTURE_WRAP_S, + GL_REPEAT, + GL_NO_ERROR); + framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); // Check Unbinding does not call CheckFramebufferStatus framebuffer_->UnbindRenderbuffer(GL_RENDERBUFFER, renderbuffer1); @@ -811,7 +964,7 @@ TEST_F(FramebufferInfoTest, GetStatus) { .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) .RetiresOnSaturation(); } - framebuffer_->GetStatus(&texture_manager_, GL_READ_FRAMEBUFFER); + framebuffer_->GetStatus(texture_manager_.get(), GL_READ_FRAMEBUFFER); } } // namespace gles2 diff --git a/chromium/gpu/command_buffer/service/gl_state_restorer_impl.cc b/chromium/gpu/command_buffer/service/gl_state_restorer_impl.cc index 7b3c5ed3841..5fbd425f695 100644 --- a/chromium/gpu/command_buffer/service/gl_state_restorer_impl.cc +++ b/chromium/gpu/command_buffer/service/gl_state_restorer_impl.cc @@ -21,14 +21,22 @@ bool GLStateRestorerImpl::IsInitialized() { return decoder_->initialized(); } -void GLStateRestorerImpl::RestoreState() { +void GLStateRestorerImpl::RestoreState(const gfx::GLStateRestorer* prev_state) { DCHECK(decoder_.get()); - decoder_->RestoreState(); + const GLStateRestorerImpl* restorer_impl = + static_cast<const GLStateRestorerImpl*>(prev_state); + decoder_->RestoreState( + restorer_impl ? restorer_impl->GetContextState() : NULL); } void GLStateRestorerImpl::RestoreAllTextureUnitBindings() { DCHECK(decoder_.get()); - decoder_->RestoreAllTextureUnitBindings(); + decoder_->RestoreAllTextureUnitBindings(NULL); +} + +void GLStateRestorerImpl::RestoreActiveTextureUnitBinding(unsigned int target) { + DCHECK(decoder_.get()); + decoder_->RestoreActiveTextureUnitBinding(target); } void GLStateRestorerImpl::RestoreFramebufferBindings() { @@ -36,4 +44,9 @@ void GLStateRestorerImpl::RestoreFramebufferBindings() { decoder_->RestoreFramebufferBindings(); } +const gles2::ContextState* GLStateRestorerImpl::GetContextState() const { + DCHECK(decoder_.get()); + return decoder_->GetContextState(); +} + } // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gl_state_restorer_impl.h b/chromium/gpu/command_buffer/service/gl_state_restorer_impl.h index 032bf725186..73534b81ad3 100644 --- a/chromium/gpu/command_buffer/service/gl_state_restorer_impl.h +++ b/chromium/gpu/command_buffer/service/gl_state_restorer_impl.h @@ -15,6 +15,7 @@ namespace gpu { namespace gles2 { class GLES2Decoder; +struct ContextState; } // This class implements a GLStateRestorer that forwards to a GLES2Decoder. @@ -24,11 +25,13 @@ class GPU_EXPORT GLStateRestorerImpl : public gfx::GLStateRestorer { virtual ~GLStateRestorerImpl(); virtual bool IsInitialized() OVERRIDE; - virtual void RestoreState() OVERRIDE; + virtual void RestoreState(const gfx::GLStateRestorer* prev_state) OVERRIDE; virtual void RestoreAllTextureUnitBindings() OVERRIDE; + virtual void RestoreActiveTextureUnitBinding(unsigned int target) OVERRIDE; virtual void RestoreFramebufferBindings() OVERRIDE; private: + const gles2::ContextState* GetContextState() const; base::WeakPtr<gles2::GLES2Decoder> decoder_; DISALLOW_COPY_AND_ASSIGN(GLStateRestorerImpl); diff --git a/chromium/gpu/command_buffer/service/gl_surface_mock.h b/chromium/gpu/command_buffer/service/gl_surface_mock.h index 372a9b3f41d..0652be64de3 100644 --- a/chromium/gpu/command_buffer/service/gl_surface_mock.h +++ b/chromium/gpu/command_buffer/service/gl_surface_mock.h @@ -20,7 +20,7 @@ class GLSurfaceMock : public gfx::GLSurface { MOCK_METHOD0(IsOffscreen, bool()); MOCK_METHOD0(SwapBuffers, bool()); MOCK_METHOD4(PostSubBuffer, bool(int x, int y, int width, int height)); - MOCK_METHOD0(GetExtensions, std::string()); + MOCK_METHOD0(SupportsPostSubBuffer, bool()); MOCK_METHOD0(GetSize, gfx::Size()); MOCK_METHOD0(GetHandle, void*()); MOCK_METHOD0(GetBackingFrameBufferObject, unsigned int()); diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc b/chromium/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc index 36f2b42bd6c..bda65ac6a60 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc +++ b/chromium/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc @@ -4,214 +4,186 @@ #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" -#include <string.h> +#include <algorithm> + #include "base/basictypes.h" -#include "gpu/command_buffer/common/types.h" #include "gpu/command_buffer/service/gl_utils.h" #include "gpu/command_buffer/service/gles2_cmd_decoder.h" -#define SHADER0(src) \ - "#ifdef GL_ES\n"\ - "precision mediump float;\n"\ - "#endif\n"\ - #src -#define SHADER(src) { false, SHADER0(src), } -#define SHADER_EXTERNAL_OES0(src) \ - "#extension GL_OES_EGL_image_external : require\n"\ - "#ifdef GL_ES\n"\ - "precision mediump float;\n"\ - "#endif\n"\ - #src -#define SHADER_EXTERNAL_OES(src) { true, SHADER_EXTERNAL_OES0(src), } +#define SHADER(src) \ + "#ifdef GL_ES\n" \ + "precision mediump float;\n" \ + "#define TexCoordPrecision mediump\n" \ + "#else\n" \ + "#define TexCoordPrecision\n" \ + "#endif\n" #src +#define SHADER_2D(src) \ + "#define SamplerType sampler2D\n" \ + "#define TextureLookup texture2D\n" SHADER(src) +#define SHADER_RECTANGLE_ARB(src) \ + "#define SamplerType samplerRect\n" \ + "#define TextureLookup textureRect\n" SHADER(src) +#define SHADER_EXTERNAL_OES(src) \ + "#extension GL_OES_EGL_image_external : require\n" \ + "#define SamplerType samplerExternalOES\n" \ + "#define TextureLookup texture2D\n" SHADER(src) +#define FRAGMENT_SHADERS(src) \ + SHADER_2D(src), SHADER_RECTANGLE_ARB(src), SHADER_EXTERNAL_OES(src) namespace { -const GLfloat kQuadVertices[] = { -1.0f, -1.0f, 0.0f, 1.0f, - 1.0f, -1.0f, 0.0f, 1.0f, - 1.0f, 1.0f, 0.0f, 1.0f, - -1.0f, 1.0f, 0.0f, 1.0f }; - -enum ProgramId { - PROGRAM_COPY_TEXTURE, - PROGRAM_COPY_TEXTURE_FLIP_Y, - PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA, - PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, - PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY, - PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY, - PROGRAM_COPY_TEXTURE_OES, - PROGRAM_COPY_TEXTURE_OES_FLIP_Y, - PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA, - PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA, - PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA_FLIPY, - PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA_FLIPY, +enum VertexShaderId { + VERTEX_SHADER_COPY_TEXTURE, + VERTEX_SHADER_COPY_TEXTURE_FLIP_Y, + NUM_VERTEX_SHADERS, }; -struct ShaderInfo { - bool needs_egl_image_external; - const char* source; +enum FragmentShaderId { + FRAGMENT_SHADER_COPY_TEXTURE_2D, + FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, + FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB, + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB, + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, + NUM_FRAGMENT_SHADERS, }; -const ShaderInfo shader_infos[] = { - // VERTEX_SHADER_POS_TEX +const char* vertex_shader_source[NUM_VERTEX_SHADERS] = { + // VERTEX_SHADER_COPY_TEXTURE SHADER( uniform mat4 u_matrix; + uniform vec2 u_half_size; attribute vec4 a_position; - varying vec2 v_uv; + varying TexCoordPrecision vec2 v_uv; void main(void) { gl_Position = u_matrix * a_position; - v_uv = a_position.xy * 0.5 + vec2(0.5, 0.5); + v_uv = a_position.xy * vec2(u_half_size.s, u_half_size.t) + + vec2(u_half_size.s, u_half_size.t); }), - // FRAGMENT_SHADER_TEX + // VERTEX_SHADER_COPY_TEXTURE_FLIP_Y SHADER( - uniform sampler2D u_texSampler; - varying vec2 v_uv; - void main(void) { - gl_FragColor = texture2D(u_texSampler, v_uv.st); - }), - // FRAGMENT_SHADER_TEX_FLIP_Y - SHADER( - uniform sampler2D u_texSampler; - varying vec2 v_uv; - void main(void) { - gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); - }), - // FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA - SHADER( - uniform sampler2D u_texSampler; - varying vec2 v_uv; + uniform mat4 u_matrix; + uniform vec2 u_half_size; + attribute vec4 a_position; + varying TexCoordPrecision vec2 v_uv; void main(void) { - gl_FragColor = texture2D(u_texSampler, v_uv.st); - gl_FragColor.rgb *= gl_FragColor.a; + gl_Position = u_matrix * a_position; + v_uv = a_position.xy * vec2(u_half_size.s, -u_half_size.t) + + vec2(u_half_size.s, u_half_size.t); }), - // FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA - SHADER( - uniform sampler2D u_texSampler; - varying vec2 v_uv; +}; + +const char* fragment_shader_source[NUM_FRAGMENT_SHADERS] = { + // FRAGMENT_SHADER_COPY_TEXTURE_* + FRAGMENT_SHADERS( + uniform SamplerType u_sampler; + varying TexCoordPrecision vec2 v_uv; void main(void) { - gl_FragColor = texture2D(u_texSampler, v_uv.st); - if (gl_FragColor.a > 0.0) - gl_FragColor.rgb /= gl_FragColor.a; + gl_FragColor = TextureLookup(u_sampler, v_uv.st); }), - // FRAGMENT_SHADER_TEX_PREMULTIPLY_ALPHA_FLIP_Y - SHADER( - uniform sampler2D u_texSampler; - varying vec2 v_uv; + // FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_* + FRAGMENT_SHADERS( + uniform SamplerType u_sampler; + varying TexCoordPrecision vec2 v_uv; void main(void) { - gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); + gl_FragColor = TextureLookup(u_sampler, v_uv.st); gl_FragColor.rgb *= gl_FragColor.a; }), - // FRAGMENT_SHADER_TEX_UNPREMULTIPLY_ALPHA_FLIP_Y - SHADER( - uniform sampler2D u_texSampler; - varying vec2 v_uv; - void main(void) { - gl_FragColor = texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); - if (gl_FragColor.a > 0.0) - gl_FragColor.rgb /= gl_FragColor.a; - }), - // FRAGMENT_SHADER_TEX_OES - SHADER_EXTERNAL_OES( - precision mediump float; - uniform samplerExternalOES u_texSampler; - varying vec2 v_uv; + // FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_* + FRAGMENT_SHADERS( + uniform SamplerType u_sampler; + varying TexCoordPrecision vec2 v_uv; void main(void) { - gl_FragColor = texture2D(u_texSampler, v_uv.st); - }), - // FRAGMENT_SHADER_TEX_OES_FLIP_Y - SHADER_EXTERNAL_OES( - precision mediump float; - uniform samplerExternalOES u_texSampler; - varying vec2 v_uv; - void main(void) { - gl_FragColor = - texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); - }), - // FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA - SHADER_EXTERNAL_OES( - precision mediump float; - uniform samplerExternalOES u_texSampler; - varying vec2 v_uv; - void main(void) { - gl_FragColor = texture2D(u_texSampler, v_uv.st); - gl_FragColor.rgb *= gl_FragColor.a; - }), - // FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA - SHADER_EXTERNAL_OES( - precision mediump float; - uniform samplerExternalOES u_texSampler; - varying vec2 v_uv; - void main(void) { - gl_FragColor = texture2D(u_texSampler, v_uv.st); + gl_FragColor = TextureLookup(u_sampler, v_uv.st); if (gl_FragColor.a > 0.0) gl_FragColor.rgb /= gl_FragColor.a; }), - // FRAGMENT_SHADER_TEX_OES_PREMULTIPLY_ALPHA_FLIP_Y - SHADER_EXTERNAL_OES( - precision mediump float; - uniform samplerExternalOES u_texSampler; - varying vec2 v_uv; - void main(void) { - gl_FragColor = - texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); - gl_FragColor.rgb *= gl_FragColor.a; - }), - // FRAGMENT_SHADER_TEX_OES_UNPREMULTIPLY_ALPHA_FLIP_Y - SHADER_EXTERNAL_OES( - precision mediump float; - uniform samplerExternalOES u_texSampler; - varying vec2 v_uv; - void main(void) { - gl_FragColor = - texture2D(u_texSampler, vec2(v_uv.s, 1.0 - v_uv.t)); - if (gl_FragColor.a > 0.0) - gl_FragColor.rgb /= gl_FragColor.a; - }), }; -const int kNumShaders = arraysize(shader_infos); +// Returns the correct vertex shader id to evaluate the copy operation for +// the CHROMIUM_flipy setting. +VertexShaderId GetVertexShaderId(bool flip_y) { + // bit 0: flip y + static VertexShaderId shader_ids[] = { + VERTEX_SHADER_COPY_TEXTURE, + VERTEX_SHADER_COPY_TEXTURE_FLIP_Y, + }; -// Returns the correct program to evaluate the copy operation for -// the CHROMIUM_flipy and premultiply alpha pixel store settings. -ProgramId GetProgram( - bool flip_y, - bool premultiply_alpha, - bool unpremultiply_alpha, - bool is_source_external_oes) { - // If both pre-multiply and unpremultiply are requested, then perform no - // alpha manipulation. - if (premultiply_alpha && unpremultiply_alpha) { - premultiply_alpha = false; - unpremultiply_alpha = false; - } + unsigned index = flip_y ? 1 : 0; + return shader_ids[index]; +} - // bit 0: Flip_y - // bit 1: Premult - // bit 2: Unpremult - // bit 3: External_oes - static ProgramId program_ids[] = { - PROGRAM_COPY_TEXTURE, - PROGRAM_COPY_TEXTURE_FLIP_Y, // F - PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA, // P - PROGRAM_COPY_TEXTURE_PREMULTIPLY_ALPHA_FLIPY, // F P - PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA, // U - PROGRAM_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_FLIPY, // F U - PROGRAM_COPY_TEXTURE, // P U - PROGRAM_COPY_TEXTURE, // F P U - PROGRAM_COPY_TEXTURE_OES, // E - PROGRAM_COPY_TEXTURE_OES_FLIP_Y, // F E - PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA, // P E - PROGRAM_COPY_TEXTURE_OES_PREMULTIPLY_ALPHA_FLIPY, // F P E - PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA, // U E - PROGRAM_COPY_TEXTURE_OES_UNPREMULTIPLY_ALPHA_FLIPY, // F U E - PROGRAM_COPY_TEXTURE_OES, // P U E - PROGRAM_COPY_TEXTURE_OES, // F P U E +// Returns the correct fragment shader id to evaluate the copy operation for +// the premultiply alpha pixel store settings and target. +FragmentShaderId GetFragmentShaderId(bool premultiply_alpha, + bool unpremultiply_alpha, + GLenum target) { + enum { + SAMPLER_2D, + SAMPLER_RECTANGLE_ARB, + SAMPLER_EXTERNAL_OES, + NUM_SAMPLERS }; - unsigned index = (flip_y ? (1 << 0) : 0) | - (premultiply_alpha ? (1 << 1) : 0) | - (unpremultiply_alpha ? (1 << 2) : 0) | - (is_source_external_oes ? (1 << 3) : 0); - return program_ids[index]; + // bit 0: premultiply alpha + // bit 1: unpremultiply alpha + static FragmentShaderId shader_ids[][NUM_SAMPLERS] = { + { + FRAGMENT_SHADER_COPY_TEXTURE_2D, + FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, + FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, + }, + { + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB, + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, + }, + { + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB, + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, + }, + { + FRAGMENT_SHADER_COPY_TEXTURE_2D, + FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, + FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, + }}; + + unsigned index = (premultiply_alpha ? (1 << 0) : 0) | + (unpremultiply_alpha ? (1 << 1) : 0); + + switch (target) { + case GL_TEXTURE_2D: + return shader_ids[index][SAMPLER_2D]; + case GL_TEXTURE_RECTANGLE_ARB: + return shader_ids[index][SAMPLER_RECTANGLE_ARB]; + case GL_TEXTURE_EXTERNAL_OES: + return shader_ids[index][SAMPLER_EXTERNAL_OES]; + default: + break; + } + + NOTREACHED(); + return shader_ids[index][SAMPLER_2D]; +} + +void CompileShader(GLuint shader, const char* shader_source) { + glShaderSource(shader, 1, &shader_source, 0); + glCompileShader(shader); +#ifndef NDEBUG + GLint compile_status; + glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status); + if (GL_TRUE != compile_status) + DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure."; +#endif +} + +void DeleteShader(GLuint shader) { + if (shader) + glDeleteShader(shader); } } // namespace @@ -219,15 +191,13 @@ ProgramId GetProgram( namespace gpu { CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager() - : initialized_(false), - buffer_id_(0), - framebuffer_(0) { - for (int i = 0; i < kNumPrograms; ++i) { - programs_[i] = 0; - matrix_handle_[i] = 0; - sampler_locations_[i] = 0; - } -} + : initialized_(false), + vertex_shaders_(NUM_VERTEX_SHADERS, 0u), + fragment_shaders_(NUM_FRAGMENT_SHADERS, 0u), + buffer_id_(0u), + framebuffer_(0u) {} + +CopyTextureCHROMIUMResourceManager::~CopyTextureCHROMIUMResourceManager() {} void CopyTextureCHROMIUMResourceManager::Initialize( const gles2::GLES2Decoder* decoder) { @@ -235,70 +205,18 @@ void CopyTextureCHROMIUMResourceManager::Initialize( kVertexPositionAttrib == 0u, Position_attribs_must_be_0); - const char* extensions = - reinterpret_cast<const char*>(glGetString(GL_EXTENSIONS)); - bool have_egl_image_external = extensions && - strstr(extensions, "GL_OES_EGL_image_external"); - // Initialize all of the GPU resources required to perform the copy. glGenBuffersARB(1, &buffer_id_); glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); - glBufferData(GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, - GL_STATIC_DRAW); + const GLfloat kQuadVertices[] = {-1.0f, -1.0f, + 1.0f, -1.0f, + 1.0f, 1.0f, + -1.0f, 1.0f}; + glBufferData( + GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, GL_STATIC_DRAW); glGenFramebuffersEXT(1, &framebuffer_); - // TODO(gman): Init these on demand. - GLuint shaders[kNumShaders]; - for (int shader = 0; shader < kNumShaders; ++shader) { - shaders[shader] = glCreateShader( - shader == 0 ? GL_VERTEX_SHADER : GL_FRAGMENT_SHADER); - const ShaderInfo& info = shader_infos[shader]; - if (info.needs_egl_image_external && !have_egl_image_external) { - continue; - } - const char* shader_source = shader_infos[shader].source; - glShaderSource(shaders[shader], 1, &shader_source, 0); - glCompileShader(shaders[shader]); -#ifndef NDEBUG - GLint compile_status; - glGetShaderiv(shaders[shader], GL_COMPILE_STATUS, &compile_status); - if (GL_TRUE != compile_status) - DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure."; -#endif - } - - // TODO(gman): Init these on demand. - for (int program = 0; program < kNumPrograms; ++program) { - const ShaderInfo& info = shader_infos[program + 1]; - if (info.needs_egl_image_external && !have_egl_image_external) { - continue; - } - programs_[program] = glCreateProgram(); - glAttachShader(programs_[program], shaders[0]); - glAttachShader(programs_[program], shaders[program + 1]); - - glBindAttribLocation(programs_[program], kVertexPositionAttrib, - "a_position"); - - glLinkProgram(programs_[program]); -#ifndef NDEBUG - GLint linked; - glGetProgramiv(programs_[program], GL_LINK_STATUS, &linked); - if (!linked) - DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; -#endif - - sampler_locations_[program] = glGetUniformLocation(programs_[program], - "u_texSampler"); - - matrix_handle_[program] = glGetUniformLocation(programs_[program], - "u_matrix"); - } - - for (int shader = 0; shader < kNumShaders; ++shader) - glDeleteShader(shaders[shader]); - decoder->RestoreBufferBindings(); initialized_ = true; @@ -310,9 +228,14 @@ void CopyTextureCHROMIUMResourceManager::Destroy() { glDeleteFramebuffersEXT(1, &framebuffer_); - for (int program = 0; program < kNumPrograms; ++program) { - if (programs_[program]) - glDeleteProgram(programs_[program]); + std::for_each(vertex_shaders_.begin(), vertex_shaders_.end(), DeleteShader); + std::for_each( + fragment_shaders_.begin(), fragment_shaders_.end(), DeleteShader); + + for (ProgramMap::const_iterator it = programs_.begin(); it != programs_.end(); + ++it) { + const ProgramInfo& info = it->second; + glDeleteProgram(info.program); } glDeleteBuffersARB(1, &buffer_id_); @@ -354,28 +277,66 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( bool unpremultiply_alpha, const GLfloat transform_matrix[16]) { DCHECK(source_target == GL_TEXTURE_2D || + source_target == GL_TEXTURE_RECTANGLE_ARB || source_target == GL_TEXTURE_EXTERNAL_OES); if (!initialized_) { DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; return; } - GLuint program = GetProgram( - flip_y, premultiply_alpha, unpremultiply_alpha, - source_target == GL_TEXTURE_EXTERNAL_OES); - glUseProgram(programs_[program]); + VertexShaderId vertex_shader_id = GetVertexShaderId(flip_y); + DCHECK_LT(static_cast<size_t>(vertex_shader_id), vertex_shaders_.size()); + GLuint* vertex_shader = &vertex_shaders_[vertex_shader_id]; + if (!*vertex_shader) { + *vertex_shader = glCreateShader(GL_VERTEX_SHADER); + CompileShader(*vertex_shader, vertex_shader_source[vertex_shader_id]); + } + + FragmentShaderId fragment_shader_id = GetFragmentShaderId( + premultiply_alpha, unpremultiply_alpha, source_target); + DCHECK_LT(static_cast<size_t>(fragment_shader_id), fragment_shaders_.size()); + GLuint* fragment_shader = &fragment_shaders_[fragment_shader_id]; + if (!*fragment_shader) { + *fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); + CompileShader(*fragment_shader, fragment_shader_source[fragment_shader_id]); + } + ProgramMapKey key(vertex_shader_id, fragment_shader_id); + ProgramInfo* info = &programs_[key]; + // Create program if necessary. + if (!info->program) { + info->program = glCreateProgram(); + glAttachShader(info->program, *vertex_shader); + glAttachShader(info->program, *fragment_shader); + glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); + glLinkProgram(info->program); #ifndef NDEBUG - glValidateProgram(programs_[program]); + GLint linked; + glGetProgramiv(info->program, GL_LINK_STATUS, &linked); + if (!linked) + DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; +#endif + info->matrix_handle = glGetUniformLocation(info->program, "u_matrix"); + info->half_size_handle = glGetUniformLocation(info->program, "u_half_size"); + info->sampler_handle = glGetUniformLocation(info->program, "u_sampler"); + } + glUseProgram(info->program); + +#ifndef NDEBUG + glValidateProgram(info->program); GLint validation_status; - glGetProgramiv(programs_[program], GL_VALIDATE_STATUS, &validation_status); + glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status); if (GL_TRUE != validation_status) { DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; return; } #endif - glUniformMatrix4fv(matrix_handle_[program], 1, GL_FALSE, transform_matrix); + glUniformMatrix4fv(info->matrix_handle, 1, GL_FALSE, transform_matrix); + if (source_target == GL_TEXTURE_RECTANGLE_ARB) + glUniform2f(info->half_size_handle, width / 2.0f, height / 2.0f); + else + glUniform2f(info->half_size_handle, 0.5f, 0.5f); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, dest_id); // NVidia drivers require texture settings to be a certain way @@ -395,13 +356,13 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( } else #endif { + decoder->ClearAllAttributes(); glEnableVertexAttribArray(kVertexPositionAttrib); glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); - glVertexAttribPointer(kVertexPositionAttrib, 4, GL_FLOAT, GL_FALSE, - 4 * sizeof(GLfloat), 0); + glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); - glUniform1i(sampler_locations_[program], 0); + glUniform1i(info->sampler_handle, 0); glBindTexture(source_target, source_id); glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); @@ -421,7 +382,7 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( glDrawArrays(GL_TRIANGLE_FAN, 0, 4); } - decoder->RestoreAttribute(kVertexPositionAttrib); + decoder->RestoreAllAttributes(); decoder->RestoreTextureState(source_id); decoder->RestoreTextureState(dest_id); decoder->RestoreTextureUnitBindings(0); @@ -432,5 +393,4 @@ void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( decoder->RestoreGlobalState(); } -} // namespace - +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h b/chromium/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h index 097eb2ce46e..17290f8ed22 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h +++ b/chromium/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h @@ -5,6 +5,9 @@ #ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_COPY_TEXTURE_CHROMIUM_H_ #define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_COPY_TEXTURE_CHROMIUM_H_ +#include <vector> + +#include "base/containers/hash_tables.h" #include "gpu/command_buffer/service/gl_utils.h" #include "gpu/gpu_export.h" @@ -21,6 +24,7 @@ class GLES2Decoder; class GPU_EXPORT CopyTextureCHROMIUMResourceManager { public: CopyTextureCHROMIUMResourceManager(); + ~CopyTextureCHROMIUMResourceManager(); void Initialize(const gles2::GLES2Decoder* decoder); void Destroy(); @@ -45,14 +49,28 @@ class GPU_EXPORT CopyTextureCHROMIUMResourceManager { static const GLuint kVertexPositionAttrib = 0; private: - bool initialized_; + struct ProgramInfo { + ProgramInfo() + : program(0u), + matrix_handle(0u), + half_size_handle(0u), + sampler_handle(0u) {} + + GLuint program; + GLuint matrix_handle; + GLuint half_size_handle; + GLuint sampler_handle; + }; - static const int kNumPrograms = 12; - GLuint programs_[kNumPrograms]; + bool initialized_; + typedef std::vector<GLuint> ShaderVector; + ShaderVector vertex_shaders_; + ShaderVector fragment_shaders_; + typedef std::pair<int, int> ProgramMapKey; + typedef base::hash_map<ProgramMapKey, ProgramInfo> ProgramMap; + ProgramMap programs_; GLuint buffer_id_; GLuint framebuffer_; - GLuint matrix_handle_[kNumPrograms]; - GLuint sampler_locations_[kNumPrograms]; DISALLOW_COPY_AND_ASSIGN(CopyTextureCHROMIUMResourceManager); }; @@ -60,5 +78,3 @@ class GPU_EXPORT CopyTextureCHROMIUMResourceManager { } // namespace gpu. #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_COPY_TEXTURE_CHROMIUM_H_ - - diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc index c2fcee2933a..02ac2f68eff 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -15,9 +15,12 @@ #include "base/at_exit.h" #include "base/bind.h" +#include "base/callback_helpers.h" #include "base/command_line.h" #include "base/debug/trace_event.h" +#include "base/debug/trace_event_synthetic_delay.h" #include "base/memory/scoped_ptr.h" +#include "base/numerics/safe_math.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "build/build_config.h" @@ -51,11 +54,10 @@ #include "gpu/command_buffer/service/shader_manager.h" #include "gpu/command_buffer/service/shader_translator.h" #include "gpu/command_buffer/service/shader_translator_cache.h" -#include "gpu/command_buffer/service/stream_texture.h" -#include "gpu/command_buffer/service/stream_texture_manager.h" #include "gpu/command_buffer/service/texture_manager.h" #include "gpu/command_buffer/service/vertex_array_manager.h" #include "gpu/command_buffer/service/vertex_attrib_manager.h" +#include "third_party/smhasher/src/City.h" #include "ui/gl/gl_bindings.h" #include "ui/gl/gl_fence.h" #include "ui/gl/gl_image.h" @@ -63,16 +65,15 @@ #include "ui/gl/gl_surface.h" #if defined(OS_MACOSX) -#include "ui/gl/io_surface_support_mac.h" +#include <IOSurface/IOSurfaceAPI.h> +// Note that this must be included after gl_bindings.h to avoid conflicts. +#include <OpenGL/CGLIOSurface.h> #endif #if defined(OS_WIN) #include "base/win/win_util.h" #endif -// TODO(zmo): we can't include "City.h" due to type def conflicts. -extern uint64 CityHash64(const char*, size_t); - namespace gpu { namespace gles2 { @@ -81,6 +82,7 @@ namespace { static const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives"; static const char kEXTFragDepthExtension[] = "GL_EXT_frag_depth"; static const char kEXTDrawBuffersExtension[] = "GL_EXT_draw_buffers"; +static const char kEXTShaderTextureLodExtension[] = "GL_EXT_shader_texture_lod"; #if !defined(ANGLE_SH_VERSION) || ANGLE_SH_VERSION < 108 khronos_uint64_t CityHashForAngle(const char* name, unsigned int len) { @@ -229,15 +231,18 @@ bool ComputeDataSize( // A struct to hold info about each command. struct CommandInfo { - int arg_flags; // How to handle the arguments for this command - int arg_count; // How many arguments are expected for this command. + uint8 arg_flags; // How to handle the arguments for this command + uint8 cmd_flags; // How to handle this command + uint16 arg_count; // How many arguments are expected for this command. }; +// cmds::name::cmd_flags, // A table of CommandInfo for all the commands. const CommandInfo g_command_info[] = { #define GLES2_CMD_OP(name) { \ cmds::name::kArgFlags, \ - sizeof(cmds::name) / sizeof(CommandBufferEntry) - 1, }, /* NOLINT */ \ + cmds::name::cmd_flags, \ + sizeof(cmds::name) / sizeof(CommandBufferEntry) - 1, }, /* NOLINT */ GLES2_COMMAND_LIST(GLES2_CMD_OP) @@ -275,15 +280,6 @@ static bool StringIsValidForGLES(const char* str) { return true; } -// Wrapper for glEnable/glDisable that doesn't suck. -static void EnableDisable(GLenum pname, bool enable) { - if (enable) { - glEnable(pname); - } else { - glDisable(pname); - } -} - // This class prevents any GL errors that occur when it is in scope from // being reported to the client. class ScopedGLErrorSuppressor { @@ -297,24 +293,25 @@ class ScopedGLErrorSuppressor { DISALLOW_COPY_AND_ASSIGN(ScopedGLErrorSuppressor); }; -// Temporarily changes a decoder's bound 2D texture and restore it when this +// Temporarily changes a decoder's bound texture and restore it when this // object goes out of scope. Also temporarily switches to using active texture // unit zero in case the client has changed that to something invalid. -class ScopedTexture2DBinder { +class ScopedTextureBinder { public: - ScopedTexture2DBinder(ContextState* state, GLuint id); - ~ScopedTexture2DBinder(); + explicit ScopedTextureBinder(ContextState* state, GLuint id, GLenum target); + ~ScopedTextureBinder(); private: ContextState* state_; - DISALLOW_COPY_AND_ASSIGN(ScopedTexture2DBinder); + GLenum target_; + DISALLOW_COPY_AND_ASSIGN(ScopedTextureBinder); }; // Temporarily changes a decoder's bound render buffer and restore it when this // object goes out of scope. class ScopedRenderBufferBinder { public: - ScopedRenderBufferBinder(ContextState* state, GLuint id); + explicit ScopedRenderBufferBinder(ContextState* state, GLuint id); ~ScopedRenderBufferBinder(); private: @@ -326,7 +323,7 @@ class ScopedRenderBufferBinder { // object goes out of scope. class ScopedFrameBufferBinder { public: - ScopedFrameBufferBinder(GLES2DecoderImpl* decoder, GLuint id); + explicit ScopedFrameBufferBinder(GLES2DecoderImpl* decoder, GLuint id); ~ScopedFrameBufferBinder(); private: @@ -340,9 +337,9 @@ class ScopedFrameBufferBinder { // true, the resolved framebuffer is not visible to the parent. class ScopedResolvedFrameBufferBinder { public: - ScopedResolvedFrameBufferBinder(GLES2DecoderImpl* decoder, - bool enforce_internal_framebuffer, - bool internal); + explicit ScopedResolvedFrameBufferBinder(GLES2DecoderImpl* decoder, + bool enforce_internal_framebuffer, + bool internal); ~ScopedResolvedFrameBufferBinder(); private: @@ -351,6 +348,45 @@ class ScopedResolvedFrameBufferBinder { DISALLOW_COPY_AND_ASSIGN(ScopedResolvedFrameBufferBinder); }; +class ScopedModifyPixels { + public: + explicit ScopedModifyPixels(TextureRef* ref); + ~ScopedModifyPixels(); + + private: + TextureRef* ref_; +}; + +ScopedModifyPixels::ScopedModifyPixels(TextureRef* ref) : ref_(ref) { + if (ref_) + ref_->texture()->OnWillModifyPixels(); +} + +ScopedModifyPixels::~ScopedModifyPixels() { + if (ref_) + ref_->texture()->OnDidModifyPixels(); +} + +class ScopedRenderTo { + public: + explicit ScopedRenderTo(Framebuffer* framebuffer); + ~ScopedRenderTo(); + + private: + const Framebuffer* framebuffer_; +}; + +ScopedRenderTo::ScopedRenderTo(Framebuffer* framebuffer) + : framebuffer_(framebuffer) { + if (framebuffer) + framebuffer_->OnWillRenderTo(); +} + +ScopedRenderTo::~ScopedRenderTo() { + if (framebuffer_) + framebuffer_->OnDidRenderTo(); +} + // Encapsulates an OpenGL texture. class BackTexture { public: @@ -382,10 +418,6 @@ class BackTexture { return size_; } - size_t estimated_size() const { - return memory_tracker_.GetMemRepresented(); - } - private: MemoryTypeTracker memory_tracker_; ContextState* state_; @@ -425,10 +457,6 @@ class BackRenderbuffer { return id_; } - size_t estimated_size() const { - return memory_tracker_.GetMemRepresented(); - } - private: RenderbufferManager* renderbuffer_manager_; MemoryTypeTracker memory_tracker_; @@ -480,13 +508,32 @@ struct FenceCallback { : fence(gfx::GLFence::Create()) { DCHECK(fence); } - void AddCallback(base::Closure cb) { - callbacks.push_back(cb); - } std::vector<base::Closure> callbacks; scoped_ptr<gfx::GLFence> fence; }; +class AsyncUploadTokenCompletionObserver + : public AsyncPixelTransferCompletionObserver { + public: + explicit AsyncUploadTokenCompletionObserver(uint32 async_upload_token) + : async_upload_token_(async_upload_token) { + } + + virtual void DidComplete(const AsyncMemoryParams& mem_params) OVERRIDE { + DCHECK(mem_params.buffer()); + void* data = mem_params.GetDataAddress(); + AsyncUploadSync* sync = static_cast<AsyncUploadSync*>(data); + sync->SetAsyncUploadToken(async_upload_token_); + } + + private: + virtual ~AsyncUploadTokenCompletionObserver() { + } + + uint32 async_upload_token_; + + DISALLOW_COPY_AND_ASSIGN(AsyncUploadTokenCompletionObserver); +}; // } // anonymous namespace. @@ -504,17 +551,16 @@ GLES2Decoder::GLES2Decoder() GLES2Decoder::~GLES2Decoder() { } +void GLES2Decoder::BeginDecoding() {} + +void GLES2Decoder::EndDecoding() {} + // This class implements GLES2Decoder so we don't have to expose all the GLES2 // cmd stuff to outside this class. class GLES2DecoderImpl : public GLES2Decoder, - public FramebufferManager::TextureDetachObserver { + public FramebufferManager::TextureDetachObserver, + public ErrorStateClient { public: - // Used by PrepForSetUniformByLocation to validate types. - struct BaseUniformInfo { - const GLenum* const valid_types; - size_t num_valid_types; - }; - explicit GLES2DecoderImpl(ContextGroup* group); virtual ~GLES2DecoderImpl(); @@ -536,44 +582,45 @@ class GLES2DecoderImpl : public GLES2Decoder, virtual void Destroy(bool have_context) OVERRIDE; virtual void SetSurface( const scoped_refptr<gfx::GLSurface>& surface) OVERRIDE; - virtual bool ProduceFrontBuffer(const Mailbox& mailbox) OVERRIDE; + virtual void ProduceFrontBuffer(const Mailbox& mailbox) OVERRIDE; virtual bool ResizeOffscreenFrameBuffer(const gfx::Size& size) OVERRIDE; void UpdateParentTextureInfo(); virtual bool MakeCurrent() OVERRIDE; - virtual void ReleaseCurrent() OVERRIDE; virtual GLES2Util* GetGLES2Util() OVERRIDE { return &util_; } virtual gfx::GLContext* GetGLContext() OVERRIDE { return context_.get(); } virtual ContextGroup* GetContextGroup() OVERRIDE { return group_.get(); } virtual Capabilities GetCapabilities() OVERRIDE; - virtual void RestoreState() const OVERRIDE; + virtual void RestoreState(const ContextState* prev_state) const OVERRIDE; virtual void RestoreActiveTexture() const OVERRIDE { state_.RestoreActiveTexture(); } - virtual void RestoreAllTextureUnitBindings() const OVERRIDE { - state_.RestoreAllTextureUnitBindings(); + virtual void RestoreAllTextureUnitBindings( + const ContextState* prev_state) const OVERRIDE { + state_.RestoreAllTextureUnitBindings(prev_state); } - virtual void RestoreAttribute(unsigned index) const OVERRIDE { - state_.RestoreAttribute(index); + virtual void RestoreActiveTextureUnitBinding( + unsigned int target) const OVERRIDE { + state_.RestoreActiveTextureUnitBinding(target); } virtual void RestoreBufferBindings() const OVERRIDE { state_.RestoreBufferBindings(); } virtual void RestoreGlobalState() const OVERRIDE { - state_.RestoreGlobalState(); + state_.RestoreGlobalState(NULL); } virtual void RestoreProgramBindings() const OVERRIDE { state_.RestoreProgramBindings(); } - virtual void RestoreRenderbufferBindings() const OVERRIDE { - state_.RestoreRenderbufferBindings(); - } virtual void RestoreTextureUnitBindings(unsigned unit) const OVERRIDE { - state_.RestoreTextureUnitBindings(unit); + state_.RestoreTextureUnitBindings(unit, NULL); } virtual void RestoreFramebufferBindings() const OVERRIDE; virtual void RestoreTextureState(unsigned service_id) const OVERRIDE; + virtual void ClearAllAttributes() const OVERRIDE; + virtual void RestoreAllAttributes() const OVERRIDE; + virtual QueryManager* GetQueryManager() OVERRIDE { return query_manager_.get(); } @@ -590,7 +637,12 @@ class GLES2DecoderImpl : public GLES2Decoder, const base::Callback<void(gfx::Size, float)>& callback) OVERRIDE; virtual Logger* GetLogger() OVERRIDE; + + virtual void BeginDecoding() OVERRIDE; + virtual void EndDecoding() OVERRIDE; + virtual ErrorState* GetErrorState() OVERRIDE; + virtual const ContextState* GetContextState() OVERRIDE { return &state_; } virtual void SetShaderCacheCallback( const ShaderCacheCallback& callback) OVERRIDE; @@ -602,6 +654,7 @@ class GLES2DecoderImpl : public GLES2Decoder, virtual void ResetAsyncPixelTransferManagerForTest() OVERRIDE; virtual void SetAsyncPixelTransferManagerForTest( AsyncPixelTransferManager* manager) OVERRIDE; + virtual void SetIgnoreCachedStateForTest(bool ignore) OVERRIDE; void ProcessFinishedAsyncTransfers(); virtual bool GetServiceTextureId(uint32 client_texture_id, @@ -632,6 +685,9 @@ class GLES2DecoderImpl : public GLES2Decoder, virtual void OnTextureRefDetachedFromFramebuffer( TextureRef* texture) OVERRIDE; + // Overriden from ErrorStateClient. + virtual void OnOutOfMemoryError() OVERRIDE; + // Helpers to facilitate calling into compatible extensions. static void RenderbufferStorageMultisampleHelper( const FeatureInfo* feature_info, @@ -676,6 +732,13 @@ class GLES2DecoderImpl : public GLES2Decoder, bool GenVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); + // Helper for async upload token completion notification callback. + base::Closure AsyncUploadTokenCompletionClosure(uint32 async_upload_token, + uint32 sync_data_shm_id, + uint32 sync_data_shm_offset); + + + // Workarounds void OnFboChanged() const; void OnUseFramebuffer() const; @@ -701,6 +764,10 @@ class GLES2DecoderImpl : public GLES2Decoder, return group_->shader_manager(); } + ShaderTranslatorCache* shader_translator_cache() { + return group_->shader_translator_cache(); + } + const TextureManager* texture_manager() const { return group_->texture_manager(); } @@ -725,10 +792,6 @@ class GLES2DecoderImpl : public GLES2Decoder, return group_->memory_tracker(); } - StreamTextureManager* stream_texture_manager() const { - return group_->stream_texture_manager(); - } - bool EnsureGPUMemoryAvailable(size_t estimated_size) { MemoryTracker* tracker = memory_tracker(); if (tracker) { @@ -874,7 +937,14 @@ class GLES2DecoderImpl : public GLES2Decoder, GLsizei height); void DoProduceTextureCHROMIUM(GLenum target, const GLbyte* key); + void DoProduceTextureDirectCHROMIUM(GLuint texture, GLenum target, + const GLbyte* key); + void ProduceTextureRef(std::string func_name, TextureRef* texture_ref, + GLenum target, const GLbyte* data); + void DoConsumeTextureCHROMIUM(GLenum target, const GLbyte* key); + void DoCreateAndConsumeTextureCHROMIUM(GLenum target, const GLbyte* key, + GLuint client_id); void DoBindTexImage2DCHROMIUM( GLenum target, @@ -887,6 +957,8 @@ class GLES2DecoderImpl : public GLES2Decoder, void DoDrawBuffersEXT(GLsizei count, const GLenum* bufs); + void DoLoseContextCHROMIUM(GLenum current, GLenum other); + // Creates a Program for the given program. Program* CreateProgram( GLuint client_id, GLuint service_id) { @@ -1036,9 +1108,12 @@ class GLES2DecoderImpl : public GLES2Decoder, } // Creates a vertex attrib manager for the given vertex array. - void CreateVertexAttribManager(GLuint client_id, GLuint service_id) { + scoped_refptr<VertexAttribManager> CreateVertexAttribManager( + GLuint client_id, + GLuint service_id, + bool client_visible) { return vertex_array_manager()->CreateVertexAttribManager( - client_id, service_id, group_->max_vertex_attribs()); + client_id, service_id, group_->max_vertex_attribs(), client_visible); } void DoBindAttribLocation(GLuint client_id, GLuint index, const char* name); @@ -1060,10 +1135,6 @@ class GLES2DecoderImpl : public GLES2Decoder, // Clear any textures used by the current program. bool ClearUnclearedTextures(); - // Clear any uncleared level in texture. - // Returns false if there was a generated GL error. - bool ClearTexture(Texture* texture); - // Clears any uncleared attachments attached to the given frame buffer. // Returns false if there was a generated GL error. void ClearUnclearedAttachments(GLenum target, Framebuffer* framebuffer); @@ -1073,6 +1144,7 @@ class GLES2DecoderImpl : public GLES2Decoder, unsigned bind_target, unsigned target, int level, + unsigned internal_format, unsigned format, unsigned type, int width, @@ -1111,10 +1183,12 @@ class GLES2DecoderImpl : public GLES2Decoder, // errors if the current program is not valid. Returns true if the current // program is valid and the location exists. Adjusts count so it // does not overflow the uniform. - bool PrepForSetUniformByLocation( - GLint fake_location, const char* function_name, - const BaseUniformInfo& base_info, - GLint* real_location, GLenum* type, GLsizei* count); + bool PrepForSetUniformByLocation(GLint fake_location, + const char* function_name, + Program::UniformApiType api_type, + GLint* real_location, + GLenum* type, + GLsizei* count); // Gets the service id for any simulated backbuffer fbo. GLuint GetBackbufferServiceId() const; @@ -1272,6 +1346,11 @@ class GLES2DecoderImpl : public GLES2Decoder, // Wrapper for glGetShaderiv void DoGetShaderiv(GLuint shader, GLenum pname, GLint* params); + // Wrappers for glGetTexParameter. + void DoGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params); + void DoGetTexParameteriv(GLenum target, GLenum pname, GLint* params); + void InitTextureMaxAnisotropyIfNeeded(GLenum target, GLenum pname); + // Wrappers for glGetVertexAttrib. void DoGetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params); void DoGetVertexAttribiv(GLuint index, GLenum pname, GLint *params); @@ -1393,11 +1472,7 @@ class GLES2DecoderImpl : public GLES2Decoder, // simulated. bool SimulateAttrib0( const char* function_name, GLuint max_vertex_accessed, bool* simulated); - void RestoreStateForAttrib(GLuint attrib); - - // If texture is a stream texture, this will update the stream to the newest - // buffer and bind the texture implicitly. - void UpdateStreamTextureIfNeeded(Texture* texture, GLuint texture_unit_index); + void RestoreStateForAttrib(GLuint attrib, bool restore_array_binding); // If an image is bound to texture, this will call Will/DidUseTexImage // if needed. @@ -1484,10 +1559,6 @@ class GLES2DecoderImpl : public GLES2Decoder, error::Error* error, GLint* real_location, GLuint* service_id, void** result, GLenum* result_type); - // Computes the estimated memory used for the backbuffer and passes it to - // the tracing system. - size_t GetBackbufferMemoryTotal(); - virtual bool WasContextLost() OVERRIDE; virtual bool WasContextLostByRobustnessExtension() OVERRIDE; virtual void LoseContext(uint32 reset_status) OVERRIDE; @@ -1496,13 +1567,6 @@ class GLES2DecoderImpl : public GLES2Decoder, void ReleaseIOSurfaceForTexture(GLuint texture_id); #endif - // Validates the combination of texture parameters. For example validates that - // for a given format the specific type, level and targets are valid. - // Synthesizes the correct GL error if invalid. Returns true if valid. - bool ValidateTextureParameters( - const char* function_name, - GLenum target, GLenum format, GLenum type, GLint level); - bool ValidateCompressedTexDimensions( const char* function_name, GLint level, GLsizei width, GLsizei height, GLenum format); @@ -1599,9 +1663,6 @@ class GLES2DecoderImpl : public GLES2Decoder, bool unpack_premultiply_alpha_; bool unpack_unpremultiply_alpha_; - // Default vertex attribs manager, used when no VAOs are bound. - scoped_refptr<VertexAttribManager> default_vertex_attrib_manager_; - // The buffer we bind to attrib 0 since OpenGL requires it (ES does not). GLuint attrib_0_buffer_id_; @@ -1666,7 +1727,9 @@ class GLES2DecoderImpl : public GLES2Decoder, // Backbuffer attachments that are currently undefined. uint32 backbuffer_needs_clear_bits_; - // The current decoder error. + // The current decoder error communicates the decoder error through command + // processing functions that do not return the error value. Should be set only + // if not returning an error. error::Error current_decoder_error_; bool use_shader_translator_; @@ -1684,6 +1747,7 @@ class GLES2DecoderImpl : public GLES2Decoder, bool has_robustness_extension_; GLenum reset_status_; bool reset_by_robustness_extension_; + bool supports_post_sub_buffer_; // These flags are used to override the state of the shared feature_info_ // member. Because the same FeatureInfo instance may be shared among many @@ -1694,14 +1758,18 @@ class GLES2DecoderImpl : public GLES2Decoder, bool derivatives_explicitly_enabled_; bool frag_depth_explicitly_enabled_; bool draw_buffers_explicitly_enabled_; + bool shader_texture_lod_explicitly_enabled_; bool compile_shader_always_succeeds_; + // An optional behaviour to lose the context and group when OOM. + bool lose_context_when_out_of_memory_; + // Log extra info. bool service_logging_; #if defined(OS_MACOSX) - typedef std::map<GLuint, CFTypeRef> TextureToIOSurfaceMap; + typedef std::map<GLuint, IOSurfaceRef> TextureToIOSurfaceMap; TextureToIOSurfaceMap texture_to_io_surface_map_; #endif @@ -1720,6 +1788,8 @@ class GLES2DecoderImpl : public GLES2Decoder, scoped_ptr<GPUTracer> gpu_tracer_; scoped_ptr<GPUStateTracer> gpu_state_tracer_; + int gpu_trace_level_; + bool gpu_trace_commands_; std::queue<linked_ptr<FenceCallback> > pending_readpixel_fences_; @@ -1742,35 +1812,55 @@ ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() { ERRORSTATE_CLEAR_REAL_GL_ERRORS(error_state_, function_name_); } -static void RestoreCurrentTexture2DBindings(ContextState* state) { +static void RestoreCurrentTextureBindings(ContextState* state, GLenum target) { TextureUnit& info = state->texture_units[0]; GLuint last_id; - if (info.bound_texture_2d.get()) { - last_id = info.bound_texture_2d->service_id(); + scoped_refptr<TextureRef> texture_ref; + switch (target) { + case GL_TEXTURE_2D: + texture_ref = info.bound_texture_2d; + break; + case GL_TEXTURE_CUBE_MAP: + texture_ref = info.bound_texture_cube_map; + break; + case GL_TEXTURE_EXTERNAL_OES: + texture_ref = info.bound_texture_external_oes; + break; + case GL_TEXTURE_RECTANGLE_ARB: + texture_ref = info.bound_texture_rectangle_arb; + break; + default: + NOTREACHED(); + break; + } + if (texture_ref.get()) { + last_id = texture_ref->service_id(); } else { last_id = 0; } - glBindTexture(GL_TEXTURE_2D, last_id); + glBindTexture(target, last_id); glActiveTexture(GL_TEXTURE0 + state->active_texture_unit); } -ScopedTexture2DBinder::ScopedTexture2DBinder(ContextState* state, - GLuint id) - : state_(state) { +ScopedTextureBinder::ScopedTextureBinder(ContextState* state, + GLuint id, + GLenum target) + : state_(state), + target_(target) { ScopedGLErrorSuppressor suppressor( - "ScopedTexture2DBinder::ctor", state_->GetErrorState()); + "ScopedTextureBinder::ctor", state_->GetErrorState()); // TODO(apatrick): Check if there are any other states that need to be reset // before binding a new texture. glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, id); + glBindTexture(target, id); } -ScopedTexture2DBinder::~ScopedTexture2DBinder() { +ScopedTextureBinder::~ScopedTextureBinder() { ScopedGLErrorSuppressor suppressor( - "ScopedTexture2DBinder::dtor", state_->GetErrorState()); - RestoreCurrentTexture2DBindings(state_); + "ScopedTextureBinder::dtor", state_->GetErrorState()); + RestoreCurrentTextureBindings(state_, target_); } ScopedRenderBufferBinder::ScopedRenderBufferBinder(ContextState* state, @@ -1847,7 +1937,7 @@ ScopedResolvedFrameBufferBinder::ScopedResolvedFrameBufferBinder( glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, targetid); const int width = decoder_->offscreen_size_.width(); const int height = decoder_->offscreen_size_.height(); - glDisable(GL_SCISSOR_TEST); + decoder->state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); decoder->BlitFramebufferHelper(0, 0, width, @@ -1869,7 +1959,7 @@ ScopedResolvedFrameBufferBinder::~ScopedResolvedFrameBufferBinder() { "ScopedResolvedFrameBufferBinder::dtor", decoder_->GetErrorState()); decoder_->RestoreCurrentFramebufferBindings(); if (decoder_->state_.enable_flags.scissor_test) { - glEnable(GL_SCISSOR_TEST); + decoder_->state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, true); } } @@ -1894,7 +1984,7 @@ void BackTexture::Create() { state_->GetErrorState()); Destroy(); glGenTextures(1, &id_); - ScopedTexture2DBinder binder(state_, id_); + ScopedTextureBinder binder(state_, id_, GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); @@ -1918,7 +2008,7 @@ bool BackTexture::AllocateStorage( DCHECK_NE(id_, 0u); ScopedGLErrorSuppressor suppressor("BackTexture::AllocateStorage", state_->GetErrorState()); - ScopedTexture2DBinder binder(state_, id_); + ScopedTextureBinder binder(state_, id_, GL_TEXTURE_2D); uint32 image_size = 0; GLES2Util::ComputeImageDataSizes( size.width(), size.height(), format, GL_UNSIGNED_BYTE, 8, &image_size, @@ -1959,7 +2049,7 @@ void BackTexture::Copy(const gfx::Size& size, GLenum format) { DCHECK_NE(id_, 0u); ScopedGLErrorSuppressor suppressor("BackTexture::Copy", state_->GetErrorState()); - ScopedTexture2DBinder binder(state_, id_); + ScopedTextureBinder binder(state_, id_, GL_TEXTURE_2D); glCopyTexImage2D(GL_TEXTURE_2D, 0, // level format, @@ -2140,7 +2230,7 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group) : GLES2Decoder(), group_(group), logger_(&debug_marker_manager_), - state_(group_->feature_info(), &logger_), + state_(group_->feature_info(), this, &logger_), unpack_flip_y_(false), unpack_premultiply_alpha_(false), unpack_unpremultiply_alpha_(false), @@ -2167,11 +2257,14 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group) has_robustness_extension_(false), reset_status_(GL_NO_ERROR), reset_by_robustness_extension_(false), + supports_post_sub_buffer_(false), force_webgl_glsl_validation_(false), derivatives_explicitly_enabled_(false), frag_depth_explicitly_enabled_(false), draw_buffers_explicitly_enabled_(false), + shader_texture_lod_explicitly_enabled_(false), compile_shader_always_succeeds_(false), + lose_context_when_out_of_memory_(false), service_logging_(CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableGPUServiceLoggingGPU)), viewport_max_width_(0), @@ -2216,8 +2309,11 @@ bool GLES2DecoderImpl::Initialize( DCHECK(!context_.get()); set_initialized(); - gpu_tracer_ = GPUTracer::Create(); + gpu_tracer_ = GPUTracer::Create(this); gpu_state_tracer_ = GPUStateTracer::Create(&state_); + // TODO(vmiura): Enable changing gpu_trace_level_ at runtime + gpu_trace_level_ = 2; + gpu_trace_commands_ = false; if (CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableGPUDebugging)) { @@ -2242,6 +2338,10 @@ bool GLES2DecoderImpl::Initialize( if (!attrib_parser.Parse(attribs)) return false; + // Save the loseContextWhenOutOfMemory context creation attribute. + lose_context_when_out_of_memory_ = + attrib_parser.lose_context_when_out_of_memory_; + // If the failIfMajorPerformanceCaveat context creation attribute was true // and we are using a software renderer, fail. if (attrib_parser.fail_if_major_perf_caveat_ && @@ -2263,14 +2363,25 @@ bool GLES2DecoderImpl::Initialize( disallowed_features_ = disallowed_features; state_.attrib_values.resize(group_->max_vertex_attribs()); - default_vertex_attrib_manager_ = new VertexAttribManager(); - default_vertex_attrib_manager_->Initialize(group_->max_vertex_attribs()); + vertex_array_manager_.reset(new VertexArrayManager()); - // vertex_attrib_manager is set to default_vertex_attrib_manager_ by this call + GLuint default_vertex_attrib_service_id = 0; + if (features().native_vertex_array_object) { + glGenVertexArraysOES(1, &default_vertex_attrib_service_id); + glBindVertexArrayOES(default_vertex_attrib_service_id); + } + + state_.default_vertex_attrib_manager = + CreateVertexAttribManager(0, default_vertex_attrib_service_id, false); + + state_.default_vertex_attrib_manager->Initialize( + group_->max_vertex_attribs(), + feature_info_->workarounds().init_vertex_attributes); + + // vertex_attrib_manager is set to default_vertex_attrib_manager by this call DoBindVertexArrayOES(0); query_manager_.reset(new QueryManager(this, feature_info_.get())); - vertex_array_manager_.reset(new VertexArrayManager()); util_.set_num_compressed_texture_formats( validators_->compressed_texture_format.GetValues().size()); @@ -2295,20 +2406,20 @@ bool GLES2DecoderImpl::Initialize( ref = texture_manager()->GetDefaultTextureInfo( GL_TEXTURE_EXTERNAL_OES); state_.texture_units[tt].bound_texture_external_oes = ref; - glBindTexture(GL_TEXTURE_EXTERNAL_OES, ref->service_id()); + glBindTexture(GL_TEXTURE_EXTERNAL_OES, ref ? ref->service_id() : 0); } if (features().arb_texture_rectangle) { ref = texture_manager()->GetDefaultTextureInfo( GL_TEXTURE_RECTANGLE_ARB); state_.texture_units[tt].bound_texture_rectangle_arb = ref; - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, ref->service_id()); + glBindTexture(GL_TEXTURE_RECTANGLE_ARB, ref ? ref->service_id() : 0); } ref = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); state_.texture_units[tt].bound_texture_cube_map = ref; - glBindTexture(GL_TEXTURE_CUBE_MAP, ref->service_id()); + glBindTexture(GL_TEXTURE_CUBE_MAP, ref ? ref->service_id() : 0); ref = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D); state_.texture_units[tt].bound_texture_2d = ref; - glBindTexture(GL_TEXTURE_2D, ref->service_id()); + glBindTexture(GL_TEXTURE_2D, ref ? ref->service_id() : 0); } glActiveTexture(GL_TEXTURE0); CHECK_GL_ERROR(); @@ -2499,8 +2610,8 @@ bool GLES2DecoderImpl::Initialize( state_.scissor_height = state_.viewport_height; // Set all the default state because some GL drivers get it wrong. - state_.InitCapabilities(); - state_.InitState(); + state_.InitCapabilities(NULL); + state_.InitState(NULL); glActiveTexture(GL_TEXTURE0 + state_.active_texture_unit); DoBindBuffer(GL_ARRAY_BUFFER, 0); @@ -2522,6 +2633,12 @@ bool GLES2DecoderImpl::Initialize( glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } + supports_post_sub_buffer_ = surface->SupportsPostSubBuffer(); + if (feature_info_->workarounds() + .disable_post_sub_buffers_for_onscreen_surfaces && + !surface->IsOffscreen()) + supports_post_sub_buffer_ = false; + if (feature_info_->workarounds().reverse_point_sprite_coord_origin) { glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT); } @@ -2568,19 +2685,15 @@ Capabilities GLES2DecoderImpl::GetCapabilities() { caps.texture_storage = feature_info_->feature_flags().ext_texture_storage; caps.discard_framebuffer = feature_info_->feature_flags().ext_discard_framebuffer; + caps.sync_query = feature_info_->feature_flags().chromium_sync_query; #if defined(OS_MACOSX) // This is unconditionally true on mac, no need to test for it at runtime. caps.iosurface = true; #endif - // TODO(boliu): Expose this directly from GLSurface. - std::vector<std::string> extension_list; - base::SplitString(surface_->GetExtensions(), ' ', &extension_list); - std::set<std::string> extension_set(extension_list.begin(), - extension_list.end()); - caps.post_sub_buffer = - extension_set.count("GL_CHROMIUM_post_sub_buffer") > 0; + caps.post_sub_buffer = supports_post_sub_buffer_; + caps.map_image = !!image_manager(); return caps; } @@ -2629,6 +2742,9 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() { resources.EXT_draw_buffers = draw_buffers_explicitly_enabled_; if (!draw_buffers_explicitly_enabled_) resources.MaxDrawBuffers = 1; +#if (ANGLE_SH_VERSION >= 123) + resources.EXT_shader_texture_lod = shader_texture_lod_explicitly_enabled_; +#endif } else { resources.OES_standard_derivatives = features().oes_standard_derivatives ? 1 : 0; @@ -2640,6 +2756,10 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() { features().ext_draw_buffers ? 1 : 0; resources.EXT_frag_depth = features().ext_frag_depth ? 1 : 0; +#if (ANGLE_SH_VERSION >= 123) + resources.EXT_shader_texture_lod = + features().ext_shader_texture_lod ? 1 : 0; +#endif } ShShaderSpec shader_spec = force_webgl_glsl_validation_ ? SH_WEBGL_SPEC @@ -2662,10 +2782,15 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() { driver_bug_workarounds |= SH_INIT_GL_POSITION; if (workarounds().unfold_short_circuit_as_ternary_operation) driver_bug_workarounds |= SH_UNFOLD_SHORT_CIRCUIT; - - ShaderTranslatorCache* cache = ShaderTranslatorCache::GetInstance(); - vertex_translator_ = cache->GetTranslator( - SH_VERTEX_SHADER, shader_spec, &resources, + if (workarounds().init_varyings_without_static_use) + driver_bug_workarounds |= SH_INIT_VARYINGS_WITHOUT_STATIC_USE; + if (workarounds().unroll_for_loop_with_sampler_array_index) + driver_bug_workarounds |= SH_UNROLL_FOR_LOOP_WITH_SAMPLER_ARRAY_INDEX; + + vertex_translator_ = shader_translator_cache()->GetTranslator( + SH_VERTEX_SHADER, + shader_spec, + &resources, implementation_type, static_cast<ShCompileOptions>(driver_bug_workarounds)); if (!vertex_translator_.get()) { @@ -2674,8 +2799,10 @@ bool GLES2DecoderImpl::InitializeShaderTranslator() { return false; } - fragment_translator_ = cache->GetTranslator( - SH_FRAGMENT_SHADER, shader_spec, &resources, + fragment_translator_ = shader_translator_cache()->GetTranslator( + SH_FRAGMENT_SHADER, + shader_spec, + &resources, implementation_type, static_cast<ShCompileOptions>(driver_bug_workarounds)); if (!fragment_translator_.get()) { @@ -2908,11 +3035,6 @@ void GLES2DecoderImpl::ProcessFinishedAsyncTransfers() { async_pixel_transfer_manager_->BindCompletedAsyncTransfers(); } -void GLES2DecoderImpl::ReleaseCurrent() { - if (context_.get()) - context_->ReleaseCurrent(surface_.get()); -} - static void RebindCurrentFramebuffer( GLenum target, Framebuffer* framebuffer, @@ -2954,13 +3076,27 @@ bool GLES2DecoderImpl::CheckFramebufferValid( if (backbuffer_needs_clear_bits_) { glClearColor(0, 0, 0, (GLES2Util::GetChannelsForFormat( offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClearStencil(0); - glStencilMask(-1); + state_.SetDeviceStencilMaskSeparate(GL_FRONT, -1); + state_.SetDeviceStencilMaskSeparate(GL_BACK, -1); glClearDepth(1.0f); - glDepthMask(true); - glDisable(GL_SCISSOR_TEST); + state_.SetDeviceDepthMask(GL_TRUE); + state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); + bool reset_draw_buffer = false; + if ((backbuffer_needs_clear_bits_ | GL_COLOR_BUFFER_BIT) != 0 && + group_->draw_buffer() == GL_NONE) { + reset_draw_buffer = true; + GLenum buf = GL_BACK; + if (GetBackbufferServiceId() != 0) // emulated backbuffer + buf = GL_COLOR_ATTACHMENT0; + glDrawBuffersARB(1, &buf); + } glClear(backbuffer_needs_clear_bits_); + if (reset_draw_buffer) { + GLenum buf = GL_NONE; + glDrawBuffersARB(1, &buf); + } backbuffer_needs_clear_bits_ = 0; RestoreClearState(); } @@ -3097,25 +3233,25 @@ void GLES2DecoderImpl::UpdateParentTextureInfo() { GL_RGBA, GL_UNSIGNED_BYTE, true); - texture_manager()->SetParameter( + texture_manager()->SetParameteri( "UpdateParentTextureInfo", GetErrorState(), offscreen_saved_color_texture_info_.get(), GL_TEXTURE_MAG_FILTER, GL_NEAREST); - texture_manager()->SetParameter( + texture_manager()->SetParameteri( "UpdateParentTextureInfo", GetErrorState(), offscreen_saved_color_texture_info_.get(), GL_TEXTURE_MIN_FILTER, GL_NEAREST); - texture_manager()->SetParameter( + texture_manager()->SetParameteri( "UpdateParentTextureInfo", GetErrorState(), offscreen_saved_color_texture_info_.get(), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - texture_manager()->SetParameter( + texture_manager()->SetParameteri( "UpdateParentTextureInfo", GetErrorState(), offscreen_saved_color_texture_info_.get(), @@ -3135,6 +3271,15 @@ Logger* GLES2DecoderImpl::GetLogger() { return &logger_; } +void GLES2DecoderImpl::BeginDecoding() { + gpu_tracer_->BeginDecoding(); + gpu_trace_commands_ = gpu_tracer_->IsTracing(); +} + +void GLES2DecoderImpl::EndDecoding() { + gpu_tracer_->EndDecoding(); +} + ErrorState* GLES2DecoderImpl::GetErrorState() { return state_.GetErrorState(); } @@ -3199,10 +3344,10 @@ void GLES2DecoderImpl::Destroy(bool have_context) { // Unbind everything. state_.vertex_attrib_manager = NULL; - default_vertex_attrib_manager_ = NULL; + state_.default_vertex_attrib_manager = NULL; state_.texture_units.clear(); state_.bound_array_buffer = NULL; - state_.current_query = NULL; + state_.current_queries.clear(); framebuffer_state_.bound_read_framebuffer = NULL; framebuffer_state_.bound_draw_framebuffer = NULL; state_.bound_renderbuffer = NULL; @@ -3306,6 +3451,11 @@ void GLES2DecoderImpl::Destroy(bool have_context) { offscreen_resolved_frame_buffer_.reset(); offscreen_resolved_color_texture_.reset(); + // Need to release these before releasing |group_| which may own the + // ShaderTranslatorCache. + fragment_translator_ = NULL; + vertex_translator_ = NULL; + // Should destroy the transfer manager before the texture manager held // by the context group. async_pixel_transfer_manager_.reset(); @@ -3338,9 +3488,11 @@ void GLES2DecoderImpl::SetSurface( RestoreCurrentFramebufferBindings(); } -bool GLES2DecoderImpl::ProduceFrontBuffer(const Mailbox& mailbox) { - if (!offscreen_saved_color_texture_.get()) - return false; +void GLES2DecoderImpl::ProduceFrontBuffer(const Mailbox& mailbox) { + if (!offscreen_saved_color_texture_.get()) { + LOG(ERROR) << "Called ProduceFrontBuffer on a non-offscreen context"; + return; + } if (!offscreen_saved_color_texture_info_.get()) { GLuint service_id = offscreen_saved_color_texture_->id(); offscreen_saved_color_texture_info_ = TextureRef::Create( @@ -3349,39 +3501,8 @@ bool GLES2DecoderImpl::ProduceFrontBuffer(const Mailbox& mailbox) { GL_TEXTURE_2D); UpdateParentTextureInfo(); } - gpu::gles2::MailboxName name; - memcpy(name.key, mailbox.name, sizeof(mailbox.name)); - return mailbox_manager()->ProduceTexture( - GL_TEXTURE_2D, name, offscreen_saved_color_texture_info_->texture()); -} - -size_t GLES2DecoderImpl::GetBackbufferMemoryTotal() { - size_t total = 0; - if (offscreen_target_frame_buffer_.get()) { - if (offscreen_target_color_texture_.get()) { - total += offscreen_target_color_texture_->estimated_size(); - } - if (offscreen_target_color_render_buffer_.get()) { - total += offscreen_target_color_render_buffer_->estimated_size(); - } - if (offscreen_target_depth_render_buffer_.get()) { - total += offscreen_target_depth_render_buffer_->estimated_size(); - } - if (offscreen_target_stencil_render_buffer_.get()) { - total += offscreen_target_stencil_render_buffer_->estimated_size(); - } - if (offscreen_saved_color_texture_.get()) { - total += offscreen_saved_color_texture_->estimated_size(); - } - if (offscreen_resolved_color_texture_.get()) { - total += offscreen_resolved_color_texture_->estimated_size(); - } - } else { - gfx::Size size = surface_->GetSize(); - total += size.width() * size.height() * - GLES2Util::RenderbufferBytesPerPixel(back_buffer_color_format_); - } - return total; + mailbox_manager()->ProduceTexture( + GL_TEXTURE_2D, mailbox, offscreen_saved_color_texture_info_->texture()); } bool GLES2DecoderImpl::ResizeOffscreenFrameBuffer(const gfx::Size& size) { @@ -3477,13 +3598,13 @@ bool GLES2DecoderImpl::ResizeOffscreenFrameBuffer(const gfx::Size& size) { ScopedFrameBufferBinder binder(this, offscreen_target_frame_buffer_->id()); glClearColor(0, 0, 0, (GLES2Util::GetChannelsForFormat( offscreen_target_color_format_) & 0x0008) != 0 ? 0 : 1); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClearStencil(0); - glStencilMaskSeparate(GL_FRONT, -1); - glStencilMaskSeparate(GL_BACK, -1); + state_.SetDeviceStencilMaskSeparate(GL_FRONT, -1); + state_.SetDeviceStencilMaskSeparate(GL_BACK, -1); glClearDepth(0); - glDepthMask(GL_TRUE); - glDisable(GL_SCISSOR_TEST); + state_.SetDeviceDepthMask(GL_TRUE); + state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); RestoreClearState(); } @@ -3567,6 +3688,14 @@ error::Error GLES2DecoderImpl::DoCommand( unsigned int info_arg_count = static_cast<unsigned int>(info.arg_count); if ((info.arg_flags == cmd::kFixed && arg_count == info_arg_count) || (info.arg_flags == cmd::kAtLeastN && arg_count >= info_arg_count)) { + bool doing_gpu_trace = false; + if (gpu_trace_commands_) { + if (CMD_FLAG_GET_TRACE_LEVEL(info.cmd_flags) <= gpu_trace_level_) { + doing_gpu_trace = true; + gpu_tracer_->Begin(GetCommandName(command), kTraceDecoder); + } + } + uint32 immediate_data_size = (arg_count - info_arg_count) * sizeof(CommandBufferEntry); // NOLINT switch (command) { @@ -3580,6 +3709,10 @@ error::Error GLES2DecoderImpl::DoCommand( GLES2_COMMAND_LIST(GLES2_CMD_OP) #undef GLES2_CMD_OP } + + if (doing_gpu_trace) + gpu_tracer_->End(kTraceDecoder); + if (debug()) { GLenum error; while ((error = glGetError()) != GL_NO_ERROR) { @@ -3657,8 +3790,9 @@ void GLES2DecoderImpl::DoBindBuffer(GLenum target, GLuint client_id) { buffer = GetBuffer(client_id); if (!buffer) { if (!group_->bind_generates_resource()) { - LOG(ERROR) << "glBindBuffer: id not generated by glGenBuffers"; - current_decoder_error_ = error::kGenericError; + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glBindBuffer", + "id not generated by glGenBuffers"); return; } @@ -3733,23 +3867,25 @@ bool GLES2DecoderImpl::BoundFramebufferHasStencilAttachment() { void GLES2DecoderImpl::ApplyDirtyState() { if (framebuffer_state_.clear_state_dirty) { - glColorMask( - state_.color_mask_red, state_.color_mask_green, state_.color_mask_blue, - state_.color_mask_alpha && - BoundFramebufferHasColorAttachmentWithAlpha(true)); + bool have_alpha = BoundFramebufferHasColorAttachmentWithAlpha(true); + state_.SetDeviceColorMask(state_.color_mask_red, + state_.color_mask_green, + state_.color_mask_blue, + state_.color_mask_alpha && have_alpha); + bool have_depth = BoundFramebufferHasDepthAttachment(); - glDepthMask(state_.depth_mask && have_depth); - EnableDisable(GL_DEPTH_TEST, state_.enable_flags.depth_test && have_depth); + state_.SetDeviceDepthMask(state_.depth_mask && have_depth); + bool have_stencil = BoundFramebufferHasStencilAttachment(); - glStencilMaskSeparate( + state_.SetDeviceStencilMaskSeparate( GL_FRONT, have_stencil ? state_.stencil_front_writemask : 0); - glStencilMaskSeparate( + state_.SetDeviceStencilMaskSeparate( GL_BACK, have_stencil ? state_.stencil_back_writemask : 0); - EnableDisable( + + state_.SetDeviceCapabilityState( + GL_DEPTH_TEST, state_.enable_flags.depth_test && have_depth); + state_.SetDeviceCapabilityState( GL_STENCIL_TEST, state_.enable_flags.stencil_test && have_stencil); - EnableDisable(GL_CULL_FACE, state_.enable_flags.cull_face); - EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test); - EnableDisable(GL_BLEND, state_.enable_flags.blend); framebuffer_state_.clear_state_dirty = false; } } @@ -3760,14 +3896,14 @@ GLuint GLES2DecoderImpl::GetBackbufferServiceId() const { : (surface_.get() ? surface_->GetBackingFrameBufferObject() : 0); } -void GLES2DecoderImpl::RestoreState() const { +void GLES2DecoderImpl::RestoreState(const ContextState* prev_state) const { TRACE_EVENT1("gpu", "GLES2DecoderImpl::RestoreState", "context", logger_.GetLogPrefix()); // Restore the Framebuffer first because of bugs in Intel drivers. // Intel drivers incorrectly clip the viewport settings to // the size of the current framebuffer object. RestoreFramebufferBindings(); - state_.RestoreState(); + state_.RestoreState(prev_state); } void GLES2DecoderImpl::RestoreFramebufferBindings() const { @@ -3804,6 +3940,28 @@ void GLES2DecoderImpl::RestoreTextureState(unsigned service_id) const { } } +void GLES2DecoderImpl::ClearAllAttributes() const { + // Must use native VAO 0, as RestoreAllAttributes can't fully restore + // other VAOs. + if (feature_info_->feature_flags().native_vertex_array_object) + glBindVertexArrayOES(0); + + for (uint32 i = 0; i < group_->max_vertex_attribs(); ++i) { + if (i != 0) // Never disable attribute 0 + glDisableVertexAttribArray(i); + if(features().angle_instanced_arrays) + glVertexAttribDivisorANGLE(i, 0); + } +} + +void GLES2DecoderImpl::RestoreAllAttributes() const { + state_.RestoreVertexAttribs(); +} + +void GLES2DecoderImpl::SetIgnoreCachedStateForTest(bool ignore) { + state_.SetIgnoreCachedStateForTest(ignore); +} + void GLES2DecoderImpl::OnFboChanged() const { if (workarounds().restore_scissor_on_fbo_change) state_.fbo_binding_for_scissor_workaround_dirty_ = true; @@ -3832,10 +3990,10 @@ void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { framebuffer = GetFramebuffer(client_id); if (!framebuffer) { if (!group_->bind_generates_resource()) { - LOG(ERROR) - << "glBindFramebuffer: id not generated by glGenFramebuffers"; - current_decoder_error_ = error::kGenericError; - return; + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glBindFramebuffer", + "id not generated by glGenFramebuffers"); + return; } // It's a new id so make a framebuffer framebuffer for it. @@ -3855,6 +4013,8 @@ void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER_EXT) { framebuffer_state_.bound_draw_framebuffer = framebuffer; } + + // vmiura: This looks like dup code if (target == GL_FRAMEBUFFER || target == GL_READ_FRAMEBUFFER_EXT) { framebuffer_state_.bound_read_framebuffer = framebuffer; } @@ -3878,9 +4038,9 @@ void GLES2DecoderImpl::DoBindRenderbuffer(GLenum target, GLuint client_id) { renderbuffer = GetRenderbuffer(client_id); if (!renderbuffer) { if (!group_->bind_generates_resource()) { - LOG(ERROR) - << "glBindRenderbuffer: id not generated by glGenRenderbuffers"; - current_decoder_error_ = error::kGenericError; + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glBindRenderbuffer", + "id not generated by glGenRenderbuffers"); return; } @@ -3896,7 +4056,7 @@ void GLES2DecoderImpl::DoBindRenderbuffer(GLenum target, GLuint client_id) { } renderbuffer->MarkAsValid(); } - LogClientServiceForInfo(renderbuffer, client_id, "glBindRenerbuffer"); + LogClientServiceForInfo(renderbuffer, client_id, "glBindRenderbuffer"); state_.bound_renderbuffer = renderbuffer; glBindRenderbufferEXT(target, service_id); } @@ -3908,9 +4068,10 @@ void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) { texture_ref = GetTexture(client_id); if (!texture_ref) { if (!group_->bind_generates_resource()) { - LOG(ERROR) << "glBindTexture: id not generated by glGenTextures"; - current_decoder_error_ = error::kGenericError; - return; + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glBindTexture", + "id not generated by glGenTextures"); + return; } // It's a new id so make a texture texture for it. @@ -3925,27 +4086,25 @@ void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint client_id) { } else { texture_ref = texture_manager()->GetDefaultTextureInfo(target); } - Texture* texture = texture_ref->texture(); // Check the texture exists - // Check that we are not trying to bind it to a different target. - if (texture->target() != 0 && texture->target() != target) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glBindTexture", "texture bound to more than 1 target."); - return; - } - if (texture->IsStreamTexture() && target != GL_TEXTURE_EXTERNAL_OES) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glBindTexture", "illegal target for stream texture."); - return; - } - LogClientServiceForInfo(texture, client_id, "glBindTexture"); - if (texture->target() == 0) { - texture_manager()->SetTarget(texture_ref, target); + if (texture_ref) { + Texture* texture = texture_ref->texture(); + // Check that we are not trying to bind it to a different target. + if (texture->target() != 0 && texture->target() != target) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glBindTexture", + "texture bound to more than 1 target."); + return; + } + LogClientServiceForInfo(texture, client_id, "glBindTexture"); + if (texture->target() == 0) { + texture_manager()->SetTarget(texture_ref, target); + } + glBindTexture(target, texture->service_id()); + } else { + glBindTexture(target, 0); } - glBindTexture(target, texture->service_id()); TextureUnit& unit = state_.texture_units[state_.active_texture_unit]; unit.bind_target = target; @@ -3984,13 +4143,6 @@ void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) { void GLES2DecoderImpl::DoDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, const GLenum* attachments) { - if (!features().ext_discard_framebuffer) { - LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, - "glDiscardFramebufferEXT", - "function not available"); - return; - } - Framebuffer* framebuffer = GetFramebufferInfoForTarget(GL_FRAMEBUFFER); @@ -4123,7 +4275,25 @@ bool GLES2DecoderImpl::GetHelper( switch (pname) { case GL_IMPLEMENTATION_COLOR_READ_FORMAT: *num_written = 1; + // Return the GL implementation's preferred format and (see below type) + // if we have the GL extension that exposes this. This allows the GPU + // client to use the implementation's preferred format for glReadPixels + // for optimisation. + // + // A conflicting extension (GL_ARB_ES2_compatibility) specifies an error + // case when requested on integer/floating point buffers but which is + // acceptable on GLES2 and with the GL_OES_read_format extension. + // + // Therefore if an error occurs we swallow the error and use the + // internal implementation. if (params) { + if (context_->HasExtension("GL_OES_read_format")) { + ScopedGLErrorSuppressor suppressor("GLES2DecoderImpl::GetHelper", + GetErrorState()); + glGetIntegerv(pname, params); + if (glGetError() == GL_NO_ERROR) + return true; + } *params = GLES2Util::GetPreferredGLReadPixelsFormat( GetBoundReadFrameBufferInternalFormat()); } @@ -4131,6 +4301,13 @@ bool GLES2DecoderImpl::GetHelper( case GL_IMPLEMENTATION_COLOR_READ_TYPE: *num_written = 1; if (params) { + if (context_->HasExtension("GL_OES_read_format")) { + ScopedGLErrorSuppressor suppressor("GLES2DecoderImpl::GetHelper", + GetErrorState()); + glGetIntegerv(pname, params); + if (glGetError() == GL_NO_ERROR) + return true; + } *params = GLES2Util::GetPreferredGLReadPixelsType( GetBoundReadFrameBufferInternalFormat(), GetBoundReadFrameBufferTextureType()); @@ -4348,7 +4525,7 @@ bool GLES2DecoderImpl::GetHelper( *num_written = 1; if (params) { if (state_.vertex_attrib_manager.get() != - default_vertex_attrib_manager_.get()) { + state_.default_vertex_attrib_manager.get()) { GLuint client_id = 0; vertex_array_manager_->GetClientId( state_.vertex_attrib_manager->service_id(), &client_id); @@ -4420,6 +4597,12 @@ bool GLES2DecoderImpl::GetHelper( params[0] = unpack_unpremultiply_alpha_; } return true; + case GL_BIND_GENERATES_RESOURCE_CHROMIUM: + *num_written = 1; + if (params) { + params[0] = group_->bind_generates_resource() ? 1 : 0; + } + return true; default: if (pname >= GL_DRAW_BUFFER0_ARB && pname < GL_DRAW_BUFFER0_ARB + group_->max_draw_buffers()) { @@ -4545,21 +4728,6 @@ void GLES2DecoderImpl::DoBindAttribLocation( glBindAttribLocation(program->service_id(), index, name); } -error::Error GLES2DecoderImpl::HandleBindAttribLocation( - uint32 immediate_data_size, const cmds::BindAttribLocation& c) { - GLuint program = static_cast<GLuint>(c.program); - GLuint index = static_cast<GLuint>(c.index); - uint32 name_size = c.data_size; - const char* name = GetSharedMemoryAs<const char*>( - c.name_shm_id, c.name_shm_offset, name_size); - if (name == NULL) { - return error::kOutOfBounds; - } - String name_str(name, name_size); - DoBindAttribLocation(program, index, name_str.c_str()); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleBindAttribLocationBucket( uint32 immediate_data_size, const cmds::BindAttribLocationBucket& c) { GLuint program = static_cast<GLuint>(c.program); @@ -4610,21 +4778,6 @@ void GLES2DecoderImpl::DoBindUniformLocationCHROMIUM( } } -error::Error GLES2DecoderImpl::HandleBindUniformLocationCHROMIUM( - uint32 immediate_data_size, const cmds::BindUniformLocationCHROMIUM& c) { - GLuint program = static_cast<GLuint>(c.program); - GLint location = static_cast<GLint>(c.location); - uint32 name_size = c.data_size; - const char* name = GetSharedMemoryAs<const char*>( - c.name_shm_id, c.name_shm_offset, name_size); - if (name == NULL) { - return error::kOutOfBounds; - } - String name_str(name, name_size); - DoBindUniformLocationCHROMIUM(program, location, name_str.c_str()); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleBindUniformLocationCHROMIUMBucket( uint32 immediate_data_size, const cmds::BindUniformLocationCHROMIUMBucket& c) { @@ -4859,33 +5012,38 @@ void GLES2DecoderImpl::ClearUnclearedAttachments( glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, framebuffer->service_id()); } GLbitfield clear_bits = 0; - if (framebuffer->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)) { + if (framebuffer->HasUnclearedColorAttachments()) { glClearColor( 0.0f, 0.0f, 0.0f, (GLES2Util::GetChannelsForFormat( framebuffer->GetColorAttachmentFormat()) & 0x0008) != 0 ? 0.0f : 1.0f); - glColorMask(true, true, true, true); + state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); clear_bits |= GL_COLOR_BUFFER_BIT; + framebuffer->PrepareDrawBuffersForClear(); } if (framebuffer->HasUnclearedAttachment(GL_STENCIL_ATTACHMENT) || framebuffer->HasUnclearedAttachment(GL_DEPTH_STENCIL_ATTACHMENT)) { glClearStencil(0); - glStencilMask(-1); + state_.SetDeviceStencilMaskSeparate(GL_FRONT, -1); + state_.SetDeviceStencilMaskSeparate(GL_BACK, -1); clear_bits |= GL_STENCIL_BUFFER_BIT; } if (framebuffer->HasUnclearedAttachment(GL_DEPTH_ATTACHMENT) || framebuffer->HasUnclearedAttachment(GL_DEPTH_STENCIL_ATTACHMENT)) { glClearDepth(1.0f); - glDepthMask(true); + state_.SetDeviceDepthMask(GL_TRUE); clear_bits |= GL_DEPTH_BUFFER_BIT; } - glDisable(GL_SCISSOR_TEST); + state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); glClear(clear_bits); + if ((clear_bits | GL_COLOR_BUFFER_BIT) != 0) + framebuffer->RestoreDrawBuffersAfterClear(); + framebuffer_manager()->MarkAttachmentsAsCleared( framebuffer, renderbuffer_manager(), texture_manager()); @@ -4909,7 +5067,7 @@ void GLES2DecoderImpl::RestoreClearState() { glClearStencil(state_.stencil_clear); glClearDepth(state_.depth_clear); if (state_.enable_flags.scissor_test) { - glEnable(GL_SCISSOR_TEST); + state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, true); } } @@ -4937,12 +5095,6 @@ void GLES2DecoderImpl::DoFramebufferTexture2D( void GLES2DecoderImpl::DoFramebufferTexture2DMultisample( GLenum target, GLenum attachment, GLenum textarget, GLuint client_texture_id, GLint level, GLsizei samples) { - if (!features().multisampled_render_to_texture) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glFramebufferTexture2DMultisample", "function not available"); - return; - } DoFramebufferTexture2DCommon( "glFramebufferTexture2DMultisample", target, attachment, textarget, client_texture_id, level, samples); @@ -5020,7 +5172,7 @@ void GLES2DecoderImpl::DoGetFramebufferAttachmentParameteriv( if (!framebuffer) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, - "glFramebufferAttachmentParameteriv", "no framebuffer bound"); + "glGetFramebufferAttachmentParameteriv", "no framebuffer bound"); return; } if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) { @@ -5075,21 +5227,16 @@ void GLES2DecoderImpl::DoBlitFramebufferCHROMIUM( GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { DCHECK(!ShouldDeferReads() && !ShouldDeferDraws()); - if (!features().chromium_framebuffer_multisample) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glBlitFramebufferCHROMIUM", "function not available"); - return; - } if (!CheckBoundFramebuffersValid("glBlitFramebufferCHROMIUM")) { return; } - glDisable(GL_SCISSOR_TEST); + state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); BlitFramebufferHelper( srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); - EnableDisable(GL_SCISSOR_TEST, state_.enable_flags.scissor_test); + state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, + state_.enable_flags.scissor_test); } void GLES2DecoderImpl::RenderbufferStorageMultisampleHelper( @@ -5162,14 +5309,14 @@ bool GLES2DecoderImpl::ValidateRenderbufferStorageMultisample( width, height, samples, internalformat, &estimated_size)) { LOCAL_SET_GL_ERROR( GL_OUT_OF_MEMORY, - "glRenderbufferStorageMultsample", "dimensions too large"); + "glRenderbufferStorageMultisample", "dimensions too large"); return false; } if (!EnsureGPUMemoryAvailable(estimated_size)) { LOCAL_SET_GL_ERROR( GL_OUT_OF_MEMORY, - "glRenderbufferStorageMultsample", "out of memory"); + "glRenderbufferStorageMultisample", "out of memory"); return false; } @@ -5179,13 +5326,6 @@ bool GLES2DecoderImpl::ValidateRenderbufferStorageMultisample( void GLES2DecoderImpl::DoRenderbufferStorageMultisampleCHROMIUM( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { - if (!features().chromium_framebuffer_multisample) { - LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, - "glRenderbufferStorageMultisampleCHROMIUM", - "function not available"); - return; - } - Renderbuffer* renderbuffer = GetRenderbufferInfoForTarget(GL_RENDERBUFFER); if (!renderbuffer) { LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, @@ -5232,13 +5372,6 @@ void GLES2DecoderImpl::DoRenderbufferStorageMultisampleCHROMIUM( void GLES2DecoderImpl::DoRenderbufferStorageMultisampleEXT( GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) { - if (!features().multisampled_render_to_texture) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glRenderbufferStorageMultisampleEXT", "function not available"); - return; - } - Renderbuffer* renderbuffer = GetRenderbufferInfoForTarget(GL_RENDERBUFFER); if (!renderbuffer) { LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, @@ -5328,11 +5461,11 @@ bool GLES2DecoderImpl::VerifyMultisampleRenderbufferIntegrity( GLboolean scissor_enabled = false; glGetBooleanv(GL_SCISSOR_TEST, &scissor_enabled); if (scissor_enabled) - glDisable(GL_SCISSOR_TEST); + state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); - GLboolean color_mask[4] = {true, true, true, true}; + GLboolean color_mask[4] = {GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE}; glGetBooleanv(GL_COLOR_WRITEMASK, color_mask); - glColorMask(true, true, true, true); + state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); GLfloat clear_color[4] = {0.0f, 0.0f, 0.0f, 0.0f}; glGetFloatv(GL_COLOR_CLEAR_VALUE, clear_color); @@ -5361,9 +5494,10 @@ bool GLES2DecoderImpl::VerifyMultisampleRenderbufferIntegrity( // Restore cached state. if (scissor_enabled) - glEnable(GL_SCISSOR_TEST); + state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, true); - glColorMask(color_mask[0], color_mask[1], color_mask[2], color_mask[3]); + state_.SetDeviceColorMask( + color_mask[0], color_mask[1], color_mask[2], color_mask[3]); glClearColor(clear_color[0], clear_color[1], clear_color[2], clear_color[3]); glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, draw_framebuffer); glBindFramebufferEXT(GL_READ_FRAMEBUFFER, read_framebuffer); @@ -5462,9 +5596,8 @@ void GLES2DecoderImpl::DoTexParameterf( return; } - texture_manager()->SetParameter( - "glTexParameterf", GetErrorState(), texture, pname, - static_cast<GLint>(param)); + texture_manager()->SetParameterf( + "glTexParameterf", GetErrorState(), texture, pname, param); } void GLES2DecoderImpl::DoTexParameteri( @@ -5476,7 +5609,7 @@ void GLES2DecoderImpl::DoTexParameteri( return; } - texture_manager()->SetParameter( + texture_manager()->SetParameteri( "glTexParameteri", GetErrorState(), texture, pname, param); } @@ -5489,9 +5622,8 @@ void GLES2DecoderImpl::DoTexParameterfv( return; } - texture_manager()->SetParameter( - "glTexParameterfv", GetErrorState(), texture, pname, - static_cast<GLint>(params[0])); + texture_manager()->SetParameterf( + "glTexParameterfv", GetErrorState(), texture, pname, *params); } void GLES2DecoderImpl::DoTexParameteriv( @@ -5504,7 +5636,7 @@ void GLES2DecoderImpl::DoTexParameteriv( return; } - texture_manager()->SetParameter( + texture_manager()->SetParameteri( "glTexParameteriv", GetErrorState(), texture, pname, *params); } @@ -5531,125 +5663,13 @@ bool GLES2DecoderImpl::CheckCurrentProgramForUniform( return location != -1; } -namespace { - -static const GLenum valid_int_vec1_types_list[] = { - GL_INT, - GL_BOOL, - GL_SAMPLER_2D, - GL_SAMPLER_2D_RECT_ARB, - GL_SAMPLER_CUBE, - GL_SAMPLER_EXTERNAL_OES, -}; - -static const GLenum valid_int_vec2_types_list[] = { - GL_INT_VEC2, - GL_BOOL_VEC2, -}; - -static const GLenum valid_int_vec3_types_list[] = { - GL_INT_VEC3, - GL_BOOL_VEC3, -}; - -static const GLenum valid_int_vec4_types_list[] = { - GL_INT_VEC4, - GL_BOOL_VEC4, -}; - -static const GLenum valid_float_vec1_types_list[] = { - GL_FLOAT, - GL_BOOL, -}; - -static const GLenum valid_float_vec2_types_list[] = { - GL_FLOAT_VEC2, - GL_BOOL_VEC2, -}; - -static const GLenum valid_float_vec3_types_list[] = { - GL_FLOAT_VEC3, - GL_BOOL_VEC3, -}; - -static const GLenum valid_float_vec4_types_list[] = { - GL_FLOAT_VEC4, - GL_BOOL_VEC4, -}; - -static const GLenum valid_float_mat2_types_list[] = { - GL_FLOAT_MAT2, -}; - -static const GLenum valid_float_mat3_types_list[] = { - GL_FLOAT_MAT3, -}; - -static const GLenum valid_float_mat4_types_list[] = { - GL_FLOAT_MAT4, -}; - -static const GLES2DecoderImpl::BaseUniformInfo valid_int_vec1_base_info = { - valid_int_vec1_types_list, - arraysize(valid_int_vec1_types_list), -}; - -static const GLES2DecoderImpl::BaseUniformInfo valid_int_vec2_base_info = { - valid_int_vec2_types_list, - arraysize(valid_int_vec2_types_list), -}; - -static const GLES2DecoderImpl::BaseUniformInfo valid_int_vec3_base_info = { - valid_int_vec3_types_list, - arraysize(valid_int_vec3_types_list), -}; - -static const GLES2DecoderImpl::BaseUniformInfo valid_int_vec4_base_info = { - valid_int_vec4_types_list, - arraysize(valid_int_vec4_types_list), -}; - -static const GLES2DecoderImpl::BaseUniformInfo valid_float_vec1_base_info = { - valid_float_vec1_types_list, - arraysize(valid_float_vec1_types_list), -}; - -static const GLES2DecoderImpl::BaseUniformInfo valid_float_vec2_base_info = { - valid_float_vec2_types_list, - arraysize(valid_float_vec2_types_list), -}; - -static const GLES2DecoderImpl::BaseUniformInfo valid_float_vec3_base_info = { - valid_float_vec3_types_list, - arraysize(valid_float_vec3_types_list), -}; - -static const GLES2DecoderImpl::BaseUniformInfo valid_float_vec4_base_info = { - valid_float_vec4_types_list, - arraysize(valid_float_vec4_types_list), -}; - -static const GLES2DecoderImpl::BaseUniformInfo valid_float_mat2_base_info = { - valid_float_mat2_types_list, - arraysize(valid_float_mat2_types_list), -}; - -static const GLES2DecoderImpl::BaseUniformInfo valid_float_mat3_base_info = { - valid_float_mat3_types_list, - arraysize(valid_float_mat3_types_list), -}; - -static const GLES2DecoderImpl::BaseUniformInfo valid_float_mat4_base_info = { - valid_float_mat4_types_list, - arraysize(valid_float_mat4_types_list), -}; - -} // anonymous namespace. - bool GLES2DecoderImpl::PrepForSetUniformByLocation( - GLint fake_location, const char* function_name, - const GLES2DecoderImpl::BaseUniformInfo& base_info, - GLint* real_location, GLenum* type, GLsizei* count) { + GLint fake_location, + const char* function_name, + Program::UniformApiType api_type, + GLint* real_location, + GLenum* type, + GLsizei* count) { DCHECK(type); DCHECK(count); DCHECK(real_location); @@ -5666,14 +5686,8 @@ bool GLES2DecoderImpl::PrepForSetUniformByLocation( GL_INVALID_OPERATION, function_name, "unknown location"); return false; } - bool okay = false; - for (size_t ii = 0; ii < base_info.num_valid_types; ++ii) { - if (base_info.valid_types[ii] == info->type) { - okay = true; - break; - } - } - if (!okay) { + + if ((api_type & info->accepts_api_type) == 0) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, function_name, "wrong uniform function for type"); @@ -5696,9 +5710,12 @@ void GLES2DecoderImpl::DoUniform1i(GLint fake_location, GLint v0) { GLenum type = 0; GLsizei count = 1; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniform1iv", valid_int_vec1_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniform1i", + Program::kUniform1i, + &real_location, + &type, + &count)) { return; } if (!state_.current_program->SetSamplers( @@ -5714,9 +5731,12 @@ void GLES2DecoderImpl::DoUniform1iv( GLint fake_location, GLsizei count, const GLint *value) { GLenum type = 0; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniform1iv", valid_int_vec1_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniform1iv", + Program::kUniform1i, + &real_location, + &type, + &count)) { return; } if (type == GL_SAMPLER_2D || type == GL_SAMPLER_2D_RECT_ARB || @@ -5735,9 +5755,12 @@ void GLES2DecoderImpl::DoUniform1fv( GLint fake_location, GLsizei count, const GLfloat* value) { GLenum type = 0; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniform1fv", valid_float_vec1_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniform1fv", + Program::kUniform1f, + &real_location, + &type, + &count)) { return; } if (type == GL_BOOL) { @@ -5755,9 +5778,12 @@ void GLES2DecoderImpl::DoUniform2fv( GLint fake_location, GLsizei count, const GLfloat* value) { GLenum type = 0; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniform2fv", valid_float_vec2_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniform2fv", + Program::kUniform2f, + &real_location, + &type, + &count)) { return; } if (type == GL_BOOL_VEC2) { @@ -5776,9 +5802,12 @@ void GLES2DecoderImpl::DoUniform3fv( GLint fake_location, GLsizei count, const GLfloat* value) { GLenum type = 0; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniform3fv", valid_float_vec3_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniform3fv", + Program::kUniform3f, + &real_location, + &type, + &count)) { return; } if (type == GL_BOOL_VEC3) { @@ -5797,9 +5826,12 @@ void GLES2DecoderImpl::DoUniform4fv( GLint fake_location, GLsizei count, const GLfloat* value) { GLenum type = 0; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniform4fv", valid_float_vec4_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniform4fv", + Program::kUniform4f, + &real_location, + &type, + &count)) { return; } if (type == GL_BOOL_VEC4) { @@ -5818,9 +5850,12 @@ void GLES2DecoderImpl::DoUniform2iv( GLint fake_location, GLsizei count, const GLint* value) { GLenum type = 0; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniform2iv", valid_int_vec2_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniform2iv", + Program::kUniform2i, + &real_location, + &type, + &count)) { return; } glUniform2iv(real_location, count, value); @@ -5830,9 +5865,12 @@ void GLES2DecoderImpl::DoUniform3iv( GLint fake_location, GLsizei count, const GLint* value) { GLenum type = 0; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniform3iv", valid_int_vec3_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniform3iv", + Program::kUniform3i, + &real_location, + &type, + &count)) { return; } glUniform3iv(real_location, count, value); @@ -5842,9 +5880,12 @@ void GLES2DecoderImpl::DoUniform4iv( GLint fake_location, GLsizei count, const GLint* value) { GLenum type = 0; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniform4iv", valid_int_vec4_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniform4iv", + Program::kUniform4i, + &real_location, + &type, + &count)) { return; } glUniform4iv(real_location, count, value); @@ -5855,9 +5896,12 @@ void GLES2DecoderImpl::DoUniformMatrix2fv( const GLfloat* value) { GLenum type = 0; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniformMatrix2fv", valid_float_mat2_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniformMatrix2fv", + Program::kUniformMatrix2f, + &real_location, + &type, + &count)) { return; } glUniformMatrix2fv(real_location, count, transpose, value); @@ -5868,9 +5912,12 @@ void GLES2DecoderImpl::DoUniformMatrix3fv( const GLfloat* value) { GLenum type = 0; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniformMatrix3fv", valid_float_mat3_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniformMatrix3fv", + Program::kUniformMatrix3f, + &real_location, + &type, + &count)) { return; } glUniformMatrix3fv(real_location, count, transpose, value); @@ -5881,9 +5928,12 @@ void GLES2DecoderImpl::DoUniformMatrix4fv( const GLfloat* value) { GLenum type = 0; GLint real_location = -1; - if (!PrepForSetUniformByLocation( - fake_location, "glUniformMatrix4fv", valid_float_mat4_base_info, - &real_location, &type, &count)) { + if (!PrepForSetUniformByLocation(fake_location, + "glUniformMatrix4fv", + Program::kUniformMatrix4f, + &real_location, + &type, + &count)) { return; } glUniformMatrix4fv(real_location, count, transpose, value); @@ -5930,24 +5980,8 @@ void GLES2DecoderImpl::PerformanceWarning( std::string("PERFORMANCE WARNING: ") + msg); } -void GLES2DecoderImpl::UpdateStreamTextureIfNeeded(Texture* texture, - GLuint texture_unit_index) { - if (texture && texture->IsStreamTexture()) { - DCHECK(stream_texture_manager()); - StreamTexture* stream_tex = - stream_texture_manager()->LookupStreamTexture(texture->service_id()); - if (stream_tex) { - glActiveTexture(GL_TEXTURE0 + texture_unit_index); - stream_tex->Update(); - } - } -} - void GLES2DecoderImpl::DoWillUseTexImageIfNeeded( Texture* texture, GLenum textarget) { - // This might be supported in the future. - if (textarget != GL_TEXTURE_2D) - return; // Image is already in use if texture is attached to a framebuffer. if (texture && !texture->IsAttachedToFramebuffer()) { gfx::GLImage* image = texture->GetLevelImage(textarget, 0); @@ -5957,16 +5991,13 @@ void GLES2DecoderImpl::DoWillUseTexImageIfNeeded( GetErrorState()); glBindTexture(textarget, texture->service_id()); image->WillUseTexImage(); - RestoreCurrentTexture2DBindings(&state_); + RestoreCurrentTextureBindings(&state_, textarget); } } } void GLES2DecoderImpl::DoDidUseTexImageIfNeeded( Texture* texture, GLenum textarget) { - // This might be supported in the future. - if (textarget != GL_TEXTURE_2D) - return; // Image is still in use if texture is attached to a framebuffer. if (texture && !texture->IsAttachedToFramebuffer()) { gfx::GLImage* image = texture->GetLevelImage(textarget, 0); @@ -5976,7 +6007,7 @@ void GLES2DecoderImpl::DoDidUseTexImageIfNeeded( GetErrorState()); glBindTexture(textarget, texture->service_id()); image->DidUseTexImage(); - RestoreCurrentTexture2DBindings(&state_); + RestoreCurrentTextureBindings(&state_, textarget); } } } @@ -5984,8 +6015,7 @@ void GLES2DecoderImpl::DoDidUseTexImageIfNeeded( bool GLES2DecoderImpl::PrepareTexturesForRender() { DCHECK(state_.current_program.get()); if (!texture_manager()->HaveUnrenderableTextures() && - !texture_manager()->HaveImages() && - !features().oes_egl_image_external) { + !texture_manager()->HaveImages()) { return true; } @@ -6018,8 +6048,8 @@ bool GLES2DecoderImpl::PrepareTexturesForRender() { continue; } - Texture* texture = texture_ref->texture(); - if (textarget == GL_TEXTURE_2D) { + if (textarget != GL_TEXTURE_CUBE_MAP) { + Texture* texture = texture_ref->texture(); gfx::GLImage* image = texture->GetLevelImage(textarget, 0); if (image && !texture->IsAttachedToFramebuffer()) { ScopedGLErrorSuppressor suppressor( @@ -6030,8 +6060,6 @@ bool GLES2DecoderImpl::PrepareTexturesForRender() { continue; } } - - UpdateStreamTextureIfNeeded(texture, texture_unit_index); } // else: should this be an error? } @@ -6064,10 +6092,10 @@ void GLES2DecoderImpl::RestoreStateForTextures() { continue; } - Texture* texture = texture_ref->texture(); - if (texture_unit.bind_target == GL_TEXTURE_2D) { - gfx::GLImage* image = texture->GetLevelImage( - texture_unit.bind_target, 0); + if (texture_unit.bind_target != GL_TEXTURE_CUBE_MAP) { + Texture* texture = texture_ref->texture(); + gfx::GLImage* image = + texture->GetLevelImage(texture_unit.bind_target, 0); if (image && !texture->IsAttachedToFramebuffer()) { ScopedGLErrorSuppressor suppressor( "GLES2DecoderImpl::RestoreStateForTextures", GetErrorState()); @@ -6208,21 +6236,23 @@ bool GLES2DecoderImpl::SimulateAttrib0( return true; } -void GLES2DecoderImpl::RestoreStateForAttrib(GLuint attrib_index) { +void GLES2DecoderImpl::RestoreStateForAttrib( + GLuint attrib_index, bool restore_array_binding) { const VertexAttrib* attrib = state_.vertex_attrib_manager->GetVertexAttrib(attrib_index); - const void* ptr = reinterpret_cast<const void*>(attrib->offset()); - Buffer* buffer = attrib->buffer(); - glBindBuffer(GL_ARRAY_BUFFER, buffer ? buffer->service_id() : 0); - glVertexAttribPointer( - attrib_index, attrib->size(), attrib->type(), attrib->normalized(), - attrib->gl_stride(), ptr); + if (restore_array_binding) { + const void* ptr = reinterpret_cast<const void*>(attrib->offset()); + Buffer* buffer = attrib->buffer(); + glBindBuffer(GL_ARRAY_BUFFER, buffer ? buffer->service_id() : 0); + glVertexAttribPointer( + attrib_index, attrib->size(), attrib->type(), attrib->normalized(), + attrib->gl_stride(), ptr); + } if (attrib->divisor()) glVertexAttribDivisorANGLE(attrib_index, attrib->divisor()); glBindBuffer( - GL_ARRAY_BUFFER, - state_.bound_array_buffer.get() ? state_.bound_array_buffer->service_id() - : 0); + GL_ARRAY_BUFFER, state_.bound_array_buffer.get() ? + state_.bound_array_buffer->service_id() : 0); // Never touch vertex attribute 0's state (in particular, never // disable it) when running on desktop GL because it will never be @@ -6411,12 +6441,12 @@ error::Error GLES2DecoderImpl::DoDrawArrays( primcount)) { bool textures_set = !PrepareTexturesForRender(); ApplyDirtyState(); + ScopedRenderTo do_render(framebuffer_state_.bound_draw_framebuffer.get()); if (!instanced) { glDrawArrays(mode, first, count); } else { glDrawArraysInstancedANGLE(mode, first, count, primcount); } - ProcessPendingQueries(); if (textures_set) { RestoreStateForTextures(); } @@ -6425,7 +6455,11 @@ error::Error GLES2DecoderImpl::DoDrawArrays( } } if (simulated_attrib_0) { - RestoreStateForAttrib(0); + // We don't have to restore attrib 0 generic data at the end of this + // function even if it is simulated. This is because we will simulate + // it in each draw call, and attrib 0 generic data queries use cached + // values instead of passing down to the underlying driver. + RestoreStateForAttrib(0, false); } } return error::kNoError; @@ -6540,6 +6574,7 @@ error::Error GLES2DecoderImpl::DoDrawElements( indices = element_array_buffer->GetRange(offset, 0); } + ScopedRenderTo do_render(framebuffer_state_.bound_draw_framebuffer.get()); if (!instanced) { glDrawElements(mode, count, type, indices); } else { @@ -6551,7 +6586,6 @@ error::Error GLES2DecoderImpl::DoDrawElements( element_array_buffer->service_id()); } - ProcessPendingQueries(); if (textures_set) { RestoreStateForTextures(); } @@ -6560,7 +6594,11 @@ error::Error GLES2DecoderImpl::DoDrawElements( } } if (simulated_attrib_0) { - RestoreStateForAttrib(0); + // We don't have to restore attrib 0 generic data at the end of this + // function even if it is simulated. This is because we will simulate + // it in each draw call, and attrib 0 generic data queries use cached + // values instead of passing down to the underlying driver. + RestoreStateForAttrib(0, false); } } return error::kNoError; @@ -6631,17 +6669,6 @@ error::Error GLES2DecoderImpl::ShaderSourceHelper( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleShaderSource( - uint32 immediate_data_size, const cmds::ShaderSource& c) { - uint32 data_size = c.data_size; - const char* data = GetSharedMemoryAs<const char*>( - c.data_shm_id, c.data_shm_offset, data_size); - if (!data) { - return error::kOutOfBounds; - } - return ShaderSourceHelper(c.shader, data, data_size); -} - error::Error GLES2DecoderImpl::HandleShaderSourceBucket( uint32 immediate_data_size, const cmds::ShaderSourceBucket& c) { Bucket* bucket = GetBucket(c.data_bucket_id); @@ -6719,7 +6746,7 @@ error::Error GLES2DecoderImpl::HandleGetTranslatedShaderSourceANGLE( uint32 bucket_id = static_cast<uint32>(c.bucket_id); Bucket* bucket = CreateBucket(bucket_id); Shader* shader = GetShaderInfoNotProgram( - shader_id, "glTranslatedGetShaderSourceANGLE"); + shader_id, "glGetTranslatedShaderSourceANGLE"); if (!shader) { bucket->SetSize(0); return error::kNoError; @@ -6885,6 +6912,39 @@ void GLES2DecoderImpl::GetVertexAttribHelper( } } +void GLES2DecoderImpl::DoGetTexParameterfv( + GLenum target, GLenum pname, GLfloat* params) { + InitTextureMaxAnisotropyIfNeeded(target, pname); + glGetTexParameterfv(target, pname, params); +} + +void GLES2DecoderImpl::DoGetTexParameteriv( + GLenum target, GLenum pname, GLint* params) { + InitTextureMaxAnisotropyIfNeeded(target, pname); + glGetTexParameteriv(target, pname, params); +} + +void GLES2DecoderImpl::InitTextureMaxAnisotropyIfNeeded( + GLenum target, GLenum pname) { + if (!workarounds().init_texture_max_anisotropy) + return; + if (pname != GL_TEXTURE_MAX_ANISOTROPY_EXT || + !validators_->texture_parameter.IsValid(pname)) { + return; + } + + TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget( + &state_, target); + if (!texture_ref) { + LOCAL_SET_GL_ERROR( + GL_INVALID_OPERATION, + "glGetTexParamter{fi}v", "unknown texture for target"); + return; + } + Texture* texture = texture_ref->texture(); + texture->InitTextureMaxAnisotropyIfNeeded(target); +} + void GLES2DecoderImpl::DoGetVertexAttribfv( GLuint index, GLenum pname, GLfloat* params) { VertexAttrib* attrib = state_.vertex_attrib_manager->GetVertexAttrib(index); @@ -7011,7 +7071,7 @@ error::Error GLES2DecoderImpl::HandleVertexAttribPointer( if (!state_.bound_array_buffer.get() || state_.bound_array_buffer->IsDeleted()) { if (state_.vertex_attrib_manager.get() == - default_vertex_attrib_manager_.get()) { + state_.default_vertex_attrib_manager.get()) { LOCAL_SET_GL_ERROR( GL_INVALID_VALUE, "glVertexAttribPointer", "no array buffer bound"); return error::kNoError; @@ -7103,6 +7163,7 @@ error::Error GLES2DecoderImpl::HandleVertexAttribDivisorANGLE( LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, "glVertexAttribDivisorANGLE", "function not available"); + return error::kNoError; } GLuint index = c.index; GLuint divisor = c.divisor; @@ -7251,6 +7312,7 @@ void GLES2DecoderImpl::FinishReadPixels( error::Error GLES2DecoderImpl::HandleReadPixels( uint32 immediate_data_size, const cmds::ReadPixels& c) { + TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleReadPixels"); error::Error fbo_error = WillAccessBoundFramebufferForRead(); if (fbo_error != error::kNoError) return fbo_error; @@ -7329,7 +7391,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels( return error::kNoError; } - LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glReadPixel"); + LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glReadPixels"); ScopedResolvedFrameBufferBinder binder(this, false, true); @@ -7393,6 +7455,9 @@ error::Error GLES2DecoderImpl::HandleReadPixels( c, buffer)); glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); return error::kNoError; + } else { + // On error, unbind pack buffer and fall through to sync readpixels + glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); } } glReadPixels(x, y, width, height, format, type, pixels); @@ -7421,7 +7486,7 @@ error::Error GLES2DecoderImpl::HandlePixelStorei( case GL_UNPACK_ALIGNMENT: if (!validators_->pixel_store_alignment.IsValid(param)) { LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glPixelStore", "param GL_INVALID_VALUE"); + GL_INVALID_VALUE, "glPixelStorei", "param GL_INVALID_VALUE"); return error::kNoError; } break; @@ -7459,7 +7524,10 @@ error::Error GLES2DecoderImpl::HandlePixelStorei( error::Error GLES2DecoderImpl::HandlePostSubBufferCHROMIUM( uint32 immediate_data_size, const cmds::PostSubBufferCHROMIUM& c) { TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandlePostSubBufferCHROMIUM"); - if (!surface_->HasExtension("GL_CHROMIUM_post_sub_buffer")) { + { + TRACE_EVENT_SYNTHETIC_DELAY("gpu.PresentingFrame"); + } + if (!supports_post_sub_buffer_) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, "glPostSubBufferCHROMIUM", "command not supported by surface"); @@ -7482,6 +7550,16 @@ error::Error GLES2DecoderImpl::HandlePostSubBufferCHROMIUM( } } +error::Error GLES2DecoderImpl::HandleScheduleOverlayPlaneCHROMIUM( + uint32 immediate_data_size, + const cmds::ScheduleOverlayPlaneCHROMIUM& c) { + NOTIMPLEMENTED() << "Overlay supported isn't finished."; + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glScheduleOverlayPlaneCHROMIUM", + "function not implemented"); + return error::kNoError; +} + error::Error GLES2DecoderImpl::GetAttribLocationHelper( GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, const std::string& name_str) { @@ -7516,19 +7594,6 @@ error::Error GLES2DecoderImpl::GetAttribLocationHelper( error::Error GLES2DecoderImpl::HandleGetAttribLocation( uint32 immediate_data_size, const cmds::GetAttribLocation& c) { - uint32 name_size = c.data_size; - const char* name = GetSharedMemoryAs<const char*>( - c.name_shm_id, c.name_shm_offset, name_size); - if (!name) { - return error::kOutOfBounds; - } - String name_str(name, name_size); - return GetAttribLocationHelper( - c.program, c.location_shm_id, c.location_shm_offset, name_str); -} - -error::Error GLES2DecoderImpl::HandleGetAttribLocationBucket( - uint32 immediate_data_size, const cmds::GetAttribLocationBucket& c) { Bucket* bucket = GetBucket(c.name_bucket_id); if (!bucket) { return error::kInvalidArguments; @@ -7550,7 +7615,7 @@ error::Error GLES2DecoderImpl::GetUniformLocationHelper( return error::kNoError; } Program* program = GetProgramInfoNotShader( - client_id, "glUniformLocation"); + client_id, "glGetUniformLocation"); if (!program) { return error::kNoError; } @@ -7575,19 +7640,6 @@ error::Error GLES2DecoderImpl::GetUniformLocationHelper( error::Error GLES2DecoderImpl::HandleGetUniformLocation( uint32 immediate_data_size, const cmds::GetUniformLocation& c) { - uint32 name_size = c.data_size; - const char* name = GetSharedMemoryAs<const char*>( - c.name_shm_id, c.name_shm_offset, name_size); - if (!name) { - return error::kOutOfBounds; - } - String name_str(name, name_size); - return GetUniformLocationHelper( - c.program, c.location_shm_id, c.location_shm_offset, name_str); -} - -error::Error GLES2DecoderImpl::HandleGetUniformLocationBucket( - uint32 immediate_data_size, const cmds::GetUniformLocationBucket& c) { Bucket* bucket = GetBucket(c.name_bucket_id); if (!bucket) { return error::kInvalidArguments; @@ -7650,12 +7702,19 @@ error::Error GLES2DecoderImpl::HandleGetString( std::string()); } } + if (!shader_texture_lod_explicitly_enabled_) { + size_t offset = extensions.find(kEXTShaderTextureLodExtension); + if (std::string::npos != offset) { + extensions.replace(offset, + arraysize(kEXTShaderTextureLodExtension), + std::string()); + } + } } else { extensions = feature_info_->extensions().c_str(); } - std::string surface_extensions = surface_->GetExtensions(); - if (!surface_extensions.empty()) - extensions += " " + surface_extensions; + if (supports_post_sub_buffer_) + extensions += " GL_CHROMIUM_post_sub_buffer"; str = extensions.c_str(); } break; @@ -7697,6 +7756,7 @@ bool GLES2DecoderImpl::ClearLevel( unsigned bind_target, unsigned target, int level, + unsigned internal_format, unsigned format, unsigned type, int width, @@ -7723,10 +7783,11 @@ bool GLES2DecoderImpl::ClearLevel( return false; } glClearStencil(0); - glStencilMask(-1); + state_.SetDeviceStencilMaskSeparate(GL_FRONT, -1); + state_.SetDeviceStencilMaskSeparate(GL_BACK, -1); glClearDepth(1.0f); - glDepthMask(true); - glDisable(GL_SCISSOR_TEST); + state_.SetDeviceDepthMask(GL_TRUE); + state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); glClear(GL_DEPTH_BUFFER_BIT | (have_stencil ? GL_STENCIL_BUFFER_BIT : 0)); RestoreClearState(); @@ -7783,7 +7844,8 @@ bool GLES2DecoderImpl::ClearLevel( glTexSubImage2D(target, level, 0, y, width, h, format, type, zero.get()); } else { glTexImage2D( - target, level, format, width, h, 0, format, type, zero.get()); + target, level, internal_format, width, h, 0, format, type, + zero.get()); } y += tile_height; } @@ -7799,15 +7861,17 @@ const int kS3TCBlockWidth = 4; const int kS3TCBlockHeight = 4; const int kS3TCDXT1BlockSize = 8; const int kS3TCDXT3AndDXT5BlockSize = 16; -const int kETC1BlockWidth = 4; -const int kETC1BlockHeight = 4; -const int kETC1BlockSize = 8; bool IsValidDXTSize(GLint level, GLsizei size) { return (size == 1) || (size == 2) || !(size % kS3TCBlockWidth); } +bool IsValidPVRTCSize(GLint level, GLsizei size) { + // Ensure that the size is a power of two + return (size & (size - 1)) == 0; +} + } // anonymous namespace. bool GLES2DecoderImpl::ValidateCompressedTexFuncData( @@ -7816,8 +7880,10 @@ bool GLES2DecoderImpl::ValidateCompressedTexFuncData( unsigned int bytes_required = 0; switch (format) { + case GL_ATC_RGB_AMD: case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: - case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: { + case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: + case GL_ETC1_RGB8_OES: { int num_blocks_across = (width + kS3TCBlockWidth - 1) / kS3TCBlockWidth; int num_blocks_down = @@ -7826,6 +7892,8 @@ bool GLES2DecoderImpl::ValidateCompressedTexFuncData( bytes_required = num_blocks * kS3TCDXT1BlockSize; break; } + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: { int num_blocks_across = @@ -7836,13 +7904,14 @@ bool GLES2DecoderImpl::ValidateCompressedTexFuncData( bytes_required = num_blocks * kS3TCDXT3AndDXT5BlockSize; break; } - case GL_ETC1_RGB8_OES: { - int num_blocks_across = - (width + kETC1BlockWidth - 1) / kETC1BlockWidth; - int num_blocks_down = - (height + kETC1BlockHeight - 1) / kETC1BlockHeight; - int num_blocks = num_blocks_across * num_blocks_down; - bytes_required = num_blocks * kETC1BlockSize; + case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: + case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: { + bytes_required = (std::max(width, 8) * std::max(height, 8) * 4 + 7)/8; + break; + } + case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: + case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: { + bytes_required = (std::max(width, 16) * std::max(height, 8) * 2 + 7)/8; break; } default: @@ -7875,7 +7944,10 @@ bool GLES2DecoderImpl::ValidateCompressedTexDimensions( } return true; } - case GL_ETC1_RGB8_OES: + case GL_ATC_RGB_AMD: + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: + case GL_ETC1_RGB8_OES: { if (width <= 0 || height <= 0) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, function_name, @@ -7883,6 +7955,20 @@ bool GLES2DecoderImpl::ValidateCompressedTexDimensions( return false; } return true; + } + case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: + case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: + case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: + case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: { + if (!IsValidPVRTCSize(level, width) || + !IsValidPVRTCSize(level, height)) { + LOCAL_SET_GL_ERROR( + GL_INVALID_OPERATION, function_name, + "width or height invalid for level"); + return false; + } + return true; + } default: return false; } @@ -7924,12 +8010,43 @@ bool GLES2DecoderImpl::ValidateCompressedTexSubDimensions( return ValidateCompressedTexDimensions( function_name, level, width, height, format); } + case GL_ATC_RGB_AMD: + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: { + LOCAL_SET_GL_ERROR( + GL_INVALID_OPERATION, function_name, + "not supported for ATC textures"); + return false; + } case GL_ETC1_RGB8_OES: { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, function_name, - "TexsubImage2d not supported for ECT1_RGB8_OES textures"); + "not supported for ECT1_RGB8_OES textures"); return false; } + case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG: + case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG: + case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: + case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: { + if ((xoffset != 0) || (yoffset != 0)) { + LOCAL_SET_GL_ERROR( + GL_INVALID_OPERATION, function_name, + "xoffset and yoffset must be zero"); + return false; + } + GLsizei tex_width = 0; + GLsizei tex_height = 0; + if (!texture->GetLevelSize(target, level, &tex_width, &tex_height) || + width != tex_width || + height != tex_height) { + LOCAL_SET_GL_ERROR( + GL_INVALID_OPERATION, function_name, + "dimensions must match existing texture level dimensions"); + return false; + } + return ValidateCompressedTexDimensions( + function_name, level, width, height, format); + } default: return false; } @@ -8112,7 +8229,8 @@ error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2DBucket( error::Error GLES2DecoderImpl::HandleTexImage2D( uint32 immediate_data_size, const cmds::TexImage2D& c) { - TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexImage2D"); + TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexImage2D", + "width", c.width, "height", c.height); // Set as failed for now, but if it successed, this will be set to not failed. texture_state_.tex_image_2d_failed = true; GLenum target = static_cast<GLenum>(c.target); @@ -8184,7 +8302,7 @@ void GLES2DecoderImpl::DoCompressedTexSubImage2D( return; } if (!texture->ValidForTexture( - target, level, xoffset, yoffset, width, height, format, type)) { + target, level, xoffset, yoffset, width, height, type)) { LOCAL_SET_GL_ERROR( GL_INVALID_VALUE, "glCompressedTexSubImage2D", "bad dimensions."); return; @@ -8246,6 +8364,7 @@ void GLES2DecoderImpl::DoCopyTexImage2D( if (texture->IsImmutable()) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, "glCopyTexImage2D", "texture is immutable"); + return; } if (!texture_manager()->ValidForTarget(target, level, width, height, 1) || border != 0) { @@ -8253,9 +8372,9 @@ void GLES2DecoderImpl::DoCopyTexImage2D( GL_INVALID_VALUE, "glCopyTexImage2D", "dimensions out of range"); return; } - if (!texture_manager()->ValidateTextureParameters( - state_.GetErrorState(), "glCopyTexImage2D", target, internal_format, - GL_UNSIGNED_BYTE, level)) { + if (!texture_manager()->ValidateFormatAndTypeCombination( + state_.GetErrorState(), "glCopyTexImage2D", internal_format, + GL_UNSIGNED_BYTE)) { return; } @@ -8318,8 +8437,8 @@ void GLES2DecoderImpl::DoCopyTexImage2D( // some part was clipped so clear the texture. if (!ClearLevel( texture->service_id(), texture->target(), - target, level, internal_format, GL_UNSIGNED_BYTE, width, height, - texture->IsImmutable())) { + target, level, internal_format, internal_format, GL_UNSIGNED_BYTE, + width, height, texture->IsImmutable())) { LOCAL_SET_GL_ERROR( GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); return; @@ -8329,11 +8448,13 @@ void GLES2DecoderImpl::DoCopyTexImage2D( GLint dy = copyY - y; GLint destX = dx; GLint destY = dy; + ScopedModifyPixels modify(texture_ref); glCopyTexSubImage2D(target, level, destX, destY, copyX, copyY, copyWidth, copyHeight); } } else { + ScopedModifyPixels modify(texture_ref); glCopyTexImage2D(target, level, internal_format, copyX, copyY, copyWidth, copyHeight, border); } @@ -8368,7 +8489,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D( GLenum format = 0; if (!texture->GetLevelType(target, level, &type, &format) || !texture->ValidForTexture( - target, level, xoffset, yoffset, width, height, format, type)) { + target, level, xoffset, yoffset, width, height, type)) { LOCAL_SET_GL_ERROR( GL_INVALID_VALUE, "glCopyTexSubImage2D", "bad dimensions."); return; @@ -8433,6 +8554,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D( } scoped_ptr<char[]> zero(new char[pixels_size]); memset(zero.get(), 0, pixels_size); + ScopedModifyPixels modify(texture_ref); glTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, zero.get()); @@ -8443,6 +8565,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D( GLint dy = copyY - y; GLint destX = xoffset + dx; GLint destY = yoffset + dy; + ScopedModifyPixels modify(texture_ref); glCopyTexSubImage2D(target, level, destX, destY, copyX, copyY, copyWidth, copyHeight); @@ -8474,14 +8597,6 @@ bool GLES2DecoderImpl::ValidateTexSubImage2D( LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "height < 0"); return false; } - if (!validators_->texture_format.IsValid(format)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, format, "format"); - return false; - } - if (!validators_->pixel_type.IsValid(type)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, type, "type"); - return false; - } TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget( &state_, target); if (!texture_ref) { @@ -8498,10 +8613,8 @@ bool GLES2DecoderImpl::ValidateTexSubImage2D( GL_INVALID_OPERATION, function_name, "level does not exist."); return false; } - if (format != internal_format) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - function_name, "format does not match internal format."); + if (!texture_manager()->ValidateTextureParameters(state_.GetErrorState(), + function_name, format, type, internal_format, level)) { return false; } if (type != current_type) { @@ -8517,7 +8630,7 @@ bool GLES2DecoderImpl::ValidateTexSubImage2D( return false; } if (!texture->ValidForTexture( - target, level, xoffset, yoffset, width, height, format, type)) { + target, level, xoffset, yoffset, width, height, type)) { LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "bad dimensions."); return false; } @@ -8574,10 +8687,13 @@ error::Error GLES2DecoderImpl::DoTexSubImage2D( if (!texture_state_.texsubimage2d_faster_than_teximage2d && !texture->IsImmutable()) { ScopedTextureUploadTimer timer(&texture_state_); - // NOTE: In OpenGL ES 2.0 border is always zero and format is always the - // same as internal_foramt. If that changes we'll need to look them up. + GLenum internal_format; + GLenum tex_type; + texture->GetLevelType(target, level, &tex_type, &internal_format); + // NOTE: In OpenGL ES 2.0 border is always zero. If that changes we'll need + // to look it up. glTexImage2D( - target, level, format, width, height, 0, format, type, data); + target, level, internal_format, width, height, 0, format, type, data); } else { ScopedTextureUploadTimer timer(&texture_state_); glTexSubImage2D( @@ -8589,7 +8705,8 @@ error::Error GLES2DecoderImpl::DoTexSubImage2D( error::Error GLES2DecoderImpl::HandleTexSubImage2D( uint32 immediate_data_size, const cmds::TexSubImage2D& c) { - TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D"); + TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexSubImage2D", + "width", c.width, "height", c.height); GLboolean internal = static_cast<GLboolean>(c.internal); if (internal == GL_TRUE && texture_state_.tex_image_2d_failed) return error::kNoError; @@ -8923,7 +9040,7 @@ error::Error GLES2DecoderImpl::HandleShaderBinary( if (shaders == NULL || binary == NULL) { return error::kOutOfBounds; } - scoped_array<GLuint> service_ids(new GLuint[n]); + scoped_ptr<GLuint[]> service_ids(new GLuint[n]); for (GLsizei ii = 0; ii < n; ++ii) { Shader* shader = GetShader(shaders[ii]); if (!shader) { @@ -8950,6 +9067,10 @@ void GLES2DecoderImpl::DoSwapBuffers() { TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoSwapBuffers", "offscreen", is_offscreen, "frame", this_frame_number); + { + TRACE_EVENT_SYNTHETIC_DELAY("gpu.PresentingFrame"); + } + bool is_tracing; TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("gpu.debug"), &is_tracing); @@ -8995,8 +9116,8 @@ void GLES2DecoderImpl::DoSwapBuffers() { ScopedFrameBufferBinder binder(this, offscreen_saved_frame_buffer_->id()); glClearColor(0, 0, 0, 0); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - glDisable(GL_SCISSOR_TEST); + state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false); glClear(GL_COLOR_BUFFER_BIT); RestoreClearState(); } @@ -9040,9 +9161,6 @@ void GLES2DecoderImpl::DoSwapBuffers() { glFlush(); } } else { - TRACE_EVENT2("gpu", "Onscreen", - "width", surface_->GetSize().width(), - "height", surface_->GetSize().height()); if (!surface_->SwapBuffers()) { LOG(ERROR) << "Context lost because SwapBuffers failed."; LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB); @@ -9123,6 +9241,7 @@ error::Error GLES2DecoderImpl::HandleRequestExtensionCHROMIUM( bool desire_standard_derivatives = false; bool desire_frag_depth = false; bool desire_draw_buffers = false; + bool desire_shader_texture_lod = false; if (force_webgl_glsl_validation_) { desire_standard_derivatives = feature_str.find("GL_OES_standard_derivatives") != std::string::npos; @@ -9130,6 +9249,8 @@ error::Error GLES2DecoderImpl::HandleRequestExtensionCHROMIUM( feature_str.find("GL_EXT_frag_depth") != std::string::npos; desire_draw_buffers = feature_str.find("GL_EXT_draw_buffers") != std::string::npos; + desire_shader_texture_lod = + feature_str.find("GL_EXT_shader_texture_lod") != std::string::npos; } if (desire_webgl_glsl_validation != force_webgl_glsl_validation_ || @@ -9140,6 +9261,7 @@ error::Error GLES2DecoderImpl::HandleRequestExtensionCHROMIUM( derivatives_explicitly_enabled_ |= desire_standard_derivatives; frag_depth_explicitly_enabled_ |= desire_frag_depth; draw_buffers_explicitly_enabled_ |= desire_draw_buffers; + shader_texture_lod_explicitly_enabled_ |= desire_shader_texture_lod; InitializeShaderTranslator(); } @@ -9173,7 +9295,7 @@ error::Error GLES2DecoderImpl::HandleGetMultipleIntegervCHROMIUM( uint32 num = util_.GLGetNumValuesReturned(enums[ii]); if (num == 0) { LOCAL_SET_GL_ERROR_INVALID_ENUM( - "glGetMulitpleCHROMIUM", enums[ii], "pname"); + "glGetMultipleCHROMIUM", enums[ii], "pname"); return error::kNoError; } // Num will never be more than 4. @@ -9191,7 +9313,7 @@ error::Error GLES2DecoderImpl::HandleGetMultipleIntegervCHROMIUM( if (result_size != static_cast<uint32>(c.size)) { LOCAL_SET_GL_ERROR( GL_INVALID_VALUE, - "glGetMulitpleCHROMIUM", "bad size GL_INVALID_VALUE"); + "glGetMultipleCHROMIUM", "bad size GL_INVALID_VALUE"); return error::kNoError; } @@ -9296,23 +9418,6 @@ void GLES2DecoderImpl::LoseContext(uint32 reset_status) { current_decoder_error_ = error::kLostContext; } -error::Error GLES2DecoderImpl::HandleLoseContextCHROMIUM( - uint32 immediate_data_size, const cmds::LoseContextCHROMIUM& c) { - GLenum current = static_cast<GLenum>(c.current); - GLenum other = static_cast<GLenum>(c.other); - if (!validators_->reset_status.IsValid(current)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM( - "glLoseContextCHROMIUM", current, "current"); - } - if (!validators_->reset_status.IsValid(other)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", other, "other"); - } - group_->LoseContexts(other); - reset_status_ = current; - current_decoder_error_ = error::kLostContext; - return error::kLostContext; -} - error::Error GLES2DecoderImpl::HandleInsertSyncPointCHROMIUM( uint32 immediate_data_size, const cmds::InsertSyncPointCHROMIUM& c) { return error::kUnknownCommand; @@ -9320,6 +9425,7 @@ error::Error GLES2DecoderImpl::HandleInsertSyncPointCHROMIUM( error::Error GLES2DecoderImpl::HandleWaitSyncPointCHROMIUM( uint32 immediate_data_size, const cmds::WaitSyncPointCHROMIUM& c) { + group_->mailbox_manager()->PullTextureUpdates(); if (wait_sync_point_callback_.is_null()) return error::kNoError; @@ -9346,7 +9452,7 @@ bool GLES2DecoderImpl::GenQueriesEXTHelper( return false; } } - // NOTE: We don't generate Query objects here. Only in BeginQueryEXT + query_manager_->GenQueries(n, client_ids); return true; } @@ -9355,12 +9461,14 @@ void GLES2DecoderImpl::DeleteQueriesEXTHelper( for (GLsizei ii = 0; ii < n; ++ii) { QueryManager::Query* query = query_manager_->GetQuery(client_ids[ii]); if (query && !query->IsDeleted()) { - if (query == state_.current_query.get()) { - state_.current_query = NULL; - } + ContextState::QueryMap::iterator it = + state_.current_queries.find(query->target()); + if (it != state_.current_queries.end()) + state_.current_queries.erase(it); + query->Destroy(true); - query_manager_->RemoveQuery(client_ids[ii]); } + query_manager_->RemoveQuery(client_ids[ii]); } } @@ -9423,6 +9531,14 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT( case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM: case GL_GET_ERROR_QUERY_CHROMIUM: break; + case GL_COMMANDS_COMPLETED_CHROMIUM: + if (!features().chromium_sync_query) { + LOCAL_SET_GL_ERROR( + GL_INVALID_OPERATION, "glBeginQueryEXT", + "not enabled for commands completed queries"); + return error::kNoError; + } + break; default: if (!features().occlusion_query_boolean) { LOCAL_SET_GL_ERROR( @@ -9433,9 +9549,7 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT( break; } - // TODO(hubbe): Make it possible to have one query per type running at the - // same time. - if (state_.current_query.get()) { + if (state_.current_queries.find(target) != state_.current_queries.end()) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress"); return error::kNoError; @@ -9448,24 +9562,12 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT( QueryManager::Query* query = query_manager_->GetQuery(client_id); if (!query) { - // TODO(gman): Decide if we need this check. - // - // Checks id was made by glGenQueries - // - // From the POV of OpenGL ES 2.0 you need to call glGenQueriesEXT - // for all Query ids but from the POV of the command buffer service maybe - // you don't. - // - // The client can enforce this. I don't think the service cares. - // - // IdAllocatorInterface* id_allocator = - // group_->GetIdAllocator(id_namespaces::kQueries); - // if (!id_allocator->InUse(client_id)) { - // LOCAL_SET_GL_ERROR( - // GL_INVALID_OPERATION, - // "glBeginQueryEXT", "id not made by glGenQueriesEXT"); - // return error::kNoError; - // } + if (!query_manager_->IsValidQuery(client_id)) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glBeginQueryEXT", + "id not made by glGenQueriesEXT"); + return error::kNoError; + } query = query_manager_->CreateQuery( target, client_id, sync_shm_id, sync_shm_offset); } @@ -9484,7 +9586,7 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT( return error::kOutOfBounds; } - state_.current_query = query; + state_.current_queries[target] = query; return error::kNoError; } @@ -9492,26 +9594,22 @@ error::Error GLES2DecoderImpl::HandleEndQueryEXT( uint32 immediate_data_size, const cmds::EndQueryEXT& c) { GLenum target = static_cast<GLenum>(c.target); uint32 submit_count = static_cast<GLuint>(c.submit_count); + ContextState::QueryMap::iterator it = state_.current_queries.find(target); - if (!state_.current_query.get()) { + if (it == state_.current_queries.end()) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, "glEndQueryEXT", "No active query"); return error::kNoError; } - if (state_.current_query->target() != target) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glEndQueryEXT", "target does not match active query"); - return error::kNoError; - } - if (!query_manager_->EndQuery(state_.current_query.get(), submit_count)) { + QueryManager::Query* query = it->second.get(); + if (!query_manager_->EndQuery(query, submit_count)) { return error::kOutOfBounds; } query_manager_->ProcessPendingTransferQueries(); - state_.current_query = NULL; + state_.current_queries.erase(it); return error::kNoError; } @@ -9526,14 +9624,14 @@ bool GLES2DecoderImpl::GenVertexArraysOESHelper( if (!features().native_vertex_array_object) { // Emulated VAO for (GLsizei ii = 0; ii < n; ++ii) { - CreateVertexAttribManager(client_ids[ii], 0); + CreateVertexAttribManager(client_ids[ii], 0, true); } } else { scoped_ptr<GLuint[]> service_ids(new GLuint[n]); glGenVertexArraysOES(n, service_ids.get()); for (GLsizei ii = 0; ii < n; ++ii) { - CreateVertexAttribManager(client_ids[ii], service_ids[ii]); + CreateVertexAttribManager(client_ids[ii], service_ids[ii], true); } } @@ -9547,7 +9645,7 @@ void GLES2DecoderImpl::DeleteVertexArraysOESHelper( GetVertexAttribManager(client_ids[ii]); if (vao && !vao->IsDeleted()) { if (state_.vertex_attrib_manager.get() == vao) { - state_.vertex_attrib_manager = default_vertex_attrib_manager_; + DoBindVertexArrayOES(0); } RemoveVertexAttribManager(client_ids[ii]); } @@ -9556,7 +9654,6 @@ void GLES2DecoderImpl::DeleteVertexArraysOESHelper( void GLES2DecoderImpl::DoBindVertexArrayOES(GLuint client_id) { VertexAttribManager* vao = NULL; - GLuint service_id = 0; if (client_id != 0) { vao = GetVertexAttribManager(client_id); if (!vao) { @@ -9568,11 +9665,9 @@ void GLES2DecoderImpl::DoBindVertexArrayOES(GLuint client_id) { "glBindVertexArrayOES", "bad vertex array id."); current_decoder_error_ = error::kNoError; return; - } else { - service_id = vao->service_id(); } } else { - vao = default_vertex_attrib_manager_.get(); + vao = state_.default_vertex_attrib_manager.get(); } // Only set the VAO state if it's changed @@ -9581,6 +9676,7 @@ void GLES2DecoderImpl::DoBindVertexArrayOES(GLuint client_id) { if (!features().native_vertex_array_object) { EmulateVertexArrayState(); } else { + GLuint service_id = vao->service_id(); glBindVertexArrayOES(service_id); } } @@ -9590,7 +9686,7 @@ void GLES2DecoderImpl::DoBindVertexArrayOES(GLuint client_id) { void GLES2DecoderImpl::EmulateVertexArrayState() { // Setup the Vertex attribute state for (uint32 vv = 0; vv < group_->max_vertex_attribs(); ++vv) { - RestoreStateForAttrib(vv); + RestoreStateForAttrib(vv, true); } // Setup the element buffer @@ -9606,93 +9702,13 @@ bool GLES2DecoderImpl::DoIsVertexArrayOES(GLuint client_id) { return vao && vao->IsValid() && !vao->IsDeleted(); } -error::Error GLES2DecoderImpl::HandleCreateStreamTextureCHROMIUM( - uint32 immediate_data_size, - const cmds::CreateStreamTextureCHROMIUM& c) { - if (!features().chromium_stream_texture) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glOpenStreamTextureCHROMIUM", "not supported."); - return error::kNoError; - } - - uint32 client_id = c.client_id; - typedef cmds::CreateStreamTextureCHROMIUM::Result Result; - Result* result = GetSharedMemoryAs<Result*>( - c.result_shm_id, c.result_shm_offset, sizeof(*result)); - - if (!result) - return error::kOutOfBounds; - *result = GL_ZERO; - TextureRef* texture_ref = texture_manager()->GetTexture(client_id); - if (!texture_ref) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, - "glCreateStreamTextureCHROMIUM", "bad texture id."); - return error::kNoError; - } - - Texture* texture = texture_ref->texture(); - if (texture->IsStreamTexture()) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glCreateStreamTextureCHROMIUM", "is already a stream texture."); - return error::kNoError; - } - - if (texture->target() && texture->target() != GL_TEXTURE_EXTERNAL_OES) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glCreateStreamTextureCHROMIUM", - "is already bound to incompatible target."); - return error::kNoError; - } - - if (!stream_texture_manager()) - return error::kInvalidArguments; - - GLuint object_id = stream_texture_manager()->CreateStreamTexture( - texture->service_id(), client_id); - - if (object_id) { - texture_manager()->SetStreamTexture(texture_ref, true); - } else { - LOCAL_SET_GL_ERROR( - GL_OUT_OF_MEMORY, - "glCreateStreamTextureCHROMIUM", "failed to create platform texture."); - } - - *result = object_id; - return error::kNoError; -} - -error::Error GLES2DecoderImpl::HandleDestroyStreamTextureCHROMIUM( - uint32 immediate_data_size, - const cmds::DestroyStreamTextureCHROMIUM& c) { - GLuint client_id = c.texture; - TextureRef* texture_ref = texture_manager()->GetTexture(client_id); - if (texture_ref && texture_manager()->IsStreamTextureOwner(texture_ref)) { - if (!stream_texture_manager()) - return error::kInvalidArguments; - - stream_texture_manager()->DestroyStreamTexture(texture_ref->service_id()); - texture_manager()->SetStreamTexture(texture_ref, false); - } else { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, - "glDestroyStreamTextureCHROMIUM", "bad texture id."); - } - - return error::kNoError; -} - #if defined(OS_MACOSX) void GLES2DecoderImpl::ReleaseIOSurfaceForTexture(GLuint texture_id) { TextureToIOSurfaceMap::iterator it = texture_to_io_surface_map_.find( texture_id); if (it != texture_to_io_surface_map_.end()) { // Found a previous IOSurface bound to this texture; release it. - CFTypeRef surface = it->second; + IOSurfaceRef surface = it->second; CFRelease(surface); texture_to_io_surface_map_.erase(it); } @@ -9710,14 +9726,6 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( return; } - IOSurfaceSupport* surface_support = IOSurfaceSupport::Initialize(); - if (!surface_support) { - LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glTexImageIOSurface2DCHROMIUM", "only supported on 10.6."); - return; - } - if (target != GL_TEXTURE_RECTANGLE_ARB) { // This might be supported in the future, and if we could require // support for binding an IOSurface to a NPOT TEXTURE_2D texture, we @@ -9746,7 +9754,7 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( // plugin process might allocate and release an IOSurface before // this process gets a chance to look it up. Hold on to any old // IOSurface in this case. - CFTypeRef surface = surface_support->IOSurfaceLookup(io_surface_id); + IOSurfaceRef surface = IOSurfaceLookup(io_surface_id); if (!surface) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, @@ -9764,7 +9772,7 @@ void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( CGLContextObj context = static_cast<CGLContextObj>(context_->GetHandle()); - CGLError err = surface_support->CGLTexImageIOSurface2D( + CGLError err = CGLTexImageIOSurface2D( context, target, GL_RGBA, @@ -9840,6 +9848,8 @@ static GLenum ExtractFormatFromStorageFormat(GLenum internalformat) { void GLES2DecoderImpl::DoCopyTextureCHROMIUM( GLenum target, GLuint source_id, GLuint dest_id, GLint level, GLenum internal_format, GLenum dest_type) { + TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoCopyTextureCHROMIUM"); + TextureRef* dest_texture_ref = GetTexture(dest_id); TextureRef* source_texture_ref = GetTexture(source_id); @@ -9859,7 +9869,8 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( Texture* dest_texture = dest_texture_ref->texture(); if (dest_texture->target() != GL_TEXTURE_2D || (source_texture->target() != GL_TEXTURE_2D && - source_texture->target() != GL_TEXTURE_EXTERNAL_OES)) { + source_texture->target() != GL_TEXTURE_RECTANGLE_ARB && + source_texture->target() != GL_TEXTURE_EXTERNAL_OES)) { LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "invalid texture target binding"); @@ -9868,26 +9879,16 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( int source_width, source_height, dest_width, dest_height; - if (source_texture->IsStreamTexture()) { - DCHECK_EQ(source_texture->target(), - static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES)); - DCHECK(stream_texture_manager()); - StreamTexture* stream_tex = - stream_texture_manager()->LookupStreamTexture( - source_texture->service_id()); - if (!stream_tex) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, - "glCopyTextureChromium", "Stream texture lookup failed"); - return; - } - gfx::Size size = stream_tex->GetSize(); + gfx::GLImage* image = + source_texture->GetLevelImage(source_texture->target(), 0); + if (image) { + gfx::Size size = image->GetSize(); source_width = size.width(); source_height = size.height(); if (source_width <= 0 || source_height <= 0) { LOCAL_SET_GL_ERROR( GL_INVALID_VALUE, - "glCopyTextureChromium", "invalid streamtexture size"); + "glCopyTextureChromium", "invalid image size"); return; } } else { @@ -9950,7 +9951,7 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( 0, internal_format, dest_type, NULL); GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTextureCHROMIUM"); if (error != GL_NO_ERROR) { - RestoreCurrentTexture2DBindings(&state_); + RestoreCurrentTextureBindings(&state_, GL_TEXTURE_2D); return; } @@ -9963,6 +9964,7 @@ void GLES2DecoderImpl::DoCopyTextureCHROMIUM( } DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); + ScopedModifyPixels modify(dest_texture_ref); // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix // before presenting. @@ -10051,7 +10053,8 @@ void GLES2DecoderImpl::DoTexStorage2DEXT( GLenum internal_format, GLsizei width, GLsizei height) { - TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoTexStorage2DEXT"); + TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoTexStorage2DEXT", + "width", width, "height", height); if (!texture_manager()->ValidForTarget(target, 0, width, height, 1) || TextureManager::ComputeMipMapCount(target, width, height, 1) < levels) { LOCAL_SET_GL_ERROR( @@ -10127,44 +10130,64 @@ error::Error GLES2DecoderImpl::HandleGenMailboxCHROMIUM( } void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target, - const GLbyte* mailbox) { + const GLbyte* data) { TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoProduceTextureCHROMIUM", "context", logger_.GetLogPrefix(), - "mailbox[0]", static_cast<unsigned char>(mailbox[0])); + "mailbox[0]", static_cast<unsigned char>(data[0])); TextureRef* texture_ref = texture_manager()->GetTextureInfoForTarget( &state_, target); + ProduceTextureRef("glProduceTextureCHROMIUM", texture_ref, target, data); +} + +void GLES2DecoderImpl::DoProduceTextureDirectCHROMIUM(GLuint client_id, + GLenum target, const GLbyte* data) { + TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoProduceTextureDirectCHROMIUM", + "context", logger_.GetLogPrefix(), + "mailbox[0]", static_cast<unsigned char>(data[0])); + + ProduceTextureRef("glProduceTextureDirectCHROMIUM", GetTexture(client_id), + target, data); +} + +void GLES2DecoderImpl::ProduceTextureRef(std::string func_name, + TextureRef* texture_ref, GLenum target, const GLbyte* data) { + const Mailbox& mailbox = *reinterpret_cast<const Mailbox*>(data); + DLOG_IF(ERROR, !mailbox.Verify()) << func_name << " was passed a " + "mailbox that was not generated by " + "GenMailboxCHROMIUM."; + if (!texture_ref) { LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glProduceTextureCHROMIUM", "unknown texture for target"); + GL_INVALID_OPERATION, func_name.c_str(), "unknown texture for target"); return; } Texture* produced = texture_manager()->Produce(texture_ref); if (!produced) { LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glProduceTextureCHROMIUM", "invalid texture"); + GL_INVALID_OPERATION, func_name.c_str(), "invalid texture"); return; } - if (!group_->mailbox_manager()->ProduceTexture( - target, - *reinterpret_cast<const MailboxName*>(mailbox), - produced)) { + if (produced->target() != target) { LOCAL_SET_GL_ERROR( - GL_INVALID_OPERATION, - "glProduceTextureCHROMIUM", "invalid mailbox name"); + GL_INVALID_OPERATION, func_name.c_str(), "invalid target"); return; } + + group_->mailbox_manager()->ProduceTexture(target, mailbox, produced); } void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target, - const GLbyte* mailbox) { + const GLbyte* data) { TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoConsumeTextureCHROMIUM", "context", logger_.GetLogPrefix(), - "mailbox[0]", static_cast<unsigned char>(mailbox[0])); + "mailbox[0]", static_cast<unsigned char>(data[0])); + const Mailbox& mailbox = *reinterpret_cast<const Mailbox*>(data); + DLOG_IF(ERROR, !mailbox.Verify()) << "ConsumeTextureCHROMIUM was passed a " + "mailbox that was not generated by " + "GenMailboxCHROMIUM."; scoped_refptr<TextureRef> texture_ref = texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target); @@ -10181,10 +10204,7 @@ void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target, "glConsumeTextureCHROMIUM", "unknown texture for target"); return; } - Texture* texture = - group_->mailbox_manager()->ConsumeTexture( - target, - *reinterpret_cast<const MailboxName*>(mailbox)); + Texture* texture = group_->mailbox_manager()->ConsumeTexture(target, mailbox); if (!texture) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, @@ -10223,6 +10243,70 @@ void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target, } } +error::Error GLES2DecoderImpl::HandleCreateAndConsumeTextureCHROMIUMImmediate( + uint32_t immediate_data_size, + const gles2::cmds::CreateAndConsumeTextureCHROMIUMImmediate& c) { + GLenum target = static_cast<GLenum>(c.target); + uint32_t data_size; + if (!ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) { + return error::kOutOfBounds; + } + if (data_size > immediate_data_size) { + return error::kOutOfBounds; + } + const GLbyte* mailbox = + GetImmediateDataAs<const GLbyte*>(c, data_size, immediate_data_size); + if (!validators_->texture_bind_target.IsValid(target)) { + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glCreateAndConsumeTextureCHROMIUM", target, "target"); + return error::kNoError; + } + if (mailbox == NULL) { + return error::kOutOfBounds; + } + uint32_t client_id = c.client_id; + DoCreateAndConsumeTextureCHROMIUM(target, mailbox, client_id); + return error::kNoError; +} + +void GLES2DecoderImpl::DoCreateAndConsumeTextureCHROMIUM(GLenum target, + const GLbyte* data, GLuint client_id) { + TRACE_EVENT2("gpu", "GLES2DecoderImpl::DoCreateAndConsumeTextureCHROMIUM", + "context", logger_.GetLogPrefix(), + "mailbox[0]", static_cast<unsigned char>(data[0])); + const Mailbox& mailbox = *reinterpret_cast<const Mailbox*>(data); + DLOG_IF(ERROR, !mailbox.Verify()) << "CreateAndConsumeTextureCHROMIUM was " + "passed a mailbox that was not " + "generated by GenMailboxCHROMIUM."; + + TextureRef* texture_ref = GetTexture(client_id); + if (texture_ref) { + LOCAL_SET_GL_ERROR( + GL_INVALID_OPERATION, + "glCreateAndConsumeTextureCHROMIUM", "client id already in use"); + return; + } + Texture* texture = group_->mailbox_manager()->ConsumeTexture(target, mailbox); + if (!texture) { + LOCAL_SET_GL_ERROR( + GL_INVALID_OPERATION, + "glCreateAndConsumeTextureCHROMIUM", "invalid mailbox name"); + return; + } + if (texture->target() != target) { + LOCAL_SET_GL_ERROR( + GL_INVALID_OPERATION, + "glCreateAndConsumeTextureCHROMIUM", "invalid target"); + return; + } + + IdAllocatorInterface* id_allocator = + group_->GetIdAllocator(id_namespaces::kTextures); + id_allocator->MarkAsUsed(client_id); + + texture_ref = texture_manager()->Consume(client_id, texture); +} + void GLES2DecoderImpl::DoInsertEventMarkerEXT( GLsizei length, const GLchar* marker) { if (!marker) { @@ -10237,18 +10321,27 @@ void GLES2DecoderImpl::DoPushGroupMarkerEXT( if (!marker) { marker = ""; } - debug_marker_manager_.PushGroup( - length ? std::string(marker, length) : std::string(marker)); + std::string name = length ? std::string(marker, length) : std::string(marker); + debug_marker_manager_.PushGroup(name); + gpu_tracer_->Begin(name, kTraceGroupMarker); } void GLES2DecoderImpl::DoPopGroupMarkerEXT(void) { debug_marker_manager_.PopGroup(); + gpu_tracer_->End(kTraceGroupMarker); } void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM( GLenum target, GLint image_id) { TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoBindTexImage2DCHROMIUM"); + if (target == GL_TEXTURE_CUBE_MAP) { + LOCAL_SET_GL_ERROR( + GL_INVALID_ENUM, + "glBindTexImage2DCHROMIUM", "invalid target"); + return; + } + // Default target might be conceptually valid, but disallow it to avoid // accidents. TextureRef* texture_ref = @@ -10335,7 +10428,7 @@ error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM( return error::kInvalidArguments; } TRACE_EVENT_COPY_ASYNC_BEGIN0("gpu", command_name.c_str(), this); - if (!gpu_tracer_->Begin(command_name)) { + if (!gpu_tracer_->Begin(command_name, kTraceCHROMIUM)) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, "glTraceBeginCHROMIUM", "unable to create begin trace"); @@ -10352,7 +10445,7 @@ void GLES2DecoderImpl::DoTraceEndCHROMIUM() { return; } TRACE_EVENT_COPY_ASYNC_END0("gpu", gpu_tracer_->CurrentName().c_str(), this); - gpu_tracer_->End(); + gpu_tracer_->End(kTraceCHROMIUM); } void GLES2DecoderImpl::DoDrawBuffersEXT( @@ -10397,6 +10490,12 @@ void GLES2DecoderImpl::DoDrawBuffersEXT( } } +void GLES2DecoderImpl::DoLoseContextCHROMIUM(GLenum current, GLenum other) { + group_->LoseContexts(other); + reset_status_ = current; + current_decoder_error_ = error::kLostContext; +} + bool GLES2DecoderImpl::ValidateAsyncTransfer( const char* function_name, TextureRef* texture_ref, @@ -10429,13 +10528,34 @@ bool GLES2DecoderImpl::ValidateAsyncTransfer( return true; } +base::Closure GLES2DecoderImpl::AsyncUploadTokenCompletionClosure( + uint32 async_upload_token, + uint32 sync_data_shm_id, + uint32 sync_data_shm_offset) { + scoped_refptr<gpu::Buffer> buffer = GetSharedMemoryBuffer(sync_data_shm_id); + if (!buffer || !buffer->GetDataAddress(sync_data_shm_offset, + sizeof(AsyncUploadSync))) + return base::Closure(); + + AsyncMemoryParams mem_params(buffer, + sync_data_shm_offset, + sizeof(AsyncUploadSync)); + + scoped_refptr<AsyncUploadTokenCompletionObserver> observer( + new AsyncUploadTokenCompletionObserver(async_upload_token)); + + return base::Bind( + &AsyncPixelTransferManager::AsyncNotifyCompletion, + base::Unretained(GetAsyncPixelTransferManager()), + mem_params, + observer); +} + error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( uint32 immediate_data_size, const cmds::AsyncTexImage2DCHROMIUM& c) { TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM"); GLenum target = static_cast<GLenum>(c.target); GLint level = static_cast<GLint>(c.level); - // TODO(kloveless): Change HandleAsyncTexImage2DCHROMIUM command to use - // unsigned integer for internalformat. GLenum internal_format = static_cast<GLenum>(c.internalformat); GLsizei width = static_cast<GLsizei>(c.width); GLsizei height = static_cast<GLsizei>(c.height); @@ -10445,6 +10565,21 @@ error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); uint32 pixels_size; + uint32 async_upload_token = static_cast<uint32>(c.async_upload_token); + uint32 sync_data_shm_id = static_cast<uint32>(c.sync_data_shm_id); + uint32 sync_data_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); + + base::ScopedClosureRunner scoped_completion_callback; + if (async_upload_token) { + base::Closure completion_closure = + AsyncUploadTokenCompletionClosure(async_upload_token, + sync_data_shm_id, + sync_data_shm_offset); + if (completion_closure.is_null()) + return error::kInvalidArguments; + + scoped_completion_callback.Reset(completion_closure); + } // TODO(epenner): Move this and copies of this memory validation // into ValidateTexImage2D step. @@ -10492,20 +10627,12 @@ error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( return error::kNoError; } - // We know the memory/size is safe, so get the real shared memory since - // it might need to be duped to prevent use-after-free of the memory. - gpu::Buffer buffer = GetSharedMemoryBuffer(c.pixels_shm_id); - base::SharedMemory* shared_memory = buffer.shared_memory; - uint32 shm_size = buffer.size; - uint32 shm_data_offset = c.pixels_shm_offset; - uint32 shm_data_size = pixels_size; - // Setup the parameters. AsyncTexImage2DParams tex_params = { target, level, static_cast<GLenum>(internal_format), width, height, border, format, type}; - AsyncMemoryParams mem_params = { - shared_memory, shm_size, shm_data_offset, shm_data_size}; + AsyncMemoryParams mem_params( + GetSharedMemoryBuffer(c.pixels_shm_id), c.pixels_shm_offset, pixels_size); // Set up the async state if needed, and make the texture // immutable so the async state stays valid. The level info @@ -10539,6 +10666,21 @@ error::Error GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM( GLsizei height = static_cast<GLsizei>(c.height); GLenum format = static_cast<GLenum>(c.format); GLenum type = static_cast<GLenum>(c.type); + uint32 async_upload_token = static_cast<uint32>(c.async_upload_token); + uint32 sync_data_shm_id = static_cast<uint32>(c.sync_data_shm_id); + uint32 sync_data_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); + + base::ScopedClosureRunner scoped_completion_callback; + if (async_upload_token) { + base::Closure completion_closure = + AsyncUploadTokenCompletionClosure(async_upload_token, + sync_data_shm_id, + sync_data_shm_offset); + if (completion_closure.is_null()) + return error::kInvalidArguments; + + scoped_completion_callback.Reset(completion_closure); + } // TODO(epenner): Move this and copies of this memory validation // into ValidateTexSubImage2D step. @@ -10582,19 +10724,11 @@ error::Error GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM( } } - // We know the memory/size is safe, so get the real shared memory since - // it might need to be duped to prevent use-after-free of the memory. - gpu::Buffer buffer = GetSharedMemoryBuffer(c.data_shm_id); - base::SharedMemory* shared_memory = buffer.shared_memory; - uint32 shm_size = buffer.size; - uint32 shm_data_offset = c.data_shm_offset; - uint32 shm_data_size = data_size; - // Setup the parameters. AsyncTexSubImage2DParams tex_params = {target, level, xoffset, yoffset, width, height, format, type}; - AsyncMemoryParams mem_params = {shared_memory, shm_size, - shm_data_offset, shm_data_size}; + AsyncMemoryParams mem_params( + GetSharedMemoryBuffer(c.data_shm_id), c.data_shm_offset, data_size); AsyncPixelTransferDelegate* delegate = async_pixel_transfer_manager_->GetPixelTransferDelegate(texture_ref); if (!delegate) { @@ -10649,12 +10783,28 @@ error::Error GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM( return error::kNoError; } +error::Error GLES2DecoderImpl::HandleWaitAllAsyncTexImage2DCHROMIUM( + uint32 immediate_data_size, const cmds::WaitAllAsyncTexImage2DCHROMIUM& c) { + TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM"); + + GetAsyncPixelTransferManager()->WaitAllAsyncTexImage2D(); + ProcessFinishedAsyncTransfers(); + return error::kNoError; +} + void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer( TextureRef* texture_ref) { Texture* texture = texture_ref->texture(); DoDidUseTexImageIfNeeded(texture, texture->target()); } +void GLES2DecoderImpl::OnOutOfMemoryError() { + if (lose_context_when_out_of_memory_) { + group_->LoseContexts(GL_UNKNOWN_CONTEXT_RESET_ARB); + LoseContext(GL_GUILTY_CONTEXT_RESET_ARB); + } +} + // Include the auto-generated part of this file. We split this because it means // we can easily edit the non-auto generated parts right here in this file // instead of having to edit some template or the code generator. diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder.h b/chromium/gpu/command_buffer/service/gles2_cmd_decoder.h index 87c93350415..ad06a6e95bf 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder.h +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder.h @@ -28,7 +28,6 @@ namespace gpu { class AsyncPixelTransferDelegate; class AsyncPixelTransferManager; -class StreamTextureManager; struct Mailbox; namespace gles2 { @@ -39,14 +38,13 @@ class GLES2Util; class Logger; class QueryManager; class VertexArrayManager; +struct ContextState; struct DisallowedFeatures { DisallowedFeatures() - : multisampling(false), - gpu_memory_manager(false) { + : gpu_memory_manager(false) { } - bool multisampling; bool gpu_memory_manager; }; @@ -117,7 +115,7 @@ class GPU_EXPORT GLES2Decoder : public base::SupportsWeakPtr<GLES2Decoder>, // Set the surface associated with the default FBO. virtual void SetSurface(const scoped_refptr<gfx::GLSurface>& surface) = 0; - virtual bool ProduceFrontBuffer(const Mailbox& mailbox) = 0; + virtual void ProduceFrontBuffer(const Mailbox& mailbox) = 0; // Resize an offscreen frame buffer. virtual bool ResizeOffscreenFrameBuffer(const gfx::Size& size) = 0; @@ -125,9 +123,6 @@ class GPU_EXPORT GLES2Decoder : public base::SupportsWeakPtr<GLES2Decoder>, // Make this decoder's GL context current. virtual bool MakeCurrent() = 0; - // Have the decoder release the context. - virtual void ReleaseCurrent() = 0; - // Gets the GLES2 Util which holds info. virtual GLES2Util* GetGLES2Util() = 0; @@ -140,20 +135,25 @@ class GPU_EXPORT GLES2Decoder : public base::SupportsWeakPtr<GLES2Decoder>, virtual Capabilities GetCapabilities() = 0; // Restores all of the decoder GL state. - virtual void RestoreState() const = 0; + virtual void RestoreState(const ContextState* prev_state) const = 0; // Restore States. virtual void RestoreActiveTexture() const = 0; - virtual void RestoreAllTextureUnitBindings() const = 0; - virtual void RestoreAttribute(unsigned index) const = 0; + virtual void RestoreAllTextureUnitBindings( + const ContextState* prev_state) const = 0; + virtual void RestoreActiveTextureUnitBinding(unsigned int target) const = 0; virtual void RestoreBufferBindings() const = 0; virtual void RestoreFramebufferBindings() const = 0; virtual void RestoreGlobalState() const = 0; virtual void RestoreProgramBindings() const = 0; - virtual void RestoreRenderbufferBindings() const = 0; virtual void RestoreTextureState(unsigned service_id) const = 0; virtual void RestoreTextureUnitBindings(unsigned unit) const = 0; + virtual void ClearAllAttributes() const = 0; + virtual void RestoreAllAttributes() const = 0; + + virtual void SetIgnoreCachedStateForTest(bool ignore) = 0; + // Gets the QueryManager for this context. virtual QueryManager* GetQueryManager() = 0; @@ -194,6 +194,7 @@ class GPU_EXPORT GLES2Decoder : public base::SupportsWeakPtr<GLES2Decoder>, unsigned bind_target, unsigned target, int level, + unsigned internal_format, unsigned format, unsigned type, int width, @@ -228,6 +229,11 @@ class GPU_EXPORT GLES2Decoder : public base::SupportsWeakPtr<GLES2Decoder>, virtual Logger* GetLogger() = 0; + virtual void BeginDecoding(); + virtual void EndDecoding(); + + virtual const ContextState* GetContextState() = 0; + protected: GLES2Decoder(); @@ -241,4 +247,5 @@ class GPU_EXPORT GLES2Decoder : public base::SupportsWeakPtr<GLES2Decoder>, } // namespace gles2 } // namespace gpu + #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_H_ diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h index ddc00fcc4fb..8011ab19990 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // It is included by gles2_cmd_decoder.cc @@ -11,14 +13,16 @@ #define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_ error::Error GLES2DecoderImpl::HandleActiveTexture( - uint32 immediate_data_size, const gles2::cmds::ActiveTexture& c) { + uint32_t immediate_data_size, + const gles2::cmds::ActiveTexture& c) { GLenum texture = static_cast<GLenum>(c.texture); DoActiveTexture(texture); return error::kNoError; } error::Error GLES2DecoderImpl::HandleAttachShader( - uint32 immediate_data_size, const gles2::cmds::AttachShader& c) { + uint32_t immediate_data_size, + const gles2::cmds::AttachShader& c) { GLuint program = c.program; GLuint shader = c.shader; DoAttachShader(program, shader); @@ -26,7 +30,8 @@ error::Error GLES2DecoderImpl::HandleAttachShader( } error::Error GLES2DecoderImpl::HandleBindBuffer( - uint32 immediate_data_size, const gles2::cmds::BindBuffer& c) { + uint32_t immediate_data_size, + const gles2::cmds::BindBuffer& c) { GLenum target = static_cast<GLenum>(c.target); GLuint buffer = c.buffer; if (!validators_->buffer_target.IsValid(target)) { @@ -38,7 +43,8 @@ error::Error GLES2DecoderImpl::HandleBindBuffer( } error::Error GLES2DecoderImpl::HandleBindFramebuffer( - uint32 immediate_data_size, const gles2::cmds::BindFramebuffer& c) { + uint32_t immediate_data_size, + const gles2::cmds::BindFramebuffer& c) { GLenum target = static_cast<GLenum>(c.target); GLuint framebuffer = c.framebuffer; if (!validators_->frame_buffer_target.IsValid(target)) { @@ -50,7 +56,8 @@ error::Error GLES2DecoderImpl::HandleBindFramebuffer( } error::Error GLES2DecoderImpl::HandleBindRenderbuffer( - uint32 immediate_data_size, const gles2::cmds::BindRenderbuffer& c) { + uint32_t immediate_data_size, + const gles2::cmds::BindRenderbuffer& c) { GLenum target = static_cast<GLenum>(c.target); GLuint renderbuffer = c.renderbuffer; if (!validators_->render_buffer_target.IsValid(target)) { @@ -62,7 +69,8 @@ error::Error GLES2DecoderImpl::HandleBindRenderbuffer( } error::Error GLES2DecoderImpl::HandleBindTexture( - uint32 immediate_data_size, const gles2::cmds::BindTexture& c) { + uint32_t immediate_data_size, + const gles2::cmds::BindTexture& c) { GLenum target = static_cast<GLenum>(c.target); GLuint texture = c.texture; if (!validators_->texture_bind_target.IsValid(target)) { @@ -74,15 +82,14 @@ error::Error GLES2DecoderImpl::HandleBindTexture( } error::Error GLES2DecoderImpl::HandleBlendColor( - uint32 immediate_data_size, const gles2::cmds::BlendColor& c) { + uint32_t immediate_data_size, + const gles2::cmds::BlendColor& c) { GLclampf red = static_cast<GLclampf>(c.red); GLclampf green = static_cast<GLclampf>(c.green); GLclampf blue = static_cast<GLclampf>(c.blue); GLclampf alpha = static_cast<GLclampf>(c.alpha); - if (state_.blend_color_red != red || - state_.blend_color_green != green || - state_.blend_color_blue != blue || - state_.blend_color_alpha != alpha) { + if (state_.blend_color_red != red || state_.blend_color_green != green || + state_.blend_color_blue != blue || state_.blend_color_alpha != alpha) { state_.blend_color_red = red; state_.blend_color_green = green; state_.blend_color_blue = blue; @@ -93,7 +100,8 @@ error::Error GLES2DecoderImpl::HandleBlendColor( } error::Error GLES2DecoderImpl::HandleBlendEquation( - uint32 immediate_data_size, const gles2::cmds::BlendEquation& c) { + uint32_t immediate_data_size, + const gles2::cmds::BlendEquation& c) { GLenum mode = static_cast<GLenum>(c.mode); if (!validators_->equation.IsValid(mode)) { LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendEquation", mode, "mode"); @@ -109,17 +117,18 @@ error::Error GLES2DecoderImpl::HandleBlendEquation( } error::Error GLES2DecoderImpl::HandleBlendEquationSeparate( - uint32 immediate_data_size, const gles2::cmds::BlendEquationSeparate& c) { + uint32_t immediate_data_size, + const gles2::cmds::BlendEquationSeparate& c) { GLenum modeRGB = static_cast<GLenum>(c.modeRGB); GLenum modeAlpha = static_cast<GLenum>(c.modeAlpha); if (!validators_->equation.IsValid(modeRGB)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendEquationSeparate", modeRGB, - "modeRGB"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glBlendEquationSeparate", modeRGB, "modeRGB"); return error::kNoError; } if (!validators_->equation.IsValid(modeAlpha)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendEquationSeparate", modeAlpha, - "modeAlpha"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glBlendEquationSeparate", modeAlpha, "modeAlpha"); return error::kNoError; } if (state_.blend_equation_rgb != modeRGB || @@ -132,7 +141,8 @@ error::Error GLES2DecoderImpl::HandleBlendEquationSeparate( } error::Error GLES2DecoderImpl::HandleBlendFunc( - uint32 immediate_data_size, const gles2::cmds::BlendFunc& c) { + uint32_t immediate_data_size, + const gles2::cmds::BlendFunc& c) { GLenum sfactor = static_cast<GLenum>(c.sfactor); GLenum dfactor = static_cast<GLenum>(c.dfactor); if (!validators_->src_blend_factor.IsValid(sfactor)) { @@ -143,8 +153,7 @@ error::Error GLES2DecoderImpl::HandleBlendFunc( LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFunc", dfactor, "dfactor"); return error::kNoError; } - if (state_.blend_source_rgb != sfactor || - state_.blend_dest_rgb != dfactor || + if (state_.blend_source_rgb != sfactor || state_.blend_dest_rgb != dfactor || state_.blend_source_alpha != sfactor || state_.blend_dest_alpha != dfactor) { state_.blend_source_rgb = sfactor; @@ -157,7 +166,8 @@ error::Error GLES2DecoderImpl::HandleBlendFunc( } error::Error GLES2DecoderImpl::HandleBlendFuncSeparate( - uint32 immediate_data_size, const gles2::cmds::BlendFuncSeparate& c) { + uint32_t immediate_data_size, + const gles2::cmds::BlendFuncSeparate& c) { GLenum srcRGB = static_cast<GLenum>(c.srcRGB); GLenum dstRGB = static_cast<GLenum>(c.dstRGB); GLenum srcAlpha = static_cast<GLenum>(c.srcAlpha); @@ -171,17 +181,16 @@ error::Error GLES2DecoderImpl::HandleBlendFuncSeparate( return error::kNoError; } if (!validators_->src_blend_factor.IsValid(srcAlpha)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", srcAlpha, - "srcAlpha"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glBlendFuncSeparate", srcAlpha, "srcAlpha"); return error::kNoError; } if (!validators_->dst_blend_factor.IsValid(dstAlpha)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlendFuncSeparate", dstAlpha, - "dstAlpha"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glBlendFuncSeparate", dstAlpha, "dstAlpha"); return error::kNoError; } - if (state_.blend_source_rgb != srcRGB || - state_.blend_dest_rgb != dstRGB || + if (state_.blend_source_rgb != srcRGB || state_.blend_dest_rgb != dstRGB || state_.blend_source_alpha != srcAlpha || state_.blend_dest_alpha != dstAlpha) { state_.blend_source_rgb = srcRGB; @@ -194,11 +203,12 @@ error::Error GLES2DecoderImpl::HandleBlendFuncSeparate( } error::Error GLES2DecoderImpl::HandleBufferSubData( - uint32 immediate_data_size, const gles2::cmds::BufferSubData& c) { + uint32_t immediate_data_size, + const gles2::cmds::BufferSubData& c) { GLenum target = static_cast<GLenum>(c.target); GLintptr offset = static_cast<GLintptr>(c.offset); GLsizeiptr size = static_cast<GLsizeiptr>(c.size); - uint32 data_size = size; + uint32_t data_size = size; const void* data = GetSharedMemoryAs<const void*>( c.data_shm_id, c.data_shm_offset, data_size); if (!validators_->buffer_target.IsValid(target)) { @@ -217,7 +227,8 @@ error::Error GLES2DecoderImpl::HandleBufferSubData( } error::Error GLES2DecoderImpl::HandleCheckFramebufferStatus( - uint32 immediate_data_size, const gles2::cmds::CheckFramebufferStatus& c) { + uint32_t immediate_data_size, + const gles2::cmds::CheckFramebufferStatus& c) { GLenum target = static_cast<GLenum>(c.target); typedef cmds::CheckFramebufferStatus::Result Result; Result* result_dst = GetSharedMemoryAs<Result*>( @@ -226,16 +237,16 @@ error::Error GLES2DecoderImpl::HandleCheckFramebufferStatus( return error::kOutOfBounds; } if (!validators_->frame_buffer_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glCheckFramebufferStatus", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glCheckFramebufferStatus", target, "target"); return error::kNoError; } *result_dst = DoCheckFramebufferStatus(target); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleClear( - uint32 immediate_data_size, const gles2::cmds::Clear& c) { +error::Error GLES2DecoderImpl::HandleClear(uint32_t immediate_data_size, + const gles2::cmds::Clear& c) { error::Error error; error = WillAccessBoundFramebufferForDraw(); if (error != error::kNoError) @@ -246,15 +257,14 @@ error::Error GLES2DecoderImpl::HandleClear( } error::Error GLES2DecoderImpl::HandleClearColor( - uint32 immediate_data_size, const gles2::cmds::ClearColor& c) { + uint32_t immediate_data_size, + const gles2::cmds::ClearColor& c) { GLclampf red = static_cast<GLclampf>(c.red); GLclampf green = static_cast<GLclampf>(c.green); GLclampf blue = static_cast<GLclampf>(c.blue); GLclampf alpha = static_cast<GLclampf>(c.alpha); - if (state_.color_clear_red != red || - state_.color_clear_green != green || - state_.color_clear_blue != blue || - state_.color_clear_alpha != alpha) { + if (state_.color_clear_red != red || state_.color_clear_green != green || + state_.color_clear_blue != blue || state_.color_clear_alpha != alpha) { state_.color_clear_red = red; state_.color_clear_green = green; state_.color_clear_blue = blue; @@ -265,7 +275,8 @@ error::Error GLES2DecoderImpl::HandleClearColor( } error::Error GLES2DecoderImpl::HandleClearDepthf( - uint32 immediate_data_size, const gles2::cmds::ClearDepthf& c) { + uint32_t immediate_data_size, + const gles2::cmds::ClearDepthf& c) { GLclampf depth = static_cast<GLclampf>(c.depth); if (state_.depth_clear != depth) { state_.depth_clear = depth; @@ -275,7 +286,8 @@ error::Error GLES2DecoderImpl::HandleClearDepthf( } error::Error GLES2DecoderImpl::HandleClearStencil( - uint32 immediate_data_size, const gles2::cmds::ClearStencil& c) { + uint32_t immediate_data_size, + const gles2::cmds::ClearStencil& c) { GLint s = static_cast<GLint>(c.s); if (state_.stencil_clear != s) { state_.stencil_clear = s; @@ -285,15 +297,14 @@ error::Error GLES2DecoderImpl::HandleClearStencil( } error::Error GLES2DecoderImpl::HandleColorMask( - uint32 immediate_data_size, const gles2::cmds::ColorMask& c) { + uint32_t immediate_data_size, + const gles2::cmds::ColorMask& c) { GLboolean red = static_cast<GLboolean>(c.red); GLboolean green = static_cast<GLboolean>(c.green); GLboolean blue = static_cast<GLboolean>(c.blue); GLboolean alpha = static_cast<GLboolean>(c.alpha); - if (state_.color_mask_red != red || - state_.color_mask_green != green || - state_.color_mask_blue != blue || - state_.color_mask_alpha != alpha) { + if (state_.color_mask_red != red || state_.color_mask_green != green || + state_.color_mask_blue != blue || state_.color_mask_alpha != alpha) { state_.color_mask_red = red; state_.color_mask_green = green; state_.color_mask_blue = blue; @@ -304,14 +315,15 @@ error::Error GLES2DecoderImpl::HandleColorMask( } error::Error GLES2DecoderImpl::HandleCompileShader( - uint32 immediate_data_size, const gles2::cmds::CompileShader& c) { + uint32_t immediate_data_size, + const gles2::cmds::CompileShader& c) { GLuint shader = c.shader; DoCompileShader(shader); return error::kNoError; } error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2D( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::CompressedTexSubImage2D& c) { GLenum target = static_cast<GLenum>(c.target); GLint level = static_cast<GLint>(c.level); @@ -321,12 +333,12 @@ error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2D( GLsizei height = static_cast<GLsizei>(c.height); GLenum format = static_cast<GLenum>(c.format); GLsizei imageSize = static_cast<GLsizei>(c.imageSize); - uint32 data_size = imageSize; + uint32_t data_size = imageSize; const void* data = GetSharedMemoryAs<const void*>( c.data_shm_id, c.data_shm_offset, data_size); if (!validators_->texture_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glCompressedTexSubImage2D", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glCompressedTexSubImage2D", target, "target"); return error::kNoError; } if (width < 0) { @@ -340,8 +352,8 @@ error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2D( return error::kNoError; } if (!validators_->compressed_texture_format.IsValid(format)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glCompressedTexSubImage2D", format, - "format"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glCompressedTexSubImage2D", format, "format"); return error::kNoError; } if (imageSize < 0) { @@ -358,7 +370,8 @@ error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2D( } error::Error GLES2DecoderImpl::HandleCopyTexImage2D( - uint32 immediate_data_size, const gles2::cmds::CopyTexImage2D& c) { + uint32_t immediate_data_size, + const gles2::cmds::CopyTexImage2D& c) { error::Error error; error = WillAccessBoundFramebufferForRead(); if (error != error::kNoError) @@ -376,8 +389,8 @@ error::Error GLES2DecoderImpl::HandleCopyTexImage2D( return error::kNoError; } if (!validators_->texture_internal_format.IsValid(internalformat)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTexImage2D", internalformat, - "internalformat"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glCopyTexImage2D", internalformat, "internalformat"); return error::kNoError; } if (width < 0) { @@ -388,17 +401,13 @@ error::Error GLES2DecoderImpl::HandleCopyTexImage2D( LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glCopyTexImage2D", "height < 0"); return error::kNoError; } - if (!validators_->texture_border.IsValid(border)) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glCopyTexImage2D", "border GL_INVALID_VALUE"); - return error::kNoError; - } DoCopyTexImage2D(target, level, internalformat, x, y, width, height, border); return error::kNoError; } error::Error GLES2DecoderImpl::HandleCopyTexSubImage2D( - uint32 immediate_data_size, const gles2::cmds::CopyTexSubImage2D& c) { + uint32_t immediate_data_size, + const gles2::cmds::CopyTexSubImage2D& c) { error::Error error; error = WillAccessBoundFramebufferForRead(); if (error != error::kNoError) @@ -428,8 +437,9 @@ error::Error GLES2DecoderImpl::HandleCopyTexSubImage2D( } error::Error GLES2DecoderImpl::HandleCreateProgram( - uint32 immediate_data_size, const gles2::cmds::CreateProgram& c) { - uint32 client_id = c.client_id; + uint32_t immediate_data_size, + const gles2::cmds::CreateProgram& c) { + uint32_t client_id = c.client_id; if (!CreateProgramHelper(client_id)) { return error::kInvalidArguments; } @@ -437,21 +447,22 @@ error::Error GLES2DecoderImpl::HandleCreateProgram( } error::Error GLES2DecoderImpl::HandleCreateShader( - uint32 immediate_data_size, const gles2::cmds::CreateShader& c) { + uint32_t immediate_data_size, + const gles2::cmds::CreateShader& c) { GLenum type = static_cast<GLenum>(c.type); if (!validators_->shader_type.IsValid(type)) { LOCAL_SET_GL_ERROR_INVALID_ENUM("glCreateShader", type, "type"); return error::kNoError; } - uint32 client_id = c.client_id; + uint32_t client_id = c.client_id; if (!CreateShaderHelper(type, client_id)) { return error::kInvalidArguments; } return error::kNoError; } -error::Error GLES2DecoderImpl::HandleCullFace( - uint32 immediate_data_size, const gles2::cmds::CullFace& c) { +error::Error GLES2DecoderImpl::HandleCullFace(uint32_t immediate_data_size, + const gles2::cmds::CullFace& c) { GLenum mode = static_cast<GLenum>(c.mode); if (!validators_->face_type.IsValid(mode)) { LOCAL_SET_GL_ERROR_INVALID_ENUM("glCullFace", mode, "mode"); @@ -464,31 +475,16 @@ error::Error GLES2DecoderImpl::HandleCullFace( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleDeleteBuffers( - uint32 immediate_data_size, const gles2::cmds::DeleteBuffers& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - const GLuint* buffers = GetSharedMemoryAs<const GLuint*>( - c.buffers_shm_id, c.buffers_shm_offset, data_size); - if (buffers == NULL) { - return error::kOutOfBounds; - } - DeleteBuffersHelper(n, buffers); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleDeleteBuffersImmediate( - uint32 immediate_data_size, const gles2::cmds::DeleteBuffersImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::DeleteBuffersImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - const GLuint* buffers = GetImmediateDataAs<const GLuint*>( - c, data_size, immediate_data_size); + const GLuint* buffers = + GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size); if (buffers == NULL) { return error::kOutOfBounds; } @@ -496,32 +492,16 @@ error::Error GLES2DecoderImpl::HandleDeleteBuffersImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleDeleteFramebuffers( - uint32 immediate_data_size, const gles2::cmds::DeleteFramebuffers& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - const GLuint* framebuffers = GetSharedMemoryAs<const GLuint*>( - c.framebuffers_shm_id, c.framebuffers_shm_offset, data_size); - if (framebuffers == NULL) { - return error::kOutOfBounds; - } - DeleteFramebuffersHelper(n, framebuffers); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleDeleteFramebuffersImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::DeleteFramebuffersImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - const GLuint* framebuffers = GetImmediateDataAs<const GLuint*>( - c, data_size, immediate_data_size); + const GLuint* framebuffers = + GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size); if (framebuffers == NULL) { return error::kOutOfBounds; } @@ -529,32 +509,16 @@ error::Error GLES2DecoderImpl::HandleDeleteFramebuffersImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleDeleteRenderbuffers( - uint32 immediate_data_size, const gles2::cmds::DeleteRenderbuffers& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - const GLuint* renderbuffers = GetSharedMemoryAs<const GLuint*>( - c.renderbuffers_shm_id, c.renderbuffers_shm_offset, data_size); - if (renderbuffers == NULL) { - return error::kOutOfBounds; - } - DeleteRenderbuffersHelper(n, renderbuffers); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleDeleteRenderbuffersImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::DeleteRenderbuffersImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - const GLuint* renderbuffers = GetImmediateDataAs<const GLuint*>( - c, data_size, immediate_data_size); + const GLuint* renderbuffers = + GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size); if (renderbuffers == NULL) { return error::kOutOfBounds; } @@ -562,32 +526,16 @@ error::Error GLES2DecoderImpl::HandleDeleteRenderbuffersImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleDeleteTextures( - uint32 immediate_data_size, const gles2::cmds::DeleteTextures& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - const GLuint* textures = GetSharedMemoryAs<const GLuint*>( - c.textures_shm_id, c.textures_shm_offset, data_size); - if (textures == NULL) { - return error::kOutOfBounds; - } - DeleteTexturesHelper(n, textures); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleDeleteTexturesImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::DeleteTexturesImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - const GLuint* textures = GetImmediateDataAs<const GLuint*>( - c, data_size, immediate_data_size); + const GLuint* textures = + GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size); if (textures == NULL) { return error::kOutOfBounds; } @@ -596,7 +544,8 @@ error::Error GLES2DecoderImpl::HandleDeleteTexturesImmediate( } error::Error GLES2DecoderImpl::HandleDepthFunc( - uint32 immediate_data_size, const gles2::cmds::DepthFunc& c) { + uint32_t immediate_data_size, + const gles2::cmds::DepthFunc& c) { GLenum func = static_cast<GLenum>(c.func); if (!validators_->cmp_function.IsValid(func)) { LOCAL_SET_GL_ERROR_INVALID_ENUM("glDepthFunc", func, "func"); @@ -610,7 +559,8 @@ error::Error GLES2DecoderImpl::HandleDepthFunc( } error::Error GLES2DecoderImpl::HandleDepthMask( - uint32 immediate_data_size, const gles2::cmds::DepthMask& c) { + uint32_t immediate_data_size, + const gles2::cmds::DepthMask& c) { GLboolean flag = static_cast<GLboolean>(c.flag); if (state_.depth_mask != flag) { state_.depth_mask = flag; @@ -620,7 +570,8 @@ error::Error GLES2DecoderImpl::HandleDepthMask( } error::Error GLES2DecoderImpl::HandleDepthRangef( - uint32 immediate_data_size, const gles2::cmds::DepthRangef& c) { + uint32_t immediate_data_size, + const gles2::cmds::DepthRangef& c) { GLclampf zNear = static_cast<GLclampf>(c.zNear); GLclampf zFar = static_cast<GLclampf>(c.zFar); DoDepthRangef(zNear, zFar); @@ -628,15 +579,16 @@ error::Error GLES2DecoderImpl::HandleDepthRangef( } error::Error GLES2DecoderImpl::HandleDetachShader( - uint32 immediate_data_size, const gles2::cmds::DetachShader& c) { + uint32_t immediate_data_size, + const gles2::cmds::DetachShader& c) { GLuint program = c.program; GLuint shader = c.shader; DoDetachShader(program, shader); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleDisable( - uint32 immediate_data_size, const gles2::cmds::Disable& c) { +error::Error GLES2DecoderImpl::HandleDisable(uint32_t immediate_data_size, + const gles2::cmds::Disable& c) { GLenum cap = static_cast<GLenum>(c.cap); if (!validators_->capability.IsValid(cap)) { LOCAL_SET_GL_ERROR_INVALID_ENUM("glDisable", cap, "cap"); @@ -647,15 +599,15 @@ error::Error GLES2DecoderImpl::HandleDisable( } error::Error GLES2DecoderImpl::HandleDisableVertexAttribArray( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::DisableVertexAttribArray& c) { GLuint index = static_cast<GLuint>(c.index); DoDisableVertexAttribArray(index); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleEnable( - uint32 immediate_data_size, const gles2::cmds::Enable& c) { +error::Error GLES2DecoderImpl::HandleEnable(uint32_t immediate_data_size, + const gles2::cmds::Enable& c) { GLenum cap = static_cast<GLenum>(c.cap); if (!validators_->capability.IsValid(cap)) { LOCAL_SET_GL_ERROR_INVALID_ENUM("glEnable", cap, "cap"); @@ -666,15 +618,15 @@ error::Error GLES2DecoderImpl::HandleEnable( } error::Error GLES2DecoderImpl::HandleEnableVertexAttribArray( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::EnableVertexAttribArray& c) { GLuint index = static_cast<GLuint>(c.index); DoEnableVertexAttribArray(index); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleFinish( - uint32 immediate_data_size, const gles2::cmds::Finish& c) { +error::Error GLES2DecoderImpl::HandleFinish(uint32_t immediate_data_size, + const gles2::cmds::Finish& c) { error::Error error; error = WillAccessBoundFramebufferForRead(); if (error != error::kNoError) @@ -683,31 +635,32 @@ error::Error GLES2DecoderImpl::HandleFinish( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleFlush( - uint32 immediate_data_size, const gles2::cmds::Flush& c) { +error::Error GLES2DecoderImpl::HandleFlush(uint32_t immediate_data_size, + const gles2::cmds::Flush& c) { DoFlush(); return error::kNoError; } error::Error GLES2DecoderImpl::HandleFramebufferRenderbuffer( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::FramebufferRenderbuffer& c) { GLenum target = static_cast<GLenum>(c.target); GLenum attachment = static_cast<GLenum>(c.attachment); GLenum renderbuffertarget = static_cast<GLenum>(c.renderbuffertarget); GLuint renderbuffer = c.renderbuffer; if (!validators_->frame_buffer_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glFramebufferRenderbuffer", target, "target"); return error::kNoError; } if (!validators_->attachment.IsValid(attachment)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer", attachment, - "attachment"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glFramebufferRenderbuffer", attachment, "attachment"); return error::kNoError; } if (!validators_->render_buffer_target.IsValid(renderbuffertarget)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferRenderbuffer", renderbuffertarget, "renderbuffertarget"); // NOLINT + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glFramebufferRenderbuffer", renderbuffertarget, "renderbuffertarget"); return error::kNoError; } DoFramebufferRenderbuffer( @@ -716,30 +669,25 @@ error::Error GLES2DecoderImpl::HandleFramebufferRenderbuffer( } error::Error GLES2DecoderImpl::HandleFramebufferTexture2D( - uint32 immediate_data_size, const gles2::cmds::FramebufferTexture2D& c) { + uint32_t immediate_data_size, + const gles2::cmds::FramebufferTexture2D& c) { GLenum target = static_cast<GLenum>(c.target); GLenum attachment = static_cast<GLenum>(c.attachment); GLenum textarget = static_cast<GLenum>(c.textarget); GLuint texture = c.texture; GLint level = static_cast<GLint>(c.level); if (!validators_->frame_buffer_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", target, "target"); return error::kNoError; } if (!validators_->attachment.IsValid(attachment)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", attachment, - "attachment"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glFramebufferTexture2D", attachment, "attachment"); return error::kNoError; } if (!validators_->texture_target.IsValid(textarget)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2D", textarget, - "textarget"); - return error::kNoError; - } - if (!validators_->zero_only.IsValid(level)) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glFramebufferTexture2D", "level GL_INVALID_VALUE"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glFramebufferTexture2D", textarget, "textarget"); return error::kNoError; } DoFramebufferTexture2D(target, attachment, textarget, texture, level); @@ -747,7 +695,8 @@ error::Error GLES2DecoderImpl::HandleFramebufferTexture2D( } error::Error GLES2DecoderImpl::HandleFrontFace( - uint32 immediate_data_size, const gles2::cmds::FrontFace& c) { + uint32_t immediate_data_size, + const gles2::cmds::FrontFace& c) { GLenum mode = static_cast<GLenum>(c.mode); if (!validators_->face_mode.IsValid(mode)) { LOCAL_SET_GL_ERROR_INVALID_ENUM("glFrontFace", mode, "mode"); @@ -760,33 +709,16 @@ error::Error GLES2DecoderImpl::HandleFrontFace( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleGenBuffers( - uint32 immediate_data_size, const gles2::cmds::GenBuffers& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - GLuint* buffers = GetSharedMemoryAs<GLuint*>( - c.buffers_shm_id, c.buffers_shm_offset, data_size); - if (buffers == NULL) { - return error::kOutOfBounds; - } - if (!GenBuffersHelper(n, buffers)) { - return error::kInvalidArguments; - } - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleGenBuffersImmediate( - uint32 immediate_data_size, const gles2::cmds::GenBuffersImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::GenBuffersImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - GLuint* buffers = GetImmediateDataAs<GLuint*>( - c, data_size, immediate_data_size); + GLuint* buffers = + GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size); if (buffers == NULL) { return error::kOutOfBounds; } @@ -797,7 +729,8 @@ error::Error GLES2DecoderImpl::HandleGenBuffersImmediate( } error::Error GLES2DecoderImpl::HandleGenerateMipmap( - uint32 immediate_data_size, const gles2::cmds::GenerateMipmap& c) { + uint32_t immediate_data_size, + const gles2::cmds::GenerateMipmap& c) { GLenum target = static_cast<GLenum>(c.target); if (!validators_->texture_bind_target.IsValid(target)) { LOCAL_SET_GL_ERROR_INVALID_ENUM("glGenerateMipmap", target, "target"); @@ -807,34 +740,16 @@ error::Error GLES2DecoderImpl::HandleGenerateMipmap( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleGenFramebuffers( - uint32 immediate_data_size, const gles2::cmds::GenFramebuffers& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - GLuint* framebuffers = GetSharedMemoryAs<GLuint*>( - c.framebuffers_shm_id, c.framebuffers_shm_offset, data_size); - if (framebuffers == NULL) { - return error::kOutOfBounds; - } - if (!GenFramebuffersHelper(n, framebuffers)) { - return error::kInvalidArguments; - } - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleGenFramebuffersImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::GenFramebuffersImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - GLuint* framebuffers = GetImmediateDataAs<GLuint*>( - c, data_size, immediate_data_size); + GLuint* framebuffers = + GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size); if (framebuffers == NULL) { return error::kOutOfBounds; } @@ -844,34 +759,16 @@ error::Error GLES2DecoderImpl::HandleGenFramebuffersImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleGenRenderbuffers( - uint32 immediate_data_size, const gles2::cmds::GenRenderbuffers& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - GLuint* renderbuffers = GetSharedMemoryAs<GLuint*>( - c.renderbuffers_shm_id, c.renderbuffers_shm_offset, data_size); - if (renderbuffers == NULL) { - return error::kOutOfBounds; - } - if (!GenRenderbuffersHelper(n, renderbuffers)) { - return error::kInvalidArguments; - } - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleGenRenderbuffersImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::GenRenderbuffersImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - GLuint* renderbuffers = GetImmediateDataAs<GLuint*>( - c, data_size, immediate_data_size); + GLuint* renderbuffers = + GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size); if (renderbuffers == NULL) { return error::kOutOfBounds; } @@ -881,33 +778,16 @@ error::Error GLES2DecoderImpl::HandleGenRenderbuffersImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleGenTextures( - uint32 immediate_data_size, const gles2::cmds::GenTextures& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - GLuint* textures = GetSharedMemoryAs<GLuint*>( - c.textures_shm_id, c.textures_shm_offset, data_size); - if (textures == NULL) { - return error::kOutOfBounds; - } - if (!GenTexturesHelper(n, textures)) { - return error::kInvalidArguments; - } - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleGenTexturesImmediate( - uint32 immediate_data_size, const gles2::cmds::GenTexturesImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::GenTexturesImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - GLuint* textures = GetImmediateDataAs<GLuint*>( - c, data_size, immediate_data_size); + GLuint* textures = + GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size); if (textures == NULL) { return error::kOutOfBounds; } @@ -918,7 +798,8 @@ error::Error GLES2DecoderImpl::HandleGenTexturesImmediate( } error::Error GLES2DecoderImpl::HandleGetBooleanv( - uint32 immediate_data_size, const gles2::cmds::GetBooleanv& c) { + uint32_t immediate_data_size, + const gles2::cmds::GetBooleanv& c) { GLenum pname = static_cast<GLenum>(c.pname); typedef cmds::GetBooleanv::Result Result; GLsizei num_values = 0; @@ -949,7 +830,8 @@ error::Error GLES2DecoderImpl::HandleGetBooleanv( } error::Error GLES2DecoderImpl::HandleGetBufferParameteriv( - uint32 immediate_data_size, const gles2::cmds::GetBufferParameteriv& c) { + uint32_t immediate_data_size, + const gles2::cmds::GetBufferParameteriv& c) { GLenum target = static_cast<GLenum>(c.target); GLenum pname = static_cast<GLenum>(c.pname); typedef cmds::GetBufferParameteriv::Result Result; @@ -959,8 +841,7 @@ error::Error GLES2DecoderImpl::HandleGetBufferParameteriv( c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values)); GLint* params = result ? result->GetData() : NULL; if (!validators_->buffer_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetBufferParameteriv", target, "target"); return error::kNoError; } if (!validators_->buffer_parameter.IsValid(pname)) { @@ -978,8 +859,8 @@ error::Error GLES2DecoderImpl::HandleGetBufferParameteriv( result->SetNumResults(num_values); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleGetError( - uint32 immediate_data_size, const gles2::cmds::GetError& c) { +error::Error GLES2DecoderImpl::HandleGetError(uint32_t immediate_data_size, + const gles2::cmds::GetError& c) { typedef cmds::GetError::Result Result; Result* result_dst = GetSharedMemoryAs<Result*>( c.result_shm_id, c.result_shm_offset, sizeof(*result_dst)); @@ -991,7 +872,8 @@ error::Error GLES2DecoderImpl::HandleGetError( } error::Error GLES2DecoderImpl::HandleGetFloatv( - uint32 immediate_data_size, const gles2::cmds::GetFloatv& c) { + uint32_t immediate_data_size, + const gles2::cmds::GetFloatv& c) { GLenum pname = static_cast<GLenum>(c.pname); typedef cmds::GetFloatv::Result Result; GLsizei num_values = 0; @@ -1022,7 +904,7 @@ error::Error GLES2DecoderImpl::HandleGetFloatv( } error::Error GLES2DecoderImpl::HandleGetFramebufferAttachmentParameteriv( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::GetFramebufferAttachmentParameteriv& c) { GLenum target = static_cast<GLenum>(c.target); GLenum attachment = static_cast<GLenum>(c.attachment); @@ -1034,15 +916,18 @@ error::Error GLES2DecoderImpl::HandleGetFramebufferAttachmentParameteriv( c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values)); GLint* params = result ? result->GetData() : NULL; if (!validators_->frame_buffer_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv", target, "target"); // NOLINT + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glGetFramebufferAttachmentParameteriv", target, "target"); return error::kNoError; } if (!validators_->attachment.IsValid(attachment)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv", attachment, "attachment"); // NOLINT + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glGetFramebufferAttachmentParameteriv", attachment, "attachment"); return error::kNoError; } if (!validators_->frame_buffer_parameter.IsValid(pname)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetFramebufferAttachmentParameteriv", pname, "pname"); // NOLINT + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glGetFramebufferAttachmentParameteriv", pname, "pname"); return error::kNoError; } if (params == NULL) { @@ -1064,7 +949,8 @@ error::Error GLES2DecoderImpl::HandleGetFramebufferAttachmentParameteriv( } error::Error GLES2DecoderImpl::HandleGetIntegerv( - uint32 immediate_data_size, const gles2::cmds::GetIntegerv& c) { + uint32_t immediate_data_size, + const gles2::cmds::GetIntegerv& c) { GLenum pname = static_cast<GLenum>(c.pname); typedef cmds::GetIntegerv::Result Result; GLsizei num_values = 0; @@ -1095,7 +981,8 @@ error::Error GLES2DecoderImpl::HandleGetIntegerv( } error::Error GLES2DecoderImpl::HandleGetProgramiv( - uint32 immediate_data_size, const gles2::cmds::GetProgramiv& c) { + uint32_t immediate_data_size, + const gles2::cmds::GetProgramiv& c) { GLuint program = c.program; GLenum pname = static_cast<GLenum>(c.pname); typedef cmds::GetProgramiv::Result Result; @@ -1127,7 +1014,7 @@ error::Error GLES2DecoderImpl::HandleGetProgramiv( } error::Error GLES2DecoderImpl::HandleGetRenderbufferParameteriv( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::GetRenderbufferParameteriv& c) { GLenum target = static_cast<GLenum>(c.target); GLenum pname = static_cast<GLenum>(c.pname); @@ -1138,13 +1025,13 @@ error::Error GLES2DecoderImpl::HandleGetRenderbufferParameteriv( c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values)); GLint* params = result ? result->GetData() : NULL; if (!validators_->render_buffer_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetRenderbufferParameteriv", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glGetRenderbufferParameteriv", target, "target"); return error::kNoError; } if (!validators_->render_buffer_parameter.IsValid(pname)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetRenderbufferParameteriv", pname, - "pname"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glGetRenderbufferParameteriv", pname, "pname"); return error::kNoError; } if (params == NULL) { @@ -1166,7 +1053,8 @@ error::Error GLES2DecoderImpl::HandleGetRenderbufferParameteriv( } error::Error GLES2DecoderImpl::HandleGetShaderiv( - uint32 immediate_data_size, const gles2::cmds::GetShaderiv& c) { + uint32_t immediate_data_size, + const gles2::cmds::GetShaderiv& c) { GLuint shader = c.shader; GLenum pname = static_cast<GLenum>(c.pname); typedef cmds::GetShaderiv::Result Result; @@ -1198,7 +1086,8 @@ error::Error GLES2DecoderImpl::HandleGetShaderiv( } error::Error GLES2DecoderImpl::HandleGetTexParameterfv( - uint32 immediate_data_size, const gles2::cmds::GetTexParameterfv& c) { + uint32_t immediate_data_size, + const gles2::cmds::GetTexParameterfv& c) { GLenum target = static_cast<GLenum>(c.target); GLenum pname = static_cast<GLenum>(c.pname); typedef cmds::GetTexParameterfv::Result Result; @@ -1223,7 +1112,7 @@ error::Error GLES2DecoderImpl::HandleGetTexParameterfv( if (result->size != 0) { return error::kInvalidArguments; } - glGetTexParameterfv(target, pname, params); + DoGetTexParameterfv(target, pname, params); GLenum error = glGetError(); if (error == GL_NO_ERROR) { result->SetNumResults(num_values); @@ -1234,7 +1123,8 @@ error::Error GLES2DecoderImpl::HandleGetTexParameterfv( } error::Error GLES2DecoderImpl::HandleGetTexParameteriv( - uint32 immediate_data_size, const gles2::cmds::GetTexParameteriv& c) { + uint32_t immediate_data_size, + const gles2::cmds::GetTexParameteriv& c) { GLenum target = static_cast<GLenum>(c.target); GLenum pname = static_cast<GLenum>(c.pname); typedef cmds::GetTexParameteriv::Result Result; @@ -1259,7 +1149,7 @@ error::Error GLES2DecoderImpl::HandleGetTexParameteriv( if (result->size != 0) { return error::kInvalidArguments; } - glGetTexParameteriv(target, pname, params); + DoGetTexParameteriv(target, pname, params); GLenum error = glGetError(); if (error == GL_NO_ERROR) { result->SetNumResults(num_values); @@ -1270,7 +1160,8 @@ error::Error GLES2DecoderImpl::HandleGetTexParameteriv( } error::Error GLES2DecoderImpl::HandleGetVertexAttribfv( - uint32 immediate_data_size, const gles2::cmds::GetVertexAttribfv& c) { + uint32_t immediate_data_size, + const gles2::cmds::GetVertexAttribfv& c) { GLuint index = static_cast<GLuint>(c.index); GLenum pname = static_cast<GLenum>(c.pname); typedef cmds::GetVertexAttribfv::Result Result; @@ -1302,7 +1193,8 @@ error::Error GLES2DecoderImpl::HandleGetVertexAttribfv( } error::Error GLES2DecoderImpl::HandleGetVertexAttribiv( - uint32 immediate_data_size, const gles2::cmds::GetVertexAttribiv& c) { + uint32_t immediate_data_size, + const gles2::cmds::GetVertexAttribiv& c) { GLuint index = static_cast<GLuint>(c.index); GLenum pname = static_cast<GLenum>(c.pname); typedef cmds::GetVertexAttribiv::Result Result; @@ -1333,8 +1225,8 @@ error::Error GLES2DecoderImpl::HandleGetVertexAttribiv( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleHint( - uint32 immediate_data_size, const gles2::cmds::Hint& c) { +error::Error GLES2DecoderImpl::HandleHint(uint32_t immediate_data_size, + const gles2::cmds::Hint& c) { GLenum target = static_cast<GLenum>(c.target); GLenum mode = static_cast<GLenum>(c.mode); if (!validators_->hint_target.IsValid(target)) { @@ -1364,8 +1256,8 @@ error::Error GLES2DecoderImpl::HandleHint( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleIsBuffer( - uint32 immediate_data_size, const gles2::cmds::IsBuffer& c) { +error::Error GLES2DecoderImpl::HandleIsBuffer(uint32_t immediate_data_size, + const gles2::cmds::IsBuffer& c) { GLuint buffer = c.buffer; typedef cmds::IsBuffer::Result Result; Result* result_dst = GetSharedMemoryAs<Result*>( @@ -1378,7 +1270,8 @@ error::Error GLES2DecoderImpl::HandleIsBuffer( } error::Error GLES2DecoderImpl::HandleIsEnabled( - uint32 immediate_data_size, const gles2::cmds::IsEnabled& c) { + uint32_t immediate_data_size, + const gles2::cmds::IsEnabled& c) { GLenum cap = static_cast<GLenum>(c.cap); typedef cmds::IsEnabled::Result Result; Result* result_dst = GetSharedMemoryAs<Result*>( @@ -1395,7 +1288,8 @@ error::Error GLES2DecoderImpl::HandleIsEnabled( } error::Error GLES2DecoderImpl::HandleIsFramebuffer( - uint32 immediate_data_size, const gles2::cmds::IsFramebuffer& c) { + uint32_t immediate_data_size, + const gles2::cmds::IsFramebuffer& c) { GLuint framebuffer = c.framebuffer; typedef cmds::IsFramebuffer::Result Result; Result* result_dst = GetSharedMemoryAs<Result*>( @@ -1408,7 +1302,8 @@ error::Error GLES2DecoderImpl::HandleIsFramebuffer( } error::Error GLES2DecoderImpl::HandleIsProgram( - uint32 immediate_data_size, const gles2::cmds::IsProgram& c) { + uint32_t immediate_data_size, + const gles2::cmds::IsProgram& c) { GLuint program = c.program; typedef cmds::IsProgram::Result Result; Result* result_dst = GetSharedMemoryAs<Result*>( @@ -1421,7 +1316,8 @@ error::Error GLES2DecoderImpl::HandleIsProgram( } error::Error GLES2DecoderImpl::HandleIsRenderbuffer( - uint32 immediate_data_size, const gles2::cmds::IsRenderbuffer& c) { + uint32_t immediate_data_size, + const gles2::cmds::IsRenderbuffer& c) { GLuint renderbuffer = c.renderbuffer; typedef cmds::IsRenderbuffer::Result Result; Result* result_dst = GetSharedMemoryAs<Result*>( @@ -1433,8 +1329,8 @@ error::Error GLES2DecoderImpl::HandleIsRenderbuffer( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleIsShader( - uint32 immediate_data_size, const gles2::cmds::IsShader& c) { +error::Error GLES2DecoderImpl::HandleIsShader(uint32_t immediate_data_size, + const gles2::cmds::IsShader& c) { GLuint shader = c.shader; typedef cmds::IsShader::Result Result; Result* result_dst = GetSharedMemoryAs<Result*>( @@ -1447,7 +1343,8 @@ error::Error GLES2DecoderImpl::HandleIsShader( } error::Error GLES2DecoderImpl::HandleIsTexture( - uint32 immediate_data_size, const gles2::cmds::IsTexture& c) { + uint32_t immediate_data_size, + const gles2::cmds::IsTexture& c) { GLuint texture = c.texture; typedef cmds::IsTexture::Result Result; Result* result_dst = GetSharedMemoryAs<Result*>( @@ -1460,7 +1357,8 @@ error::Error GLES2DecoderImpl::HandleIsTexture( } error::Error GLES2DecoderImpl::HandleLineWidth( - uint32 immediate_data_size, const gles2::cmds::LineWidth& c) { + uint32_t immediate_data_size, + const gles2::cmds::LineWidth& c) { GLfloat width = static_cast<GLfloat>(c.width); if (width <= 0.0f) { LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "LineWidth", "width out of range"); @@ -1474,14 +1372,16 @@ error::Error GLES2DecoderImpl::HandleLineWidth( } error::Error GLES2DecoderImpl::HandleLinkProgram( - uint32 immediate_data_size, const gles2::cmds::LinkProgram& c) { + uint32_t immediate_data_size, + const gles2::cmds::LinkProgram& c) { GLuint program = c.program; DoLinkProgram(program); return error::kNoError; } error::Error GLES2DecoderImpl::HandlePolygonOffset( - uint32 immediate_data_size, const gles2::cmds::PolygonOffset& c) { + uint32_t immediate_data_size, + const gles2::cmds::PolygonOffset& c) { GLfloat factor = static_cast<GLfloat>(c.factor); GLfloat units = static_cast<GLfloat>(c.units); if (state_.polygon_offset_factor != factor || @@ -1494,13 +1394,15 @@ error::Error GLES2DecoderImpl::HandlePolygonOffset( } error::Error GLES2DecoderImpl::HandleReleaseShaderCompiler( - uint32 immediate_data_size, const gles2::cmds::ReleaseShaderCompiler& c) { + uint32_t immediate_data_size, + const gles2::cmds::ReleaseShaderCompiler& c) { DoReleaseShaderCompiler(); return error::kNoError; } error::Error GLES2DecoderImpl::HandleRenderbufferStorage( - uint32 immediate_data_size, const gles2::cmds::RenderbufferStorage& c) { + uint32_t immediate_data_size, + const gles2::cmds::RenderbufferStorage& c) { GLenum target = static_cast<GLenum>(c.target); GLenum internalformat = static_cast<GLenum>(c.internalformat); GLsizei width = static_cast<GLsizei>(c.width); @@ -1510,8 +1412,8 @@ error::Error GLES2DecoderImpl::HandleRenderbufferStorage( return error::kNoError; } if (!validators_->render_buffer_format.IsValid(internalformat)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorage", internalformat, - "internalformat"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glRenderbufferStorage", internalformat, "internalformat"); return error::kNoError; } if (width < 0) { @@ -1519,8 +1421,7 @@ error::Error GLES2DecoderImpl::HandleRenderbufferStorage( return error::kNoError; } if (height < 0) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glRenderbufferStorage", "height < 0"); + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glRenderbufferStorage", "height < 0"); return error::kNoError; } DoRenderbufferStorage(target, internalformat, width, height); @@ -1528,15 +1429,16 @@ error::Error GLES2DecoderImpl::HandleRenderbufferStorage( } error::Error GLES2DecoderImpl::HandleSampleCoverage( - uint32 immediate_data_size, const gles2::cmds::SampleCoverage& c) { + uint32_t immediate_data_size, + const gles2::cmds::SampleCoverage& c) { GLclampf value = static_cast<GLclampf>(c.value); GLboolean invert = static_cast<GLboolean>(c.invert); DoSampleCoverage(value, invert); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleScissor( - uint32 immediate_data_size, const gles2::cmds::Scissor& c) { +error::Error GLES2DecoderImpl::HandleScissor(uint32_t immediate_data_size, + const gles2::cmds::Scissor& c) { GLint x = static_cast<GLint>(c.x); GLint y = static_cast<GLint>(c.y); GLsizei width = static_cast<GLsizei>(c.width); @@ -1549,10 +1451,8 @@ error::Error GLES2DecoderImpl::HandleScissor( LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glScissor", "height < 0"); return error::kNoError; } - if (state_.scissor_x != x || - state_.scissor_y != y || - state_.scissor_width != width || - state_.scissor_height != height) { + if (state_.scissor_x != x || state_.scissor_y != y || + state_.scissor_width != width || state_.scissor_height != height) { state_.scissor_x = x; state_.scissor_y = y; state_.scissor_width = width; @@ -1563,7 +1463,8 @@ error::Error GLES2DecoderImpl::HandleScissor( } error::Error GLES2DecoderImpl::HandleStencilFunc( - uint32 immediate_data_size, const gles2::cmds::StencilFunc& c) { + uint32_t immediate_data_size, + const gles2::cmds::StencilFunc& c) { GLenum func = static_cast<GLenum>(c.func); GLint ref = static_cast<GLint>(c.ref); GLuint mask = static_cast<GLuint>(c.mask); @@ -1571,12 +1472,9 @@ error::Error GLES2DecoderImpl::HandleStencilFunc( LOCAL_SET_GL_ERROR_INVALID_ENUM("glStencilFunc", func, "func"); return error::kNoError; } - if (state_.stencil_front_func != func || - state_.stencil_front_ref != ref || - state_.stencil_front_mask != mask || - state_.stencil_back_func != func || - state_.stencil_back_ref != ref || - state_.stencil_back_mask != mask) { + if (state_.stencil_front_func != func || state_.stencil_front_ref != ref || + state_.stencil_front_mask != mask || state_.stencil_back_func != func || + state_.stencil_back_ref != ref || state_.stencil_back_mask != mask) { state_.stencil_front_func = func; state_.stencil_front_ref = ref; state_.stencil_front_mask = mask; @@ -1589,7 +1487,8 @@ error::Error GLES2DecoderImpl::HandleStencilFunc( } error::Error GLES2DecoderImpl::HandleStencilFuncSeparate( - uint32 immediate_data_size, const gles2::cmds::StencilFuncSeparate& c) { + uint32_t immediate_data_size, + const gles2::cmds::StencilFuncSeparate& c) { GLenum face = static_cast<GLenum>(c.face); GLenum func = static_cast<GLenum>(c.func); GLint ref = static_cast<GLint>(c.ref); @@ -1605,13 +1504,13 @@ error::Error GLES2DecoderImpl::HandleStencilFuncSeparate( bool changed = false; if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { changed |= state_.stencil_front_func != func || - state_.stencil_front_ref != ref || - state_.stencil_front_mask != mask; + state_.stencil_front_ref != ref || + state_.stencil_front_mask != mask; } if (face == GL_BACK || face == GL_FRONT_AND_BACK) { changed |= state_.stencil_back_func != func || - state_.stencil_back_ref != ref || - state_.stencil_back_mask != mask; + state_.stencil_back_ref != ref || + state_.stencil_back_mask != mask; } if (changed) { if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { @@ -1630,7 +1529,8 @@ error::Error GLES2DecoderImpl::HandleStencilFuncSeparate( } error::Error GLES2DecoderImpl::HandleStencilMask( - uint32 immediate_data_size, const gles2::cmds::StencilMask& c) { + uint32_t immediate_data_size, + const gles2::cmds::StencilMask& c) { GLuint mask = static_cast<GLuint>(c.mask); if (state_.stencil_front_writemask != mask || state_.stencil_back_writemask != mask) { @@ -1642,7 +1542,8 @@ error::Error GLES2DecoderImpl::HandleStencilMask( } error::Error GLES2DecoderImpl::HandleStencilMaskSeparate( - uint32 immediate_data_size, const gles2::cmds::StencilMaskSeparate& c) { + uint32_t immediate_data_size, + const gles2::cmds::StencilMaskSeparate& c) { GLenum face = static_cast<GLenum>(c.face); GLuint mask = static_cast<GLuint>(c.mask); if (!validators_->face_type.IsValid(face)) { @@ -1669,7 +1570,8 @@ error::Error GLES2DecoderImpl::HandleStencilMaskSeparate( } error::Error GLES2DecoderImpl::HandleStencilOp( - uint32 immediate_data_size, const gles2::cmds::StencilOp& c) { + uint32_t immediate_data_size, + const gles2::cmds::StencilOp& c) { GLenum fail = static_cast<GLenum>(c.fail); GLenum zfail = static_cast<GLenum>(c.zfail); GLenum zpass = static_cast<GLenum>(c.zpass); @@ -1703,7 +1605,8 @@ error::Error GLES2DecoderImpl::HandleStencilOp( } error::Error GLES2DecoderImpl::HandleStencilOpSeparate( - uint32 immediate_data_size, const gles2::cmds::StencilOpSeparate& c) { + uint32_t immediate_data_size, + const gles2::cmds::StencilOpSeparate& c) { GLenum face = static_cast<GLenum>(c.face); GLenum fail = static_cast<GLenum>(c.fail); GLenum zfail = static_cast<GLenum>(c.zfail); @@ -1727,13 +1630,13 @@ error::Error GLES2DecoderImpl::HandleStencilOpSeparate( bool changed = false; if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { changed |= state_.stencil_front_fail_op != fail || - state_.stencil_front_z_fail_op != zfail || - state_.stencil_front_z_pass_op != zpass; + state_.stencil_front_z_fail_op != zfail || + state_.stencil_front_z_pass_op != zpass; } if (face == GL_BACK || face == GL_FRONT_AND_BACK) { changed |= state_.stencil_back_fail_op != fail || - state_.stencil_back_z_fail_op != zfail || - state_.stencil_back_z_pass_op != zpass; + state_.stencil_back_z_fail_op != zfail || + state_.stencil_back_z_pass_op != zpass; } if (changed) { if (face == GL_FRONT || face == GL_FRONT_AND_BACK) { @@ -1752,7 +1655,8 @@ error::Error GLES2DecoderImpl::HandleStencilOpSeparate( } error::Error GLES2DecoderImpl::HandleTexParameterf( - uint32 immediate_data_size, const gles2::cmds::TexParameterf& c) { + uint32_t immediate_data_size, + const gles2::cmds::TexParameterf& c) { GLenum target = static_cast<GLenum>(c.target); GLenum pname = static_cast<GLenum>(c.pname); GLfloat param = static_cast<GLfloat>(c.param); @@ -1768,45 +1672,20 @@ error::Error GLES2DecoderImpl::HandleTexParameterf( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleTexParameterfv( - uint32 immediate_data_size, const gles2::cmds::TexParameterfv& c) { - GLenum target = static_cast<GLenum>(c.target); - GLenum pname = static_cast<GLenum>(c.pname); - uint32 data_size; - if (!ComputeDataSize(1, sizeof(GLfloat), 1, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* params = GetSharedMemoryAs<const GLfloat*>( - c.params_shm_id, c.params_shm_offset, data_size); - if (!validators_->texture_bind_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", target, "target"); - return error::kNoError; - } - if (!validators_->texture_parameter.IsValid(pname)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", pname, "pname"); - return error::kNoError; - } - if (params == NULL) { - return error::kOutOfBounds; - } - DoTexParameterfv(target, pname, params); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleTexParameterfvImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::TexParameterfvImmediate& c) { GLenum target = static_cast<GLenum>(c.target); GLenum pname = static_cast<GLenum>(c.pname); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(1, sizeof(GLfloat), 1, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* params = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); + const GLfloat* params = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (!validators_->texture_bind_target.IsValid(target)) { LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameterfv", target, "target"); return error::kNoError; @@ -1823,7 +1702,8 @@ error::Error GLES2DecoderImpl::HandleTexParameterfvImmediate( } error::Error GLES2DecoderImpl::HandleTexParameteri( - uint32 immediate_data_size, const gles2::cmds::TexParameteri& c) { + uint32_t immediate_data_size, + const gles2::cmds::TexParameteri& c) { GLenum target = static_cast<GLenum>(c.target); GLenum pname = static_cast<GLenum>(c.pname); GLint param = static_cast<GLint>(c.param); @@ -1839,45 +1719,20 @@ error::Error GLES2DecoderImpl::HandleTexParameteri( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleTexParameteriv( - uint32 immediate_data_size, const gles2::cmds::TexParameteriv& c) { - GLenum target = static_cast<GLenum>(c.target); - GLenum pname = static_cast<GLenum>(c.pname); - uint32 data_size; - if (!ComputeDataSize(1, sizeof(GLint), 1, &data_size)) { - return error::kOutOfBounds; - } - const GLint* params = GetSharedMemoryAs<const GLint*>( - c.params_shm_id, c.params_shm_offset, data_size); - if (!validators_->texture_bind_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", target, "target"); - return error::kNoError; - } - if (!validators_->texture_parameter.IsValid(pname)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", pname, "pname"); - return error::kNoError; - } - if (params == NULL) { - return error::kOutOfBounds; - } - DoTexParameteriv(target, pname, params); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleTexParameterivImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::TexParameterivImmediate& c) { GLenum target = static_cast<GLenum>(c.target); GLenum pname = static_cast<GLenum>(c.pname); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(1, sizeof(GLint), 1, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLint* params = GetImmediateDataAs<const GLint*>( - c, data_size, immediate_data_size); + const GLint* params = + GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size); if (!validators_->texture_bind_target.IsValid(target)) { LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexParameteriv", target, "target"); return error::kNoError; @@ -1894,44 +1749,31 @@ error::Error GLES2DecoderImpl::HandleTexParameterivImmediate( } error::Error GLES2DecoderImpl::HandleUniform1f( - uint32 immediate_data_size, const gles2::cmds::Uniform1f& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform1f& c) { GLint location = static_cast<GLint>(c.location); GLfloat x = static_cast<GLfloat>(c.x); - GLfloat temp[1] = { x, }; + GLfloat temp[1] = { + x, + }; DoUniform1fv(location, 1, &temp[0]); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleUniform1fv( - uint32 immediate_data_size, const gles2::cmds::Uniform1fv& c) { - GLint location = static_cast<GLint>(c.location); - GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLfloat), 1, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* v = GetSharedMemoryAs<const GLfloat*>( - c.v_shm_id, c.v_shm_offset, data_size); - if (v == NULL) { - return error::kOutOfBounds; - } - DoUniform1fv(location, count, v); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniform1fvImmediate( - uint32 immediate_data_size, const gles2::cmds::Uniform1fvImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform1fvImmediate& c) { GLint location = static_cast<GLint>(c.location); GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLfloat), 1, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* v = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); + const GLfloat* v = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (v == NULL) { return error::kOutOfBounds; } @@ -1940,43 +1782,28 @@ error::Error GLES2DecoderImpl::HandleUniform1fvImmediate( } error::Error GLES2DecoderImpl::HandleUniform1i( - uint32 immediate_data_size, const gles2::cmds::Uniform1i& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform1i& c) { GLint location = static_cast<GLint>(c.location); GLint x = static_cast<GLint>(c.x); DoUniform1i(location, x); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleUniform1iv( - uint32 immediate_data_size, const gles2::cmds::Uniform1iv& c) { - GLint location = static_cast<GLint>(c.location); - GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLint), 1, &data_size)) { - return error::kOutOfBounds; - } - const GLint* v = GetSharedMemoryAs<const GLint*>( - c.v_shm_id, c.v_shm_offset, data_size); - if (v == NULL) { - return error::kOutOfBounds; - } - DoUniform1iv(location, count, v); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniform1ivImmediate( - uint32 immediate_data_size, const gles2::cmds::Uniform1ivImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform1ivImmediate& c) { GLint location = static_cast<GLint>(c.location); GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLint), 1, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLint* v = GetImmediateDataAs<const GLint*>( - c, data_size, immediate_data_size); + const GLint* v = + GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size); if (v == NULL) { return error::kOutOfBounds; } @@ -1985,45 +1812,32 @@ error::Error GLES2DecoderImpl::HandleUniform1ivImmediate( } error::Error GLES2DecoderImpl::HandleUniform2f( - uint32 immediate_data_size, const gles2::cmds::Uniform2f& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform2f& c) { GLint location = static_cast<GLint>(c.location); GLfloat x = static_cast<GLfloat>(c.x); GLfloat y = static_cast<GLfloat>(c.y); - GLfloat temp[2] = { x, y, }; + GLfloat temp[2] = { + x, y, + }; DoUniform2fv(location, 1, &temp[0]); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleUniform2fv( - uint32 immediate_data_size, const gles2::cmds::Uniform2fv& c) { - GLint location = static_cast<GLint>(c.location); - GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLfloat), 2, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* v = GetSharedMemoryAs<const GLfloat*>( - c.v_shm_id, c.v_shm_offset, data_size); - if (v == NULL) { - return error::kOutOfBounds; - } - DoUniform2fv(location, count, v); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniform2fvImmediate( - uint32 immediate_data_size, const gles2::cmds::Uniform2fvImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform2fvImmediate& c) { GLint location = static_cast<GLint>(c.location); GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLfloat), 2, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* v = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); + const GLfloat* v = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (v == NULL) { return error::kOutOfBounds; } @@ -2032,45 +1846,32 @@ error::Error GLES2DecoderImpl::HandleUniform2fvImmediate( } error::Error GLES2DecoderImpl::HandleUniform2i( - uint32 immediate_data_size, const gles2::cmds::Uniform2i& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform2i& c) { GLint location = static_cast<GLint>(c.location); GLint x = static_cast<GLint>(c.x); GLint y = static_cast<GLint>(c.y); - GLint temp[2] = { x, y, }; + GLint temp[2] = { + x, y, + }; DoUniform2iv(location, 1, &temp[0]); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleUniform2iv( - uint32 immediate_data_size, const gles2::cmds::Uniform2iv& c) { - GLint location = static_cast<GLint>(c.location); - GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLint), 2, &data_size)) { - return error::kOutOfBounds; - } - const GLint* v = GetSharedMemoryAs<const GLint*>( - c.v_shm_id, c.v_shm_offset, data_size); - if (v == NULL) { - return error::kOutOfBounds; - } - DoUniform2iv(location, count, v); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniform2ivImmediate( - uint32 immediate_data_size, const gles2::cmds::Uniform2ivImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform2ivImmediate& c) { GLint location = static_cast<GLint>(c.location); GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLint), 2, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLint* v = GetImmediateDataAs<const GLint*>( - c, data_size, immediate_data_size); + const GLint* v = + GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size); if (v == NULL) { return error::kOutOfBounds; } @@ -2079,46 +1880,33 @@ error::Error GLES2DecoderImpl::HandleUniform2ivImmediate( } error::Error GLES2DecoderImpl::HandleUniform3f( - uint32 immediate_data_size, const gles2::cmds::Uniform3f& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform3f& c) { GLint location = static_cast<GLint>(c.location); GLfloat x = static_cast<GLfloat>(c.x); GLfloat y = static_cast<GLfloat>(c.y); GLfloat z = static_cast<GLfloat>(c.z); - GLfloat temp[3] = { x, y, z, }; + GLfloat temp[3] = { + x, y, z, + }; DoUniform3fv(location, 1, &temp[0]); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleUniform3fv( - uint32 immediate_data_size, const gles2::cmds::Uniform3fv& c) { - GLint location = static_cast<GLint>(c.location); - GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLfloat), 3, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* v = GetSharedMemoryAs<const GLfloat*>( - c.v_shm_id, c.v_shm_offset, data_size); - if (v == NULL) { - return error::kOutOfBounds; - } - DoUniform3fv(location, count, v); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniform3fvImmediate( - uint32 immediate_data_size, const gles2::cmds::Uniform3fvImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform3fvImmediate& c) { GLint location = static_cast<GLint>(c.location); GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLfloat), 3, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* v = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); + const GLfloat* v = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (v == NULL) { return error::kOutOfBounds; } @@ -2127,46 +1915,33 @@ error::Error GLES2DecoderImpl::HandleUniform3fvImmediate( } error::Error GLES2DecoderImpl::HandleUniform3i( - uint32 immediate_data_size, const gles2::cmds::Uniform3i& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform3i& c) { GLint location = static_cast<GLint>(c.location); GLint x = static_cast<GLint>(c.x); GLint y = static_cast<GLint>(c.y); GLint z = static_cast<GLint>(c.z); - GLint temp[3] = { x, y, z, }; + GLint temp[3] = { + x, y, z, + }; DoUniform3iv(location, 1, &temp[0]); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleUniform3iv( - uint32 immediate_data_size, const gles2::cmds::Uniform3iv& c) { - GLint location = static_cast<GLint>(c.location); - GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLint), 3, &data_size)) { - return error::kOutOfBounds; - } - const GLint* v = GetSharedMemoryAs<const GLint*>( - c.v_shm_id, c.v_shm_offset, data_size); - if (v == NULL) { - return error::kOutOfBounds; - } - DoUniform3iv(location, count, v); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniform3ivImmediate( - uint32 immediate_data_size, const gles2::cmds::Uniform3ivImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform3ivImmediate& c) { GLint location = static_cast<GLint>(c.location); GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLint), 3, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLint* v = GetImmediateDataAs<const GLint*>( - c, data_size, immediate_data_size); + const GLint* v = + GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size); if (v == NULL) { return error::kOutOfBounds; } @@ -2175,47 +1950,34 @@ error::Error GLES2DecoderImpl::HandleUniform3ivImmediate( } error::Error GLES2DecoderImpl::HandleUniform4f( - uint32 immediate_data_size, const gles2::cmds::Uniform4f& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform4f& c) { GLint location = static_cast<GLint>(c.location); GLfloat x = static_cast<GLfloat>(c.x); GLfloat y = static_cast<GLfloat>(c.y); GLfloat z = static_cast<GLfloat>(c.z); GLfloat w = static_cast<GLfloat>(c.w); - GLfloat temp[4] = { x, y, z, w, }; + GLfloat temp[4] = { + x, y, z, w, + }; DoUniform4fv(location, 1, &temp[0]); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleUniform4fv( - uint32 immediate_data_size, const gles2::cmds::Uniform4fv& c) { - GLint location = static_cast<GLint>(c.location); - GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLfloat), 4, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* v = GetSharedMemoryAs<const GLfloat*>( - c.v_shm_id, c.v_shm_offset, data_size); - if (v == NULL) { - return error::kOutOfBounds; - } - DoUniform4fv(location, count, v); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniform4fvImmediate( - uint32 immediate_data_size, const gles2::cmds::Uniform4fvImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform4fvImmediate& c) { GLint location = static_cast<GLint>(c.location); GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLfloat), 4, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* v = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); + const GLfloat* v = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (v == NULL) { return error::kOutOfBounds; } @@ -2224,47 +1986,34 @@ error::Error GLES2DecoderImpl::HandleUniform4fvImmediate( } error::Error GLES2DecoderImpl::HandleUniform4i( - uint32 immediate_data_size, const gles2::cmds::Uniform4i& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform4i& c) { GLint location = static_cast<GLint>(c.location); GLint x = static_cast<GLint>(c.x); GLint y = static_cast<GLint>(c.y); GLint z = static_cast<GLint>(c.z); GLint w = static_cast<GLint>(c.w); - GLint temp[4] = { x, y, z, w, }; + GLint temp[4] = { + x, y, z, w, + }; DoUniform4iv(location, 1, &temp[0]); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleUniform4iv( - uint32 immediate_data_size, const gles2::cmds::Uniform4iv& c) { - GLint location = static_cast<GLint>(c.location); - GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLint), 4, &data_size)) { - return error::kOutOfBounds; - } - const GLint* v = GetSharedMemoryAs<const GLint*>( - c.v_shm_id, c.v_shm_offset, data_size); - if (v == NULL) { - return error::kOutOfBounds; - } - DoUniform4iv(location, count, v); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniform4ivImmediate( - uint32 immediate_data_size, const gles2::cmds::Uniform4ivImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::Uniform4ivImmediate& c) { GLint location = static_cast<GLint>(c.location); GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLint), 4, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLint* v = GetImmediateDataAs<const GLint*>( - c, data_size, immediate_data_size); + const GLint* v = + GetImmediateDataAs<const GLint*>(c, data_size, immediate_data_size); if (v == NULL) { return error::kOutOfBounds; } @@ -2272,49 +2021,21 @@ error::Error GLES2DecoderImpl::HandleUniform4ivImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleUniformMatrix2fv( - uint32 immediate_data_size, const gles2::cmds::UniformMatrix2fv& c) { - GLint location = static_cast<GLint>(c.location); - GLsizei count = static_cast<GLsizei>(c.count); - GLboolean transpose = static_cast<GLboolean>(c.transpose); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLfloat), 4, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* value = GetSharedMemoryAs<const GLfloat*>( - c.value_shm_id, c.value_shm_offset, data_size); - if (!validators_->false_only.IsValid(transpose)) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glUniformMatrix2fv", "transpose GL_INVALID_VALUE"); - return error::kNoError; - } - if (value == NULL) { - return error::kOutOfBounds; - } - DoUniformMatrix2fv(location, count, transpose, value); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniformMatrix2fvImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::UniformMatrix2fvImmediate& c) { GLint location = static_cast<GLint>(c.location); GLsizei count = static_cast<GLsizei>(c.count); GLboolean transpose = static_cast<GLboolean>(c.transpose); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLfloat), 4, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* value = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); - if (!validators_->false_only.IsValid(transpose)) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glUniformMatrix2fv", "transpose GL_INVALID_VALUE"); - return error::kNoError; - } + const GLfloat* value = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (value == NULL) { return error::kOutOfBounds; } @@ -2322,49 +2043,21 @@ error::Error GLES2DecoderImpl::HandleUniformMatrix2fvImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleUniformMatrix3fv( - uint32 immediate_data_size, const gles2::cmds::UniformMatrix3fv& c) { - GLint location = static_cast<GLint>(c.location); - GLsizei count = static_cast<GLsizei>(c.count); - GLboolean transpose = static_cast<GLboolean>(c.transpose); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLfloat), 9, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* value = GetSharedMemoryAs<const GLfloat*>( - c.value_shm_id, c.value_shm_offset, data_size); - if (!validators_->false_only.IsValid(transpose)) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glUniformMatrix3fv", "transpose GL_INVALID_VALUE"); - return error::kNoError; - } - if (value == NULL) { - return error::kOutOfBounds; - } - DoUniformMatrix3fv(location, count, transpose, value); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniformMatrix3fvImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::UniformMatrix3fvImmediate& c) { GLint location = static_cast<GLint>(c.location); GLsizei count = static_cast<GLsizei>(c.count); GLboolean transpose = static_cast<GLboolean>(c.transpose); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLfloat), 9, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* value = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); - if (!validators_->false_only.IsValid(transpose)) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glUniformMatrix3fv", "transpose GL_INVALID_VALUE"); - return error::kNoError; - } + const GLfloat* value = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (value == NULL) { return error::kOutOfBounds; } @@ -2372,49 +2065,21 @@ error::Error GLES2DecoderImpl::HandleUniformMatrix3fvImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleUniformMatrix4fv( - uint32 immediate_data_size, const gles2::cmds::UniformMatrix4fv& c) { - GLint location = static_cast<GLint>(c.location); - GLsizei count = static_cast<GLsizei>(c.count); - GLboolean transpose = static_cast<GLboolean>(c.transpose); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLfloat), 16, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* value = GetSharedMemoryAs<const GLfloat*>( - c.value_shm_id, c.value_shm_offset, data_size); - if (!validators_->false_only.IsValid(transpose)) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glUniformMatrix4fv", "transpose GL_INVALID_VALUE"); - return error::kNoError; - } - if (value == NULL) { - return error::kOutOfBounds; - } - DoUniformMatrix4fv(location, count, transpose, value); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleUniformMatrix4fvImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::UniformMatrix4fvImmediate& c) { GLint location = static_cast<GLint>(c.location); GLsizei count = static_cast<GLsizei>(c.count); GLboolean transpose = static_cast<GLboolean>(c.transpose); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLfloat), 16, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* value = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); - if (!validators_->false_only.IsValid(transpose)) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glUniformMatrix4fv", "transpose GL_INVALID_VALUE"); - return error::kNoError; - } + const GLfloat* value = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (value == NULL) { return error::kOutOfBounds; } @@ -2423,56 +2088,43 @@ error::Error GLES2DecoderImpl::HandleUniformMatrix4fvImmediate( } error::Error GLES2DecoderImpl::HandleUseProgram( - uint32 immediate_data_size, const gles2::cmds::UseProgram& c) { + uint32_t immediate_data_size, + const gles2::cmds::UseProgram& c) { GLuint program = c.program; DoUseProgram(program); return error::kNoError; } error::Error GLES2DecoderImpl::HandleValidateProgram( - uint32 immediate_data_size, const gles2::cmds::ValidateProgram& c) { + uint32_t immediate_data_size, + const gles2::cmds::ValidateProgram& c) { GLuint program = c.program; DoValidateProgram(program); return error::kNoError; } error::Error GLES2DecoderImpl::HandleVertexAttrib1f( - uint32 immediate_data_size, const gles2::cmds::VertexAttrib1f& c) { + uint32_t immediate_data_size, + const gles2::cmds::VertexAttrib1f& c) { GLuint indx = static_cast<GLuint>(c.indx); GLfloat x = static_cast<GLfloat>(c.x); DoVertexAttrib1f(indx, x); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleVertexAttrib1fv( - uint32 immediate_data_size, const gles2::cmds::VertexAttrib1fv& c) { - GLuint indx = static_cast<GLuint>(c.indx); - uint32 data_size; - if (!ComputeDataSize(1, sizeof(GLfloat), 1, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* values = GetSharedMemoryAs<const GLfloat*>( - c.values_shm_id, c.values_shm_offset, data_size); - if (values == NULL) { - return error::kOutOfBounds; - } - DoVertexAttrib1fv(indx, values); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleVertexAttrib1fvImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::VertexAttrib1fvImmediate& c) { GLuint indx = static_cast<GLuint>(c.indx); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(1, sizeof(GLfloat), 1, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* values = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); + const GLfloat* values = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (values == NULL) { return error::kOutOfBounds; } @@ -2481,7 +2133,8 @@ error::Error GLES2DecoderImpl::HandleVertexAttrib1fvImmediate( } error::Error GLES2DecoderImpl::HandleVertexAttrib2f( - uint32 immediate_data_size, const gles2::cmds::VertexAttrib2f& c) { + uint32_t immediate_data_size, + const gles2::cmds::VertexAttrib2f& c) { GLuint indx = static_cast<GLuint>(c.indx); GLfloat x = static_cast<GLfloat>(c.x); GLfloat y = static_cast<GLfloat>(c.y); @@ -2489,35 +2142,19 @@ error::Error GLES2DecoderImpl::HandleVertexAttrib2f( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleVertexAttrib2fv( - uint32 immediate_data_size, const gles2::cmds::VertexAttrib2fv& c) { - GLuint indx = static_cast<GLuint>(c.indx); - uint32 data_size; - if (!ComputeDataSize(1, sizeof(GLfloat), 2, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* values = GetSharedMemoryAs<const GLfloat*>( - c.values_shm_id, c.values_shm_offset, data_size); - if (values == NULL) { - return error::kOutOfBounds; - } - DoVertexAttrib2fv(indx, values); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleVertexAttrib2fvImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::VertexAttrib2fvImmediate& c) { GLuint indx = static_cast<GLuint>(c.indx); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(1, sizeof(GLfloat), 2, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* values = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); + const GLfloat* values = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (values == NULL) { return error::kOutOfBounds; } @@ -2526,7 +2163,8 @@ error::Error GLES2DecoderImpl::HandleVertexAttrib2fvImmediate( } error::Error GLES2DecoderImpl::HandleVertexAttrib3f( - uint32 immediate_data_size, const gles2::cmds::VertexAttrib3f& c) { + uint32_t immediate_data_size, + const gles2::cmds::VertexAttrib3f& c) { GLuint indx = static_cast<GLuint>(c.indx); GLfloat x = static_cast<GLfloat>(c.x); GLfloat y = static_cast<GLfloat>(c.y); @@ -2535,35 +2173,19 @@ error::Error GLES2DecoderImpl::HandleVertexAttrib3f( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleVertexAttrib3fv( - uint32 immediate_data_size, const gles2::cmds::VertexAttrib3fv& c) { - GLuint indx = static_cast<GLuint>(c.indx); - uint32 data_size; - if (!ComputeDataSize(1, sizeof(GLfloat), 3, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* values = GetSharedMemoryAs<const GLfloat*>( - c.values_shm_id, c.values_shm_offset, data_size); - if (values == NULL) { - return error::kOutOfBounds; - } - DoVertexAttrib3fv(indx, values); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleVertexAttrib3fvImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::VertexAttrib3fvImmediate& c) { GLuint indx = static_cast<GLuint>(c.indx); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(1, sizeof(GLfloat), 3, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* values = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); + const GLfloat* values = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (values == NULL) { return error::kOutOfBounds; } @@ -2572,7 +2194,8 @@ error::Error GLES2DecoderImpl::HandleVertexAttrib3fvImmediate( } error::Error GLES2DecoderImpl::HandleVertexAttrib4f( - uint32 immediate_data_size, const gles2::cmds::VertexAttrib4f& c) { + uint32_t immediate_data_size, + const gles2::cmds::VertexAttrib4f& c) { GLuint indx = static_cast<GLuint>(c.indx); GLfloat x = static_cast<GLfloat>(c.x); GLfloat y = static_cast<GLfloat>(c.y); @@ -2582,35 +2205,19 @@ error::Error GLES2DecoderImpl::HandleVertexAttrib4f( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleVertexAttrib4fv( - uint32 immediate_data_size, const gles2::cmds::VertexAttrib4fv& c) { - GLuint indx = static_cast<GLuint>(c.indx); - uint32 data_size; - if (!ComputeDataSize(1, sizeof(GLfloat), 4, &data_size)) { - return error::kOutOfBounds; - } - const GLfloat* values = GetSharedMemoryAs<const GLfloat*>( - c.values_shm_id, c.values_shm_offset, data_size); - if (values == NULL) { - return error::kOutOfBounds; - } - DoVertexAttrib4fv(indx, values); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleVertexAttrib4fvImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::VertexAttrib4fvImmediate& c) { GLuint indx = static_cast<GLuint>(c.indx); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(1, sizeof(GLfloat), 4, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLfloat* values = GetImmediateDataAs<const GLfloat*>( - c, data_size, immediate_data_size); + const GLfloat* values = + GetImmediateDataAs<const GLfloat*>(c, data_size, immediate_data_size); if (values == NULL) { return error::kOutOfBounds; } @@ -2618,8 +2225,8 @@ error::Error GLES2DecoderImpl::HandleVertexAttrib4fvImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleViewport( - uint32 immediate_data_size, const gles2::cmds::Viewport& c) { +error::Error GLES2DecoderImpl::HandleViewport(uint32_t immediate_data_size, + const gles2::cmds::Viewport& c) { GLint x = static_cast<GLint>(c.x); GLint y = static_cast<GLint>(c.y); GLsizei width = static_cast<GLsizei>(c.width); @@ -2637,8 +2244,15 @@ error::Error GLES2DecoderImpl::HandleViewport( } error::Error GLES2DecoderImpl::HandleBlitFramebufferCHROMIUM( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::BlitFramebufferCHROMIUM& c) { + if (!features().chromium_framebuffer_multisample) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glBlitFramebufferCHROMIUM", + "function not available"); + return error::kNoError; + } + error::Error error; error = WillAccessBoundFramebufferForDraw(); if (error != error::kNoError) @@ -2657,8 +2271,8 @@ error::Error GLES2DecoderImpl::HandleBlitFramebufferCHROMIUM( GLbitfield mask = static_cast<GLbitfield>(c.mask); GLenum filter = static_cast<GLenum>(c.filter); if (!validators_->blit_filter.IsValid(filter)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glBlitFramebufferCHROMIUM", filter, - "filter"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glBlitFramebufferCHROMIUM", filter, "filter"); return error::kNoError; } DoBlitFramebufferCHROMIUM( @@ -2667,34 +2281,47 @@ error::Error GLES2DecoderImpl::HandleBlitFramebufferCHROMIUM( } error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleCHROMIUM( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::RenderbufferStorageMultisampleCHROMIUM& c) { + if (!features().chromium_framebuffer_multisample) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glRenderbufferStorageMultisampleCHROMIUM", + "function not available"); + return error::kNoError; + } + GLenum target = static_cast<GLenum>(c.target); GLsizei samples = static_cast<GLsizei>(c.samples); GLenum internalformat = static_cast<GLenum>(c.internalformat); GLsizei width = static_cast<GLsizei>(c.width); GLsizei height = static_cast<GLsizei>(c.height); if (!validators_->render_buffer_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleCHROMIUM", target, "target"); // NOLINT + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glRenderbufferStorageMultisampleCHROMIUM", target, "target"); return error::kNoError; } if (samples < 0) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glRenderbufferStorageMultisampleCHROMIUM", "samples < 0"); // NOLINT + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, + "glRenderbufferStorageMultisampleCHROMIUM", + "samples < 0"); return error::kNoError; } if (!validators_->render_buffer_format.IsValid(internalformat)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleCHROMIUM", internalformat, "internalformat"); // NOLINT + LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleCHROMIUM", + internalformat, + "internalformat"); return error::kNoError; } if (width < 0) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glRenderbufferStorageMultisampleCHROMIUM", "width < 0"); // NOLINT + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, + "glRenderbufferStorageMultisampleCHROMIUM", + "width < 0"); return error::kNoError; } if (height < 0) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glRenderbufferStorageMultisampleCHROMIUM", "height < 0"); // NOLINT + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, + "glRenderbufferStorageMultisampleCHROMIUM", + "height < 0"); return error::kNoError; } DoRenderbufferStorageMultisampleCHROMIUM( @@ -2703,15 +2330,23 @@ error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleCHROMIUM( } error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleEXT( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::RenderbufferStorageMultisampleEXT& c) { + if (!features().multisampled_render_to_texture) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glRenderbufferStorageMultisampleEXT", + "function not available"); + return error::kNoError; + } + GLenum target = static_cast<GLenum>(c.target); GLsizei samples = static_cast<GLsizei>(c.samples); GLenum internalformat = static_cast<GLenum>(c.internalformat); GLsizei width = static_cast<GLsizei>(c.width); GLsizei height = static_cast<GLsizei>(c.height); if (!validators_->render_buffer_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleEXT", target, "target"); // NOLINT + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glRenderbufferStorageMultisampleEXT", target, "target"); return error::kNoError; } if (samples < 0) { @@ -2720,7 +2355,9 @@ error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleEXT( return error::kNoError; } if (!validators_->render_buffer_format.IsValid(internalformat)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleEXT", internalformat, "internalformat"); // NOLINT + LOCAL_SET_GL_ERROR_INVALID_ENUM("glRenderbufferStorageMultisampleEXT", + internalformat, + "internalformat"); return error::kNoError; } if (width < 0) { @@ -2739,8 +2376,15 @@ error::Error GLES2DecoderImpl::HandleRenderbufferStorageMultisampleEXT( } error::Error GLES2DecoderImpl::HandleFramebufferTexture2DMultisampleEXT( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::FramebufferTexture2DMultisampleEXT& c) { + if (!features().multisampled_render_to_texture) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glFramebufferTexture2DMultisampleEXT", + "function not available"); + return error::kNoError; + } + GLenum target = static_cast<GLenum>(c.target); GLenum attachment = static_cast<GLenum>(c.attachment); GLenum textarget = static_cast<GLenum>(c.textarget); @@ -2748,25 +2392,24 @@ error::Error GLES2DecoderImpl::HandleFramebufferTexture2DMultisampleEXT( GLint level = static_cast<GLint>(c.level); GLsizei samples = static_cast<GLsizei>(c.samples); if (!validators_->frame_buffer_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT", target, "target"); // NOLINT + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glFramebufferTexture2DMultisampleEXT", target, "target"); return error::kNoError; } if (!validators_->attachment.IsValid(attachment)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT", attachment, "attachment"); // NOLINT + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glFramebufferTexture2DMultisampleEXT", attachment, "attachment"); return error::kNoError; } if (!validators_->texture_target.IsValid(textarget)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glFramebufferTexture2DMultisampleEXT", textarget, "textarget"); // NOLINT - return error::kNoError; - } - if (!validators_->zero_only.IsValid(level)) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glFramebufferTexture2DMultisampleEXT", "level GL_INVALID_VALUE"); // NOLINT + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glFramebufferTexture2DMultisampleEXT", textarget, "textarget"); return error::kNoError; } if (samples < 0) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glFramebufferTexture2DMultisampleEXT", "samples < 0"); // NOLINT + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, + "glFramebufferTexture2DMultisampleEXT", + "samples < 0"); return error::kNoError; } DoFramebufferTexture2DMultisample( @@ -2775,7 +2418,8 @@ error::Error GLES2DecoderImpl::HandleFramebufferTexture2DMultisampleEXT( } error::Error GLES2DecoderImpl::HandleTexStorage2DEXT( - uint32 immediate_data_size, const gles2::cmds::TexStorage2DEXT& c) { + uint32_t immediate_data_size, + const gles2::cmds::TexStorage2DEXT& c) { GLenum target = static_cast<GLenum>(c.target); GLsizei levels = static_cast<GLsizei>(c.levels); GLenum internalFormat = static_cast<GLenum>(c.internalFormat); @@ -2790,8 +2434,8 @@ error::Error GLES2DecoderImpl::HandleTexStorage2DEXT( return error::kNoError; } if (!validators_->texture_internal_format_storage.IsValid(internalFormat)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexStorage2DEXT", internalFormat, - "internalFormat"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glTexStorage2DEXT", internalFormat, "internalFormat"); return error::kNoError; } if (width < 0) { @@ -2806,33 +2450,16 @@ error::Error GLES2DecoderImpl::HandleTexStorage2DEXT( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleGenQueriesEXT( - uint32 immediate_data_size, const gles2::cmds::GenQueriesEXT& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - GLuint* queries = GetSharedMemoryAs<GLuint*>( - c.queries_shm_id, c.queries_shm_offset, data_size); - if (queries == NULL) { - return error::kOutOfBounds; - } - if (!GenQueriesEXTHelper(n, queries)) { - return error::kInvalidArguments; - } - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleGenQueriesEXTImmediate( - uint32 immediate_data_size, const gles2::cmds::GenQueriesEXTImmediate& c) { + uint32_t immediate_data_size, + const gles2::cmds::GenQueriesEXTImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - GLuint* queries = GetImmediateDataAs<GLuint*>( - c, data_size, immediate_data_size); + GLuint* queries = + GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size); if (queries == NULL) { return error::kOutOfBounds; } @@ -2842,32 +2469,16 @@ error::Error GLES2DecoderImpl::HandleGenQueriesEXTImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleDeleteQueriesEXT( - uint32 immediate_data_size, const gles2::cmds::DeleteQueriesEXT& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - const GLuint* queries = GetSharedMemoryAs<const GLuint*>( - c.queries_shm_id, c.queries_shm_offset, data_size); - if (queries == NULL) { - return error::kOutOfBounds; - } - DeleteQueriesEXTHelper(n, queries); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleDeleteQueriesEXTImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::DeleteQueriesEXTImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - const GLuint* queries = GetImmediateDataAs<const GLuint*>( - c, data_size, immediate_data_size); + const GLuint* queries = + GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size); if (queries == NULL) { return error::kOutOfBounds; } @@ -2876,7 +2487,8 @@ error::Error GLES2DecoderImpl::HandleDeleteQueriesEXTImmediate( } error::Error GLES2DecoderImpl::HandleInsertEventMarkerEXT( - uint32 immediate_data_size, const gles2::cmds::InsertEventMarkerEXT& c) { + uint32_t immediate_data_size, + const gles2::cmds::InsertEventMarkerEXT& c) { GLuint bucket_id = static_cast<GLuint>(c.bucket_id); Bucket* bucket = GetBucket(bucket_id); if (!bucket || bucket->size() == 0) { @@ -2891,7 +2503,8 @@ error::Error GLES2DecoderImpl::HandleInsertEventMarkerEXT( } error::Error GLES2DecoderImpl::HandlePushGroupMarkerEXT( - uint32 immediate_data_size, const gles2::cmds::PushGroupMarkerEXT& c) { + uint32_t immediate_data_size, + const gles2::cmds::PushGroupMarkerEXT& c) { GLuint bucket_id = static_cast<GLuint>(c.bucket_id); Bucket* bucket = GetBucket(bucket_id); if (!bucket || bucket->size() == 0) { @@ -2906,39 +2519,22 @@ error::Error GLES2DecoderImpl::HandlePushGroupMarkerEXT( } error::Error GLES2DecoderImpl::HandlePopGroupMarkerEXT( - uint32 immediate_data_size, const gles2::cmds::PopGroupMarkerEXT& c) { + uint32_t immediate_data_size, + const gles2::cmds::PopGroupMarkerEXT& c) { DoPopGroupMarkerEXT(); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleGenVertexArraysOES( - uint32 immediate_data_size, const gles2::cmds::GenVertexArraysOES& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - GLuint* arrays = GetSharedMemoryAs<GLuint*>( - c.arrays_shm_id, c.arrays_shm_offset, data_size); - if (arrays == NULL) { - return error::kOutOfBounds; - } - if (!GenVertexArraysOESHelper(n, arrays)) { - return error::kInvalidArguments; - } - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleGenVertexArraysOESImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::GenVertexArraysOESImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - GLuint* arrays = GetImmediateDataAs<GLuint*>( - c, data_size, immediate_data_size); + GLuint* arrays = + GetImmediateDataAs<GLuint*>(c, data_size, immediate_data_size); if (arrays == NULL) { return error::kOutOfBounds; } @@ -2948,32 +2544,16 @@ error::Error GLES2DecoderImpl::HandleGenVertexArraysOESImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleDeleteVertexArraysOES( - uint32 immediate_data_size, const gles2::cmds::DeleteVertexArraysOES& c) { - GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; - if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { - return error::kOutOfBounds; - } - const GLuint* arrays = GetSharedMemoryAs<const GLuint*>( - c.arrays_shm_id, c.arrays_shm_offset, data_size); - if (arrays == NULL) { - return error::kOutOfBounds; - } - DeleteVertexArraysOESHelper(n, arrays); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleDeleteVertexArraysOESImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::DeleteVertexArraysOESImmediate& c) { GLsizei n = static_cast<GLsizei>(c.n); - uint32 data_size; + uint32_t data_size; if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { return error::kOutOfBounds; } - const GLuint* arrays = GetImmediateDataAs<const GLuint*>( - c, data_size, immediate_data_size); + const GLuint* arrays = + GetImmediateDataAs<const GLuint*>(c, data_size, immediate_data_size); if (arrays == NULL) { return error::kOutOfBounds; } @@ -2982,7 +2562,8 @@ error::Error GLES2DecoderImpl::HandleDeleteVertexArraysOESImmediate( } error::Error GLES2DecoderImpl::HandleIsVertexArrayOES( - uint32 immediate_data_size, const gles2::cmds::IsVertexArrayOES& c) { + uint32_t immediate_data_size, + const gles2::cmds::IsVertexArrayOES& c) { GLuint array = c.array; typedef cmds::IsVertexArrayOES::Result Result; Result* result_dst = GetSharedMemoryAs<Result*>( @@ -2995,20 +2576,22 @@ error::Error GLES2DecoderImpl::HandleIsVertexArrayOES( } error::Error GLES2DecoderImpl::HandleBindVertexArrayOES( - uint32 immediate_data_size, const gles2::cmds::BindVertexArrayOES& c) { + uint32_t immediate_data_size, + const gles2::cmds::BindVertexArrayOES& c) { GLuint array = c.array; DoBindVertexArrayOES(array); return error::kNoError; } error::Error GLES2DecoderImpl::HandleSwapBuffers( - uint32 immediate_data_size, const gles2::cmds::SwapBuffers& c) { + uint32_t immediate_data_size, + const gles2::cmds::SwapBuffers& c) { DoSwapBuffers(); return error::kNoError; } error::Error GLES2DecoderImpl::HandleGetMaxValueInBufferCHROMIUM( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::GetMaxValueInBufferCHROMIUM& c) { GLuint buffer_id = c.buffer_id; GLsizei count = static_cast<GLsizei>(c.count); @@ -3026,8 +2609,8 @@ error::Error GLES2DecoderImpl::HandleGetMaxValueInBufferCHROMIUM( return error::kNoError; } if (!validators_->get_max_index_type.IsValid(type)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetMaxValueInBufferCHROMIUM", type, - "type"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glGetMaxValueInBufferCHROMIUM", type, "type"); return error::kNoError; } *result_dst = DoGetMaxValueInBufferCHROMIUM(buffer_id, count, type, offset); @@ -3035,7 +2618,7 @@ error::Error GLES2DecoderImpl::HandleGetMaxValueInBufferCHROMIUM( } error::Error GLES2DecoderImpl::HandleTexImageIOSurface2DCHROMIUM( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::TexImageIOSurface2DCHROMIUM& c) { GLenum target = static_cast<GLenum>(c.target); GLsizei width = static_cast<GLsizei>(c.width); @@ -3043,8 +2626,8 @@ error::Error GLES2DecoderImpl::HandleTexImageIOSurface2DCHROMIUM( GLuint ioSurfaceId = static_cast<GLuint>(c.ioSurfaceId); GLuint plane = static_cast<GLuint>(c.plane); if (!validators_->texture_bind_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glTexImageIOSurface2DCHROMIUM", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glTexImageIOSurface2DCHROMIUM", target, "target"); return error::kNoError; } if (width < 0) { @@ -3062,7 +2645,8 @@ error::Error GLES2DecoderImpl::HandleTexImageIOSurface2DCHROMIUM( } error::Error GLES2DecoderImpl::HandleCopyTextureCHROMIUM( - uint32 immediate_data_size, const gles2::cmds::CopyTextureCHROMIUM& c) { + uint32_t immediate_data_size, + const gles2::cmds::CopyTextureCHROMIUM& c) { GLenum target = static_cast<GLenum>(c.target); GLenum source_id = static_cast<GLenum>(c.source_id); GLenum dest_id = static_cast<GLenum>(c.dest_id); @@ -3070,13 +2654,14 @@ error::Error GLES2DecoderImpl::HandleCopyTextureCHROMIUM( GLint internalformat = static_cast<GLint>(c.internalformat); GLenum dest_type = static_cast<GLenum>(c.dest_type); if (!validators_->texture_internal_format.IsValid(internalformat)) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glCopyTextureCHROMIUM", "internalformat GL_INVALID_VALUE"); // NOLINT + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, + "glCopyTextureCHROMIUM", + "internalformat GL_INVALID_VALUE"); return error::kNoError; } if (!validators_->pixel_type.IsValid(dest_type)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glCopyTextureCHROMIUM", dest_type, - "dest_type"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glCopyTextureCHROMIUM", dest_type, "dest_type"); return error::kNoError; } DoCopyTextureCHROMIUM( @@ -3084,43 +2669,22 @@ error::Error GLES2DecoderImpl::HandleCopyTextureCHROMIUM( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleProduceTextureCHROMIUM( - uint32 immediate_data_size, const gles2::cmds::ProduceTextureCHROMIUM& c) { - GLenum target = static_cast<GLenum>(c.target); - uint32 data_size; - if (!ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) { - return error::kOutOfBounds; - } - const GLbyte* mailbox = GetSharedMemoryAs<const GLbyte*>( - c.mailbox_shm_id, c.mailbox_shm_offset, data_size); - if (!validators_->texture_bind_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glProduceTextureCHROMIUM", target, - "target"); - return error::kNoError; - } - if (mailbox == NULL) { - return error::kOutOfBounds; - } - DoProduceTextureCHROMIUM(target, mailbox); - return error::kNoError; -} - error::Error GLES2DecoderImpl::HandleProduceTextureCHROMIUMImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::ProduceTextureCHROMIUMImmediate& c) { GLenum target = static_cast<GLenum>(c.target); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLbyte* mailbox = GetImmediateDataAs<const GLbyte*>( - c, data_size, immediate_data_size); + const GLbyte* mailbox = + GetImmediateDataAs<const GLbyte*>(c, data_size, immediate_data_size); if (!validators_->texture_bind_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glProduceTextureCHROMIUM", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glProduceTextureCHROMIUM", target, "target"); return error::kNoError; } if (mailbox == NULL) { @@ -3130,43 +2694,48 @@ error::Error GLES2DecoderImpl::HandleProduceTextureCHROMIUMImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleConsumeTextureCHROMIUM( - uint32 immediate_data_size, const gles2::cmds::ConsumeTextureCHROMIUM& c) { +error::Error GLES2DecoderImpl::HandleProduceTextureDirectCHROMIUMImmediate( + uint32_t immediate_data_size, + const gles2::cmds::ProduceTextureDirectCHROMIUMImmediate& c) { + GLuint texture = c.texture; GLenum target = static_cast<GLenum>(c.target); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) { return error::kOutOfBounds; } - const GLbyte* mailbox = GetSharedMemoryAs<const GLbyte*>( - c.mailbox_shm_id, c.mailbox_shm_offset, data_size); + if (data_size > immediate_data_size) { + return error::kOutOfBounds; + } + const GLbyte* mailbox = + GetImmediateDataAs<const GLbyte*>(c, data_size, immediate_data_size); if (!validators_->texture_bind_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glConsumeTextureCHROMIUM", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glProduceTextureDirectCHROMIUM", target, "target"); return error::kNoError; } if (mailbox == NULL) { return error::kOutOfBounds; } - DoConsumeTextureCHROMIUM(target, mailbox); + DoProduceTextureDirectCHROMIUM(texture, target, mailbox); return error::kNoError; } error::Error GLES2DecoderImpl::HandleConsumeTextureCHROMIUMImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::ConsumeTextureCHROMIUMImmediate& c) { GLenum target = static_cast<GLenum>(c.target); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(1, sizeof(GLbyte), 64, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLbyte* mailbox = GetImmediateDataAs<const GLbyte*>( - c, data_size, immediate_data_size); + const GLbyte* mailbox = + GetImmediateDataAs<const GLbyte*>(c, data_size, immediate_data_size); if (!validators_->texture_bind_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glConsumeTextureCHROMIUM", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glConsumeTextureCHROMIUM", target, "target"); return error::kNoError; } if (mailbox == NULL) { @@ -3177,12 +2746,13 @@ error::Error GLES2DecoderImpl::HandleConsumeTextureCHROMIUMImmediate( } error::Error GLES2DecoderImpl::HandleBindTexImage2DCHROMIUM( - uint32 immediate_data_size, const gles2::cmds::BindTexImage2DCHROMIUM& c) { + uint32_t immediate_data_size, + const gles2::cmds::BindTexImage2DCHROMIUM& c) { GLenum target = static_cast<GLenum>(c.target); GLint imageId = static_cast<GLint>(c.imageId); if (!validators_->texture_bind_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTexImage2DCHROMIUM", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glBindTexImage2DCHROMIUM", target, "target"); return error::kNoError; } DoBindTexImage2DCHROMIUM(target, imageId); @@ -3190,13 +2760,13 @@ error::Error GLES2DecoderImpl::HandleBindTexImage2DCHROMIUM( } error::Error GLES2DecoderImpl::HandleReleaseTexImage2DCHROMIUM( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::ReleaseTexImage2DCHROMIUM& c) { GLenum target = static_cast<GLenum>(c.target); GLint imageId = static_cast<GLint>(c.imageId); if (!validators_->texture_bind_target.IsValid(target)) { - LOCAL_SET_GL_ERROR_INVALID_ENUM("glReleaseTexImage2DCHROMIUM", target, - "target"); + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glReleaseTexImage2DCHROMIUM", target, "target"); return error::kNoError; } DoReleaseTexImage2DCHROMIUM(target, imageId); @@ -3204,47 +2774,33 @@ error::Error GLES2DecoderImpl::HandleReleaseTexImage2DCHROMIUM( } error::Error GLES2DecoderImpl::HandleTraceEndCHROMIUM( - uint32 immediate_data_size, const gles2::cmds::TraceEndCHROMIUM& c) { + uint32_t immediate_data_size, + const gles2::cmds::TraceEndCHROMIUM& c) { DoTraceEndCHROMIUM(); return error::kNoError; } -error::Error GLES2DecoderImpl::HandleDiscardFramebufferEXT( - uint32 immediate_data_size, const gles2::cmds::DiscardFramebufferEXT& c) { - GLenum target = static_cast<GLenum>(c.target); - GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLenum), 1, &data_size)) { - return error::kOutOfBounds; - } - const GLenum* attachments = GetSharedMemoryAs<const GLenum*>( - c.attachments_shm_id, c.attachments_shm_offset, data_size); - if (count < 0) { - LOCAL_SET_GL_ERROR( - GL_INVALID_VALUE, "glDiscardFramebufferEXT", "count < 0"); +error::Error GLES2DecoderImpl::HandleDiscardFramebufferEXTImmediate( + uint32_t immediate_data_size, + const gles2::cmds::DiscardFramebufferEXTImmediate& c) { + if (!features().ext_discard_framebuffer) { + LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, + "glDiscardFramebufferEXT", + "function not available"); return error::kNoError; } - if (attachments == NULL) { - return error::kOutOfBounds; - } - DoDiscardFramebufferEXT(target, count, attachments); - return error::kNoError; -} -error::Error GLES2DecoderImpl::HandleDiscardFramebufferEXTImmediate( - uint32 immediate_data_size, - const gles2::cmds::DiscardFramebufferEXTImmediate& c) { GLenum target = static_cast<GLenum>(c.target); GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLenum), 1, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLenum* attachments = GetImmediateDataAs<const GLenum*>( - c, data_size, immediate_data_size); + const GLenum* attachments = + GetImmediateDataAs<const GLenum*>(c, data_size, immediate_data_size); if (count < 0) { LOCAL_SET_GL_ERROR( GL_INVALID_VALUE, "glDiscardFramebufferEXT", "count < 0"); @@ -3257,39 +2813,37 @@ error::Error GLES2DecoderImpl::HandleDiscardFramebufferEXTImmediate( return error::kNoError; } -error::Error GLES2DecoderImpl::HandleDrawBuffersEXT( - uint32 immediate_data_size, const gles2::cmds::DrawBuffersEXT& c) { - GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; - if (!ComputeDataSize(count, sizeof(GLenum), 1, &data_size)) { - return error::kOutOfBounds; - } - const GLenum* bufs = GetSharedMemoryAs<const GLenum*>( - c.bufs_shm_id, c.bufs_shm_offset, data_size); - if (count < 0) { - LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glDrawBuffersEXT", "count < 0"); +error::Error GLES2DecoderImpl::HandleLoseContextCHROMIUM( + uint32_t immediate_data_size, + const gles2::cmds::LoseContextCHROMIUM& c) { + GLenum current = static_cast<GLenum>(c.current); + GLenum other = static_cast<GLenum>(c.other); + if (!validators_->reset_status.IsValid(current)) { + LOCAL_SET_GL_ERROR_INVALID_ENUM( + "glLoseContextCHROMIUM", current, "current"); return error::kNoError; } - if (bufs == NULL) { - return error::kOutOfBounds; + if (!validators_->reset_status.IsValid(other)) { + LOCAL_SET_GL_ERROR_INVALID_ENUM("glLoseContextCHROMIUM", other, "other"); + return error::kNoError; } - DoDrawBuffersEXT(count, bufs); + DoLoseContextCHROMIUM(current, other); return error::kNoError; } error::Error GLES2DecoderImpl::HandleDrawBuffersEXTImmediate( - uint32 immediate_data_size, + uint32_t immediate_data_size, const gles2::cmds::DrawBuffersEXTImmediate& c) { GLsizei count = static_cast<GLsizei>(c.count); - uint32 data_size; + uint32_t data_size; if (!ComputeDataSize(count, sizeof(GLenum), 1, &data_size)) { return error::kOutOfBounds; } if (data_size > immediate_data_size) { return error::kOutOfBounds; } - const GLenum* bufs = GetImmediateDataAs<const GLenum*>( - c, data_size, immediate_data_size); + const GLenum* bufs = + GetImmediateDataAs<const GLenum*>(c, data_size, immediate_data_size); if (count < 0) { LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glDrawBuffersEXT", "count < 0"); return error::kNoError; @@ -3301,42 +2855,75 @@ error::Error GLES2DecoderImpl::HandleDrawBuffersEXTImmediate( return error::kNoError; } - bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) { switch (cap) { case GL_BLEND: state_.enable_flags.blend = enabled; - return true; + if (state_.enable_flags.cached_blend != enabled || + state_.ignore_cached_state) { + state_.enable_flags.cached_blend = enabled; + return true; + } + return false; case GL_CULL_FACE: state_.enable_flags.cull_face = enabled; - return true; + if (state_.enable_flags.cached_cull_face != enabled || + state_.ignore_cached_state) { + state_.enable_flags.cached_cull_face = enabled; + return true; + } + return false; case GL_DEPTH_TEST: - if (state_.enable_flags.depth_test != enabled) { - state_.enable_flags.depth_test = enabled; + state_.enable_flags.depth_test = enabled; + if (state_.enable_flags.cached_depth_test != enabled || + state_.ignore_cached_state) { framebuffer_state_.clear_state_dirty = true; } return false; case GL_DITHER: state_.enable_flags.dither = enabled; - return true; + if (state_.enable_flags.cached_dither != enabled || + state_.ignore_cached_state) { + state_.enable_flags.cached_dither = enabled; + return true; + } + return false; case GL_POLYGON_OFFSET_FILL: state_.enable_flags.polygon_offset_fill = enabled; - return true; + if (state_.enable_flags.cached_polygon_offset_fill != enabled || + state_.ignore_cached_state) { + state_.enable_flags.cached_polygon_offset_fill = enabled; + return true; + } + return false; case GL_SAMPLE_ALPHA_TO_COVERAGE: state_.enable_flags.sample_alpha_to_coverage = enabled; - return true; + if (state_.enable_flags.cached_sample_alpha_to_coverage != enabled || + state_.ignore_cached_state) { + state_.enable_flags.cached_sample_alpha_to_coverage = enabled; + return true; + } + return false; case GL_SAMPLE_COVERAGE: state_.enable_flags.sample_coverage = enabled; - return true; + if (state_.enable_flags.cached_sample_coverage != enabled || + state_.ignore_cached_state) { + state_.enable_flags.cached_sample_coverage = enabled; + return true; + } + return false; case GL_SCISSOR_TEST: - if (state_.enable_flags.scissor_test != enabled) { - state_.enable_flags.scissor_test = enabled; - framebuffer_state_.clear_state_dirty = true; + state_.enable_flags.scissor_test = enabled; + if (state_.enable_flags.cached_scissor_test != enabled || + state_.ignore_cached_state) { + state_.enable_flags.cached_scissor_test = enabled; + return true; } return false; case GL_STENCIL_TEST: - if (state_.enable_flags.stencil_test != enabled) { - state_.enable_flags.stencil_test = enabled; + state_.enable_flags.stencil_test = enabled; + if (state_.enable_flags.cached_stencil_test != enabled || + state_.ignore_cached_state) { framebuffer_state_.clear_state_dirty = true; } return false; @@ -3346,4 +2933,3 @@ bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) { } } #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_mock.h b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_mock.h index f52c2217040..94bf3aa27f8 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_mock.h +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_mock.h @@ -21,13 +21,12 @@ class GLSurface; } namespace gpu { -class StreamTextureManager; - namespace gles2 { class ContextGroup; class ErrorState; class QueryManager; +struct ContextState; class MockGLES2Decoder : public GLES2Decoder { public: @@ -43,23 +42,25 @@ class MockGLES2Decoder : public GLES2Decoder { const std::vector<int32>& attribs)); MOCK_METHOD1(Destroy, void(bool have_context)); MOCK_METHOD1(SetSurface, void(const scoped_refptr<gfx::GLSurface>& surface)); - MOCK_METHOD1(ProduceFrontBuffer, bool(const Mailbox& mailbox)); + MOCK_METHOD1(ProduceFrontBuffer, void(const Mailbox& mailbox)); MOCK_METHOD1(ResizeOffscreenFrameBuffer, bool(const gfx::Size& size)); MOCK_METHOD0(MakeCurrent, bool()); - MOCK_METHOD0(ReleaseCurrent, void()); MOCK_METHOD1(GetServiceIdForTesting, uint32(uint32 client_id)); MOCK_METHOD0(GetGLES2Util, GLES2Util*()); MOCK_METHOD0(GetGLSurface, gfx::GLSurface*()); MOCK_METHOD0(GetGLContext, gfx::GLContext*()); MOCK_METHOD0(GetContextGroup, ContextGroup*()); + MOCK_METHOD0(GetContextState, const ContextState*()); MOCK_METHOD0(GetCapabilities, Capabilities()); MOCK_METHOD0(ProcessPendingQueries, bool()); MOCK_METHOD0(HasMoreIdleWork, bool()); MOCK_METHOD0(PerformIdleWork, void()); - MOCK_CONST_METHOD0(RestoreState, void()); + MOCK_CONST_METHOD1(RestoreState, void(const ContextState* prev_state)); MOCK_CONST_METHOD0(RestoreActiveTexture, void()); - MOCK_CONST_METHOD0(RestoreAllTextureUnitBindings, void()); - MOCK_CONST_METHOD1(RestoreAttribute, void(unsigned index)); + MOCK_CONST_METHOD1( + RestoreAllTextureUnitBindings, void(const ContextState* state)); + MOCK_CONST_METHOD1( + RestoreActiveTextureUnitBinding, void(unsigned int target)); MOCK_CONST_METHOD0(RestoreBufferBindings, void()); MOCK_CONST_METHOD0(RestoreFramebufferBindings, void()); MOCK_CONST_METHOD0(RestoreGlobalState, void()); @@ -67,6 +68,8 @@ class MockGLES2Decoder : public GLES2Decoder { MOCK_CONST_METHOD0(RestoreRenderbufferBindings, void()); MOCK_CONST_METHOD1(RestoreTextureState, void(unsigned service_id)); MOCK_CONST_METHOD1(RestoreTextureUnitBindings, void(unsigned unit)); + MOCK_CONST_METHOD0(ClearAllAttributes, void()); + MOCK_CONST_METHOD0(RestoreAllAttributes, void()); MOCK_METHOD0(GetQueryManager, gpu::gles2::QueryManager*()); MOCK_METHOD0(GetVertexArrayManager, gpu::gles2::VertexArrayManager*()); MOCK_METHOD1( @@ -78,6 +81,7 @@ class MockGLES2Decoder : public GLES2Decoder { MOCK_METHOD0(ResetAsyncPixelTransferManagerForTest, void()); MOCK_METHOD1(SetAsyncPixelTransferManagerForTest, void(AsyncPixelTransferManager*)); + MOCK_METHOD1(SetIgnoreCachedStateForTest, void(bool ignore)); MOCK_METHOD3(DoCommand, error::Error(unsigned int command, unsigned int arg_count, const void* cmd_data)); @@ -85,11 +89,12 @@ class MockGLES2Decoder : public GLES2Decoder { uint32* service_texture_id)); MOCK_METHOD0(GetContextLostReason, error::ContextLostReason()); MOCK_CONST_METHOD1(GetCommandName, const char*(unsigned int command_id)); - MOCK_METHOD9(ClearLevel, bool( + MOCK_METHOD10(ClearLevel, bool( unsigned service_id, unsigned bind_target, unsigned target, int level, + unsigned internal_format, unsigned format, unsigned type, int width, diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc index ec8ff6ccb2f..f97a6dc5b95 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "gpu/command_buffer/service/gles2_cmd_decoder.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" #include "base/command_line.h" #include "base/strings/string_number_conversions.h" @@ -14,15 +14,14 @@ #include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" #include "gpu/command_buffer/service/cmd_buffer_engine.h" #include "gpu/command_buffer/service/context_group.h" +#include "gpu/command_buffer/service/context_state.h" #include "gpu/command_buffer/service/gl_surface_mock.h" -#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" #include "gpu/command_buffer/service/gpu_switches.h" #include "gpu/command_buffer/service/image_manager.h" #include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/mocks.h" #include "gpu/command_buffer/service/program_manager.h" -#include "gpu/command_buffer/service/stream_texture_manager_mock.h" -#include "gpu/command_buffer/service/stream_texture_mock.h" #include "gpu/command_buffer/service/test_helper.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_implementation.h" @@ -36,10 +35,12 @@ using ::gfx::MockGLInterface; using ::testing::_; +using ::testing::AtLeast; using ::testing::DoAll; using ::testing::InSequence; using ::testing::Invoke; using ::testing::MatcherCast; +using ::testing::Mock; using ::testing::Pointee; using ::testing::Return; using ::testing::SaveArg; @@ -54,1592 +55,58 @@ namespace gles2 { using namespace cmds; -class GLES2DecoderTest : public GLES2DecoderTestBase { - public: - GLES2DecoderTest() { } - - protected: - void CheckReadPixelsOutOfRange( - GLint in_read_x, GLint in_read_y, - GLsizei in_read_width, GLsizei in_read_height, - bool init); -}; - -class GLES2DecoderTestWithExtensions - : public GLES2DecoderTest, - public ::testing::WithParamInterface<const char*> { - public: - GLES2DecoderTestWithExtensions() {} - - virtual void SetUp() { - InitDecoder(GetParam(), // extensions - true, // has alpha - true, // has depth - false, // has stencil - true, // request alpha - true, // request depth - false, // request stencil - false); // bind generates resource - } -}; - -class GLES2DecoderWithShaderTest : public GLES2DecoderWithShaderTestBase { - public: - GLES2DecoderWithShaderTest() - : GLES2DecoderWithShaderTestBase() { - } - - void CheckTextureChangesMarkFBOAsNotComplete(bool bound_fbo); - void CheckRenderbufferChangesMarkFBOAsNotComplete(bool bound_fbo); -}; - -class GLES2DecoderGeometryInstancingTest : public GLES2DecoderWithShaderTest { - public: - GLES2DecoderGeometryInstancingTest() - : GLES2DecoderWithShaderTest() { - } - - virtual void SetUp() { - InitDecoder( - "GL_ANGLE_instanced_arrays", // extensions - true, // has alpha - true, // has depth - false, // has stencil - true, // request alpha - true, // request depth - false, // request stencil - true); // bind generates resource - SetupDefaultProgram(); - } -}; - -class GLES2DecoderRGBBackbufferTest : public GLES2DecoderWithShaderTest { - public: - GLES2DecoderRGBBackbufferTest() { } - - virtual void SetUp() { - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - SetupDefaultProgram(); - } -}; - -class GLES2DecoderManualInitTest : public GLES2DecoderWithShaderTest { - public: - GLES2DecoderManualInitTest() { } - - // Override default setup so nothing gets setup. - virtual void SetUp() { - } -}; - -TEST_F(GLES2DecoderWithShaderTest, DrawArraysNoAttributesSucceeds) { - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDefaultDirtyState(); - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -// Tests when the math overflows (0x40000000 * sizeof GLfloat) -TEST_F(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0OverflowFails) { - const GLsizei kLargeCount = 0x40000000; - SetupTexture(); - EXPECT_CALL(*gl_, DrawArrays(_, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kLargeCount); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); -} - -// Tests when the math overflows (0x7FFFFFFF + 1 = 0x8000000 verts) -TEST_F(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0PosToNegFails) { - const GLsizei kLargeCount = 0x7FFFFFFF; - SetupTexture(); - EXPECT_CALL(*gl_, DrawArrays(_, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kLargeCount); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); +void GLES2DecoderRGBBackbufferTest::SetUp() { + // Test codepath with workaround clear_alpha_in_readpixels because + // ReadPixelsEmulator emulates the incorrect driver behavior. + CommandLine command_line(0, NULL); + command_line.AppendSwitchASCII( + switches::kGpuDriverBugWorkarounds, + base::IntToString(gpu::CLEAR_ALPHA_IN_READPIXELS)); + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoderWithCommandLine(init, &command_line); + SetupDefaultProgram(); } -// Tests when the driver returns an error -TEST_F(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0OOMFails) { - const GLsizei kFakeLargeCount = 0x1234; - SetupTexture(); - AddExpectationsForSimulatedAttrib0WithError( - kFakeLargeCount, 0, GL_OUT_OF_MEMORY); - EXPECT_CALL(*gl_, DrawArrays(_, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kFakeLargeCount); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); +// Override default setup so nothing gets setup. +void GLES2DecoderManualInitTest::SetUp() { } -TEST_F(GLES2DecoderWithShaderTest, DrawArraysBadTextureUsesBlack) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - // This is an NPOT texture. As the default filtering requires mips - // this should trigger replacing with black textures before rendering. - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - { - InSequence sequence; - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, BindTexture( - GL_TEXTURE_2D, TestHelper::kServiceBlackTexture2dId)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) - .Times(1) - .RetiresOnSaturation(); +void GLES2DecoderManualInitTest::EnableDisableTest(GLenum cap, + bool enable, + bool expect_set) { + if (expect_set) { + SetupExpectationsForEnableDisable(cap, enable); + } + if (enable) { + Enable cmd; + cmd.Init(cap); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + } else { + Disable cmd; + cmd.Init(cap); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); } - SetupExpectationsForApplyingDefaultDirtyState(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawArraysMissingAttributesFails) { - DoEnableVertexAttribArray(1); - - EXPECT_CALL(*gl_, DrawArrays(_, _, _)) - .Times(0); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, - DrawArraysMissingAttributesZeroCountSucceeds) { - DoEnableVertexAttribArray(1); - - EXPECT_CALL(*gl_, DrawArrays(_, _, _)) - .Times(0); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, 0); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawArraysValidAttributesSucceeds) { - SetupTexture(); - SetupVertexBuffer(); - DoEnableVertexAttribArray(1); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); - SetupExpectationsForApplyingDefaultDirtyState(); - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawArraysDeletedBufferFails) { - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - DeleteVertexBuffer(); - - EXPECT_CALL(*gl_, DrawArrays(_, _, _)) - .Times(0); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawArraysDeletedProgramSucceeds) { - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDefaultDirtyState(); - DoDeleteProgram(client_program_id_, kServiceProgramId); - - EXPECT_CALL(*gl_, DrawArrays(_, _, _)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)) - .Times(1); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawArraysWithInvalidModeFails) { - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - EXPECT_CALL(*gl_, DrawArrays(_, _, _)) - .Times(0); - DrawArrays cmd; - cmd.Init(GL_QUADS, 0, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - cmd.Init(GL_POLYGON, 0, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawArraysInvalidCountFails) { - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - // Try start > 0 - EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 1, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Try with count > size - cmd.Init(GL_TRIANGLES, 0, kNumVertices + 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Try with attrib offset > 0 - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 4); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Try with size > 2 (ie, vec3 instead of vec2) - DoVertexAttribPointer(1, 3, GL_FLOAT, 0, 0); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Try with stride > 8 (vec2 + vec2 byte) - DoVertexAttribPointer(1, 2, GL_FLOAT, sizeof(GLfloat) * 3, 0); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawArraysInstancedANGLEFails) { - SetupTexture(); - SetupVertexBuffer(); - DoEnableVertexAttribArray(1); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawArraysInstancedANGLENoAttributesFails) { - SetupTexture(); - - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawArraysInstancedANGLESimulatedAttrib0) { - SetupTexture(); - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); - SetupExpectationsForApplyingDefaultDirtyState(); - - DoVertexAttribDivisorANGLE(0, 1); - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, 3)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 1)) - .Times(1) - .RetiresOnSaturation(); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 3); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawArraysInstancedANGLEMissingAttributesFails) { - DoEnableVertexAttribArray(1); - - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) - .Times(0); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawArraysInstancedANGLEMissingAttributesZeroCountSucceeds) { - DoEnableVertexAttribArray(1); - - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) - .Times(0); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, 0, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawArraysInstancedANGLEValidAttributesSucceeds) { - SetupTexture(); - SetupVertexBuffer(); - DoEnableVertexAttribArray(1); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); - SetupExpectationsForApplyingDefaultDirtyState(); - - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, 1)) - .Times(1) - .RetiresOnSaturation(); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawArraysInstancedANGLEWithInvalidModeFails) { - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) - .Times(0); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_QUADS, 0, 1, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - cmd.Init(GL_POLYGON, 0, 1, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawArraysInstancedANGLEInvalidPrimcountFails) { - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) - .Times(0); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, 1, -1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -// Per-instance data is twice as large, but number of instances is half -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawArraysInstancedANGLELargeInstanceSucceeds) { - SetupTexture(); - SetupVertexBuffer(); - SetupExpectationsForApplyingDefaultDirtyState(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); - DoVertexAttribDivisorANGLE(0, 1); - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, - kNumVertices / 2)) - .Times(1) - .RetiresOnSaturation(); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices / 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -// Per-instance data is twice as large, but divisor is twice -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawArraysInstancedANGLELargeDivisorSucceeds) { - SetupTexture(); - SetupVertexBuffer(); - SetupExpectationsForApplyingDefaultDirtyState(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); - DoVertexAttribDivisorANGLE(0, 2); - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, - kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, DrawArraysInstancedANGLELargeFails) { - SetupTexture(); - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); - DoVertexAttribDivisorANGLE(0, 1); - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices + 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - cmd.Init(GL_TRIANGLES, 0, kNumVertices + 1, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -// Per-index data is twice as large, but number of indices is half -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawArraysInstancedANGLELargeIndexSucceeds) { - SetupTexture(); - SetupVertexBuffer(); - SetupExpectationsForApplyingDefaultDirtyState(); - DoVertexAttribPointer(1, 4, GL_FLOAT, 0, 0); - - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); - DoVertexAttribDivisorANGLE(0, 1); - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices / 2, - kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices / 2, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawArraysInstancedANGLENoDivisor0Fails) { - SetupTexture(); - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); - DoVertexAttribDivisorANGLE(0, 1); - DoVertexAttribDivisorANGLE(1, 1); - EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawArraysInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsNoAttributesSucceeds) { - SetupTexture(); - SetupIndexBuffer(); - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0); - SetupExpectationsForApplyingDefaultDirtyState(); - EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount, - GL_UNSIGNED_SHORT, - BufferOffset(kValidIndexRangeStart * 2))) - .Times(1) - .RetiresOnSaturation(); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsMissingAttributesFails) { - SetupIndexBuffer(); - DoEnableVertexAttribArray(1); - - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) - .Times(0); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, - DrawElementsMissingAttributesZeroCountSucceeds) { - SetupIndexBuffer(); - DoEnableVertexAttribArray(1); - - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) - .Times(0); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsExtraAttributesFails) { - SetupIndexBuffer(); - DoEnableVertexAttribArray(6); - - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) - .Times(0); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsValidAttributesSucceeds) { - SetupTexture(); - SetupVertexBuffer(); - SetupIndexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId); - SetupExpectationsForApplyingDefaultDirtyState(); - - EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount, - GL_UNSIGNED_SHORT, - BufferOffset(kValidIndexRangeStart * 2))) - .Times(1) - .RetiresOnSaturation(); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsDeletedBufferFails) { - SetupVertexBuffer(); - SetupIndexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - DeleteIndexBuffer(); - - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) - .Times(0); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsDeletedProgramSucceeds) { - SetupTexture(); - SetupIndexBuffer(); - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0); - SetupExpectationsForApplyingDefaultDirtyState(); - DoDeleteProgram(client_program_id_, kServiceProgramId); - - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) - .Times(1); - EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)) - .Times(1); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsWithInvalidModeFails) { - SetupVertexBuffer(); - SetupIndexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) - .Times(0); - DrawElements cmd; - cmd.Init(GL_QUADS, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - cmd.Init(GL_POLYGON, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsInvalidCountFails) { - SetupVertexBuffer(); - SetupIndexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - // Try start > 0 - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, kNumIndices, GL_UNSIGNED_SHORT, 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Try with count > size - cmd.Init(GL_TRIANGLES, kNumIndices + 1, GL_UNSIGNED_SHORT, 0); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsOutOfRangeIndicesFails) { - SetupVertexBuffer(); - SetupIndexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT, - kInvalidIndexRangeStart * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsOddOffsetForUint16Fails) { - SetupVertexBuffer(); - SetupIndexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsInstancedANGLEFails) { - SetupTexture(); - SetupVertexBuffer(); - SetupIndexBuffer(); - DoEnableVertexAttribArray(1); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLENoAttributesFails) { - SetupTexture(); - SetupIndexBuffer(); - - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLESimulatedAttrib0) { - SetupTexture(); - SetupVertexBuffer(); - SetupIndexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId); - SetupExpectationsForApplyingDefaultDirtyState(); - - DoVertexAttribDivisorANGLE(0, 1); - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE( - GL_TRIANGLES, - kValidIndexRangeCount, - GL_UNSIGNED_SHORT, - BufferOffset(kValidIndexRangeStart * 2), - 3)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 1)) - .Times(1) - .RetiresOnSaturation(); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, 3); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLEMissingAttributesFails) { - SetupIndexBuffer(); - DoEnableVertexAttribArray(1); - - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) - .Times(0); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLEMissingAttributesZeroCountSucceeds) { - SetupIndexBuffer(); - DoEnableVertexAttribArray(1); - - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) - .Times(0); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLEValidAttributesSucceeds) { - SetupIndexBuffer(); - SetupTexture(); - SetupVertexBuffer(); - DoEnableVertexAttribArray(1); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId); - SetupExpectationsForApplyingDefaultDirtyState(); - - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE( - GL_TRIANGLES, - kValidIndexRangeCount, - GL_UNSIGNED_SHORT, - BufferOffset(kValidIndexRangeStart * 2), - 1)) - .Times(1) - .RetiresOnSaturation(); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLEWithInvalidModeFails) { - SetupIndexBuffer(); - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) - .Times(0); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_QUADS, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - cmd.Init(GL_INVALID_ENUM, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -// Per-instance data is twice as large, but number of instances is half -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLELargeInstanceSucceeds) { - SetupTexture(); - SetupIndexBuffer(); - SetupVertexBuffer(); - SetupExpectationsForApplyingDefaultDirtyState(); - //Add offset so we're sure we're accessing data near the end of the buffer. - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, - (kNumVertices - kMaxValidIndex - 1) * 2 * - sizeof(GLfloat)); - - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); - DoVertexAttribDivisorANGLE(0, 1); - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE( - GL_TRIANGLES, - kValidIndexRangeCount, - GL_UNSIGNED_SHORT, - BufferOffset(kValidIndexRangeStart * 2), - kNumVertices / 2)) - .Times(1) - .RetiresOnSaturation(); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, kNumVertices / 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -// Per-instance data is twice as large, but divisor is twice -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLELargeDivisorSucceeds) { - SetupTexture(); - SetupIndexBuffer(); - SetupVertexBuffer(); - SetupExpectationsForApplyingDefaultDirtyState(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); - DoVertexAttribDivisorANGLE(0, 2); - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE( - GL_TRIANGLES, - kValidIndexRangeCount, - GL_UNSIGNED_SHORT, - BufferOffset(kValidIndexRangeStart * 2), - kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLELargeFails) { - SetupTexture(); - SetupIndexBuffer(); - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); - DoVertexAttribDivisorANGLE(0, 1); - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, kNumVertices + 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT, - kInvalidIndexRangeStart * 2, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLEInvalidPrimcountFails) { - SetupTexture(); - SetupIndexBuffer(); - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); - DoVertexAttribDivisorANGLE(0, 1); - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, -1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -// Per-index data is twice as large, but values of indices are smaller -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLELargeIndexSucceeds) { - SetupTexture(); - SetupIndexBuffer(); - SetupVertexBuffer(); - SetupExpectationsForApplyingDefaultDirtyState(); - DoVertexAttribPointer(1, 4, GL_FLOAT, 0, 0); - - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); - DoVertexAttribDivisorANGLE(0, 1); - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE( - GL_TRIANGLES, - kValidIndexRangeCount, - GL_UNSIGNED_SHORT, - BufferOffset(kValidIndexRangeStart * 2), - kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderGeometryInstancingTest, - DrawElementsInstancedANGLENoDivisor0Fails) { - SetupTexture(); - SetupIndexBuffer(); - SetupVertexBuffer(); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); - DoVertexAttribDivisorANGLE(0, 1); - DoVertexAttribDivisorANGLE(1, 1); - EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawElementsInstancedANGLE cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetVertexAttribPointervSucceeds) { - const float dummy = 0; - const GLuint kOffsetToTestFor = sizeof(dummy) * 4; - const GLuint kIndexToTest = 1; - GetVertexAttribPointerv::Result* result = - static_cast<GetVertexAttribPointerv::Result*>(shared_memory_address_); - result->size = 0; - const GLuint* result_value = result->GetData(); - // Test that initial value is 0. - GetVertexAttribPointerv cmd; - cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(sizeof(*result_value), result->size); - EXPECT_EQ(0u, *result_value); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Set the value and see that we get it. - SetupVertexBuffer(); - DoVertexAttribPointer(kIndexToTest, 2, GL_FLOAT, 0, kOffsetToTestFor); - result->size = 0; - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(sizeof(*result_value), result->size); - EXPECT_EQ(kOffsetToTestFor, *result_value); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetVertexAttribPointervBadArgsFails) { - const GLuint kIndexToTest = 1; - GetVertexAttribPointerv::Result* result = - static_cast<GetVertexAttribPointerv::Result*>(shared_memory_address_); - result->size = 0; - const GLuint* result_value = result->GetData(); - // Test pname invalid fails. - GetVertexAttribPointerv cmd; - cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER + 1, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0u, result->size); - EXPECT_EQ(kInitialResult, *result_value); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - - // Test index out of range fails. - result->size = 0; - cmd.Init(kNumVertexAttribs, GL_VERTEX_ATTRIB_ARRAY_POINTER, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0u, result->size); - EXPECT_EQ(kInitialResult, *result_value); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - - // Test memory id bad fails. - cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER, - kInvalidSharedMemoryId, shared_memory_offset_); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - - // Test memory offset bad fails. - cmd.Init(kIndexToTest, GL_VERTEX_ATTRIB_ARRAY_POINTER, - shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformivSucceeds) { - GetUniformiv::Result* result = - static_cast<GetUniformiv::Result*>(shared_memory_address_); - result->size = 0; - GetUniformiv cmd; - cmd.Init(client_program_id_, - kUniform2FakeLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, GetUniformiv(kServiceProgramId, kUniform2RealLocation, _)) - .Times(1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), - result->size); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformivArrayElementSucceeds) { - GetUniformiv::Result* result = - static_cast<GetUniformiv::Result*>(shared_memory_address_); - result->size = 0; - GetUniformiv cmd; - cmd.Init(client_program_id_, - kUniform2ElementFakeLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, - GetUniformiv(kServiceProgramId, kUniform2ElementRealLocation, _)) - .Times(1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), - result->size); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadProgramFails) { - GetUniformiv::Result* result = - static_cast<GetUniformiv::Result*>(shared_memory_address_); - result->size = 0; - GetUniformiv cmd; - // non-existant program - cmd.Init(kInvalidClientId, - kUniform2FakeLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, GetUniformiv(_, _, _)) - .Times(0); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0U, result->size); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - // Valid id that is not a program. The GL spec requires a different error for - // this case. -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS - result->size = kInitialResult; - cmd.Init(client_shader_id_, - kUniform2FakeLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0U, result->size); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS - // Unlinked program - EXPECT_CALL(*gl_, CreateProgram()) - .Times(1) - .WillOnce(Return(kNewServiceId)) - .RetiresOnSaturation(); - CreateProgram cmd2; - cmd2.Init(kNewClientId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - result->size = kInitialResult; - cmd.Init(kNewClientId, - kUniform2FakeLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0U, result->size); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadLocationFails) { - GetUniformiv::Result* result = - static_cast<GetUniformiv::Result*>(shared_memory_address_); - result->size = 0; - GetUniformiv cmd; - // invalid location - cmd.Init(client_program_id_, kInvalidUniformLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, GetUniformiv(_, _, _)) - .Times(0); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0U, result->size); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformivBadSharedMemoryFails) { - GetUniformiv cmd; - cmd.Init(client_program_id_, - kUniform2FakeLocation, - kInvalidSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, GetUniformiv(_, _, _)) - .Times(0); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_program_id_, kUniform2FakeLocation, - kSharedMemoryId, kInvalidSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -}; - -TEST_F(GLES2DecoderWithShaderTest, GetUniformfvSucceeds) { - GetUniformfv::Result* result = - static_cast<GetUniformfv::Result*>(shared_memory_address_); - result->size = 0; - GetUniformfv cmd; - cmd.Init(client_program_id_, - kUniform2FakeLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, GetUniformfv(kServiceProgramId, kUniform2RealLocation, _)) - .Times(1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), - result->size); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformfvArrayElementSucceeds) { - GetUniformfv::Result* result = - static_cast<GetUniformfv::Result*>(shared_memory_address_); - result->size = 0; - GetUniformfv cmd; - cmd.Init(client_program_id_, - kUniform2ElementFakeLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, - GetUniformfv(kServiceProgramId, kUniform2ElementRealLocation, _)) - .Times(1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), - result->size); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadProgramFails) { - GetUniformfv::Result* result = - static_cast<GetUniformfv::Result*>(shared_memory_address_); - result->size = 0; - GetUniformfv cmd; - // non-existant program - cmd.Init(kInvalidClientId, - kUniform2FakeLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, GetUniformfv(_, _, _)) - .Times(0); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0U, result->size); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - // Valid id that is not a program. The GL spec requires a different error for - // this case. -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS - result->size = kInitialResult; - cmd.Init(client_shader_id_, - kUniform2FakeLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0U, result->size); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS - // Unlinked program - EXPECT_CALL(*gl_, CreateProgram()) - .Times(1) - .WillOnce(Return(kNewServiceId)) - .RetiresOnSaturation(); - CreateProgram cmd2; - cmd2.Init(kNewClientId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - result->size = kInitialResult; - cmd.Init(kNewClientId, - kUniform2FakeLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0U, result->size); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadLocationFails) { - GetUniformfv::Result* result = - static_cast<GetUniformfv::Result*>(shared_memory_address_); - result->size = 0; - GetUniformfv cmd; - // invalid location - cmd.Init(client_program_id_, kInvalidUniformLocation, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, GetUniformfv(_, _, _)) - .Times(0); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0U, result->size); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformfvBadSharedMemoryFails) { - GetUniformfv cmd; - cmd.Init(client_program_id_, - kUniform2FakeLocation, - kInvalidSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, GetUniformfv(_, _, _)) - .Times(0); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_program_id_, kUniform2FakeLocation, - kSharedMemoryId, kInvalidSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -}; - -TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersSucceeds) { - GetAttachedShaders cmd; - typedef GetAttachedShaders::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->size = 0; - EXPECT_CALL(*gl_, GetAttachedShaders(kServiceProgramId, 1, _, _)) - .WillOnce(DoAll(SetArgumentPointee<2>(1), - SetArgumentPointee<3>(kServiceShaderId))); - cmd.Init(client_program_id_, shared_memory_id_, shared_memory_offset_, - Result::ComputeSize(1)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(1, result->GetNumResults()); - EXPECT_EQ(client_shader_id_, result->GetData()[0]); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersResultNotInitFail) { - GetAttachedShaders cmd; - typedef GetAttachedShaders::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->size = 1; - EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)) - .Times(0); - cmd.Init(client_program_id_, shared_memory_id_, shared_memory_offset_, - Result::ComputeSize(1)); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersBadProgramFails) { - GetAttachedShaders cmd; - typedef GetAttachedShaders::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->size = 0; - EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)) - .Times(0); - cmd.Init(kInvalidClientId, shared_memory_id_, shared_memory_offset_, - Result::ComputeSize(1)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0U, result->size); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetAttachedShadersBadSharedMemoryFails) { - GetAttachedShaders cmd; - typedef GetAttachedShaders::Result Result; - cmd.Init(client_program_id_, kInvalidSharedMemoryId, shared_memory_offset_, - Result::ComputeSize(1)); - EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)) - .Times(0); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_program_id_, shared_memory_id_, kInvalidSharedMemoryOffset, - Result::ComputeSize(1)); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatSucceeds) { - ScopedGLImplementationSetter gl_impl(::gfx::kGLImplementationEGLGLES2); - GetShaderPrecisionFormat cmd; - typedef GetShaderPrecisionFormat::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->success = 0; - const GLint range[2] = { 62, 62 }; - const GLint precision = 16; - EXPECT_CALL(*gl_,GetShaderPrecisionFormat(_, _, _, _)) - .WillOnce(DoAll(SetArrayArgument<2>(range,range+2), - SetArgumentPointee<3>(precision))) - .RetiresOnSaturation(); - cmd.Init(GL_VERTEX_SHADER, GL_HIGH_FLOAT, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_NE(0, result->success); - EXPECT_EQ(range[0], result->min_range); - EXPECT_EQ(range[1], result->max_range); - EXPECT_EQ(precision, result->precision); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatResultNotInitFails) { - GetShaderPrecisionFormat cmd; - typedef GetShaderPrecisionFormat::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->success = 1; - // NOTE: GL might not be called. There is no Desktop OpenGL equivalent - cmd.Init(GL_VERTEX_SHADER, GL_HIGH_FLOAT, - shared_memory_id_, shared_memory_offset_); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatBadArgsFails) { - typedef GetShaderPrecisionFormat::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->success = 0; - GetShaderPrecisionFormat cmd; - cmd.Init(GL_TEXTURE_2D, GL_HIGH_FLOAT, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - result->success = 0; - cmd.Init(GL_VERTEX_SHADER, GL_TEXTURE_2D, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, - GetShaderPrecisionFormatBadSharedMemoryFails) { - GetShaderPrecisionFormat cmd; - cmd.Init(GL_VERTEX_SHADER, GL_HIGH_FLOAT, - kInvalidSharedMemoryId, shared_memory_offset_); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(GL_VERTEX_SHADER, GL_TEXTURE_2D, - shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformSucceeds) { - const GLuint kUniformIndex = 1; - const uint32 kBucketId = 123; - GetActiveUniform cmd; - typedef GetActiveUniform::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->success = 0; - cmd.Init(client_program_id_, kUniformIndex, kBucketId, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_NE(0, result->success); - EXPECT_EQ(kUniform2Size, result->size); - EXPECT_EQ(kUniform2Type, result->type); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); - ASSERT_TRUE(bucket != NULL); - EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kUniform2Name, - bucket->size())); -} - -TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformResultNotInitFails) { - const GLuint kUniformIndex = 1; - const uint32 kBucketId = 123; - GetActiveUniform cmd; - typedef GetActiveUniform::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->success = 1; - cmd.Init(client_program_id_, kUniformIndex, kBucketId, - shared_memory_id_, shared_memory_offset_); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadProgramFails) { - const GLuint kUniformIndex = 1; - const uint32 kBucketId = 123; - GetActiveUniform cmd; - typedef GetActiveUniform::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->success = 0; - cmd.Init(kInvalidClientId, kUniformIndex, kBucketId, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0, result->success); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS - result->success = 0; - cmd.Init(client_shader_id_, kUniformIndex, kBucketId, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0, result->success); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS -} - -TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadIndexFails) { - const uint32 kBucketId = 123; - GetActiveUniform cmd; - typedef GetActiveUniform::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->success = 0; - cmd.Init(client_program_id_, kBadUniformIndex, kBucketId, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0, result->success); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetActiveUniformBadSharedMemoryFails) { - const GLuint kUniformIndex = 1; - const uint32 kBucketId = 123; - GetActiveUniform cmd; - typedef GetActiveUniform::Result Result; - cmd.Init(client_program_id_, kUniformIndex, kBucketId, - kInvalidSharedMemoryId, shared_memory_offset_); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_program_id_, kUniformIndex, kBucketId, - shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribSucceeds) { - const GLuint kAttribIndex = 1; - const uint32 kBucketId = 123; - GetActiveAttrib cmd; - typedef GetActiveAttrib::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->success = 0; - cmd.Init(client_program_id_, kAttribIndex, kBucketId, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_NE(0, result->success); - EXPECT_EQ(kAttrib2Size, result->size); - EXPECT_EQ(kAttrib2Type, result->type); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); - ASSERT_TRUE(bucket != NULL); - EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kAttrib2Name, - bucket->size())); -} - -TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribResultNotInitFails) { - const GLuint kAttribIndex = 1; - const uint32 kBucketId = 123; - GetActiveAttrib cmd; - typedef GetActiveAttrib::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->success = 1; - cmd.Init(client_program_id_, kAttribIndex, kBucketId, - shared_memory_id_, shared_memory_offset_); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadProgramFails) { - const GLuint kAttribIndex = 1; - const uint32 kBucketId = 123; - GetActiveAttrib cmd; - typedef GetActiveAttrib::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->success = 0; - cmd.Init(kInvalidClientId, kAttribIndex, kBucketId, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0, result->success); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS - result->success = 0; - cmd.Init(client_shader_id_, kAttribIndex, kBucketId, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0, result->success); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS -} - -TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadIndexFails) { - const uint32 kBucketId = 123; - GetActiveAttrib cmd; - typedef GetActiveAttrib::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->success = 0; - cmd.Init(client_program_id_, kBadAttribIndex, kBucketId, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(0, result->success); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetActiveAttribBadSharedMemoryFails) { - const GLuint kAttribIndex = 1; - const uint32 kBucketId = 123; - GetActiveAttrib cmd; - typedef GetActiveAttrib::Result Result; - cmd.Init(client_program_id_, kAttribIndex, kBucketId, - kInvalidSharedMemoryId, shared_memory_offset_); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_program_id_, kAttribIndex, kBucketId, - shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, GetShaderInfoLogValidArgs) { - const char* kInfo = "hello"; - const uint32 kBucketId = 123; - CompileShader compile_cmd; - GetShaderInfoLog cmd; - EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _)); - EXPECT_CALL(*gl_, CompileShader(kServiceShaderId)); - EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _)) - .WillOnce(SetArgumentPointee<2>(GL_FALSE)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_INFO_LOG_LENGTH, _)) - .WillOnce(SetArgumentPointee<2>(strlen(kInfo) + 1)) - .RetiresOnSaturation(); - EXPECT_CALL( - *gl_, GetShaderInfoLog(kServiceShaderId, strlen(kInfo) + 1, _, _)) - .WillOnce(DoAll(SetArgumentPointee<2>(strlen(kInfo)), - SetArrayArgument<3>(kInfo, kInfo + strlen(kInfo) + 1))); - compile_cmd.Init(client_shader_id_); - cmd.Init(client_shader_id_, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(compile_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); - ASSERT_TRUE(bucket != NULL); - EXPECT_EQ(strlen(kInfo) + 1, bucket->size()); - EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kInfo, - bucket->size())); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetShaderInfoLogInvalidArgs) { - const uint32 kBucketId = 123; - GetShaderInfoLog cmd; - cmd.Init(kInvalidClientId, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); } -TEST_F(GLES2DecoderTest, GetIntegervCached) { +TEST_P(GLES2DecoderTest, GetIntegervCached) { struct TestInfo { GLenum pname; GLint expected; }; TestInfo tests[] = { - { GL_MAX_TEXTURE_SIZE, TestHelper::kMaxTextureSize, }, - { GL_MAX_CUBE_MAP_TEXTURE_SIZE, TestHelper::kMaxCubeMapTextureSize, }, - { GL_MAX_RENDERBUFFER_SIZE, TestHelper::kMaxRenderbufferSize, }, + { + GL_MAX_TEXTURE_SIZE, TestHelper::kMaxTextureSize, + }, + { + GL_MAX_CUBE_MAP_TEXTURE_SIZE, TestHelper::kMaxCubeMapTextureSize, + }, + { + GL_MAX_RENDERBUFFER_SIZE, TestHelper::kMaxRenderbufferSize, + }, }; typedef GetIntegerv::Result Result; for (size_t ii = 0; ii < sizeof(tests) / sizeof(tests[0]); ++ii) { @@ -1649,1243 +116,100 @@ TEST_F(GLES2DecoderTest, GetIntegervCached) { .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetIntegerv(test.pname, _)) - .Times(0); + EXPECT_CALL(*gl_, GetIntegerv(test.pname, _)).Times(0); result->size = 0; GetIntegerv cmd2; cmd2.Init(test.pname, shared_memory_id_, shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(test.pname), - result->GetNumResults()); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(test.pname), + result->GetNumResults()); EXPECT_EQ(GL_NO_ERROR, GetGLError()); EXPECT_EQ(test.expected, result->GetData()[0]); } } -TEST_F(GLES2DecoderTest, CompileShaderValidArgs) { - EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _)); - EXPECT_CALL(*gl_, CompileShader(kServiceShaderId)); - EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _)) - .WillOnce(SetArgumentPointee<2>(GL_TRUE)) - .RetiresOnSaturation(); - CompileShader cmd; - cmd.Init(client_shader_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, CompileShaderInvalidArgs) { - CompileShader cmd; - cmd.Init(kInvalidClientId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS - cmd.Init(client_program_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS -} - -TEST_F(GLES2DecoderTest, ShaderSourceAndGetShaderSourceValidArgs) { - const uint32 kBucketId = 123; - const char kSource[] = "hello"; - const uint32 kSourceSize = sizeof(kSource) - 1; - memcpy(shared_memory_address_, kSource, kSourceSize); - ShaderSource cmd; - cmd.Init(client_shader_id_, - kSharedMemoryId, kSharedMemoryOffset, kSourceSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - memset(shared_memory_address_, 0, kSourceSize); - GetShaderSource get_cmd; - get_cmd.Init(client_shader_id_, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); - ASSERT_TRUE(bucket != NULL); - EXPECT_EQ(kSourceSize + 1, bucket->size()); - EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kSource, - bucket->size())); -} - -TEST_F(GLES2DecoderTest, ShaderSourceInvalidArgs) { - const char kSource[] = "hello"; - const uint32 kSourceSize = sizeof(kSource) - 1; - memcpy(shared_memory_address_, kSource, kSourceSize); - ShaderSource cmd; - cmd.Init(kInvalidClientId, - kSharedMemoryId, kSharedMemoryOffset, kSourceSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -#if GLES2_TEST_SHADER_VS_PROGRAM_IDS - cmd.Init(client_program_id_, - kSharedMemoryId, kSharedMemoryOffset, kSourceSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS - cmd.Init(client_shader_id_, - kInvalidSharedMemoryId, kSharedMemoryOffset, kSourceSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_shader_id_, - kSharedMemoryId, kInvalidSharedMemoryOffset, kSourceSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_shader_id_, - kSharedMemoryId, kSharedMemoryOffset, kSharedBufferSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, ShaderSourceBucketAndGetShaderSourceValidArgs) { - const uint32 kInBucketId = 123; - const uint32 kOutBucketId = 125; - const char kSource[] = "hello"; - const uint32 kSourceSize = sizeof(kSource) - 1; - SetBucketAsCString(kInBucketId, kSource); - ShaderSourceBucket cmd; - cmd.Init(client_shader_id_, kInBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - ClearSharedMemory(); - GetShaderSource get_cmd; - get_cmd.Init(client_shader_id_, kOutBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kOutBucketId); - ASSERT_TRUE(bucket != NULL); - EXPECT_EQ(kSourceSize + 1, bucket->size()); - EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kSource, - bucket->size())); -} - -TEST_F(GLES2DecoderTest, ShaderSourceBucketInvalidArgs) { - const uint32 kBucketId = 123; - const char kSource[] = "hello"; - const uint32 kSourceSize = sizeof(kSource) - 1; - memcpy(shared_memory_address_, kSource, kSourceSize); - ShaderSourceBucket cmd; - // Test no bucket. - cmd.Init(client_texture_id_, kBucketId); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - // Test invalid client. - SetBucketAsCString(kBucketId, kSource); - cmd.Init(kInvalidClientId, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest, ShaderSourceStripComments) { - const uint32 kInBucketId = 123; - const char kSource[] = "hello/*te\ast*/world//a\ab"; - SetBucketAsCString(kInBucketId, kSource); - ShaderSourceBucket cmd; - cmd.Init(client_shader_id_, kInBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest, GenerateMipmapWrongFormatsFails) { - EXPECT_CALL(*gl_, GenerateMipmapEXT(_)) - .Times(0); - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - GenerateMipmap cmd; - cmd.Init(GL_TEXTURE_2D); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderTest, GenerateMipmapHandlesOutOfMemory) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - TextureManager* manager = group().texture_manager(); - TextureRef* texture_ref = manager->GetTexture(client_texture_id_); - ASSERT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - GLint width = 0; - GLint height = 0; - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height)); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, TexParameteri( - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D)) - .Times(1); - EXPECT_CALL(*gl_, TexParameteri( - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_OUT_OF_MEMORY)) - .RetiresOnSaturation(); - GenerateMipmap cmd; - cmd.Init(GL_TEXTURE_2D); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height)); -} - -TEST_F(GLES2DecoderTest, GenerateMipmapClearsUnclearedTexture) { - EXPECT_CALL(*gl_, GenerateMipmapEXT(_)) - .Times(0); - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - SetupClearTextureExpections( - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, - 0, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); - EXPECT_CALL(*gl_, TexParameteri( - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D)); - EXPECT_CALL(*gl_, TexParameteri( - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - GenerateMipmap cmd; - cmd.Init(GL_TEXTURE_2D); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, Uniform1iValidArgs) { - EXPECT_CALL(*gl_, Uniform1i(kUniform1RealLocation, 2)); - Uniform1i cmd; - cmd.Init(kUniform1FakeLocation, 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivValidArgs) { - EXPECT_CALL( - *gl_, Uniform1iv(kUniform1RealLocation, 1, - reinterpret_cast<const GLint*>(shared_memory_address_))); - Uniform1iv cmd; - cmd.Init(kUniform1FakeLocation, - 1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidArgs2_0) { - EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); - Uniform1iv cmd; - cmd.Init(kUniform1FakeLocation, - 1, kInvalidSharedMemoryId, 0); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidArgs2_1) { - EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); - Uniform1iv cmd; - cmd.Init(kUniform1FakeLocation, - 1, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivImmediateValidArgs) { - Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); - EXPECT_CALL( - *gl_, - Uniform1iv(kUniform1RealLocation, 1, - reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); - GLint temp[1 * 2] = { 0, }; - cmd.Init(kUniform1FakeLocation, 1, - &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); -} - -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivInvalidValidArgs) { - EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); - Uniform1iv cmd; - cmd.Init(kUniform1FakeLocation, - 2, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivZeroCount) { - EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); - Uniform1iv cmd; - cmd.Init(kUniform1FakeLocation, - 0, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, Uniform1iSamplerIsLmited) { - EXPECT_CALL(*gl_, Uniform1i(_, _)).Times(0); - Uniform1i cmd; - cmd.Init( - kUniform1FakeLocation, - kNumTextureUnits); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, Uniform1ivSamplerIsLimited) { - EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); - Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); - GLint temp[] = { kNumTextureUnits }; - cmd.Init(kUniform1FakeLocation, 1, - &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, BindBufferToDifferentTargetFails) { - // Bind the buffer to GL_ARRAY_BUFFER - DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); - // Attempt to rebind to GL_ELEMENT_ARRAY_BUFFER - // NOTE: Real GLES2 does not have this restriction but WebGL and we do. - // This can be restriction can be removed at runtime. - EXPECT_CALL(*gl_, BindBuffer(_, _)) - .Times(0); - BindBuffer cmd; - cmd.Init(GL_ELEMENT_ARRAY_BUFFER, client_buffer_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderTest, ActiveTextureValidArgs) { - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1)); - SpecializedSetup<ActiveTexture, 0>(true); - ActiveTexture cmd; - cmd.Init(GL_TEXTURE1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest, ActiveTextureInvalidArgs) { - EXPECT_CALL(*gl_, ActiveTexture(_)).Times(0); - SpecializedSetup<ActiveTexture, 0>(false); - ActiveTexture cmd; - cmd.Init(GL_TEXTURE0 - 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - cmd.Init(kNumTextureUnits); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderTest, CheckFramebufferStatusWithNoBoundTarget) { - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(_)) - .Times(0); - CheckFramebufferStatus::Result* result = - static_cast<CheckFramebufferStatus::Result*>(shared_memory_address_); - *result = 0; - CheckFramebufferStatus cmd; - cmd.Init(GL_FRAMEBUFFER, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), *result); -} - -TEST_F(GLES2DecoderWithShaderTest, BindAndDeleteFramebuffer) { - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDefaultDirtyState(); - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - DoDeleteFramebuffer( - client_framebuffer_id_, kServiceFramebufferId, - true, GL_FRAMEBUFFER, 0, - true, GL_FRAMEBUFFER, 0); - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest, FramebufferRenderbufferWithNoBoundTarget) { - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(_, _, _, _)) - .Times(0); - FramebufferRenderbuffer cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderTest, FramebufferTexture2DWithNoBoundTarget) { - EXPECT_CALL(*gl_, FramebufferTexture2DEXT(_, _, _, _, _)) - .Times(0); - FramebufferTexture2D cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_, - 0); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithNoBoundTarget) { - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _)) - .Times(0); - GetFramebufferAttachmentParameteriv cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, shared_memory_id_, - shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithRenderbuffer) { - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - kServiceRenderbufferId)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - GetFramebufferAttachmentParameteriv::Result* result = - static_cast<GetFramebufferAttachmentParameteriv::Result*>( - shared_memory_address_); - result->size = 0; - const GLint* result_value = result->GetData(); - FramebufferRenderbuffer fbrb_cmd; - GetFramebufferAttachmentParameteriv cmd; - fbrb_cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_); - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, shared_memory_id_, - shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(static_cast<GLuint>(*result_value), client_renderbuffer_id_); -} - -TEST_F(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithTexture) { - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, FramebufferTexture2DEXT( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kServiceTextureId, 0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - GetFramebufferAttachmentParameteriv::Result* result = - static_cast<GetFramebufferAttachmentParameteriv::Result*>( - shared_memory_address_); - result->SetNumResults(0); - const GLint* result_value = result->GetData(); - FramebufferTexture2D fbtex_cmd; - GetFramebufferAttachmentParameteriv cmd; - fbtex_cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_, - 0); - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, shared_memory_id_, - shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(static_cast<GLuint>(*result_value), client_texture_id_); -} - -TEST_F(GLES2DecoderTest, GetRenderbufferParameterivWithNoBoundTarget) { - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetRenderbufferParameterivEXT(_, _, _)) - .Times(0); - GetRenderbufferParameteriv cmd; - cmd.Init( - GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, shared_memory_id_, - shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderTest, RenderbufferStorageWithNoBoundTarget) { - EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)) - .Times(0); - RenderbufferStorage cmd; - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, 4); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -namespace { - -// A class to emulate glReadPixels -class ReadPixelsEmulator { - public: - // pack_alignment is the alignment you want ReadPixels to use - // when copying. The actual data passed in pixels should be contiguous. - ReadPixelsEmulator(GLsizei width, GLsizei height, GLint bytes_per_pixel, - const void* src_pixels, const void* expected_pixels, - GLint pack_alignment) - : width_(width), - height_(height), - pack_alignment_(pack_alignment), - bytes_per_pixel_(bytes_per_pixel), - src_pixels_(reinterpret_cast<const int8*>(src_pixels)), - expected_pixels_(reinterpret_cast<const int8*>(expected_pixels)) { - } - - void ReadPixels( - GLint x, GLint y, GLsizei width, GLsizei height, - GLenum format, GLenum type, void* pixels) const { - DCHECK_GE(x, 0); - DCHECK_GE(y, 0); - DCHECK_LE(x + width, width_); - DCHECK_LE(y + height, height_); - for (GLint yy = 0; yy < height; ++yy) { - const int8* src = GetPixelAddress(src_pixels_, x, y + yy); - const void* dst = ComputePackAlignmentAddress(0, yy, width, pixels); - memcpy(const_cast<void*>(dst), src, width * bytes_per_pixel_); - } - } - - bool CompareRowSegment( - GLint x, GLint y, GLsizei width, const void* data) const { - DCHECK(x + width <= width_ || width == 0); - return memcmp(data, GetPixelAddress(expected_pixels_, x, y), - width * bytes_per_pixel_) == 0; - } - - // Helper to compute address of pixel in pack aligned data. - const void* ComputePackAlignmentAddress( - GLint x, GLint y, GLsizei width, const void* address) const { - GLint unpadded_row_size = ComputeImageDataSize(width, 1); - GLint two_rows_size = ComputeImageDataSize(width, 2); - GLsizei padded_row_size = two_rows_size - unpadded_row_size; - GLint offset = y * padded_row_size + x * bytes_per_pixel_; - return static_cast<const int8*>(address) + offset; - } - - GLint ComputeImageDataSize(GLint width, GLint height) const { - GLint row_size = width * bytes_per_pixel_; - if (height > 1) { - GLint temp = row_size + pack_alignment_ - 1; - GLint padded_row_size = (temp / pack_alignment_) * pack_alignment_; - GLint size_of_all_but_last_row = (height - 1) * padded_row_size; - return size_of_all_but_last_row + row_size; - } else { - return height * row_size; - } - } - - private: - const int8* GetPixelAddress(const int8* base, GLint x, GLint y) const { - return base + (width_ * y + x) * bytes_per_pixel_; - } - - GLsizei width_; - GLsizei height_; - GLint pack_alignment_; - GLint bytes_per_pixel_; - const int8* src_pixels_; - const int8* expected_pixels_; -}; - -} // anonymous namespace - -void GLES2DecoderTest::CheckReadPixelsOutOfRange( - GLint in_read_x, GLint in_read_y, - GLsizei in_read_width, GLsizei in_read_height, - bool init) { - const GLsizei kWidth = 5; - const GLsizei kHeight = 3; - const GLint kBytesPerPixel = 3; - const GLint kPackAlignment = 4; - const GLenum kFormat = GL_RGB; - static const int8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = { - 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19, 18, 19, 13, - 29, 28, 23, 22, 21, 22, 21, 29, 28, 23, 22, 21, 22, 21, 28, - 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32, 37, 32, 34, - }; - - ClearSharedMemory(); - - // We need to setup an FBO so we can know the max size that ReadPixels will - // access - if (init) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 0, kFormat, kWidth, kHeight, 0, - kFormat, GL_UNSIGNED_BYTE, kSharedMemoryId, - kSharedMemoryOffset); - DoBindFramebuffer( - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); - DoFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - client_texture_id_, kServiceTextureId, 0, GL_NO_ERROR); - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) - .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) - .RetiresOnSaturation(); - } - - ReadPixelsEmulator emu( - kWidth, kHeight, kBytesPerPixel, kSrcPixels, kSrcPixels, kPackAlignment); - typedef ReadPixels::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - uint32 result_shm_id = kSharedMemoryId; - uint32 result_shm_offset = kSharedMemoryOffset; - uint32 pixels_shm_id = kSharedMemoryId; - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); - void* dest = &result[1]; - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - // ReadPixels will be called for valid size only even though the command - // is requesting a larger size. - GLint read_x = std::max(0, in_read_x); - GLint read_y = std::max(0, in_read_y); - GLint read_end_x = std::max(0, std::min(kWidth, in_read_x + in_read_width)); - GLint read_end_y = std::max(0, std::min(kHeight, in_read_y + in_read_height)); - GLint read_width = read_end_x - read_x; - GLint read_height = read_end_y - read_y; - if (read_width > 0 && read_height > 0) { - for (GLint yy = read_y; yy < read_end_y; ++yy) { - EXPECT_CALL( - *gl_, ReadPixels(read_x, yy, read_width, 1, - kFormat, GL_UNSIGNED_BYTE, _)) - .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels)) - .RetiresOnSaturation(); - } - } - ReadPixels cmd; - cmd.Init(in_read_x, in_read_y, in_read_width, in_read_height, - kFormat, GL_UNSIGNED_BYTE, - pixels_shm_id, pixels_shm_offset, - result_shm_id, result_shm_offset, - false); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - - GLint unpadded_row_size = emu.ComputeImageDataSize(in_read_width, 1); - scoped_ptr<int8[]> zero(new int8[unpadded_row_size]); - scoped_ptr<int8[]> pack(new int8[kPackAlignment]); - memset(zero.get(), 0, unpadded_row_size); - memset(pack.get(), kInitialMemoryValue, kPackAlignment); - for (GLint yy = 0; yy < in_read_height; ++yy) { - const int8* row = static_cast<const int8*>( - emu.ComputePackAlignmentAddress(0, yy, in_read_width, dest)); - GLint y = in_read_y + yy; - if (y < 0 || y >= kHeight) { - EXPECT_EQ(0, memcmp(zero.get(), row, unpadded_row_size)); - } else { - // check off left. - GLint num_left_pixels = std::max(-in_read_x, 0); - GLint num_left_bytes = num_left_pixels * kBytesPerPixel; - EXPECT_EQ(0, memcmp(zero.get(), row, num_left_bytes)); - - // check off right. - GLint num_right_pixels = std::max(in_read_x + in_read_width - kWidth, 0); - GLint num_right_bytes = num_right_pixels * kBytesPerPixel; - EXPECT_EQ(0, memcmp(zero.get(), - row + unpadded_row_size - num_right_bytes, - num_right_bytes)); - - // check middle. - GLint x = std::max(in_read_x, 0); - GLint num_middle_pixels = - std::max(in_read_width - num_left_pixels - num_right_pixels, 0); - EXPECT_TRUE(emu.CompareRowSegment( - x, y, num_middle_pixels, row + num_left_bytes)); - } - - // check padding - if (yy != in_read_height - 1) { - GLint num_padding_bytes = - (kPackAlignment - 1) - (unpadded_row_size % kPackAlignment); - EXPECT_EQ(0, - memcmp(pack.get(), row + unpadded_row_size, num_padding_bytes)); - } - } -} - -TEST_F(GLES2DecoderTest, ReadPixels) { - const GLsizei kWidth = 5; - const GLsizei kHeight = 3; - const GLint kBytesPerPixel = 3; - const GLint kPackAlignment = 4; - static const int8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = { - 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19, 18, 19, 13, - 29, 28, 23, 22, 21, 22, 21, 29, 28, 23, 22, 21, 22, 21, 28, - 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32, 37, 32, 34, - }; - - surface_->SetSize(gfx::Size(INT_MAX, INT_MAX)); - - ReadPixelsEmulator emu( - kWidth, kHeight, kBytesPerPixel, kSrcPixels, kSrcPixels, kPackAlignment); - typedef ReadPixels::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - uint32 result_shm_id = kSharedMemoryId; - uint32 result_shm_offset = kSharedMemoryOffset; - uint32 pixels_shm_id = kSharedMemoryId; - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); - void* dest = &result[1]; - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL( - *gl_, ReadPixels(0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, _)) - .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels)); - ReadPixels cmd; - cmd.Init(0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, - pixels_shm_id, pixels_shm_offset, - result_shm_id, result_shm_offset, - false); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - for (GLint yy = 0; yy < kHeight; ++yy) { - EXPECT_TRUE(emu.CompareRowSegment( - 0, yy, kWidth, - emu.ComputePackAlignmentAddress(0, yy, kWidth, dest))); - } -} - -TEST_F(GLES2DecoderRGBBackbufferTest, ReadPixelsNoAlphaBackbuffer) { - const GLsizei kWidth = 3; - const GLsizei kHeight = 3; - const GLint kBytesPerPixel = 4; - const GLint kPackAlignment = 4; - static const uint8 kExpectedPixels[kWidth * kHeight * kBytesPerPixel] = { - 12, 13, 14, 255, 19, 18, 19, 255, 13, 14, 18, 255, - 29, 28, 23, 255, 21, 22, 21, 255, 28, 23, 22, 255, - 31, 34, 39, 255, 32, 37, 32, 255, 34, 39, 37, 255, - }; - static const uint8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = { - 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19, - 29, 28, 23, 22, 21, 22, 21, 29, 28, 23, 22, 21, - 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32, - }; - - surface_->SetSize(gfx::Size(INT_MAX, INT_MAX)); - - ReadPixelsEmulator emu( - kWidth, kHeight, kBytesPerPixel, kSrcPixels, kExpectedPixels, - kPackAlignment); - typedef ReadPixels::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - uint32 result_shm_id = kSharedMemoryId; - uint32 result_shm_offset = kSharedMemoryOffset; - uint32 pixels_shm_id = kSharedMemoryId; - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); - void* dest = &result[1]; - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL( - *gl_, ReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, _)) - .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels)); - ReadPixels cmd; - cmd.Init(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - pixels_shm_id, pixels_shm_offset, - result_shm_id, result_shm_offset, - false); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - for (GLint yy = 0; yy < kHeight; ++yy) { - EXPECT_TRUE(emu.CompareRowSegment( - 0, yy, kWidth, - emu.ComputePackAlignmentAddress(0, yy, kWidth, dest))); - } -} - -TEST_F(GLES2DecoderTest, ReadPixelsOutOfRange) { - static GLint tests[][4] = { - { -2, -1, 9, 5, }, // out of range on all sides - { 2, 1, 9, 5, }, // out of range on right, bottom - { -7, -4, 9, 5, }, // out of range on left, top - { 0, -5, 9, 5, }, // completely off top - { 0, 3, 9, 5, }, // completely off bottom - { -9, 0, 9, 5, }, // completely off left - { 5, 0, 9, 5, }, // completely off right - }; - - for (size_t tt = 0; tt < arraysize(tests); ++tt) { - CheckReadPixelsOutOfRange( - tests[tt][0], tests[tt][1], tests[tt][2], tests[tt][3], tt == 0); - } -} - -TEST_F(GLES2DecoderTest, ReadPixelsInvalidArgs) { - typedef ReadPixels::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - uint32 result_shm_id = kSharedMemoryId; - uint32 result_shm_offset = kSharedMemoryOffset; - uint32 pixels_shm_id = kSharedMemoryId; - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); - EXPECT_CALL(*gl_, ReadPixels(_, _, _, _, _, _, _)).Times(0); - ReadPixels cmd; - cmd.Init(0, 0, -1, 1, GL_RGB, GL_UNSIGNED_BYTE, - pixels_shm_id, pixels_shm_offset, - result_shm_id, result_shm_offset, - false); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(0, 0, 1, -1, GL_RGB, GL_UNSIGNED_BYTE, - pixels_shm_id, pixels_shm_offset, - result_shm_id, result_shm_offset, - false); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(0, 0, 1, 1, GL_RGB, GL_INT, - pixels_shm_id, pixels_shm_offset, - result_shm_id, result_shm_offset, - false); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, - kInvalidSharedMemoryId, pixels_shm_offset, - result_shm_id, result_shm_offset, - false); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, - pixels_shm_id, kInvalidSharedMemoryOffset, - result_shm_id, result_shm_offset, - false); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, - pixels_shm_id, pixels_shm_offset, - kInvalidSharedMemoryId, result_shm_offset, - false); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(0, 0, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, - pixels_shm_id, pixels_shm_offset, - result_shm_id, kInvalidSharedMemoryOffset, - false); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, BindAttribLocation) { - const GLint kLocation = 2; - const char* kName = "testing"; - const uint32 kNameSize = strlen(kName); - EXPECT_CALL( - *gl_, BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) - .Times(1); - memcpy(shared_memory_address_, kName, kNameSize); - BindAttribLocation cmd; - cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, BindAttribLocationInvalidArgs) { - const GLint kLocation = 2; - const char* kName = "testing"; - const char* kBadName = "test\aing"; - const uint32 kNameSize = strlen(kName); - const uint32 kBadNameSize = strlen(kBadName); - EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0); - memcpy(shared_memory_address_, kName, kNameSize); - BindAttribLocation cmd; - cmd.Init(kInvalidClientId, kLocation, - kSharedMemoryId, kSharedMemoryOffset, kNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(client_program_id_, kLocation, - kInvalidSharedMemoryId, kSharedMemoryOffset, kNameSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_program_id_, kLocation, - kSharedMemoryId, kInvalidSharedMemoryOffset, kNameSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_program_id_, kLocation, - kSharedMemoryId, kSharedMemoryOffset, kSharedBufferSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - memcpy(shared_memory_address_, kBadName, kBadNameSize); - cmd.Init(client_program_id_, kLocation, - kSharedMemoryId, kSharedMemoryOffset, kBadNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest, BindAttribLocationBucket) { - const uint32 kBucketId = 123; - const GLint kLocation = 2; - const char* kName = "testing"; - EXPECT_CALL( - *gl_, BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) - .Times(1); - SetBucketAsCString(kBucketId, kName); - BindAttribLocationBucket cmd; - cmd.Init(client_program_id_, kLocation, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, BindAttribLocationBucketInvalidArgs) { - const uint32 kBucketId = 123; - const GLint kLocation = 2; - const char* kName = "testing"; - EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0); - BindAttribLocationBucket cmd; - // check bucket does not exist. - cmd.Init(client_program_id_, kLocation, kBucketId); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - // check bucket is empty. - SetBucketAsCString(kBucketId, NULL); - cmd.Init(client_program_id_, kLocation, kBucketId); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - // Check bad program id - SetBucketAsCString(kBucketId, kName); - cmd.Init(kInvalidClientId, kLocation, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetAttribLocation) { - const uint32 kNameSize = strlen(kAttrib2Name); - const char* kNonExistentName = "foobar"; - const uint32 kNonExistentNameSize = strlen(kNonExistentName); - typedef GetAttribLocation::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - *result = -1; - char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); - const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); - memcpy(name, kAttrib2Name, kNameSize); - GetAttribLocation cmd; - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(kAttrib2Location, *result); - *result = -1; - memcpy(name, kNonExistentName, kNonExistentNameSize); - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kNonExistentNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); -} - -TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationInvalidArgs) { - const uint32 kNameSize = strlen(kAttrib2Name); - const char* kBadName = "foo\abar"; - const uint32 kBadNameSize = strlen(kBadName); - typedef GetAttribLocation::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - *result = -1; - char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); - const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); - memcpy(name, kAttrib2Name, kNameSize); - GetAttribLocation cmd; - cmd.Init(kInvalidClientId, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - *result = -1; - cmd.Init(client_program_id_, - kInvalidSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - cmd.Init(client_program_id_, - kSharedMemoryId, kInvalidSharedMemoryOffset, - kSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kInvalidSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kInvalidSharedMemoryOffset, - kNameSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kSharedBufferSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - memcpy(name, kBadName, kBadNameSize); - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kBadNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationBucket) { - const uint32 kBucketId = 123; - const char* kNonExistentName = "foobar"; - typedef GetAttribLocationBucket::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - SetBucketAsCString(kBucketId, kAttrib2Name); - *result = -1; - GetAttribLocationBucket cmd; - cmd.Init(client_program_id_, kBucketId, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(kAttrib2Location, *result); - SetBucketAsCString(kBucketId, kNonExistentName); - *result = -1; - cmd.Init(client_program_id_, kBucketId, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); -} - -TEST_F(GLES2DecoderWithShaderTest, GetAttribLocationBucketInvalidArgs) { - const uint32 kBucketId = 123; - typedef GetAttribLocationBucket::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - *result = -1; - GetAttribLocationBucket cmd; - // Check no bucket - cmd.Init(client_program_id_, kBucketId, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - // Check bad program id. - SetBucketAsCString(kBucketId, kAttrib2Name); - cmd.Init(kInvalidClientId, kBucketId, - kSharedMemoryId, kSharedMemoryOffset); - *result = -1; - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - // Check bad memory - cmd.Init(client_program_id_, kBucketId, - kInvalidSharedMemoryId, kSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_program_id_, kBucketId, - kSharedMemoryId, kInvalidSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformLocation) { - const uint32 kNameSize = strlen(kUniform2Name); - const char* kNonExistentName = "foobar"; - const uint32 kNonExistentNameSize = strlen(kNonExistentName); - typedef GetUniformLocation::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - *result = -1; - char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); - const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); - memcpy(name, kUniform2Name, kNameSize); - GetUniformLocation cmd; - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(kUniform2FakeLocation, *result); - memcpy(name, kNonExistentName, kNonExistentNameSize); - *result = -1; - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kNonExistentNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationInvalidArgs) { - const uint32 kNameSize = strlen(kUniform2Name); - const char* kBadName = "foo\abar"; - const uint32 kBadNameSize = strlen(kBadName); - typedef GetUniformLocation::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - *result = -1; - char* name = GetSharedMemoryAsWithOffset<char*>(sizeof(*result)); - const uint32 kNameOffset = kSharedMemoryOffset + sizeof(*result); - memcpy(name, kUniform2Name, kNameSize); - GetUniformLocation cmd; - cmd.Init(kInvalidClientId, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - *result = -1; - cmd.Init(client_program_id_, - kInvalidSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - cmd.Init(client_program_id_, - kSharedMemoryId, kInvalidSharedMemoryOffset, - kSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kInvalidSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kInvalidSharedMemoryOffset, - kNameSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kSharedBufferSize); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - memcpy(name, kBadName, kBadNameSize); - cmd.Init(client_program_id_, - kSharedMemoryId, kNameOffset, - kSharedMemoryId, kSharedMemoryOffset, - kBadNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationBucket) { - const uint32 kBucketId = 123; - const char* kNonExistentName = "foobar"; - typedef GetUniformLocationBucket::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - SetBucketAsCString(kBucketId, kUniform2Name); - *result = -1; - GetUniformLocationBucket cmd; - cmd.Init(client_program_id_, kBucketId, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(kUniform2FakeLocation, *result); - SetBucketAsCString(kBucketId, kNonExistentName); - *result = -1; - cmd.Init(client_program_id_, kBucketId, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); -} - -TEST_F(GLES2DecoderWithShaderTest, GetUniformLocationBucketInvalidArgs) { - const uint32 kBucketId = 123; - typedef GetUniformLocationBucket::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - *result = -1; - GetUniformLocationBucket cmd; - // Check no bucket - cmd.Init(client_program_id_, kBucketId, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - // Check bad program id. - SetBucketAsCString(kBucketId, kUniform2Name); - cmd.Init(kInvalidClientId, kBucketId, - kSharedMemoryId, kSharedMemoryOffset); - *result = -1; - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(-1, *result); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - // Check bad memory - cmd.Init(client_program_id_, kBucketId, - kInvalidSharedMemoryId, kSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_program_id_, kBucketId, - kSharedMemoryId, kInvalidSharedMemoryOffset); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, GetMaxValueInBufferCHROMIUM) { +TEST_P(GLES2DecoderWithShaderTest, GetMaxValueInBufferCHROMIUM) { SetupIndexBuffer(); GetMaxValueInBufferCHROMIUM::Result* result = static_cast<GetMaxValueInBufferCHROMIUM::Result*>(shared_memory_address_); *result = 0; GetMaxValueInBufferCHROMIUM cmd; - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); + cmd.Init(client_element_buffer_id_, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(7u, *result); EXPECT_EQ(GL_NO_ERROR, GetGLError()); - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1, + cmd.Init(client_element_buffer_id_, + kValidIndexRangeCount + 1, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); + kValidIndexRangeStart * 2, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(100u, *result); EXPECT_EQ(GL_NO_ERROR, GetGLError()); - cmd.Init(kInvalidClientId, kValidIndexRangeCount, + cmd.Init(kInvalidClientId, + kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); + kValidIndexRangeStart * 2, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(client_element_buffer_id_, kOutOfRangeIndexRangeEnd, + cmd.Init(client_element_buffer_id_, + kOutOfRangeIndexRangeEnd, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); + kValidIndexRangeStart * 2, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1, + cmd.Init(client_element_buffer_id_, + kValidIndexRangeCount + 1, GL_UNSIGNED_SHORT, - kOutOfRangeIndexRangeEnd * 2, kSharedMemoryId, kSharedMemoryOffset); + kOutOfRangeIndexRangeEnd * 2, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1, + cmd.Init(client_element_buffer_id_, + kValidIndexRangeCount + 1, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); + kValidIndexRangeStart * 2, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_buffer_id_, kValidIndexRangeCount + 1, + cmd.Init(client_buffer_id_, + kValidIndexRangeCount + 1, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2, kSharedMemoryId, kSharedMemoryOffset); + kValidIndexRangeStart * 2, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1, + cmd.Init(client_element_buffer_id_, + kValidIndexRangeCount + 1, GL_UNSIGNED_SHORT, kValidIndexRangeStart * 2, - kInvalidSharedMemoryId, kSharedMemoryOffset); + kInvalidSharedMemoryId, + kSharedMemoryOffset); EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(client_element_buffer_id_, kValidIndexRangeCount + 1, + cmd.Init(client_element_buffer_id_, + kValidIndexRangeCount + 1, GL_UNSIGNED_SHORT, kValidIndexRangeStart * 2, - kSharedMemoryId, kInvalidSharedMemoryOffset); + kSharedMemoryId, + kInvalidSharedMemoryOffset); EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); } -TEST_F(GLES2DecoderTest, SharedIds) { +TEST_P(GLES2DecoderTest, SharedIds) { GenSharedIdsCHROMIUM gen_cmd; RegisterSharedIdsCHROMIUM reg_cmd; DeleteSharedIdsCHROMIUM del_cmd; @@ -2956,7 +280,7 @@ TEST_F(GLES2DecoderTest, SharedIds) { EXPECT_EQ(kOffset + 1, ids[1]); } -TEST_F(GLES2DecoderTest, GenSharedIdsCHROMIUMBadArgs) { +TEST_P(GLES2DecoderTest, GenSharedIdsCHROMIUMBadArgs) { const GLuint kNamespaceId = id_namespaces::kTextures; GenSharedIdsCHROMIUM cmd; cmd.Init(kNamespaceId, 0, -1, kSharedMemoryId, kSharedMemoryOffset); @@ -2967,7 +291,7 @@ TEST_F(GLES2DecoderTest, GenSharedIdsCHROMIUMBadArgs) { EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); } -TEST_F(GLES2DecoderTest, RegisterSharedIdsCHROMIUMBadArgs) { +TEST_P(GLES2DecoderTest, RegisterSharedIdsCHROMIUMBadArgs) { const GLuint kNamespaceId = id_namespaces::kTextures; RegisterSharedIdsCHROMIUM cmd; cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset); @@ -2978,7 +302,7 @@ TEST_F(GLES2DecoderTest, RegisterSharedIdsCHROMIUMBadArgs) { EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); } -TEST_F(GLES2DecoderTest, RegisterSharedIdsCHROMIUMDuplicateIds) { +TEST_P(GLES2DecoderTest, RegisterSharedIdsCHROMIUMDuplicateIds) { const GLuint kNamespaceId = id_namespaces::kTextures; const GLuint kRegisterId = 3; RegisterSharedIdsCHROMIUM cmd; @@ -2991,7 +315,7 @@ TEST_F(GLES2DecoderTest, RegisterSharedIdsCHROMIUMDuplicateIds) { EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); } -TEST_F(GLES2DecoderTest, DeleteSharedIdsCHROMIUMBadArgs) { +TEST_P(GLES2DecoderTest, DeleteSharedIdsCHROMIUMBadArgs) { const GLuint kNamespaceId = id_namespaces::kTextures; DeleteSharedIdsCHROMIUM cmd; cmd.Init(kNamespaceId, -1, kSharedMemoryId, kSharedMemoryOffset); @@ -3002,234 +326,7 @@ TEST_F(GLES2DecoderTest, DeleteSharedIdsCHROMIUMBadArgs) { EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); } -TEST_F(GLES2DecoderTest, TexSubImage2DValidArgs) { - const int kWidth = 16; - const int kHeight = 8; - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, TexSubImage2D( - GL_TEXTURE_2D, 1, 1, 0, kWidth - 1, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - shared_memory_address_)) - .Times(1) - .RetiresOnSaturation(); - TexSubImage2D cmd; - cmd.Init( - GL_TEXTURE_2D, 1, 1, 0, kWidth - 1, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest, TexSubImage2DBadArgs) { - const int kWidth = 16; - const int kHeight = 8; - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - TexSubImage2D cmd; - cmd.Init(GL_TEXTURE0, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_TRUE, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_INT, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, -1, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 1, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, -1, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, 1, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth + 1, kHeight, GL_RGBA, - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight + 1, GL_RGBA, - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, - GL_UNSIGNED_SHORT_4_4_4_4, kSharedMemoryId, kSharedMemoryOffset, - GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kInvalidSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kInvalidSharedMemoryOffset, GL_FALSE); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, CopyTexSubImage2DValidArgs) { - const int kWidth = 16; - const int kHeight = 8; - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, CopyTexSubImage2D( - GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight)) - .Times(1) - .RetiresOnSaturation(); - CopyTexSubImage2D cmd; - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest, CopyTexSubImage2DBadArgs) { - const int kWidth = 16; - const int kHeight = 8; - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 1, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - CopyTexSubImage2D cmd; - cmd.Init(GL_TEXTURE0, 1, 0, 0, 0, 0, kWidth, kHeight); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, -1, 0, 0, 0, kWidth, kHeight); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 1, 0, 0, 0, kWidth, kHeight); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, -1, 0, 0, kWidth, kHeight); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, 1, 0, 0, kWidth, kHeight); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth + 1, kHeight); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight + 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -// Check that if a renderbuffer is attached and GL returns -// GL_FRAMEBUFFER_COMPLETE that the buffer is cleared and state is restored. -TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearColor) { - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - ClearColor color_cmd; - ColorMask color_mask_cmd; - Enable enable_cmd; - FramebufferRenderbuffer cmd; - color_cmd.Init(0.1f, 0.2f, 0.3f, 0.4f); - color_mask_cmd.Init(0, 1, 0, 1); - enable_cmd.Init(GL_SCISSOR_TEST); - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_); - InSequence sequence; - EXPECT_CALL(*gl_, ClearColor(0.1f, 0.2f, 0.3f, 0.4f)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - kServiceRenderbufferId)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(color_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(color_mask_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(enable_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepth) { - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - ClearDepthf depth_cmd; - DepthMask depth_mask_cmd; - FramebufferRenderbuffer cmd; - depth_cmd.Init(0.5f); - depth_mask_cmd.Init(false); - cmd.Init( - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, - client_renderbuffer_id_); - InSequence sequence; - EXPECT_CALL(*gl_, ClearDepth(0.5f)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, - kServiceRenderbufferId)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(depth_mask_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearStencil) { - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - ClearStencil stencil_cmd; - StencilMaskSeparate stencil_mask_separate_cmd; - FramebufferRenderbuffer cmd; - stencil_cmd.Init(123); - stencil_mask_separate_cmd.Init(GL_BACK, 0x1234u); - cmd.Init( - GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, - client_renderbuffer_id_); - InSequence sequence; - EXPECT_CALL(*gl_, ClearStencil(123)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( - GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, - kServiceRenderbufferId)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_mask_separate_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, IsBuffer) { +TEST_P(GLES2DecoderTest, IsBuffer) { EXPECT_FALSE(DoIsBuffer(client_buffer_id_)); DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); EXPECT_TRUE(DoIsBuffer(client_buffer_id_)); @@ -3237,19 +334,23 @@ TEST_F(GLES2DecoderTest, IsBuffer) { EXPECT_FALSE(DoIsBuffer(client_buffer_id_)); } -TEST_F(GLES2DecoderTest, IsFramebuffer) { +TEST_P(GLES2DecoderTest, IsFramebuffer) { EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_)); - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); EXPECT_TRUE(DoIsFramebuffer(client_framebuffer_id_)); - DoDeleteFramebuffer( - client_framebuffer_id_, kServiceFramebufferId, - true, GL_FRAMEBUFFER, 0, - true, GL_FRAMEBUFFER, 0); + DoDeleteFramebuffer(client_framebuffer_id_, + kServiceFramebufferId, + true, + GL_FRAMEBUFFER, + 0, + true, + GL_FRAMEBUFFER, + 0); EXPECT_FALSE(DoIsFramebuffer(client_framebuffer_id_)); } -TEST_F(GLES2DecoderTest, IsProgram) { +TEST_P(GLES2DecoderTest, IsProgram) { // IsProgram is true as soon as the program is created. EXPECT_TRUE(DoIsProgram(client_program_id_)); EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)) @@ -3257,26 +358,25 @@ TEST_F(GLES2DecoderTest, IsProgram) { .RetiresOnSaturation(); DoDeleteProgram(client_program_id_, kServiceProgramId); EXPECT_FALSE(DoIsProgram(client_program_id_)); - } -TEST_F(GLES2DecoderTest, IsRenderbuffer) { +TEST_P(GLES2DecoderTest, IsRenderbuffer) { EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_)); - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); EXPECT_TRUE(DoIsRenderbuffer(client_renderbuffer_id_)); DoDeleteRenderbuffer(client_renderbuffer_id_, kServiceRenderbufferId); EXPECT_FALSE(DoIsRenderbuffer(client_renderbuffer_id_)); } -TEST_F(GLES2DecoderTest, IsShader) { +TEST_P(GLES2DecoderTest, IsShader) { // IsShader is true as soon as the program is created. EXPECT_TRUE(DoIsShader(client_shader_id_)); DoDeleteShader(client_shader_id_, kServiceShaderId); EXPECT_FALSE(DoIsShader(client_shader_id_)); } -TEST_F(GLES2DecoderTest, IsTexture) { +TEST_P(GLES2DecoderTest, IsTexture) { EXPECT_FALSE(DoIsTexture(client_texture_id_)); DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); EXPECT_TRUE(DoIsTexture(client_texture_id_)); @@ -3284,1114 +384,7 @@ TEST_F(GLES2DecoderTest, IsTexture) { EXPECT_FALSE(DoIsTexture(client_texture_id_)); } -#if 0 // Turn this test on once we allow GL_DEPTH_STENCIL_ATTACHMENT -TEST_F(GLES2DecoderTest, FramebufferRenderbufferClearDepthStencil) { - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - ClearDepthf depth_cmd; - ClearStencil stencil_cmd; - FramebufferRenderbuffer cmd; - depth_cmd.Init(0.5f); - stencil_cmd.Init(123); - cmd.Init( - GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, - client_renderbuffer_id_); - InSequence sequence; - EXPECT_CALL(*gl_, ClearDepth(0.5f)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ClearStencil(123)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( - GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, - kServiceRenderbufferId)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} -#endif - -TEST_F(GLES2DecoderWithShaderTest, VertexAttribPointer) { - SetupVertexBuffer(); - static const GLenum types[] = { - GL_BYTE, - GL_UNSIGNED_BYTE, - GL_SHORT, - GL_UNSIGNED_SHORT, - GL_FLOAT, - GL_FIXED, - GL_INT, - GL_UNSIGNED_INT, - }; - static const GLsizei sizes[] = { - 1, - 1, - 2, - 2, - 4, - 4, - 4, - 4, - }; - static const GLuint indices[] = { - 0, - 1, - kNumVertexAttribs - 1, - kNumVertexAttribs, - }; - static const GLsizei offset_mult[] = { - 0, - 0, - 1, - 1, - 2, - 1000, - }; - static const GLsizei offset_offset[] = { - 0, - 1, - 0, - 1, - 0, - 0, - }; - static const GLsizei stride_mult[] = { - -1, - 0, - 0, - 1, - 1, - 2, - 1000, - }; - static const GLsizei stride_offset[] = { - 0, - 0, - 1, - 0, - 1, - 0, - 0, - }; - for (size_t tt = 0; tt < arraysize(types); ++tt) { - GLenum type = types[tt]; - GLsizei num_bytes = sizes[tt]; - for (size_t ii = 0; ii < arraysize(indices); ++ii) { - GLuint index = indices[ii]; - for (GLint size = 0; size < 5; ++size) { - for (size_t oo = 0; oo < arraysize(offset_mult); ++oo) { - GLuint offset = num_bytes * offset_mult[oo] + offset_offset[oo]; - for (size_t ss = 0; ss < arraysize(stride_mult); ++ss) { - GLsizei stride = num_bytes * stride_mult[ss] + stride_offset[ss]; - for (int normalize = 0; normalize < 2; ++normalize) { - bool index_good = index < static_cast<GLuint>(kNumVertexAttribs); - bool size_good = (size > 0 && size < 5); - bool offset_good = (offset % num_bytes == 0); - bool stride_good = (stride % num_bytes == 0) && stride >= 0 && - stride <= 255; - bool type_good = (type != GL_INT && type != GL_UNSIGNED_INT && - type != GL_FIXED); - bool good = size_good && offset_good && stride_good && - type_good && index_good; - bool call = good && (type != GL_FIXED); - if (call) { - EXPECT_CALL(*gl_, VertexAttribPointer( - index, size, type, normalize, stride, - BufferOffset(offset))); - } - VertexAttribPointer cmd; - cmd.Init(index, size, type, normalize, stride, offset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - if (good) { - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - } else if (size_good && - offset_good && - stride_good && - type_good && - !index_good) { - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - } else if (size_good && - offset_good && - stride_good && - !type_good && - index_good) { - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - } else if (size_good && - offset_good && - !stride_good && - type_good && - index_good) { - if (stride < 0 || stride > 255) { - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - } else { - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - } - } else if (size_good && - !offset_good && - stride_good && - type_good && - index_good) { - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - } else if (!size_good && - offset_good && - stride_good && - type_good && - index_good) { - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - } else { - EXPECT_NE(GL_NO_ERROR, GetGLError()); - } - } - } - } - } - } - } -} - -// Test that with an RGB backbuffer if we set the color mask to 1,1,1,1 it is -// set to 1,1,1,0 at Draw time but is 1,1,1,1 at query time. -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMask) { - ColorMask cmd; - cmd.Init(true, true, true, true); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_COLOR_WRITEMASK, result->GetData())) - .Times(0); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_COLOR_WRITEMASK, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_COLOR_WRITEMASK), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(1, result->GetData()[0]); - EXPECT_EQ(1, result->GetData()[1]); - EXPECT_EQ(1, result->GetData()[2]); - EXPECT_EQ(1, result->GetData()[3]); -} - -// Test that with no depth if we set DepthMask true that it's set to false at -// draw time but querying it returns true. -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferDepthMask) { - EXPECT_CALL(*gl_, DepthMask(true)) - .Times(0) - .RetiresOnSaturation(); - DepthMask cmd; - cmd.Init(true); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_WRITEMASK, result->GetData())) - .Times(0); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_DEPTH_WRITEMASK, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_WRITEMASK), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(1, result->GetData()[0]); -} - -// Test that with no stencil if we set the stencil mask it's still set to 0 at -// draw time but gets our value if we query. -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferStencilMask) { - const GLint kMask = 123; - EXPECT_CALL(*gl_, StencilMask(kMask)) - .Times(0) - .RetiresOnSaturation(); - StencilMask cmd; - cmd.Init(kMask); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_WRITEMASK, result->GetData())) - .Times(0); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_WRITEMASK, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_WRITEMASK), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(kMask, result->GetData()[0]); -} - -// Test that if an FBO is bound we get the correct masks. -TEST_F(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMaskFBO) { - ColorMask cmd; - cmd.Init(true, true, true, true); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupTexture(); - SetupVertexBuffer(); - DoEnableVertexAttribArray(0); - DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); - DoEnableVertexAttribArray(1); - DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); - DoEnableVertexAttribArray(2); - DoVertexAttribPointer(2, 2, GL_FLOAT, 0, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Check that no extra calls are made on the next draw. - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Setup Frame buffer. - // needs to be 1x1 or else it's not renderable. - const GLsizei kWidth = 1; - const GLsizei kHeight = 1; - const GLenum kFormat = GL_RGB; - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - // Pass some data so the texture will be marked as cleared. - DoTexImage2D( - GL_TEXTURE_2D, 0, kFormat, kWidth, kHeight, 0, - kFormat, GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); - DoBindFramebuffer( - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); - DoFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - client_texture_id_, kServiceTextureId, 0, GL_NO_ERROR); - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) - .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) - .RetiresOnSaturation(); - - // This time state needs to be set. - SetupExpectationsForApplyingDirtyState( - false, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Check that no extra calls are made on the next draw. - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Unbind - DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); - - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, ActualAlphaMatchesRequestedAlpha) { - InitDecoder( - "", // extensions - true, // has alpha - false, // has depth - false, // has stencil - true, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(8, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, ActualAlphaDoesNotMatchRequestedAlpha) { - InitDecoder( - "", // extensions - true, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(0, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, ActualDepthMatchesRequestedDepth) { - InitDecoder( - "", // extensions - false, // has alpha - true, // has depth - false, // has stencil - false, // request alpha - true, // request depth - false, // request stencil - true); // bind generates resource - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) - .WillOnce(SetArgumentPointee<1>(24)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(24, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, ActualDepthDoesNotMatchRequestedDepth) { - InitDecoder( - "", // extensions - false, // has alpha - true, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) - .WillOnce(SetArgumentPointee<1>(24)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(0, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, ActualStencilMatchesRequestedStencil) { - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - true, // has stencil - false, // request alpha - false, // request depth - true, // request stencil - true); // bind generates resource - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(8, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, ActualStencilDoesNotMatchRequestedStencil) { - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - true, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(0, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, DepthEnableWithDepth) { - InitDecoder( - "", // extensions - false, // has alpha - true, // has depth - false, // has stencil - false, // request alpha - true, // request depth - false, // request stencil - true); // bind generates resource - - Enable cmd; - cmd.Init(GL_DEPTH_TEST); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupDefaultProgram(); - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - true, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - true, // depth mask - true, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_TEST, _)) - .Times(0) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_DEPTH_TEST, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_TEST), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(1, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, DepthEnableWithoutRequestedDepth) { - InitDecoder( - "", // extensions - false, // has alpha - true, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - Enable cmd; - cmd.Init(GL_DEPTH_TEST); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupDefaultProgram(); - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_TEST, _)) - .Times(0) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_DEPTH_TEST, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_TEST), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(1, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, StencilEnableWithStencil) { - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - true, // has stencil - false, // request alpha - false, // request depth - true, // request stencil - true); // bind generates resource - - Enable cmd; - cmd.Init(GL_STENCIL_TEST); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupDefaultProgram(); - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - true, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - false, // depth enabled - -1, // front stencil mask - -1, // back stencil mask - true, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, _)) - .Times(0) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_TEST, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_TEST), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(1, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, StencilEnableWithoutRequestedStencil) { - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - true, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - Enable cmd; - cmd.Init(GL_STENCIL_TEST); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupDefaultProgram(); - SetupTexture(); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - true, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1110, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays draw_cmd; - draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, _)) - .Times(0) - .RetiresOnSaturation(); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_TEST, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_TEST), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(1, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilReportsCorrectValues) { - InitDecoder( - "GL_OES_packed_depth_stencil", // extensions - false, // has alpha - true, // has depth - true, // has stencil - false, // request alpha - true, // request depth - true, // request stencil - true); // bind generates resource - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(8, result->GetData()[0]); - result->size = 0; - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) - .WillOnce(SetArgumentPointee<1>(24)) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(24, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilNoRequestedStencil) { - InitDecoder( - "GL_OES_packed_depth_stencil", // extensions - false, // has alpha - true, // has depth - true, // has stencil - false, // request alpha - true, // request depth - false, // request stencil - true); // bind generates resource - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(0, result->GetData()[0]); - result->size = 0; - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) - .WillOnce(SetArgumentPointee<1>(24)) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(24, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilRenderbufferDepth) { - InitDecoder( - "GL_OES_packed_depth_stencil", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) // for RenderbufferStoage - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) // for FramebufferRenderbuffer - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - - EXPECT_CALL(*gl_, RenderbufferStorageEXT( - GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50)) - .Times(1) - .RetiresOnSaturation(); - RenderbufferStorage cmd; - cmd.Init(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, - kServiceRenderbufferId)) - .Times(1) - .RetiresOnSaturation(); - FramebufferRenderbuffer fbrb_cmd; - fbrb_cmd.Init( - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, - client_renderbuffer_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); - - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(0, result->GetData()[0]); - result->size = 0; - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) - .WillOnce(SetArgumentPointee<1>(24)) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(24, result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, PackedDepthStencilRenderbufferStencil) { - InitDecoder( - "GL_OES_packed_depth_stencil", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) // for RenderbufferStoage - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) // for FramebufferRenderbuffer - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - - EXPECT_CALL(*gl_, RenderbufferStorageEXT( - GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50)) - .Times(1) - .RetiresOnSaturation(); - RenderbufferStorage cmd; - cmd.Init(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( - GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, - kServiceRenderbufferId)) - .Times(1) - .RetiresOnSaturation(); - FramebufferRenderbuffer fbrb_cmd; - fbrb_cmd.Init( - GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, - client_renderbuffer_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); - - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - result->size = 0; - GetIntegerv cmd2; - cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) - .WillOnce(SetArgumentPointee<1>(8)) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(8, result->GetData()[0]); - result->size = 0; - cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); - EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) - .WillOnce(SetArgumentPointee<1>(24)) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ( - decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), - result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(0, result->GetData()[0]); -} - -TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMValidArgs) { +TEST_P(GLES2DecoderTest, GetMultipleIntegervCHROMIUMValidArgs) { const GLsizei kCount = 3; GLenum* pnames = GetSharedMemoryAs<GLenum*>(); pnames[0] = GL_DEPTH_WRITEMASK; @@ -4405,29 +398,31 @@ TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMValidArgs) { num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]); } const GLsizei result_size = num_results * sizeof(*results); - memset(results, 0, result_size); + memset(results, 0, result_size); const GLint kSentinel = 0x12345678; results[num_results] = kSentinel; GetMultipleIntegervCHROMIUM cmd; - cmd.Init( - kSharedMemoryId, kSharedMemoryOffset, kCount, - kSharedMemoryId, kSharedMemoryOffset + sizeof(*pnames) * kCount, - result_size); + cmd.Init(kSharedMemoryId, + kSharedMemoryOffset, + kCount, + kSharedMemoryId, + kSharedMemoryOffset + sizeof(*pnames) * kCount, + result_size); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(1, results[0]); // Depth writemask - EXPECT_EQ(1, results[1]); // color writemask red - EXPECT_EQ(1, results[2]); // color writemask green - EXPECT_EQ(1, results[3]); // color writemask blue - EXPECT_EQ(1, results[4]); // color writemask alpha - EXPECT_EQ(-1, results[5]); // stencil writemask alpha + EXPECT_EQ(1, results[0]); // Depth writemask + EXPECT_EQ(1, results[1]); // color writemask red + EXPECT_EQ(1, results[2]); // color writemask green + EXPECT_EQ(1, results[3]); // color writemask blue + EXPECT_EQ(1, results[4]); // color writemask alpha + EXPECT_EQ(-1, results[5]); // stencil writemask alpha EXPECT_EQ(kSentinel, results[num_results]); // End of results } -TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMInvalidArgs) { +TEST_P(GLES2DecoderTest, GetMultipleIntegervCHROMIUMInvalidArgs) { const GLsizei kCount = 3; // Offset the pnames because GLGetError will use the first uint32. const uint32 kPnameOffset = sizeof(uint32); @@ -4443,66 +438,82 @@ TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMInvalidArgs) { num_results += decoder_->GetGLES2Util()->GLGetNumValuesReturned(pnames[ii]); } const GLsizei result_size = num_results * sizeof(*results); - memset(results, 0, result_size); + memset(results, 0, result_size); const GLint kSentinel = 0x12345678; results[num_results] = kSentinel; GetMultipleIntegervCHROMIUM cmd; // Check bad pnames pointer. - cmd.Init( - kInvalidSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, - result_size); + cmd.Init(kInvalidSharedMemoryId, + kSharedMemoryOffset + kPnameOffset, + kCount, + kSharedMemoryId, + kSharedMemoryOffset + kResultsOffset, + result_size); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); // Check bad pnames pointer. - cmd.Init( - kSharedMemoryId, kInvalidSharedMemoryOffset, kCount, - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, - result_size); + cmd.Init(kSharedMemoryId, + kInvalidSharedMemoryOffset, + kCount, + kSharedMemoryId, + kSharedMemoryOffset + kResultsOffset, + result_size); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); // Check bad count. - cmd.Init( - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, -1, - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, - result_size); + cmd.Init(kSharedMemoryId, + kSharedMemoryOffset + kPnameOffset, + -1, + kSharedMemoryId, + kSharedMemoryOffset + kResultsOffset, + result_size); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); // Check bad results pointer. - cmd.Init( - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, - kInvalidSharedMemoryId, kSharedMemoryOffset + kResultsOffset, - result_size); + cmd.Init(kSharedMemoryId, + kSharedMemoryOffset + kPnameOffset, + kCount, + kInvalidSharedMemoryId, + kSharedMemoryOffset + kResultsOffset, + result_size); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); // Check bad results pointer. - cmd.Init( - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, - kSharedMemoryId, kInvalidSharedMemoryOffset, - result_size); + cmd.Init(kSharedMemoryId, + kSharedMemoryOffset + kPnameOffset, + kCount, + kSharedMemoryId, + kInvalidSharedMemoryOffset, + result_size); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); // Check bad size. - cmd.Init( - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, - result_size + 1); + cmd.Init(kSharedMemoryId, + kSharedMemoryOffset + kPnameOffset, + kCount, + kSharedMemoryId, + kSharedMemoryOffset + kResultsOffset, + result_size + 1); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); // Check bad size. - cmd.Init( - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, - result_size - 1); + cmd.Init(kSharedMemoryId, + kSharedMemoryOffset + kPnameOffset, + kCount, + kSharedMemoryId, + kSharedMemoryOffset + kResultsOffset, + result_size - 1); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); // Check bad enum. - cmd.Init( - kSharedMemoryId, kSharedMemoryOffset + kPnameOffset, kCount, - kSharedMemoryId, kSharedMemoryOffset + kResultsOffset, - result_size); + cmd.Init(kSharedMemoryId, + kSharedMemoryOffset + kPnameOffset, + kCount, + kSharedMemoryId, + kSharedMemoryOffset + kResultsOffset, + result_size); GLenum temp = pnames[2]; pnames[2] = GL_TRUE; EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); @@ -4521,2631 +532,58 @@ TEST_F(GLES2DecoderTest, GetMultipleIntegervCHROMIUMInvalidArgs) { EXPECT_EQ(kSentinel, results[num_results]); // End of results } -TEST_F(GLES2DecoderTest, TexImage2DRedefinitionSucceeds) { - const int kWidth = 16; - const int kHeight = 8; - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - EXPECT_CALL(*gl_, GetError()) - .WillRepeatedly(Return(GL_NO_ERROR)); - for (int ii = 0; ii < 2; ++ii) { - TexImage2D cmd; - if (ii == 0) { - EXPECT_CALL(*gl_, TexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, - GL_UNSIGNED_BYTE, _)) - .Times(1) - .RetiresOnSaturation(); - cmd.Init( - GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); - } else { - SetupClearTextureExpections( - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, - 0, GL_RGBA, GL_UNSIGNED_BYTE, kWidth, kHeight); - cmd.Init( - GL_TEXTURE_2D, 0, GL_RGBA, kWidth, kHeight, 0, GL_RGBA, - GL_UNSIGNED_BYTE, 0, 0); - } - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_CALL(*gl_, TexSubImage2D( - GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight - 1, GL_RGBA, GL_UNSIGNED_BYTE, - shared_memory_address_)) - .Times(1) - .RetiresOnSaturation(); - // Consider this TexSubImage2D command part of the previous TexImage2D - // (last GL_TRUE argument). It will be skipped if there are bugs in the - // redefinition case. - TexSubImage2D cmd2; - cmd2.Init( - GL_TEXTURE_2D, 0, 0, 0, kWidth, kHeight - 1, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_TRUE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - } -} - -TEST_F(GLES2DecoderTest, TexImage2DGLError) { - GLenum target = GL_TEXTURE_2D; - GLint level = 0; - GLenum internal_format = GL_RGBA; - GLsizei width = 2; - GLsizei height = 4; - GLint border = 0; - GLenum format = GL_RGBA; - GLenum type = GL_UNSIGNED_BYTE; - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - TextureManager* manager = group().texture_manager(); - TextureRef* texture_ref = manager->GetTexture(client_texture_id_); - ASSERT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_OUT_OF_MEMORY)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, TexImage2D(target, level, internal_format, - width, height, border, format, type, _)) - .Times(1) - .RetiresOnSaturation(); - TexImage2D cmd; - cmd.Init(target, level, internal_format, width, height, border, format, - type, kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); -} - -TEST_F(GLES2DecoderTest, BufferDataGLError) { - GLenum target = GL_ARRAY_BUFFER; - GLsizeiptr size = 4; - DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); - BufferManager* manager = group().buffer_manager(); - Buffer* buffer = manager->GetBuffer(client_buffer_id_); - ASSERT_TRUE(buffer != NULL); - EXPECT_EQ(0, buffer->size()); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_OUT_OF_MEMORY)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, BufferData(target, size, _, GL_STREAM_DRAW)) - .Times(1) - .RetiresOnSaturation(); - BufferData cmd; - cmd.Init(target, size, 0, 0, GL_STREAM_DRAW); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); - EXPECT_EQ(0, buffer->size()); -} - -TEST_F(GLES2DecoderTest, CopyTexImage2DGLError) { - GLenum target = GL_TEXTURE_2D; - GLint level = 0; - GLenum internal_format = GL_RGBA; - GLsizei width = 2; - GLsizei height = 4; - GLint border = 0; - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - TextureManager* manager = group().texture_manager(); - TextureRef* texture_ref = manager->GetTexture(client_texture_id_); - ASSERT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_OUT_OF_MEMORY)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, CopyTexImage2D( - target, level, internal_format, 0, 0, width, height, border)) - .Times(1) - .RetiresOnSaturation(); - CopyTexImage2D cmd; - cmd.Init(target, level, internal_format, 0, 0, width, height, border); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); -} - -TEST_F(GLES2DecoderTest, FramebufferRenderbufferGLError) { - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_OUT_OF_MEMORY)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - kServiceRenderbufferId)) - .Times(1) - .RetiresOnSaturation(); - FramebufferRenderbuffer cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); -} - -TEST_F(GLES2DecoderTest, FramebufferTexture2DGLError) { - const GLsizei kWidth = 5; - const GLsizei kHeight = 3; - const GLenum kFormat = GL_RGB; - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D(GL_TEXTURE_2D, 0, kFormat, kWidth, kHeight, 0, - kFormat, GL_UNSIGNED_BYTE, 0, 0); - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_OUT_OF_MEMORY)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, FramebufferTexture2DEXT( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kServiceTextureId, 0)) - .Times(1) - .RetiresOnSaturation(); - FramebufferTexture2D fbtex_cmd; - fbtex_cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_, - 0); - EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); -} - -TEST_F(GLES2DecoderTest, RenderbufferStorageGLError) { - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_OUT_OF_MEMORY)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, RenderbufferStorageEXT( - GL_RENDERBUFFER, GL_RGBA, 100, 50)) - .Times(1) - .RetiresOnSaturation(); - RenderbufferStorage cmd; - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 100, 50); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); -} - -TEST_F(GLES2DecoderTest, RenderbufferStorageBadArgs) { - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - RenderbufferStorage cmd; - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, TestHelper::kMaxRenderbufferSize + 1, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 1, TestHelper::kMaxRenderbufferSize + 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, - RenderbufferStorageMultisampleCHROMIUMGLError) { - InitDecoder( - "GL_EXT_framebuffer_multisample", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_OUT_OF_MEMORY)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, RenderbufferStorageMultisampleEXT( - GL_RENDERBUFFER, 1, GL_RGBA, 100, 50)) - .Times(1) - .RetiresOnSaturation(); - RenderbufferStorageMultisampleCHROMIUM cmd; - cmd.Init(GL_RENDERBUFFER, 1, GL_RGBA4, 100, 50); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, - RenderbufferStorageMultisampleCHROMIUMBadArgs) { - InitDecoder( - "GL_EXT_framebuffer_multisample", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - EXPECT_CALL(*gl_, RenderbufferStorageMultisampleEXT(_, _, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - RenderbufferStorageMultisampleCHROMIUM cmd; - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples + 1, - GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, - GL_RGBA4, TestHelper::kMaxRenderbufferSize + 1, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, - GL_RGBA4, 1, TestHelper::kMaxRenderbufferSize + 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, RenderbufferStorageMultisampleCHROMIUM) { - InitDecoder( - "GL_EXT_framebuffer_multisample", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - false); // bind generates resource - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - InSequence sequence; - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL( - *gl_, - RenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, - TestHelper::kMaxSamples, - GL_RGBA, - TestHelper::kMaxRenderbufferSize, - 1)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - RenderbufferStorageMultisampleCHROMIUM cmd; - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, - GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, - RenderbufferStorageMultisampleEXTNotSupported) { - InitDecoder( - "GL_EXT_framebuffer_multisample", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - false); // bind generates resource - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - InSequence sequence; - // GL_EXT_framebuffer_multisample uses RenderbufferStorageMultisampleCHROMIUM. - RenderbufferStorageMultisampleEXT cmd; - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, - GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -class GLES2DecoderMultisampledRenderToTextureTest - : public GLES2DecoderTestWithExtensions {}; - -TEST_P(GLES2DecoderMultisampledRenderToTextureTest, - NotCompatibleWithRenderbufferStorageMultisampleCHROMIUM) { - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - RenderbufferStorageMultisampleCHROMIUM cmd; - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, - GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_P(GLES2DecoderMultisampledRenderToTextureTest, - RenderbufferStorageMultisampleEXT) { - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - InSequence sequence; - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - if (strstr(GetParam(), "GL_IMG_multisampled_render_to_texture")) { - EXPECT_CALL( - *gl_, - RenderbufferStorageMultisampleIMG(GL_RENDERBUFFER, - TestHelper::kMaxSamples, - GL_RGBA, - TestHelper::kMaxRenderbufferSize, - 1)) - .Times(1) - .RetiresOnSaturation(); - } else { - EXPECT_CALL( - *gl_, - RenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, - TestHelper::kMaxSamples, - GL_RGBA, - TestHelper::kMaxRenderbufferSize, - 1)) - .Times(1) - .RetiresOnSaturation(); - } - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - RenderbufferStorageMultisampleEXT cmd; - cmd.Init(GL_RENDERBUFFER, TestHelper::kMaxSamples, - GL_RGBA4, TestHelper::kMaxRenderbufferSize, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -INSTANTIATE_TEST_CASE_P( - GLES2DecoderMultisampledRenderToTextureTests, - GLES2DecoderMultisampledRenderToTextureTest, - ::testing::Values("GL_EXT_multisampled_render_to_texture", - "GL_IMG_multisampled_render_to_texture")); - -TEST_F(GLES2DecoderTest, ReadPixelsGLError) { - GLenum kFormat = GL_RGBA; - GLint x = 0; - GLint y = 0; - GLsizei width = 2; - GLsizei height = 4; - typedef ReadPixels::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - uint32 result_shm_id = kSharedMemoryId; - uint32 result_shm_offset = kSharedMemoryOffset; - uint32 pixels_shm_id = kSharedMemoryId; - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_OUT_OF_MEMORY)) - .RetiresOnSaturation(); - EXPECT_CALL( - *gl_, ReadPixels(x, y, width, height, kFormat, GL_UNSIGNED_BYTE, _)) - .Times(1) - .RetiresOnSaturation(); - ReadPixels cmd; - cmd.Init(x, y, width, height, kFormat, GL_UNSIGNED_BYTE, - pixels_shm_id, pixels_shm_offset, - result_shm_id, result_shm_offset, - false); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); -} - -static bool ValueInArray(GLint value, GLint* array, GLint count) { - for (GLint ii = 0; ii < count; ++ii) { - if (array[ii] == value) { - return true; - } - } - return false; -} - -TEST_F(GLES2DecoderManualInitTest, GetCompressedTextureFormats) { - InitDecoder( - "GL_EXT_texture_compression_s3tc", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - GetIntegerv cmd; - result->size = 0; - EXPECT_CALL(*gl_, GetIntegerv(_, _)) - .Times(0) - .RetiresOnSaturation(); - cmd.Init( - GL_NUM_COMPRESSED_TEXTURE_FORMATS, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(1, result->GetNumResults()); - GLint num_formats = result->GetData()[0]; - EXPECT_EQ(4, num_formats); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - result->size = 0; - cmd.Init( - GL_COMPRESSED_TEXTURE_FORMATS, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(num_formats, result->GetNumResults()); - - EXPECT_TRUE(ValueInArray( - GL_COMPRESSED_RGB_S3TC_DXT1_EXT, - result->GetData(), result->GetNumResults())); - EXPECT_TRUE(ValueInArray( - GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, - result->GetData(), result->GetNumResults())); - EXPECT_TRUE(ValueInArray( - GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, - result->GetData(), result->GetNumResults())); - EXPECT_TRUE(ValueInArray( - GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, - result->GetData(), result->GetNumResults())); - - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, GetNoCompressedTextureFormats) { - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - GetIntegerv cmd; - result->size = 0; - EXPECT_CALL(*gl_, GetIntegerv(_, _)) - .Times(0) - .RetiresOnSaturation(); - cmd.Init( - GL_NUM_COMPRESSED_TEXTURE_FORMATS, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(1, result->GetNumResults()); - GLint num_formats = result->GetData()[0]; - EXPECT_EQ(0, num_formats); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - result->size = 0; - cmd.Init( - GL_COMPRESSED_TEXTURE_FORMATS, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(num_formats, result->GetNumResults()); - - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, CompressedTexImage2DBucketBadBucket) { - InitDecoder( - "GL_EXT_texture_compression_s3tc", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - const uint32 kBadBucketId = 123; - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - CompressedTexImage2DBucket cmd; - cmd.Init( - GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 4, 4, 0, - kBadBucketId); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); - CompressedTexSubImage2DBucket cmd2; - cmd2.Init( - GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, - kBadBucketId); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); -} - -namespace { - -struct S3TCTestData { - GLenum format; - size_t block_size; -}; - -} // anonymous namespace. - -TEST_F(GLES2DecoderManualInitTest, CompressedTexImage2DS3TC) { - InitDecoder( - "GL_EXT_texture_compression_s3tc", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - const uint32 kBucketId = 123; - CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId); - ASSERT_TRUE(bucket != NULL); - - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - - static const S3TCTestData test_data[] = { - { GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, }, - { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, }, - { GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 16, }, - { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 16, }, - }; - - for (size_t ii = 0; ii < arraysize(test_data); ++ii) { - const S3TCTestData& test = test_data[ii]; - CompressedTexImage2DBucket cmd; - // test small width. - DoCompressedTexImage2D( - GL_TEXTURE_2D, 0, test.format, 2, 4, 0, test.block_size, - kBucketId); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // test bad width. - cmd.Init( - GL_TEXTURE_2D, 0, test.format, 5, 4, 0, - kBucketId); - bucket->SetSize(test.block_size * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - // test small height. - DoCompressedTexImage2D( - GL_TEXTURE_2D, 0, test.format, 4, 2, 0, test.block_size, - kBucketId); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // test too bad height. - cmd.Init( - GL_TEXTURE_2D, 0, test.format, 4, 5, 0, - kBucketId); - bucket->SetSize(test.block_size * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - // test small for level 0. - DoCompressedTexImage2D( - GL_TEXTURE_2D, 0, test.format, 1, 1, 0, test.block_size, - kBucketId); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // test small for level 0. - DoCompressedTexImage2D( - GL_TEXTURE_2D, 0, test.format, 2, 2, 0, test.block_size, - kBucketId); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // test size too large. - cmd.Init( - GL_TEXTURE_2D, 0, test.format, 4, 4, 0, - kBucketId); - bucket->SetSize(test.block_size * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - - // test size too small. - cmd.Init( - GL_TEXTURE_2D, 0, test.format, 4, 4, 0, - kBucketId); - bucket->SetSize(test.block_size / 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - - // test with 3 mips. - DoCompressedTexImage2D( - GL_TEXTURE_2D, 0, test.format, 4, 4, 0, test.block_size, kBucketId); - DoCompressedTexImage2D( - GL_TEXTURE_2D, 1, test.format, 2, 2, 0, test.block_size, kBucketId); - DoCompressedTexImage2D( - GL_TEXTURE_2D, 2, test.format, 1, 1, 0, test.block_size, kBucketId); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Test a 16x16 - DoCompressedTexImage2D( - GL_TEXTURE_2D, 0, test.format, 16, 16, 0, test.block_size * 4 * 4, - kBucketId); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - CompressedTexSubImage2DBucket sub_cmd; - bucket->SetSize(test.block_size); - // Test sub image bad xoffset - sub_cmd.Init( - GL_TEXTURE_2D, 0, 1, 0, 4, 4, test.format, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - // Test sub image bad yoffset - sub_cmd.Init( - GL_TEXTURE_2D, 0, 0, 2, 4, 4, test.format, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - // Test sub image bad width - bucket->SetSize(test.block_size * 2); - sub_cmd.Init( - GL_TEXTURE_2D, 0, 0, 0, 5, 4, test.format, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - // Test sub image bad height - sub_cmd.Init( - GL_TEXTURE_2D, 0, 0, 0, 4, 5, test.format, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - // Test sub image bad size - bucket->SetSize(test.block_size + 1); - sub_cmd.Init( - GL_TEXTURE_2D, 0, 0, 0, 4, 4, test.format, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - - for (GLint yoffset = 0; yoffset <= 8; yoffset += 4) { - for (GLint xoffset = 0; xoffset <= 8; xoffset += 4) { - for (GLsizei height = 4; height <= 8; height +=4 ) { - for (GLsizei width = 4; width <= 8; width += 4) { - GLsizei size = test.block_size * (width / 4) * (height / 4); - bucket->SetSize(size); - EXPECT_CALL(*gl_, CompressedTexSubImage2D( - GL_TEXTURE_2D, 0, xoffset, yoffset, width, height, test.format, - size, _)) - .Times(1) - .RetiresOnSaturation(); - sub_cmd.Init( - GL_TEXTURE_2D, 0, xoffset, yoffset, width, height, test.format, - kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - } - } - } - } - } -} - -TEST_F(GLES2DecoderManualInitTest, CompressedTexImage2DETC1) { - InitDecoder( - "GL_OES_compressed_ETC1_RGB8_texture", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - const uint32 kBucketId = 123; - CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId); - ASSERT_TRUE(bucket != NULL); - - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - - const GLenum kFormat = GL_ETC1_RGB8_OES; - const size_t kBlockSize = 8; - - CompressedTexImage2DBucket cmd; - // test small width. - DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 4, 8, 0, 16, kBucketId); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // test small height. - DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 8, 4, 0, 16, kBucketId); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // test size too large. - cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, 0, kBucketId); - bucket->SetSize(kBlockSize * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - - // test size too small. - cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, 0, kBucketId); - bucket->SetSize(kBlockSize / 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - - // Test a 16x16 - DoCompressedTexImage2D( - GL_TEXTURE_2D, 0, kFormat, 16, 16, 0, kBlockSize * 16, kBucketId); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Test CompressedTexSubImage not allowed - CompressedTexSubImage2DBucket sub_cmd; - bucket->SetSize(kBlockSize); - sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, kFormat, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - // Test TexSubImage not allowed for ETC1 compressed texture - TextureRef* texture_ref = GetTexture(client_texture_id_); - ASSERT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - GLenum type, internal_format; - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); - EXPECT_EQ(kFormat, internal_format); - TexSubImage2D texsub_cmd; - texsub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(texsub_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - // Test CopyTexSubImage not allowed for ETC1 compressed texture - CopyTexSubImage2D copy_cmd; - copy_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4); - EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, GetCompressedTextureFormatsETC1) { - InitDecoder( - "GL_OES_compressed_ETC1_RGB8_texture", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - GetIntegerv cmd; - result->size = 0; - EXPECT_CALL(*gl_, GetIntegerv(_, _)) - .Times(0) - .RetiresOnSaturation(); - cmd.Init( - GL_NUM_COMPRESSED_TEXTURE_FORMATS, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(1, result->GetNumResults()); - GLint num_formats = result->GetData()[0]; - EXPECT_EQ(1, num_formats); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - result->size = 0; - cmd.Init( - GL_COMPRESSED_TEXTURE_FORMATS, - shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(num_formats, result->GetNumResults()); - - EXPECT_TRUE(ValueInArray( - GL_ETC1_RGB8_OES, - result->GetData(), result->GetNumResults())); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMValidArgs) { - const uint32 kBucketId = 123; - GetProgramInfoCHROMIUM cmd; - cmd.Init(client_program_id_, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); - EXPECT_GT(bucket->size(), 0u); -} - -TEST_F(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMInvalidArgs) { - const uint32 kBucketId = 123; - CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); - EXPECT_TRUE(bucket == NULL); - GetProgramInfoCHROMIUM cmd; - cmd.Init(kInvalidClientId, kBucketId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - bucket = decoder_->GetBucket(kBucketId); - ASSERT_TRUE(bucket != NULL); - EXPECT_EQ(sizeof(ProgramInfoHeader), bucket->size()); - ProgramInfoHeader* info = bucket->GetDataAs<ProgramInfoHeader*>( - 0, sizeof(ProgramInfoHeader)); - ASSERT_TRUE(info != 0); - EXPECT_EQ(0u, info->link_status); - EXPECT_EQ(0u, info->num_attribs); - EXPECT_EQ(0u, info->num_uniforms); -} - -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalBindTexture) { - InitDecoder( - "GL_OES_EGL_image_external", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_EXTERNAL_OES, kNewServiceId)); - EXPECT_CALL(*gl_, GenTextures(1, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)); - BindTexture cmd; - cmd.Init(GL_TEXTURE_EXTERNAL_OES, kNewClientId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - TextureRef* texture_ref = GetTexture(kNewClientId); - EXPECT_TRUE(texture_ref != NULL); - EXPECT_TRUE(texture_ref->texture()->target() == GL_TEXTURE_EXTERNAL_OES); -} - -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalGetBinding) { - InitDecoder( - "GL_OES_EGL_image_external", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, - result->GetData())) - .Times(0); - result->size = 0; - GetIntegerv cmd; - cmd.Init(GL_TEXTURE_BINDING_EXTERNAL_OES, - shared_memory_id_, - shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( - GL_TEXTURE_BINDING_EXTERNAL_OES), result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureDefaults) { - InitDecoder( - "GL_OES_EGL_image_external", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); - - TextureRef* texture_ref = GetTexture(client_texture_id_); - EXPECT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES); - EXPECT_TRUE(texture->min_filter() == GL_LINEAR); - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); -} - -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureParam) { - InitDecoder( - "GL_OES_EGL_image_external", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); - - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_MIN_FILTER, - GL_NEAREST)); - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_MIN_FILTER, - GL_LINEAR)); - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_WRAP_S, - GL_CLAMP_TO_EDGE)); - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_WRAP_T, - GL_CLAMP_TO_EDGE)); - TexParameteri cmd; - cmd.Init(GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_MIN_FILTER, - GL_NEAREST); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - cmd.Init(GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_MIN_FILTER, - GL_LINEAR); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - cmd.Init(GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_WRAP_S, - GL_CLAMP_TO_EDGE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - cmd.Init(GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_WRAP_T, - GL_CLAMP_TO_EDGE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - TextureRef* texture_ref = GetTexture(client_texture_id_); - EXPECT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES); - EXPECT_TRUE(texture->min_filter() == GL_LINEAR); - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); -} - -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTextureParamInvalid) { - InitDecoder( - "GL_OES_EGL_image_external", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); - - TexParameteri cmd; - cmd.Init(GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_MIN_FILTER, - GL_NEAREST_MIPMAP_NEAREST); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - - cmd.Init(GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_WRAP_S, - GL_REPEAT); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - - cmd.Init(GL_TEXTURE_EXTERNAL_OES, - GL_TEXTURE_WRAP_T, - GL_REPEAT); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - - TextureRef* texture_ref = GetTexture(client_texture_id_); - EXPECT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES); - EXPECT_TRUE(texture->min_filter() == GL_LINEAR); - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); -} - -TEST_F(GLES2DecoderManualInitTest, EGLImageExternalTexImage2DError) { - InitDecoder( - "GL_OES_EGL_image_external", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - GLenum target = GL_TEXTURE_EXTERNAL_OES; - GLint level = 0; - GLenum internal_format = GL_RGBA; - GLsizei width = 2; - GLsizei height = 4; - GLint border = 0; - GLenum format = GL_RGBA; - GLenum type = GL_UNSIGNED_BYTE; - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); - ASSERT_TRUE(GetTexture(client_texture_id_) != NULL); - TexImage2D cmd; - cmd.Init(target, level, internal_format, width, height, border, format, - type, kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - - // TexImage2D is not allowed with GL_TEXTURE_EXTERNAL_OES targets. - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) { - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - false); // bind generates resource +TEST_P(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); BindTexture cmd1; cmd1.Init(GL_TEXTURE_2D, kInvalidClientId); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); BindBuffer cmd2; cmd2.Init(GL_ARRAY_BUFFER, kInvalidClientId); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); BindFramebuffer cmd3; cmd3.Init(GL_FRAMEBUFFER, kInvalidClientId); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd3)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd3)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); BindRenderbuffer cmd4; cmd4.Init(GL_RENDERBUFFER, kInvalidClientId); - EXPECT_NE(error::kNoError, ExecuteCmd(cmd4)); -} - -TEST_F(GLES2DecoderManualInitTest, CreateStreamTextureCHROMIUM) { - const GLuint kObjectId = 123; - InitDecoder( - "GL_CHROMIUM_stream_texture", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - EXPECT_CALL(*stream_texture_manager(), CreateStreamTexture( - kServiceTextureId, client_texture_id_)) - .WillOnce(Return(kObjectId)) - .RetiresOnSaturation(); - - CreateStreamTextureCHROMIUM cmd; - CreateStreamTextureCHROMIUM::Result* result = - static_cast<CreateStreamTextureCHROMIUM::Result*>(shared_memory_address_); - cmd.Init(client_texture_id_, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(kObjectId, *result); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - TextureRef* texture_ref = GetTexture(client_texture_id_); - EXPECT_TRUE(texture_ref != NULL); - EXPECT_TRUE(texture_ref->texture()->IsStreamTexture()); - EXPECT_CALL(*stream_texture_manager(), - DestroyStreamTexture(kServiceTextureId)) - .Times(1) - .RetiresOnSaturation(); -} - -TEST_F(GLES2DecoderManualInitTest, CreateStreamTextureCHROMIUMBadId) { - InitDecoder( - "GL_CHROMIUM_stream_texture", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - CreateStreamTextureCHROMIUM cmd; - CreateStreamTextureCHROMIUM::Result* result = - static_cast<CreateStreamTextureCHROMIUM::Result*>(shared_memory_address_); - cmd.Init(kNewClientId, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(static_cast<GLuint>(GL_ZERO), *result); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, CreateStreamTextureCHROMIUMAlreadyBound) { - InitDecoder( - "GL_CHROMIUM_stream_texture", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - - CreateStreamTextureCHROMIUM cmd; - CreateStreamTextureCHROMIUM::Result* result = - static_cast<CreateStreamTextureCHROMIUM::Result*>(shared_memory_address_); - cmd.Init(client_texture_id_, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(static_cast<GLuint>(GL_ZERO), *result); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, CreateStreamTextureCHROMIUMAlreadySet) { - InitDecoder( - "GL_CHROMIUM_stream_texture", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - TextureRef* texture_ref = GetTexture(client_texture_id_); - group().texture_manager()->SetStreamTexture(texture_ref, true); - - CreateStreamTextureCHROMIUM cmd; - cmd.Init(client_texture_id_, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - EXPECT_CALL(*stream_texture_manager(), - DestroyStreamTexture(kServiceTextureId)) - .Times(1) - .RetiresOnSaturation(); -} - -TEST_F(GLES2DecoderManualInitTest, DrawStreamTextureCHROMIUM) { - InitDecoder( - "GL_CHROMIUM_stream_texture GL_OES_EGL_image_external", // extensions - true, // has alpha - true, // has depth - false, // has stencil - true, // request alpha - true, // request depth - false, // request stencil - true); // bind generates resource - - StrictMock<MockStreamTexture> stream_texture; - - TextureRef* texture_ref = GetTexture(client_texture_id_); - group().texture_manager()->SetStreamTexture(texture_ref, true); - - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - SetupSamplerExternalProgram(); - SetupIndexBuffer(); - AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0); - SetupExpectationsForApplyingDefaultDirtyState(); - EXPECT_TRUE(group().texture_manager()->CanRender(texture_ref)); - - InSequence s; - EXPECT_CALL(*stream_texture_manager(), LookupStreamTexture(kServiceTextureId)) - .WillOnce(Return(&stream_texture)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(stream_texture, Update()) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DrawElements(_, _, _, _)) - .Times(1); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - EXPECT_CALL(*stream_texture_manager(), - DestroyStreamTexture(kServiceTextureId)) - .Times(1) - .RetiresOnSaturation(); -} - -TEST_F(GLES2DecoderManualInitTest, BindStreamTextureCHROMIUMInvalid) { - InitDecoder( - "GL_CHROMIUM_stream_texture", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - TextureRef* texture_ref = GetTexture(client_texture_id_); - group().texture_manager()->SetStreamTexture(texture_ref, true); - - BindTexture cmd; - cmd.Init(GL_TEXTURE_2D, client_texture_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - BindTexture cmd2; - cmd2.Init(GL_TEXTURE_CUBE_MAP, client_texture_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd4)); EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - EXPECT_CALL(*stream_texture_manager(), - DestroyStreamTexture(kServiceTextureId)) - .Times(1) - .RetiresOnSaturation(); -} - -TEST_F(GLES2DecoderManualInitTest, DestroyStreamTextureCHROMIUM) { - InitDecoder( - "GL_CHROMIUM_stream_texture", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - TextureRef* texture_ref = GetTexture(client_texture_id_); - group().texture_manager()->SetStreamTexture(texture_ref, true); - - EXPECT_CALL(*stream_texture_manager(), - DestroyStreamTexture(kServiceTextureId)) - .Times(1) - .RetiresOnSaturation(); - - DestroyStreamTextureCHROMIUM cmd; - cmd.Init(client_texture_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_FALSE(texture_ref->texture()->IsStreamTexture()); - EXPECT_EQ(0U, texture_ref->texture()->target()); -} - -TEST_F(GLES2DecoderManualInitTest, DestroyStreamTextureCHROMIUMInvalid) { - InitDecoder( - "GL_CHROMIUM_stream_texture", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - DestroyStreamTextureCHROMIUM cmd; - cmd.Init(client_texture_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, DestroyStreamTextureCHROMIUMBadId) { - InitDecoder( - "GL_CHROMIUM_stream_texture", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - DestroyStreamTextureCHROMIUM cmd; - cmd.Init(GL_ZERO); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, StreamTextureCHROMIUMNullMgr) { - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - CreateStreamTextureCHROMIUM cmd; - cmd.Init(client_texture_id_, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); - GetGLError(); // ignore internal error - - TextureRef* texture_ref = GetTexture(client_texture_id_); - group().texture_manager()->SetStreamTexture(texture_ref, true); - - DestroyStreamTextureCHROMIUM cmd2; - cmd2.Init(client_texture_id_); - EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd2)); - GetGLError(); // ignore internal error -} - -TEST_F(GLES2DecoderManualInitTest, ReCreateStreamTextureCHROMIUM) { - const GLuint kObjectId = 123; - InitDecoder( - "GL_CHROMIUM_stream_texture GL_OES_EGL_image_external", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - EXPECT_CALL(*stream_texture_manager(), - DestroyStreamTexture(kServiceTextureId)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*stream_texture_manager(), - CreateStreamTexture(kServiceTextureId, client_texture_id_)) - .WillOnce(Return(kObjectId)) - .RetiresOnSaturation(); - - TextureRef* texture_ref = GetTexture(client_texture_id_); - group().texture_manager()->SetStreamTexture(texture_ref, true); - - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - DestroyStreamTextureCHROMIUM cmd; - cmd.Init(client_texture_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_FALSE(texture_ref->texture()->IsStreamTexture()); - - CreateStreamTextureCHROMIUM cmd2; - cmd2.Init(client_texture_id_, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE(texture_ref->texture()->IsStreamTexture()); - - EXPECT_CALL(*stream_texture_manager(), - DestroyStreamTexture(kServiceTextureId)) - .Times(1) - .RetiresOnSaturation(); } -TEST_F(GLES2DecoderManualInitTest, ProduceAndConsumeStreamTextureCHROMIUM) { - InitDecoder( - "GL_CHROMIUM_stream_texture GL_OES_EGL_image_external", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - TextureRef* texture_ref = GetTexture(client_texture_id_); - group().texture_manager()->SetStreamTexture(texture_ref, true); - - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); - - GLbyte mailbox[GL_MAILBOX_SIZE_CHROMIUM]; - group().mailbox_manager()->GenerateMailboxName( - reinterpret_cast<MailboxName*>(mailbox)); - - memcpy(shared_memory_address_, mailbox, sizeof(mailbox)); - - EXPECT_EQ(kServiceTextureId, texture_ref->service_id()); - - ProduceTextureCHROMIUM produce_cmd; - produce_cmd.Init( - GL_TEXTURE_EXTERNAL_OES, kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(produce_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Create new texture for consume. - EXPECT_CALL(*gl_, GenTextures(_, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)) - .RetiresOnSaturation(); - DoBindTexture(GL_TEXTURE_EXTERNAL_OES, kNewClientId, kNewServiceId); - - // Assigns and binds original service size texture ID. - EXPECT_CALL(*gl_, DeleteTextures(1, _)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_EXTERNAL_OES, kServiceTextureId)) - .Times(1) - .RetiresOnSaturation(); - - // Shared mem got clobbered from GetError() above. - memcpy(shared_memory_address_, mailbox, sizeof(mailbox)); - ConsumeTextureCHROMIUM consume_cmd; - consume_cmd.Init( - GL_TEXTURE_EXTERNAL_OES, kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(consume_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Service ID is restored. - EXPECT_EQ(kServiceTextureId, texture_ref->service_id()); - - EXPECT_CALL(*stream_texture_manager(), - DestroyStreamTexture(kServiceTextureId)) - .Times(1) - .RetiresOnSaturation(); -} - -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleBindTexture) { - InitDecoder( - "GL_ARB_texture_rectangle", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_RECTANGLE_ARB, kNewServiceId)); - EXPECT_CALL(*gl_, GenTextures(1, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)); - BindTexture cmd; - cmd.Init(GL_TEXTURE_RECTANGLE_ARB, kNewClientId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - Texture* texture = GetTexture(kNewClientId)->texture(); - EXPECT_TRUE(texture != NULL); - EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); -} - -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleGetBinding) { - InitDecoder( - "GL_ARB_texture_rectangle", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - DoBindTexture( - GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - typedef GetIntegerv::Result Result; - Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL(*gl_, GetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, - result->GetData())) - .Times(0); - result->size = 0; - GetIntegerv cmd; - cmd.Init(GL_TEXTURE_BINDING_RECTANGLE_ARB, - shared_memory_id_, - shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( - GL_TEXTURE_BINDING_RECTANGLE_ARB), result->GetNumResults()); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]); -} - -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTextureDefaults) { - InitDecoder( - "GL_ARB_texture_rectangle", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - DoBindTexture( - GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); - - Texture* texture = GetTexture(client_texture_id_)->texture(); - EXPECT_TRUE(texture != NULL); - EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); - EXPECT_TRUE(texture->min_filter() == GL_LINEAR); - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); -} - -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParam) { - InitDecoder( - "GL_ARB_texture_rectangle", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - DoBindTexture( - GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); - - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_MIN_FILTER, - GL_NEAREST)); - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_MIN_FILTER, - GL_LINEAR)); - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_WRAP_S, - GL_CLAMP_TO_EDGE)); - EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_WRAP_T, - GL_CLAMP_TO_EDGE)); - TexParameteri cmd; - cmd.Init(GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_MIN_FILTER, - GL_NEAREST); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - cmd.Init(GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_MIN_FILTER, - GL_LINEAR); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - cmd.Init(GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_WRAP_S, - GL_CLAMP_TO_EDGE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - cmd.Init(GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_WRAP_T, - GL_CLAMP_TO_EDGE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - Texture* texture = GetTexture(client_texture_id_)->texture(); - EXPECT_TRUE(texture != NULL); - EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); - EXPECT_TRUE(texture->min_filter() == GL_LINEAR); - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); -} - -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParamInvalid) { - InitDecoder( - "GL_ARB_texture_rectangle", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - DoBindTexture( - GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); - - TexParameteri cmd; - cmd.Init(GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_MIN_FILTER, - GL_NEAREST_MIPMAP_NEAREST); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - - cmd.Init(GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_WRAP_S, - GL_REPEAT); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - - cmd.Init(GL_TEXTURE_RECTANGLE_ARB, - GL_TEXTURE_WRAP_T, - GL_REPEAT); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); - - Texture* texture = GetTexture(client_texture_id_)->texture(); - EXPECT_TRUE(texture != NULL); - EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); - EXPECT_TRUE(texture->min_filter() == GL_LINEAR); - EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); - EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); -} - -TEST_F(GLES2DecoderManualInitTest, ARBTextureRectangleTexImage2DError) { - InitDecoder( - "GL_ARB_texture_rectangle", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - GLenum target = GL_TEXTURE_RECTANGLE_ARB; - GLint level = 0; - GLenum internal_format = GL_RGBA; - GLsizei width = 2; - GLsizei height = 4; - GLint border = 0; - GLenum format = GL_RGBA; - GLenum type = GL_UNSIGNED_BYTE; - DoBindTexture( - GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); - ASSERT_TRUE(GetTexture(client_texture_id_) != NULL); - TexImage2D cmd; - cmd.Init(target, level, internal_format, width, height, border, format, - type, kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - - // TexImage2D is not allowed with GL_TEXTURE_RECTANGLE_ARB targets. - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderTest, EnableFeatureCHROMIUMBadBucket) { +TEST_P(GLES2DecoderTest, EnableFeatureCHROMIUMBadBucket) { const uint32 kBadBucketId = 123; EnableFeatureCHROMIUM cmd; cmd.Init(kBadBucketId, shared_memory_id_, shared_memory_offset_); EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); } -TEST_F(GLES2DecoderTest, RequestExtensionCHROMIUMBadBucket) { +TEST_P(GLES2DecoderTest, RequestExtensionCHROMIUMBadBucket) { const uint32 kBadBucketId = 123; RequestExtensionCHROMIUM cmd; cmd.Init(kBadBucketId); EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); } -TEST_F(GLES2DecoderTest, TexSubImage2DClearsAfterTexImage2DNULL) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - SetupClearTextureExpections( - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, - 0, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); - EXPECT_CALL(*gl_, TexSubImage2D( - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - shared_memory_address_)) - .Times(1) - .RetiresOnSaturation(); - TexSubImage2D cmd; - cmd.Init( - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - // Test if we call it again it does not clear. - EXPECT_CALL(*gl_, TexSubImage2D( - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - shared_memory_address_)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, TexSubImage2DDoesNotClearAfterTexImage2DNULLThenData) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_CALL(*gl_, TexSubImage2D( - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - shared_memory_address_)) - .Times(1) - .RetiresOnSaturation(); - TexSubImage2D cmd; - cmd.Init( - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - // Test if we call it again it does not clear. - EXPECT_CALL(*gl_, TexSubImage2D( - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - shared_memory_address_)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F( - GLES2DecoderManualInitTest, - TexSubImage2DDoesNotClearAfterTexImage2DNULLThenDataWithTexImage2DIsFaster) { - CommandLine command_line(0, NULL); - command_line.AppendSwitchASCII( - switches::kGpuDriverBugWorkarounds, - base::IntToString(gpu::TEXSUBIMAGE2D_FASTER_THAN_TEXIMAGE2D)); - InitDecoderWithCommandLine( - "", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true, // bind generates resource - &command_line); - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - - { - // Uses texSubimage internally because the above workaround is active and - // the update is for the full size of the texture. - EXPECT_CALL(*gl_, - TexSubImage2D( - GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, _)) - .Times(1) - .RetiresOnSaturation(); - cmds::TexImage2D cmd; - cmd.Init(GL_TEXTURE_2D, - 0, - GL_RGBA, - 2, - 2, - 0, - GL_RGBA, - GL_UNSIGNED_BYTE, - kSharedMemoryId, - kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - } - - EXPECT_CALL(*gl_, TexSubImage2D( - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - shared_memory_address_)) - .Times(1) - .RetiresOnSaturation(); - TexSubImage2D cmd; - cmd.Init( - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - // Test if we call it again it does not clear. - EXPECT_CALL(*gl_, TexSubImage2D( - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - shared_memory_address_)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, TexSubImage2DClearsAfterTexImage2DWithDataThenNULL) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - // Put in data (so it should be marked as cleared) - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); - // Put in no data. - TexImage2D tex_cmd; - tex_cmd.Init( - GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); - // It won't actually call TexImage2D, just mark it as uncleared. - EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd)); - // Next call to TexSubImage2d should clear. - SetupClearTextureExpections( - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, - 0, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); - EXPECT_CALL(*gl_, TexSubImage2D( - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - shared_memory_address_)) - .Times(1) - .RetiresOnSaturation(); - TexSubImage2D cmd; - cmd.Init( - GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawArraysClearsAfterTexImage2DNULL) { - SetupAllNeededVertexBuffers(); - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - // Create an uncleared texture with 2 levels. - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - DoTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - // Expect 2 levels will be cleared. - SetupClearTextureExpections( - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, - 0, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); - SetupClearTextureExpections( - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, - 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, 1); - SetupExpectationsForApplyingDefaultDirtyState(); - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // But not again - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawElementsClearsAfterTexImage2DNULL) { - SetupAllNeededVertexBuffers(); - SetupIndexBuffer(); - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - // Create an uncleared texture with 2 levels. - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - DoTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - // Expect 2 levels will be cleared. - SetupClearTextureExpections( - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, - 0, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); - SetupClearTextureExpections( - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, - 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, 1); - SetupExpectationsForApplyingDefaultDirtyState(); - - EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount, - GL_UNSIGNED_SHORT, - BufferOffset(kValidIndexRangeStart * 2))) - .Times(1) - .RetiresOnSaturation(); - DrawElements cmd; - cmd.Init(GL_TRIANGLES, kValidIndexRangeCount, GL_UNSIGNED_SHORT, - kValidIndexRangeStart * 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // But not again - EXPECT_CALL(*gl_, DrawElements(GL_TRIANGLES, kValidIndexRangeCount, - GL_UNSIGNED_SHORT, - BufferOffset(kValidIndexRangeStart * 2))) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawClearsAfterTexImage2DNULLInFBO) { - const GLuint kFBOClientTextureId = 4100; - const GLuint kFBOServiceTextureId = 4101; - - SetupAllNeededVertexBuffers(); - // Register a texture id. - EXPECT_CALL(*gl_, GenTextures(_, _)) - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) - .RetiresOnSaturation(); - GenHelper<GenTexturesImmediate>(kFBOClientTextureId); - - // Setup "render to" texture. - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); - DoBindFramebuffer( - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); - DoFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); - - // Setup "render from" texture. - SetupTexture(); - - SetupExpectationsForFramebufferClearing( - GL_FRAMEBUFFER, // target - GL_COLOR_BUFFER_BIT, // clear bits - 0, 0, 0, 0, // color - 0, // stencil - 1.0f, // depth - false); // scissor test - - SetupExpectationsForApplyingDirtyState( - false, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1111, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // But not again. - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawWitFBOThatCantClearDoesNotDraw) { - const GLuint kFBOClientTextureId = 4100; - const GLuint kFBOServiceTextureId = 4101; - - // Register a texture id. - EXPECT_CALL(*gl_, GenTextures(_, _)) - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) - .RetiresOnSaturation(); - GenHelper<GenTexturesImmediate>(kFBOClientTextureId); - - // Setup "render to" texture. - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); - DoBindFramebuffer( - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); - DoFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); - - // Setup "render from" texture. - SetupTexture(); - - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) - .WillOnce(Return(GL_FRAMEBUFFER_UNSUPPORTED)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DrawArrays(_, _, _)) - .Times(0) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderTest, CopyTexImage2DMarksTextureAsCleared) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - - TextureManager* manager = group().texture_manager(); - TextureRef* texture_ref = manager->GetTexture(client_texture_id_); - ASSERT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - CopyTexImage2D cmd; - cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - - EXPECT_TRUE(texture->SafeToRenderFrom()); -} - -TEST_F(GLES2DecoderTest, CopyTexSubImage2DClearsUnclearedTexture) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); - - SetupClearTextureExpections( - kServiceTextureId, kServiceTextureId, GL_TEXTURE_2D, GL_TEXTURE_2D, - 0, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); - EXPECT_CALL(*gl_, CopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1)) - .Times(1) - .RetiresOnSaturation(); - CopyTexSubImage2D cmd; - cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderManualInitTest, CompressedImage2DMarksTextureAsCleared) { - InitDecoder( - "GL_EXT_texture_compression_s3tc", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, CompressedTexImage2D( - GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, 8, _)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - CompressedTexImage2D cmd; - cmd.Init(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, - 8, kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - TextureManager* manager = group().texture_manager(); - TextureRef* texture_ref = manager->GetTexture(client_texture_id_); - EXPECT_TRUE(texture_ref->texture()->SafeToRenderFrom()); -} - -TEST_F(GLES2DecoderWithShaderTest, UnClearedAttachmentsGetClearedOnClear) { - const GLuint kFBOClientTextureId = 4100; - const GLuint kFBOServiceTextureId = 4101; - - // Register a texture id. - EXPECT_CALL(*gl_, GenTextures(_, _)) - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) - .RetiresOnSaturation(); - GenHelper<GenTexturesImmediate>(kFBOClientTextureId); - - // Setup "render to" texture. - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); - DoBindFramebuffer( - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); - DoFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); - - // Setup "render from" texture. - SetupTexture(); - - SetupExpectationsForFramebufferClearing( - GL_FRAMEBUFFER, // target - GL_COLOR_BUFFER_BIT, // clear bits - 0, 0, 0, 0, // color - 0, // stencil - 1.0f, // depth - false); // scissor test - SetupExpectationsForApplyingDirtyState( - false, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1111, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, Clear(GL_COLOR_BUFFER_BIT)) - .Times(1) - .RetiresOnSaturation(); - - Clear cmd; - cmd.Init(GL_COLOR_BUFFER_BIT); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, UnClearedAttachmentsGetClearedOnReadPixels) { - const GLuint kFBOClientTextureId = 4100; - const GLuint kFBOServiceTextureId = 4101; - - // Register a texture id. - EXPECT_CALL(*gl_, GenTextures(_, _)) - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) - .RetiresOnSaturation(); - GenHelper<GenTexturesImmediate>(kFBOClientTextureId); - - // Setup "render to" texture. - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); - DoBindFramebuffer( - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); - DoFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); - - // Setup "render from" texture. - SetupTexture(); - - SetupExpectationsForFramebufferClearing( - GL_FRAMEBUFFER, // target - GL_COLOR_BUFFER_BIT, // clear bits - 0, 0, 0, 0, // color - 0, // stencil - 1.0f, // depth - false); // scissor test - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, _)) - .Times(1) - .RetiresOnSaturation(); - typedef ReadPixels::Result Result; - Result* result = GetSharedMemoryAs<Result*>(); - uint32 result_shm_id = kSharedMemoryId; - uint32 result_shm_offset = kSharedMemoryOffset; - uint32 pixels_shm_id = kSharedMemoryId; - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); - ReadPixels cmd; - cmd.Init(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - pixels_shm_id, pixels_shm_offset, - result_shm_id, result_shm_offset, - false); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, - UnClearedAttachmentsGetClearedOnReadPixelsAndDrawBufferGetsRestored) { - InitDecoder( - "GL_EXT_framebuffer_multisample", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - const GLuint kFBOClientTextureId = 4100; - const GLuint kFBOServiceTextureId = 4101; - - // Register a texture id. - EXPECT_CALL(*gl_, GenTextures(_, _)) - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) - .RetiresOnSaturation(); - GenHelper<GenTexturesImmediate>(kFBOClientTextureId); - - // Setup "render from" texture. - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); - DoBindFramebuffer( - GL_READ_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); - DoFramebufferTexture2D( - GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); - - SetupExpectationsForFramebufferClearingMulti( - kServiceFramebufferId, // read framebuffer service id - 0, // backbuffer service id - GL_READ_FRAMEBUFFER, // target - GL_COLOR_BUFFER_BIT, // clear bits - 0, 0, 0, 0, // color - 0, // stencil - 1.0f, // depth - false); // scissor test - - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, _)) - .Times(1) - .RetiresOnSaturation(); - typedef ReadPixels::Result Result; - uint32 result_shm_id = kSharedMemoryId; - uint32 result_shm_offset = kSharedMemoryOffset; - uint32 pixels_shm_id = kSharedMemoryId; - uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(Result); - ReadPixels cmd; - cmd.Init(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, - pixels_shm_id, pixels_shm_offset, - result_shm_id, result_shm_offset, - false); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, DrawClearsAfterRenderbufferStorageInFBO) { - SetupTexture(); - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - DoRenderbufferStorage( - GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 100, 50, GL_NO_ERROR); - DoFramebufferRenderbuffer( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR); - - SetupExpectationsForFramebufferClearing( - GL_FRAMEBUFFER, // target - GL_COLOR_BUFFER_BIT, // clear bits - 0, 0, 0, 0, // color - 0, // stencil - 1.0f, // depth - false); // scissor test - - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - false, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1111, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest, DrawArraysClearsAfterTexImage2DNULLCubemap) { - static const GLenum faces[] = { - GL_TEXTURE_CUBE_MAP_POSITIVE_X, - GL_TEXTURE_CUBE_MAP_NEGATIVE_X, - GL_TEXTURE_CUBE_MAP_POSITIVE_Y, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, - GL_TEXTURE_CUBE_MAP_POSITIVE_Z, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, - }; - SetupCubemapProgram(); - DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId); - // Fill out all the faces for 2 levels, leave 2 uncleared. - for (int ii = 0; ii < 6; ++ii) { - GLenum face = faces[ii]; - int32 shm_id = - (face == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) ? 0 : kSharedMemoryId; - uint32 shm_offset = - (face == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) ? 0 : kSharedMemoryOffset; - DoTexImage2D(face, 0, GL_RGBA, 2, 2, 0, GL_RGBA, - GL_UNSIGNED_BYTE, shm_id, shm_offset); - DoTexImage2D(face, 1, GL_RGBA, 1, 1, 0, GL_RGBA, - GL_UNSIGNED_BYTE, shm_id, shm_offset); - } - // Expect 2 levels will be cleared. - SetupClearTextureExpections( - kServiceTextureId, kServiceTextureId, GL_TEXTURE_CUBE_MAP, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 2, 2); - SetupClearTextureExpections( - kServiceTextureId, kServiceTextureId, GL_TEXTURE_CUBE_MAP, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 1, GL_RGBA, GL_UNSIGNED_BYTE, 1, 1); - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDefaultDirtyState(); - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest, TextureUsageAngleExtNotEnabledByDefault) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - - TexParameteri cmd; - cmd.Init(GL_TEXTURE_2D, - GL_TEXTURE_USAGE_ANGLE, - GL_FRAMEBUFFER_ATTACHMENT_ANGLE); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, - DrawClearsAfterRenderbuffersWithMultipleAttachments) { - const GLuint kFBOClientTextureId = 4100; - const GLuint kFBOServiceTextureId = 4101; - - // Register a texture id. - EXPECT_CALL(*gl_, GenTextures(_, _)) - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) - .RetiresOnSaturation(); - GenHelper<GenTexturesImmediate>(kFBOClientTextureId); - - // Setup "render to" texture. - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); - DoBindFramebuffer( - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); - DoFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); - - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - DoRenderbufferStorage( - GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, - 1, 1, GL_NO_ERROR); - DoFramebufferRenderbuffer( - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, - client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR); - - SetupTexture(); - SetupExpectationsForFramebufferClearing( - GL_FRAMEBUFFER, // target - GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, // clear bits - 0, 0, 0, 0, // color - 0, // stencil - 1.0f, // depth - false); // scissor test - - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDirtyState( - false, // Framebuffer is RGB - true, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1111, // color bits - true, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, CopyTexImageWithInCompleteFBOFails) { - GLenum target = GL_TEXTURE_2D; - GLint level = 0; - GLenum internal_format = GL_RGBA; - GLsizei width = 2; - GLsizei height = 4; - GLint border = 0; - SetupTexture(); - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - DoRenderbufferStorage( - GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 0, 0, GL_NO_ERROR); - DoFramebufferRenderbuffer( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR); - - EXPECT_CALL(*gl_, CopyTexImage2D(_, _, _, _, _, _, _, _)) - .Times(0) - .RetiresOnSaturation(); - CopyTexImage2D cmd; - cmd.Init(target, level, internal_format, 0, 0, width, height, border); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, GetGLError()); -} - -void GLES2DecoderWithShaderTest::CheckRenderbufferChangesMarkFBOAsNotComplete( - bool bound_fbo) { - FramebufferManager* framebuffer_manager = group().framebuffer_manager(); - SetupTexture(); - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - DoRenderbufferStorage( - GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 1, 1, GL_NO_ERROR); - DoFramebufferRenderbuffer( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR); - - - if (!bound_fbo) { - DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); - } - - Framebuffer* framebuffer = - framebuffer_manager->GetFramebuffer(client_framebuffer_id_); - ASSERT_TRUE(framebuffer != NULL); - framebuffer_manager->MarkAsComplete(framebuffer); - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); - - // Test that renderbufferStorage marks fbo as not complete. - DoRenderbufferStorage( - GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 1, 1, GL_NO_ERROR); - EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); - framebuffer_manager->MarkAsComplete(framebuffer); - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); - - // Test deleting renderbuffer marks fbo as not complete. - DoDeleteRenderbuffer(client_renderbuffer_id_, kServiceRenderbufferId); - if (bound_fbo) { - EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); - } else { - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); - } -} - -TEST_F(GLES2DecoderWithShaderTest, - RenderbufferChangesMarkFBOAsNotCompleteBoundFBO) { - CheckRenderbufferChangesMarkFBOAsNotComplete(true); -} - -TEST_F(GLES2DecoderWithShaderTest, - RenderbufferChangesMarkFBOAsNotCompleteUnboundFBO) { - CheckRenderbufferChangesMarkFBOAsNotComplete(false); -} - -void GLES2DecoderWithShaderTest::CheckTextureChangesMarkFBOAsNotComplete( - bool bound_fbo) { - FramebufferManager* framebuffer_manager = group().framebuffer_manager(); - const GLuint kFBOClientTextureId = 4100; - const GLuint kFBOServiceTextureId = 4101; - - // Register a texture id. - EXPECT_CALL(*gl_, GenTextures(_, _)) - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) - .RetiresOnSaturation(); - GenHelper<GenTexturesImmediate>(kFBOClientTextureId); - - SetupTexture(); - - // Setup "render to" texture. - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); - DoBindFramebuffer( - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); - DoFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); - - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - DoRenderbufferStorage( - GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, - 1, 1, GL_NO_ERROR); - DoFramebufferRenderbuffer( - GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, - client_renderbuffer_id_, kServiceRenderbufferId, GL_NO_ERROR); - - if (!bound_fbo) { - DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); - } - - Framebuffer* framebuffer = - framebuffer_manager->GetFramebuffer(client_framebuffer_id_); - ASSERT_TRUE(framebuffer != NULL); - framebuffer_manager->MarkAsComplete(framebuffer); - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); - - // Test TexImage2D marks fbo as not complete. - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0, 0); - EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); - framebuffer_manager->MarkAsComplete(framebuffer); - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); - - // Test CopyImage2D marks fbo as not complete. - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, 1, 0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - CopyTexImage2D cmd; - cmd.Init(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, 1, 0); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); - - // Test deleting texture marks fbo as not complete. - framebuffer_manager->MarkAsComplete(framebuffer); - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); - DoDeleteTexture(kFBOClientTextureId, kFBOServiceTextureId); - - if (bound_fbo) { - EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); - } else { - EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); - } -} - -TEST_F(GLES2DecoderWithShaderTest, TextureChangesMarkFBOAsNotCompleteBoundFBO) { - CheckTextureChangesMarkFBOAsNotComplete(true); -} - -TEST_F(GLES2DecoderWithShaderTest, - TextureChangesMarkFBOAsNotCompleteUnboundFBO) { - CheckTextureChangesMarkFBOAsNotComplete(false); -} - -TEST_F(GLES2DecoderWithShaderTest, - DrawingWithFBOTwiceChecksForFBOCompleteOnce) { - const GLuint kFBOClientTextureId = 4100; - const GLuint kFBOServiceTextureId = 4101; - - SetupAllNeededVertexBuffers(); - - // Register a texture id. - EXPECT_CALL(*gl_, GenTextures(_, _)) - .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) - .RetiresOnSaturation(); - GenHelper<GenTexturesImmediate>(kFBOClientTextureId); - - // Setup "render to" texture that is cleared. - DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); - DoTexImage2D( - GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); - DoBindFramebuffer( - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); - DoFramebufferTexture2D( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kFBOClientTextureId, kFBOServiceTextureId, 0, GL_NO_ERROR); - - // Setup "render from" texture. - SetupTexture(); - - // Make sure we check for framebuffer complete. - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) - .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) - .RetiresOnSaturation(); - - SetupExpectationsForApplyingDirtyState( - false, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1111, // color bits - false, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled - - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // But not again. - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest, BeginQueryEXTDisabled) { +TEST_P(GLES2DecoderTest, BeginQueryEXTDisabled) { // Test something fails if off. } -TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXT) { - InitDecoder( - "GL_EXT_occlusion_query_boolean", // extensions - true, // has alpha - false, // has depth - false, // has stencil - true, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource +TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXT) { + InitState init; + init.extensions = "GL_EXT_occlusion_query_boolean"; + init.gl_version = "opengl es 2.0"; + init.has_alpha = true; + init.request_alpha = true; + init.bind_generates_resource = true; + InitDecoder(init); // Test end fails if no begin. EndQueryEXT end_cmd; @@ -7165,20 +603,35 @@ TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXT) { // Test valid parameters work. EXPECT_CALL(*gl_, GenQueriesARB(1, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)) - .RetiresOnSaturation(); + .WillOnce(SetArgumentPointee<1>(kNewServiceId)) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, kNewServiceId)) .Times(1) .RetiresOnSaturation(); - begin_cmd.Init( - GL_ANY_SAMPLES_PASSED_EXT, kNewClientId, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); + // Query object should not be created untill BeginQueriesEXT. QueryManager* query_manager = decoder_->GetQueryManager(); ASSERT_TRUE(query_manager != NULL); QueryManager::Query* query = query_manager->GetQuery(kNewClientId); + EXPECT_TRUE(query == NULL); + + // BeginQueryEXT should fail if id is not generated from GenQueriesEXT. + begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, + kInvalidClientId, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, + kNewClientId, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // After BeginQueriesEXT id name should have query object associated with it. + query = query_manager->GetQuery(kNewClientId); ASSERT_TRUE(query != NULL); EXPECT_FALSE(query->pending()); @@ -7200,105 +653,150 @@ TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXT) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); EXPECT_TRUE(query->pending()); - EXPECT_CALL(*gl_, DeleteQueriesARB(1, _)) - .Times(1) - .RetiresOnSaturation(); + EXPECT_CALL(*gl_, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation(); } -static void CheckBeginEndQueryBadMemoryFails( - GLES2DecoderTestBase* test, - GLuint client_id, - GLuint service_id, - int32 shm_id, - uint32 shm_offset) { +struct QueryType { + GLenum type; + bool is_gl; +}; + +const QueryType kQueryTypes[] = { + {GL_COMMANDS_ISSUED_CHROMIUM, false}, + {GL_LATENCY_QUERY_CHROMIUM, false}, + {GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, false}, + {GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, false}, + {GL_GET_ERROR_QUERY_CHROMIUM, false}, + {GL_COMMANDS_COMPLETED_CHROMIUM, false}, + {GL_ANY_SAMPLES_PASSED_EXT, true}, +}; + +static void CheckBeginEndQueryBadMemoryFails(GLES2DecoderTestBase* test, + GLuint client_id, + GLuint service_id, + const QueryType& query_type, + int32 shm_id, + uint32 shm_offset) { + // We need to reset the decoder on each iteration, because we lose the + // context every time. + GLES2DecoderTestBase::InitState init; + init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync"; + init.gl_version = "opengl es 2.0"; + init.has_alpha = true; + init.request_alpha = true; + init.bind_generates_resource = true; + test->InitDecoder(init); ::testing::StrictMock< ::gfx::MockGLInterface>* gl = test->GetGLMock(); BeginQueryEXT begin_cmd; test->GenHelper<GenQueriesEXTImmediate>(client_id); - EXPECT_CALL(*gl, GenQueriesARB(1, _)) - .WillOnce(SetArgumentPointee<1>(service_id)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl, BeginQueryARB(GL_ANY_SAMPLES_PASSED_EXT, service_id)) - .Times(1) - .RetiresOnSaturation(); + if (query_type.is_gl) { + EXPECT_CALL(*gl, GenQueriesARB(1, _)) + .WillOnce(SetArgumentPointee<1>(service_id)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, BeginQueryARB(query_type.type, service_id)) + .Times(1) + .RetiresOnSaturation(); + } // Test bad shared memory fails - begin_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, client_id, shm_id, shm_offset); + begin_cmd.Init(query_type.type, client_id, shm_id, shm_offset); error::Error error1 = test->ExecuteCmd(begin_cmd); - EXPECT_CALL(*gl, EndQueryARB(GL_ANY_SAMPLES_PASSED_EXT)) - .Times(1) - .RetiresOnSaturation(); + if (query_type.is_gl) { + EXPECT_CALL(*gl, EndQueryARB(query_type.type)) + .Times(1) + .RetiresOnSaturation(); + } + if (query_type.type == GL_GET_ERROR_QUERY_CHROMIUM) { + EXPECT_CALL(*gl, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + } + GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef); + if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) { + EXPECT_CALL(*gl, Flush()).RetiresOnSaturation(); + EXPECT_CALL(*gl, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)) + .WillOnce(Return(kGlSync)) + .RetiresOnSaturation(); + } EndQueryEXT end_cmd; - end_cmd.Init(GL_ANY_SAMPLES_PASSED_EXT, 1); + end_cmd.Init(query_type.type, 1); error::Error error2 = test->ExecuteCmd(end_cmd); - EXPECT_CALL(*gl, - GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) - .WillOnce(SetArgumentPointee<2>(1)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl, - GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_EXT, _)) - .WillOnce(SetArgumentPointee<2>(1)) - .RetiresOnSaturation(); + if (query_type.is_gl) { + EXPECT_CALL( + *gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_AVAILABLE_EXT, _)) + .WillOnce(SetArgumentPointee<2>(1)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, GetQueryObjectuivARB(service_id, GL_QUERY_RESULT_EXT, _)) + .WillOnce(SetArgumentPointee<2>(1)) + .RetiresOnSaturation(); + } + if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) { + EXPECT_CALL(*gl, ClientWaitSync(kGlSync, _, _)) + .WillOnce(Return(GL_ALREADY_SIGNALED)) + .RetiresOnSaturation(); + } QueryManager* query_manager = test->GetDecoder()->GetQueryManager(); ASSERT_TRUE(query_manager != NULL); bool process_success = query_manager->ProcessPendingQueries(); - EXPECT_TRUE(error1 != error::kNoError || - error2 != error::kNoError || + EXPECT_TRUE(error1 != error::kNoError || error2 != error::kNoError || !process_success); - EXPECT_CALL(*gl, DeleteQueriesARB(1, _)) - .Times(1) - .RetiresOnSaturation(); + if (query_type.is_gl) { + EXPECT_CALL(*gl, DeleteQueriesARB(1, _)).Times(1).RetiresOnSaturation(); + } + if (query_type.type == GL_COMMANDS_COMPLETED_CHROMIUM) + EXPECT_CALL(*gl, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); + test->ResetDecoder(); } -TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryIdFails) { - InitDecoder( - "GL_EXT_occlusion_query_boolean", // extensions - true, // has alpha - false, // has depth - false, // has stencil - true, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - CheckBeginEndQueryBadMemoryFails( - this, kNewClientId, kNewServiceId, - kInvalidSharedMemoryId, kSharedMemoryOffset); +TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryIdFails) { + for (size_t i = 0; i < arraysize(kQueryTypes); ++i) { + CheckBeginEndQueryBadMemoryFails(this, + kNewClientId, + kNewServiceId, + kQueryTypes[i], + kInvalidSharedMemoryId, + kSharedMemoryOffset); + } } -TEST_F(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryOffsetFails) { - InitDecoder( - "GL_EXT_occlusion_query_boolean", // extensions - true, // has alpha - false, // has depth - false, // has stencil - true, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - - CheckBeginEndQueryBadMemoryFails( - this, kNewClientId, kNewServiceId, - kSharedMemoryId, kInvalidSharedMemoryOffset); +TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTBadMemoryOffsetFails) { + for (size_t i = 0; i < arraysize(kQueryTypes); ++i) { + // Out-of-bounds. + CheckBeginEndQueryBadMemoryFails(this, + kNewClientId, + kNewServiceId, + kQueryTypes[i], + kSharedMemoryId, + kInvalidSharedMemoryOffset); + // Overflow. + CheckBeginEndQueryBadMemoryFails(this, + kNewClientId, + kNewServiceId, + kQueryTypes[i], + kSharedMemoryId, + 0xfffffffcu); + } } -TEST_F(GLES2DecoderTest, BeginEndQueryEXTCommandsIssuedCHROMIUM) { +TEST_P(GLES2DecoderTest, BeginEndQueryEXTCommandsIssuedCHROMIUM) { BeginQueryEXT begin_cmd; GenHelper<GenQueriesEXTImmediate>(kNewClientId); // Test valid parameters work. - begin_cmd.Init( - GL_COMMANDS_ISSUED_CHROMIUM, kNewClientId, - kSharedMemoryId, kSharedMemoryOffset); + begin_cmd.Init(GL_COMMANDS_ISSUED_CHROMIUM, + kNewClientId, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); @@ -7316,15 +814,16 @@ TEST_F(GLES2DecoderTest, BeginEndQueryEXTCommandsIssuedCHROMIUM) { EXPECT_FALSE(query->pending()); } -TEST_F(GLES2DecoderTest, BeginEndQueryEXTGetErrorQueryCHROMIUM) { +TEST_P(GLES2DecoderTest, BeginEndQueryEXTGetErrorQueryCHROMIUM) { BeginQueryEXT begin_cmd; GenHelper<GenQueriesEXTImmediate>(kNewClientId); // Test valid parameters work. - begin_cmd.Init( - GL_GET_ERROR_QUERY_CHROMIUM, kNewClientId, - kSharedMemoryId, kSharedMemoryOffset); + begin_cmd.Init(GL_GET_ERROR_QUERY_CHROMIUM, + kNewClientId, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); @@ -7350,107 +849,70 @@ TEST_F(GLES2DecoderTest, BeginEndQueryEXTGetErrorQueryCHROMIUM) { static_cast<GLenum>(sync->result)); } -TEST_F(GLES2DecoderTest, ProduceAndConsumeTextureCHROMIUM) { - GLbyte mailbox[GL_MAILBOX_SIZE_CHROMIUM]; - group().mailbox_manager()->GenerateMailboxName( - reinterpret_cast<MailboxName*>(mailbox)); +TEST_P(GLES2DecoderManualInitTest, BeginEndQueryEXTCommandsCompletedCHROMIUM) { + InitState init; + init.extensions = "GL_EXT_occlusion_query_boolean GL_ARB_sync"; + init.gl_version = "opengl es 2.0"; + init.has_alpha = true; + init.request_alpha = true; + init.bind_generates_resource = true; + InitDecoder(init); - memcpy(shared_memory_address_, mailbox, sizeof(mailbox)); + GenHelper<GenQueriesEXTImmediate>(kNewClientId); - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - DoTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - TextureRef* texture_ref = group().texture_manager()->GetTexture( - client_texture_id_); - ASSERT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - EXPECT_EQ(kServiceTextureId, texture->service_id()); - - ProduceTextureCHROMIUM produce_cmd; - produce_cmd.Init(GL_TEXTURE_2D, kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(produce_cmd)); + BeginQueryEXT begin_cmd; + begin_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM, + kNewClientId, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); - // Texture didn't change. - GLsizei width; - GLsizei height; - GLenum type; - GLenum internal_format; - - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); - EXPECT_EQ(3, width); - EXPECT_EQ(1, height); - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); - - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); - EXPECT_EQ(2, width); - EXPECT_EQ(4, height); - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format)); - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); - - // Service ID has not changed. - EXPECT_EQ(kServiceTextureId, texture->service_id()); - - // Create new texture for consume. - EXPECT_CALL(*gl_, GenTextures(_, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)) - .RetiresOnSaturation(); - DoBindTexture(GL_TEXTURE_2D, kNewClientId, kNewServiceId); + QueryManager* query_manager = decoder_->GetQueryManager(); + ASSERT_TRUE(query_manager != NULL); + QueryManager::Query* query = query_manager->GetQuery(kNewClientId); + ASSERT_TRUE(query != NULL); + EXPECT_FALSE(query->pending()); - // Assigns and binds original service size texture ID. - EXPECT_CALL(*gl_, DeleteTextures(1, _)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) - .Times(1) + GLsync kGlSync = reinterpret_cast<GLsync>(0xdeadbeef); + EXPECT_CALL(*gl_, Flush()).RetiresOnSaturation(); + EXPECT_CALL(*gl_, FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)) + .WillOnce(Return(kGlSync)) .RetiresOnSaturation(); - memcpy(shared_memory_address_, mailbox, sizeof(mailbox)); - ConsumeTextureCHROMIUM consume_cmd; - consume_cmd.Init(GL_TEXTURE_2D, kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(consume_cmd)); + EndQueryEXT end_cmd; + end_cmd.Init(GL_COMMANDS_COMPLETED_CHROMIUM, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(end_cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_TRUE(query->pending()); - // Texture is redefined. - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); - EXPECT_EQ(3, width); - EXPECT_EQ(1, height); - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); - - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); - EXPECT_EQ(2, width); - EXPECT_EQ(4, height); - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format)); - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); - - // Service ID is restored. - EXPECT_EQ(kServiceTextureId, texture->service_id()); -} + EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _)) + .WillOnce(Return(GL_TIMEOUT_EXPIRED)) + .RetiresOnSaturation(); + bool process_success = query_manager->ProcessPendingQueries(); + EXPECT_TRUE(process_success); + EXPECT_TRUE(query->pending()); + + EXPECT_CALL(*gl_, ClientWaitSync(kGlSync, _, _)) + .WillOnce(Return(GL_ALREADY_SIGNALED)) + .RetiresOnSaturation(); + process_success = query_manager->ProcessPendingQueries(); -TEST_F(GLES2DecoderTest, CanChangeSurface) { - scoped_refptr<GLSurfaceMock> other_surface(new GLSurfaceMock); - EXPECT_CALL(*other_surface.get(), GetBackingFrameBufferObject()). - WillOnce(Return(7)); - EXPECT_CALL(*gl_, BindFramebufferEXT(GL_FRAMEBUFFER_EXT, 7)); + EXPECT_TRUE(process_success); + EXPECT_FALSE(query->pending()); + QuerySync* sync = static_cast<QuerySync*>(shared_memory_address_); + EXPECT_EQ(static_cast<GLenum>(0), static_cast<GLenum>(sync->result)); - decoder_->SetSurface(other_surface); + EXPECT_CALL(*gl_, DeleteSync(kGlSync)).Times(1).RetiresOnSaturation(); + ResetDecoder(); } -TEST_F(GLES2DecoderTest, IsEnabledReturnsCachedValue) { +TEST_P(GLES2DecoderTest, IsEnabledReturnsCachedValue) { // NOTE: There are no expectations because no GL functions should be // called for DEPTH_TEST or STENCIL_TEST static const GLenum kStates[] = { - GL_DEPTH_TEST, - GL_STENCIL_TEST, + GL_DEPTH_TEST, GL_STENCIL_TEST, }; for (size_t ii = 0; ii < arraysize(kStates); ++ii) { Enable enable_cmd; @@ -7471,732 +933,18 @@ TEST_F(GLES2DecoderTest, IsEnabledReturnsCachedValue) { } } -TEST_F(GLES2DecoderManualInitTest, DepthTextureBadArgs) { - InitDecoder( - "GL_ANGLE_depth_texture", // extensions - false, // has alpha - true, // has depth - true, // has stencil - false, // request alpha - true, // request depth - true, // request stencil - true); // bind generates resource - - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - // Check trying to upload data fails. - TexImage2D tex_cmd; - tex_cmd.Init( - GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, - 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, - kSharedMemoryId, kSharedMemoryOffset); - EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - // Try level > 0. - tex_cmd.Init( - GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT, - 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, 0); - EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - // Make a 1 pixel depth texture. - DoTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, - 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, 0); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // Check that trying to update it fails. - TexSubImage2D tex_sub_cmd; - tex_sub_cmd.Init( - GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, - kSharedMemoryId, kSharedMemoryOffset, GL_FALSE); - EXPECT_EQ(error::kNoError, ExecuteCmd(tex_sub_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - // Check that trying to CopyTexImage2D fails - CopyTexImage2D copy_tex_cmd; - copy_tex_cmd.Init(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, 1, 1, 0); - EXPECT_EQ(error::kNoError, ExecuteCmd(copy_tex_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - - // Check that trying to CopyTexSubImage2D fails - CopyTexSubImage2D copy_sub_cmd; - copy_sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(copy_sub_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, GenerateMipmapDepthTexture) { - InitDecoder( - "GL_ANGLE_depth_texture", // extensions - false, // has alpha - true, // has depth - true, // has stencil - false, // request alpha - true, // request depth - true, // request stencil - true); // bind generates resource - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, - 2, 2, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, - 0, 0); - GenerateMipmap cmd; - cmd.Init(GL_TEXTURE_2D); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, DrawClearsDepthTexture) { - InitDecoder( - "GL_ANGLE_depth_texture", // extensions - true, // has alpha - true, // has depth - false, // has stencil - true, // request alpha - true, // request depth - false, // request stencil - true); // bind generates resource - - SetupDefaultProgram(); - SetupAllNeededVertexBuffers(); - const GLenum attachment = GL_DEPTH_ATTACHMENT; - const GLenum target = GL_TEXTURE_2D; - const GLint level = 0; - DoBindTexture(target, client_texture_id_, kServiceTextureId); - - // Create a depth texture. - DoTexImage2D(target, level, GL_DEPTH_COMPONENT, 1, 1, 0, - GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0, 0); - - EXPECT_CALL(*gl_, GenFramebuffersEXT(1, _)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, _)) - .Times(1) - .RetiresOnSaturation(); - - EXPECT_CALL(*gl_, FramebufferTexture2DEXT( - GL_DRAW_FRAMEBUFFER_EXT, attachment, target, kServiceTextureId, level)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT)) - .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) - .RetiresOnSaturation(); - - EXPECT_CALL(*gl_, ClearStencil(0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, StencilMask(-1)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ClearDepth(1.0f)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DepthMask(true)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST)) - .Times(1) - .RetiresOnSaturation(); - - EXPECT_CALL(*gl_, Clear(GL_DEPTH_BUFFER_BIT)) - .Times(1) - .RetiresOnSaturation(); - - SetupExpectationsForRestoreClearState( - 0.0f, 0.0f, 0.0f, 0.0f, 0, 1.0f, false); - - EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0)) - .Times(1) - .RetiresOnSaturation(); - - SetupExpectationsForApplyingDefaultDirtyState(); - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderWithShaderTest, BindUniformLocationCHROMIUM) { - const GLint kLocation = 2; - const char* kName = "testing"; - const uint32 kNameSize = strlen(kName); - const char* kBadName1 = "gl_testing"; - const uint32 kBadName1Size = strlen(kBadName1); - const char* kBadName2 = "testing[1]"; - const uint32 kBadName2Size = strlen(kBadName2); - memcpy(shared_memory_address_, kName, kNameSize); - BindUniformLocationCHROMIUM cmd; - cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - // check negative location - memcpy(shared_memory_address_, kName, kNameSize); - cmd.Init(client_program_id_, -1, kSharedMemoryId, kSharedMemoryOffset, - kNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - // check highest location - memcpy(shared_memory_address_, kName, kNameSize); - GLint kMaxLocation = - (kMaxFragmentUniformVectors + kMaxVertexUniformVectors) * 4 - 1; - cmd.Init(client_program_id_, kMaxLocation, kSharedMemoryId, - kSharedMemoryOffset, kNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - // check too high location - memcpy(shared_memory_address_, kName, kNameSize); - cmd.Init(client_program_id_, kMaxLocation + 1, kSharedMemoryId, - kSharedMemoryOffset, kNameSize); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); - // check bad name "gl_..." - memcpy(shared_memory_address_, kBadName1, kBadName1Size); - cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset, - kBadName1Size); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - // check bad name "name[1]" non zero - memcpy(shared_memory_address_, kBadName2, kBadName2Size); - cmd.Init(client_program_id_, kLocation, kSharedMemoryId, kSharedMemoryOffset, - kBadName2Size); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -class GLES2DecoderVertexArraysOESTest : public GLES2DecoderWithShaderTest { - public: - GLES2DecoderVertexArraysOESTest() { } - - bool vertex_array_deleted_manually_; - - virtual void SetUp() { - InitDecoder( - "GL_OES_vertex_array_object", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - SetupDefaultProgram(); - - AddExpectationsForGenVertexArraysOES(); - GenHelper<GenVertexArraysOESImmediate>(client_vertexarray_id_); - - vertex_array_deleted_manually_ = false; - } - - virtual void TearDown() { - // This should only be set if the test handled deletion of the vertex array - // itself. Necessary because vertex_array_objects are not sharable, and thus - // not managed in the ContextGroup, meaning they will be destroyed during - // test tear down - if (!vertex_array_deleted_manually_) { - AddExpectationsForDeleteVertexArraysOES(); - } - - GLES2DecoderWithShaderTest::TearDown(); - } - - void GenVertexArraysOESValidArgs() { - AddExpectationsForGenVertexArraysOES(); - GetSharedMemoryAs<GLuint*>()[0] = kNewClientId; - GenVertexArraysOES cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE(GetVertexArrayInfo(kNewClientId) != NULL); - AddExpectationsForDeleteVertexArraysOES(); - } - - void GenVertexArraysOESInvalidArgs() { - EXPECT_CALL(*gl_, GenVertexArraysOES(_, _)).Times(0); - GetSharedMemoryAs<GLuint*>()[0] = client_vertexarray_id_; - GenVertexArraysOES cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); - } - - void GenVertexArraysOESImmediateValidArgs() { - AddExpectationsForGenVertexArraysOES(); - GenVertexArraysOESImmediate* cmd = - GetImmediateAs<GenVertexArraysOESImmediate>(); - GLuint temp = kNewClientId; - cmd->Init(1, &temp); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(*cmd, sizeof(temp))); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE(GetVertexArrayInfo(kNewClientId) != NULL); - AddExpectationsForDeleteVertexArraysOES(); - } - - void GenVertexArraysOESImmediateInvalidArgs() { - EXPECT_CALL(*gl_, GenVertexArraysOES(_, _)).Times(0); - GenVertexArraysOESImmediate* cmd = - GetImmediateAs<GenVertexArraysOESImmediate>(); - cmd->Init(1, &client_vertexarray_id_); - EXPECT_EQ(error::kInvalidArguments, - ExecuteImmediateCmd(*cmd, sizeof(&client_vertexarray_id_))); - } - - void DeleteVertexArraysOESValidArgs() { - AddExpectationsForDeleteVertexArraysOES(); - GetSharedMemoryAs<GLuint*>()[0] = client_vertexarray_id_; - DeleteVertexArraysOES cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE( - GetVertexArrayInfo(client_vertexarray_id_) == NULL); - vertex_array_deleted_manually_ = true; - } - - void DeleteVertexArraysOESInvalidArgs() { - GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId; - DeleteVertexArraysOES cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - } - - void DeleteVertexArraysOESImmediateValidArgs() { - AddExpectationsForDeleteVertexArraysOES(); - DeleteVertexArraysOESImmediate& cmd = - *GetImmediateAs<DeleteVertexArraysOESImmediate>(); - cmd.Init(1, &client_vertexarray_id_); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(client_vertexarray_id_))); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE( - GetVertexArrayInfo(client_vertexarray_id_) == NULL); - vertex_array_deleted_manually_ = true; - } - - void DeleteVertexArraysOESImmediateInvalidArgs() { - DeleteVertexArraysOESImmediate& cmd = - *GetImmediateAs<DeleteVertexArraysOESImmediate>(); - GLuint temp = kInvalidClientId; - cmd.Init(1, &temp); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); - } - - void IsVertexArrayOESValidArgs() { - IsVertexArrayOES cmd; - cmd.Init(client_vertexarray_id_, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - } - - void IsVertexArrayOESInvalidArgsBadSharedMemoryId() { - IsVertexArrayOES cmd; - cmd.Init( - client_vertexarray_id_, kInvalidSharedMemoryId, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - cmd.Init( - client_vertexarray_id_, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - } - - void BindVertexArrayOESValidArgs() { - AddExpectationsForBindVertexArrayOES(); - BindVertexArrayOES cmd; - cmd.Init(client_vertexarray_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - } - - void BindVertexArrayOESValidArgsNewId() { - BindVertexArrayOES cmd; - cmd.Init(kNewClientId); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - } -}; - -class GLES2DecoderEmulatedVertexArraysOESTest - : public GLES2DecoderVertexArraysOESTest { - public: - GLES2DecoderEmulatedVertexArraysOESTest() { } - - virtual void SetUp() { - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - SetupDefaultProgram(); - - AddExpectationsForGenVertexArraysOES(); - GenHelper<GenVertexArraysOESImmediate>(client_vertexarray_id_); - - vertex_array_deleted_manually_ = false; - } -}; - -// Test vertex array objects with native support -TEST_F(GLES2DecoderVertexArraysOESTest, GenVertexArraysOESValidArgs) { - GenVertexArraysOESValidArgs(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, GenVertexArraysOESValidArgs) { - GenVertexArraysOESValidArgs(); -} - -TEST_F(GLES2DecoderVertexArraysOESTest, GenVertexArraysOESInvalidArgs) { - GenVertexArraysOESInvalidArgs(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, ) { - GenVertexArraysOESInvalidArgs(); -} - -TEST_F(GLES2DecoderVertexArraysOESTest, GenVertexArraysOESImmediateValidArgs) { - GenVertexArraysOESImmediateValidArgs(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, - GenVertexArraysOESImmediateValidArgs) { - GenVertexArraysOESImmediateValidArgs(); -} - -TEST_F(GLES2DecoderVertexArraysOESTest, - GenVertexArraysOESImmediateInvalidArgs) { - GenVertexArraysOESImmediateInvalidArgs(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, - GenVertexArraysOESImmediateInvalidArgs) { - GenVertexArraysOESImmediateInvalidArgs(); -} - -TEST_F(GLES2DecoderVertexArraysOESTest, DeleteVertexArraysOESValidArgs) { - DeleteVertexArraysOESValidArgs(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, - DeleteVertexArraysOESValidArgs) { - DeleteVertexArraysOESValidArgs(); -} - -TEST_F(GLES2DecoderVertexArraysOESTest, DeleteVertexArraysOESInvalidArgs) { - DeleteVertexArraysOESInvalidArgs(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, - DeleteVertexArraysOESInvalidArgs) { - DeleteVertexArraysOESInvalidArgs(); -} - -TEST_F(GLES2DecoderVertexArraysOESTest, - DeleteVertexArraysOESImmediateValidArgs) { - DeleteVertexArraysOESImmediateValidArgs(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, - DeleteVertexArraysOESImmediateValidArgs) { - DeleteVertexArraysOESImmediateValidArgs(); -} - -TEST_F(GLES2DecoderVertexArraysOESTest, - DeleteVertexArraysOESImmediateInvalidArgs) { - DeleteVertexArraysOESImmediateInvalidArgs(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, - DeleteVertexArraysOESImmediateInvalidArgs) { - DeleteVertexArraysOESImmediateInvalidArgs(); -} - -TEST_F(GLES2DecoderVertexArraysOESTest, IsVertexArrayOESValidArgs) { - IsVertexArrayOESValidArgs(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, IsVertexArrayOESValidArgs) { - IsVertexArrayOESValidArgs(); -} - -TEST_F(GLES2DecoderVertexArraysOESTest, - IsVertexArrayOESInvalidArgsBadSharedMemoryId) { - IsVertexArrayOESInvalidArgsBadSharedMemoryId(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, - IsVertexArrayOESInvalidArgsBadSharedMemoryId) { - IsVertexArrayOESInvalidArgsBadSharedMemoryId(); -} - -TEST_F(GLES2DecoderVertexArraysOESTest, BindVertexArrayOESValidArgs) { - BindVertexArrayOESValidArgs(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, BindVertexArrayOESValidArgs) { - BindVertexArrayOESValidArgs(); -} - -TEST_F(GLES2DecoderVertexArraysOESTest, BindVertexArrayOESValidArgsNewId) { - BindVertexArrayOESValidArgsNewId(); -} -TEST_F(GLES2DecoderEmulatedVertexArraysOESTest, - BindVertexArrayOESValidArgsNewId) { - BindVertexArrayOESValidArgsNewId(); -} - -TEST_F(GLES2DecoderTest, BindTexImage2DCHROMIUM) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - TextureRef* texture_ref = group().texture_manager()->GetTexture( - client_texture_id_); - ASSERT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - EXPECT_EQ(kServiceTextureId, texture->service_id()); - - group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1); - EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL); - - GLsizei width; - GLsizei height; - GLenum type; - GLenum internal_format; - - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); - EXPECT_EQ(3, width); - EXPECT_EQ(1, height); - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); - EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); - - // Bind image to texture. - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; - bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); - // Image should now be set. - EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); - - // Define new texture image. - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); - // Image should no longer be set. - EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); -} - -TEST_F(GLES2DecoderTest, ReleaseTexImage2DCHROMIUM) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0, 0); - TextureRef* texture_ref = group().texture_manager()->GetTexture( - client_texture_id_); - ASSERT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - EXPECT_EQ(kServiceTextureId, texture->service_id()); - - group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1); - EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL); - - GLsizei width; - GLsizei height; - GLenum type; - GLenum internal_format; - - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); - EXPECT_EQ(3, width); - EXPECT_EQ(1, height); - EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); - EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); - EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); - EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); - - // Bind image to texture. - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; - bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); - // Image should now be set. - EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); - - // Release image from texture. - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - ReleaseTexImage2DCHROMIUM release_tex_image_2d_cmd; - release_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(release_tex_image_2d_cmd)); - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); - // Image should no longer be set. - EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); -} - -class MockGLImage : public gfx::GLImage { - public: - MockGLImage() {} - - // Overridden from gfx::GLImage: - MOCK_METHOD0(Destroy, void()); - MOCK_METHOD0(GetSize, gfx::Size()); - MOCK_METHOD1(BindTexImage, bool(unsigned)); - MOCK_METHOD1(ReleaseTexImage, void(unsigned)); - MOCK_METHOD0(WillUseTexImage, void()); - MOCK_METHOD0(DidUseTexImage, void()); - - protected: - virtual ~MockGLImage() {} -}; - -TEST_F(GLES2DecoderWithShaderTest, UseTexImage) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); - - TextureRef* texture_ref = group().texture_manager()->GetTexture( - client_texture_id_); - ASSERT_TRUE(texture_ref != NULL); - Texture* texture = texture_ref->texture(); - EXPECT_EQ(kServiceTextureId, texture->service_id()); - - const int32 kImageId = 1; - scoped_refptr<MockGLImage> image(new MockGLImage); - group().image_manager()->AddImage(image.get(), kImageId); - - // Bind image to texture. - EXPECT_CALL(*image, BindTexImage(GL_TEXTURE_2D)) - .Times(1) - .WillOnce(Return(true)) - .RetiresOnSaturation(); - EXPECT_CALL(*image, GetSize()) - .Times(1) - .WillOnce(Return(gfx::Size(1, 1))) - .RetiresOnSaturation(); - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; - bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, kImageId); - EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); - - AddExpectationsForSimulatedAttrib0(kNumVertices, 0); - SetupExpectationsForApplyingDefaultDirtyState(); - - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) - .Times(3) - .RetiresOnSaturation(); - EXPECT_CALL(*image, WillUseTexImage()) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*image, DidUseTexImage()) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) - .Times(1) - .RetiresOnSaturation(); - DrawArrays cmd; - cmd.Init(GL_TRIANGLES, 0, kNumVertices); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) - .Times(2) - .RetiresOnSaturation(); - // Image will be 'in use' as long as bound to a framebuffer. - EXPECT_CALL(*image, WillUseTexImage()) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, FramebufferTexture2DEXT( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kServiceTextureId, 0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - FramebufferTexture2D fbtex_cmd; - fbtex_cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_, - 0); - EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - - // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - kServiceRenderbufferId)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) - .Times(2) - .RetiresOnSaturation(); - // Image should no longer be 'in use' after being unbound from framebuffer. - EXPECT_CALL(*image, DidUseTexImage()) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - FramebufferRenderbuffer fbrb_cmd; - fbrb_cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); -} - -TEST_F(GLES2DecoderManualInitTest, GpuMemoryManagerCHROMIUM) { - InitDecoder( - "GL_ARB_texture_rectangle", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource +TEST_P(GLES2DecoderManualInitTest, GpuMemoryManagerCHROMIUM) { + InitState init; + init.extensions = "GL_ARB_texture_rectangle"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); Texture* texture = GetTexture(client_texture_id_)->texture(); EXPECT_TRUE(texture != NULL); EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_UNMANAGED_CHROMIUM); - DoBindTexture( - GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); TexParameteri cmd; cmd.Init(GL_TEXTURE_2D, @@ -8213,258 +961,11 @@ TEST_F(GLES2DecoderManualInitTest, GpuMemoryManagerCHROMIUM) { EXPECT_TRUE(texture->pool() == GL_TEXTURE_POOL_MANAGED_CHROMIUM); - cmd.Init(GL_TEXTURE_2D, - GL_TEXTURE_POOL_CHROMIUM, - GL_NONE); + cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_POOL_CHROMIUM, GL_NONE); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransfers) { - InitDecoder( - "GL_CHROMIUM_async_pixel_transfers", // extensions - false, false, false, // has alpha/depth/stencil - false, false, false, // request alpha/depth/stencil - true); // bind generates resource - - // Set up the texture. - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - TextureRef* texture_ref = GetTexture(client_texture_id_); - Texture* texture = texture_ref->texture(); - - // Set a mock Async delegate - StrictMock<gpu::MockAsyncPixelTransferManager>* manager = - new StrictMock<gpu::MockAsyncPixelTransferManager>; - manager->Initialize(group().texture_manager()); - decoder_->SetAsyncPixelTransferManagerForTest(manager); - StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL; - - // Tex(Sub)Image2D upload commands. - AsyncTexImage2DCHROMIUM teximage_cmd; - teximage_cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); - AsyncTexSubImage2DCHROMIUM texsubimage_cmd; - texsubimage_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 8, 8, GL_RGBA, - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); - WaitAsyncTexImage2DCHROMIUM wait_cmd; - wait_cmd.Init(GL_TEXTURE_2D); - - // No transfer state exists initially. - EXPECT_FALSE( - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( - texture_ref)); - - base::Closure bind_callback; - - // AsyncTexImage2D - { - // Create transfer state since it doesn't exist. - EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) - .WillOnce(Return( - delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) - .RetiresOnSaturation(); - EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)) - .WillOnce(SaveArg<2>(&bind_callback)) - .RetiresOnSaturation(); - // Command succeeds. - EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ( - delegate, - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( - texture_ref)); - EXPECT_TRUE(texture->IsImmutable()); - // The texture is safe but the level has not been defined yet. - EXPECT_TRUE(texture->SafeToRenderFrom()); - GLsizei width, height; - EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); - } - { - // Async redefinitions are not allowed! - // Command fails. - EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ( - delegate, - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( - texture_ref)); - EXPECT_TRUE(texture->IsImmutable()); - EXPECT_TRUE(texture->SafeToRenderFrom()); - } - - // Binding/defining of the async transfer - { - // TODO(epenner): We should check that the manager gets the - // BindCompletedAsyncTransfers() call, which is required to - // guarantee the delegate calls the bind callback. - - // Simulate the bind callback from the delegate. - bind_callback.Run(); - - // After the bind callback is run, the texture is safe, - // and has the right size etc. - EXPECT_TRUE(texture->SafeToRenderFrom()); - GLsizei width, height; - EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); - EXPECT_EQ(width, 8); - EXPECT_EQ(height, 8); - } - - // AsyncTexSubImage2D - decoder_->GetAsyncPixelTransferManager() - ->ClearPixelTransferDelegateForTest(texture_ref); - texture->SetImmutable(false); - { - // Create transfer state since it doesn't exist. - EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) - .WillOnce(Return( - delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) - .RetiresOnSaturation(); - EXPECT_CALL(*delegate, AsyncTexSubImage2D(_, _)) - .RetiresOnSaturation(); - // Command succeeds. - EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ( - delegate, - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( - texture_ref)); - EXPECT_TRUE(texture->IsImmutable()); - EXPECT_TRUE(texture->SafeToRenderFrom()); - } - { - // No transfer is in progress. - EXPECT_CALL(*delegate, TransferIsInProgress()) - .WillOnce(Return(false)) // texSubImage validation - .WillOnce(Return(false)) // async validation - .RetiresOnSaturation(); - EXPECT_CALL(*delegate, AsyncTexSubImage2D(_, _)) - .RetiresOnSaturation(); - // Command succeeds. - EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ( - delegate, - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( - texture_ref)); - EXPECT_TRUE(texture->IsImmutable()); - EXPECT_TRUE(texture->SafeToRenderFrom()); - } - { - // A transfer is still in progress! - EXPECT_CALL(*delegate, TransferIsInProgress()) - .WillOnce(Return(true)) - .RetiresOnSaturation(); - // No async call, command fails. - EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd)); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); - EXPECT_EQ( - delegate, - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( - texture_ref)); - EXPECT_TRUE(texture->IsImmutable()); - EXPECT_TRUE(texture->SafeToRenderFrom()); - } - - // Delete delegate on DeleteTexture. - { - EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); - DoDeleteTexture(client_texture_id_, kServiceTextureId); - EXPECT_FALSE( - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( - texture_ref)); - delegate = NULL; - } - - // WaitAsyncTexImage2D - { - // Get a fresh texture since the existing texture cannot be respecified - // asynchronously and AsyncTexSubImage2D does not involved binding. - EXPECT_CALL(*gl_, GenTextures(1, _)) - .WillOnce(SetArgumentPointee<1>(kServiceTextureId)); - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - texture_ref = GetTexture(client_texture_id_); - texture = texture_ref->texture(); - texture->SetImmutable(false); - // Create transfer state since it doesn't exist. - EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) - .WillOnce(Return( - delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) - .RetiresOnSaturation(); - EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)) - .RetiresOnSaturation(); - // Start async transfer. - EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_EQ( - delegate, - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( - texture_ref)); - - EXPECT_TRUE(texture->IsImmutable()); - // Wait for completion. - EXPECT_CALL(*delegate, WaitForTransferCompletion()); - EXPECT_CALL(*manager, BindCompletedAsyncTransfers()); - EXPECT_EQ(error::kNoError, ExecuteCmd(wait_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - } -} - -TEST_F(GLES2DecoderManualInitTest, AsyncPixelTransferManager) { - InitDecoder( - "GL_CHROMIUM_async_pixel_transfers", // extensions - false, false, false, // has alpha/depth/stencil - false, false, false, // request alpha/depth/stencil - true); // bind generates resource - - // Set up the texture. - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - TextureRef* texture_ref = GetTexture(client_texture_id_); - - // Set a mock Async delegate. - StrictMock<gpu::MockAsyncPixelTransferManager>* manager = - new StrictMock<gpu::MockAsyncPixelTransferManager>; - manager->Initialize(group().texture_manager()); - decoder_->SetAsyncPixelTransferManagerForTest(manager); - StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL; - - AsyncTexImage2DCHROMIUM teximage_cmd; - teximage_cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 8, 8, 0, GL_RGBA, - GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); - - // No transfer delegate exists initially. - EXPECT_FALSE( - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( - texture_ref)); - - // Create delegate on AsyncTexImage2D. - { - EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) - .WillOnce(Return( - delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) - .RetiresOnSaturation(); - EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)).RetiresOnSaturation(); - - // Command succeeds. - EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - } - - // Delegate is cached. - EXPECT_EQ(delegate, - decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( - texture_ref)); - - // Delete delegate on manager teardown. - { - EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); - decoder_->ResetAsyncPixelTransferManagerForTest(); - - // Texture ref still valid. - EXPECT_EQ(texture_ref, GetTexture(client_texture_id_)); - } -} - namespace { class SizeOnlyMemoryTracker : public MemoryTracker { @@ -8476,15 +977,15 @@ class SizeOnlyMemoryTracker : public MemoryTracker { const size_t kInitialManagedPoolSize = 0; pool_infos_[MemoryTracker::kUnmanaged].initial_size = kInitialUnmanagedPoolSize; - pool_infos_[MemoryTracker::kManaged].initial_size = - kInitialManagedPoolSize; + pool_infos_[MemoryTracker::kManaged].initial_size = kInitialManagedPoolSize; } // Ensure a certain amount of GPU memory is free. Returns true on success. MOCK_METHOD1(EnsureGPUMemoryAvailable, bool(size_t size_needed)); - virtual void TrackMemoryAllocatedChange( - size_t old_size, size_t new_size, Pool pool) { + virtual void TrackMemoryAllocatedChange(size_t old_size, + size_t new_size, + Pool pool) { PoolInfo& info = pool_infos_[pool]; info.size += new_size - old_size; } @@ -8495,13 +996,9 @@ class SizeOnlyMemoryTracker : public MemoryTracker { } private: - virtual ~SizeOnlyMemoryTracker() { - } + virtual ~SizeOnlyMemoryTracker() {} struct PoolInfo { - PoolInfo() - : initial_size(0), - size(0) { - } + PoolInfo() : initial_size(0), size(0) {} size_t initial_size; size_t size; }; @@ -8510,78 +1007,90 @@ class SizeOnlyMemoryTracker : public MemoryTracker { } // anonymous namespace. -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerInitialSize) { +TEST_P(GLES2DecoderManualInitTest, MemoryTrackerInitialSize) { scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = new SizeOnlyMemoryTracker(); set_memory_tracker(memory_tracker.get()); - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); // Expect that initial size - size is 0. EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); EXPECT_EQ(0u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); } -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexImage2D) { +TEST_P(GLES2DecoderManualInitTest, MemoryTrackerTexImage2D) { scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = new SizeOnlyMemoryTracker(); set_memory_tracker(memory_tracker.get()); - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) - .WillOnce(Return(true)).RetiresOnSaturation(); - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 8, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); + .WillOnce(Return(true)) + .RetiresOnSaturation(); + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + 8, + 4, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64)) - .WillOnce(Return(true)).RetiresOnSaturation(); - DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); + .WillOnce(Return(true)) + .RetiresOnSaturation(); + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + 4, + 4, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); // Check we get out of memory and no call to glTexImage2D if Ensure fails. EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(64)) - .WillOnce(Return(false)).RetiresOnSaturation(); + .WillOnce(Return(false)) + .RetiresOnSaturation(); TexImage2D cmd; - cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, - kSharedMemoryId, kSharedMemoryOffset); + cmd.Init(GL_TEXTURE_2D, + 0, + GL_RGBA, + 4, + 4, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); EXPECT_EQ(64u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); } -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) { +TEST_P(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) { scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = new SizeOnlyMemoryTracker(); set_memory_tracker(memory_tracker.get()); - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); // Check we get out of memory and no call to glTexStorage2DEXT // if Ensure fails. EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) - .WillOnce(Return(false)).RetiresOnSaturation(); + .WillOnce(Return(false)) + .RetiresOnSaturation(); TexStorage2DEXT cmd; cmd.Init(GL_TEXTURE_2D, 1, GL_RGBA8, 8, 4); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); @@ -8589,7 +1098,7 @@ TEST_F(GLES2DecoderManualInitTest, MemoryTrackerTexStorage2DEXT) { EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); } -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) { +TEST_P(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) { GLenum target = GL_TEXTURE_2D; GLint level = 0; GLenum internal_format = GL_RGBA; @@ -8599,62 +1108,57 @@ TEST_F(GLES2DecoderManualInitTest, MemoryTrackerCopyTexImage2D) { scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = new SizeOnlyMemoryTracker(); set_memory_tracker(memory_tracker.get()); - InitDecoder( - "", // extensions - true, // has alpha - false, // has depth - false, // has stencil - true, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource + InitState init; + init.gl_version = "3.0"; + init.has_alpha = true; + init.request_alpha = true; + init.bind_generates_resource = true; + InitDecoder(init); DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) - .WillOnce(Return(true)).RetiresOnSaturation(); + .WillOnce(Return(true)) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, CopyTexImage2D( - target, level, internal_format, 0, 0, width, height, border)) + EXPECT_CALL(*gl_, + CopyTexImage2D( + target, level, internal_format, 0, 0, width, height, border)) .Times(1) .RetiresOnSaturation(); CopyTexImage2D cmd; - cmd.Init(target, level, internal_format, 0, 0, width, height, border); + cmd.Init(target, level, internal_format, 0, 0, width, height); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); // Check we get out of memory and no call to glCopyTexImage2D if Ensure fails. EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) - .WillOnce(Return(false)).RetiresOnSaturation(); + .WillOnce(Return(false)) + .RetiresOnSaturation(); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); } -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) { +TEST_P(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) { scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = new SizeOnlyMemoryTracker(); set_memory_tracker(memory_tracker.get()); - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) .RetiresOnSaturation(); EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) - .WillOnce(Return(true)).RetiresOnSaturation(); - EXPECT_CALL(*gl_, RenderbufferStorageEXT( - GL_RENDERBUFFER, GL_RGBA, 8, 4)) + .WillOnce(Return(true)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, RenderbufferStorageEXT(GL_RENDERBUFFER, GL_RGBA, 8, 4)) .Times(1) .RetiresOnSaturation(); RenderbufferStorage cmd; @@ -8665,33 +1169,29 @@ TEST_F(GLES2DecoderManualInitTest, MemoryTrackerRenderbufferStorage) { // Check we get out of memory and no call to glRenderbufferStorage if Ensure // fails. EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) - .WillOnce(Return(false)).RetiresOnSaturation(); + .WillOnce(Return(false)) + .RetiresOnSaturation(); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kUnmanaged)); } -TEST_F(GLES2DecoderManualInitTest, MemoryTrackerBufferData) { +TEST_P(GLES2DecoderManualInitTest, MemoryTrackerBufferData) { scoped_refptr<SizeOnlyMemoryTracker> memory_tracker = new SizeOnlyMemoryTracker(); set_memory_tracker(memory_tracker.get()); - InitDecoder( - "", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - true); // bind generates resource - DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, - kServiceBufferId); + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) .RetiresOnSaturation(); EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) - .WillOnce(Return(true)).RetiresOnSaturation(); + .WillOnce(Return(true)) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, BufferData(GL_ARRAY_BUFFER, 128, _, GL_STREAM_DRAW)) .Times(1) .RetiresOnSaturation(); @@ -8703,206 +1203,96 @@ TEST_F(GLES2DecoderManualInitTest, MemoryTrackerBufferData) { // Check we get out of memory and no call to glBufferData if Ensure // fails. EXPECT_CALL(*memory_tracker.get(), EnsureGPUMemoryAvailable(128)) - .WillOnce(Return(false)).RetiresOnSaturation(); + .WillOnce(Return(false)) + .RetiresOnSaturation(); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); EXPECT_EQ(128u, memory_tracker->GetPoolSize(MemoryTracker::kManaged)); } -TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateSuccceeds) { - const GLsizei count = 1; - const GLenum bufs[] = { GL_COLOR_ATTACHMENT0 }; - DrawBuffersEXTImmediate& cmd = - *GetImmediateAs<DrawBuffersEXTImmediate>(); - cmd.Init(count, bufs); - - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - EXPECT_CALL(*gl_, DrawBuffersARB(count, _)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(bufs))); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateFails) { - const GLsizei count = 1; - const GLenum bufs[] = { GL_COLOR_ATTACHMENT1_EXT }; - DrawBuffersEXTImmediate& cmd = - *GetImmediateAs<DrawBuffersEXTImmediate>(); - cmd.Init(count, bufs); - - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(bufs))); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); -} - -TEST_F(GLES2DecoderTest, DrawBuffersEXTImmediateBackbuffer) { - const GLsizei count = 1; - const GLenum bufs[] = { GL_BACK }; - DrawBuffersEXTImmediate& cmd = - *GetImmediateAs<DrawBuffersEXTImmediate>(); - cmd.Init(count, bufs); - - DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, - kServiceFramebufferId); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(bufs))); - EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +TEST_P(GLES2DecoderManualInitTest, ImmutableCopyTexImage2D) { + const GLenum kTarget = GL_TEXTURE_2D; + const GLint kLevel = 0; + const GLenum kInternalFormat = GL_RGBA; + const GLenum kSizedInternalFormat = GL_RGBA8; + const GLsizei kWidth = 4; + const GLsizei kHeight = 8; + const GLint kBorder = 0; + InitState init; + init.extensions = "GL_EXT_texture_storage"; + init.gl_version = "3.0"; + init.has_alpha = true; + init.request_alpha = true; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); - DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); // unbind + // CopyTexImage2D will call arbitrary amount of GetErrors. + EXPECT_CALL(*gl_, GetError()) + .Times(AtLeast(1)); - EXPECT_CALL(*gl_, DrawBuffersARB(count, _)) - .Times(1) - .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + CopyTexImage2D( + kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight, + kBorder)) + .Times(1); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(bufs))); + EXPECT_CALL(*gl_, + TexStorage2DEXT( + kTarget, kLevel, kSizedInternalFormat, kWidth, kHeight)) + .Times(1); + CopyTexImage2D copy_cmd; + copy_cmd.Init(kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight); + EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderManualInitTest, DiscardFramebufferEXT) { - InitDecoder("GL_EXT_discard_framebuffer", // extensions - false, // has alpha - false, // has depth - false, // has stencil - false, // request alpha - false, // request depth - false, // request stencil - false); // bind generates resource - - const GLenum target = GL_FRAMEBUFFER; - const GLsizei count = 1; - const GLenum attachments[] = { GL_COLOR_ATTACHMENT0 }; - - SetupTexture(); - DoBindFramebuffer( - GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); - DoFramebufferTexture2D(GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, - client_texture_id_, - kServiceTextureId, - 0, - GL_NO_ERROR); - FramebufferManager* framebuffer_manager = group().framebuffer_manager(); - Framebuffer* framebuffer = - framebuffer_manager->GetFramebuffer(client_framebuffer_id_); - EXPECT_TRUE(framebuffer->IsCleared()); - - EXPECT_CALL(*gl_, DiscardFramebufferEXT(target, count, _)) - .Times(1) - .RetiresOnSaturation(); - DiscardFramebufferEXTImmediate& cmd = - *GetImmediateAs<DiscardFramebufferEXTImmediate>(); - cmd.Init(target, count, attachments); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(attachments))); + TexStorage2DEXT storage_cmd; + storage_cmd.Init(kTarget, kLevel, kSizedInternalFormat, kWidth, kHeight); + EXPECT_EQ(error::kNoError, ExecuteCmd(storage_cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_FALSE(framebuffer->IsCleared()); -} -TEST_F(GLES2DecoderTest, DiscardFramebufferEXTUnsupported) { - const GLenum target = GL_FRAMEBUFFER; - const GLsizei count = 1; - const GLenum attachments[] = { GL_COLOR_EXT }; - DiscardFramebufferEXTImmediate& cmd = - *GetImmediateAs<DiscardFramebufferEXTImmediate>(); - cmd.Init(target, count, attachments); - - // Should not result into a call into GL. - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(attachments))); + // This should not invoke CopyTexImage2D. + copy_cmd.Init(kTarget, kLevel, kInternalFormat, 0, 0, kWidth, kHeight); + EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd)); EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); } -TEST_F(GLES2DecoderManualInitTest, ClearUniformsBeforeFirstProgramUse) { - CommandLine command_line(0, NULL); - command_line.AppendSwitchASCII( - switches::kGpuDriverBugWorkarounds, - base::IntToString(gpu::CLEAR_UNIFORMS_BEFORE_FIRST_PROGRAM_USE)); - InitDecoderWithCommandLine( - "", // extensions - true, // has alpha - false, // has depth - false, // has stencil - true, // request alpha - false, // request depth - false, // request stencil - true, // bind generates resource - &command_line); - { - static AttribInfo attribs[] = { - { kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, }, - { kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, }, - { kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, }, - }; - static UniformInfo uniforms[] = { - { kUniform1Name, kUniform1Size, kUniform1Type, - kUniform1FakeLocation, kUniform1RealLocation, - kUniform1DesiredLocation }, - { kUniform2Name, kUniform2Size, kUniform2Type, - kUniform2FakeLocation, kUniform2RealLocation, - kUniform2DesiredLocation }, - { kUniform3Name, kUniform3Size, kUniform3Type, - kUniform3FakeLocation, kUniform3RealLocation, - kUniform3DesiredLocation }, - }; - SetupShader(attribs, arraysize(attribs), uniforms, arraysize(uniforms), - client_program_id_, kServiceProgramId, - client_vertex_shader_id_, kServiceVertexShaderId, - client_fragment_shader_id_, kServiceFragmentShaderId); - TestHelper::SetupExpectationsForClearingUniforms( - gl_.get(), uniforms, arraysize(uniforms)); - } - - { - EXPECT_CALL(*gl_, UseProgram(kServiceProgramId)) - .Times(1) - .RetiresOnSaturation(); - cmds::UseProgram cmd; - cmd.Init(client_program_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - } +TEST_P(GLES2DecoderTest, LoseContextCHROMIUMValidArgs) { + EXPECT_CALL(*mock_decoder_, LoseContext(GL_GUILTY_CONTEXT_RESET_ARB)) + .Times(1); + cmds::LoseContextCHROMIUM cmd; + cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_GUILTY_CONTEXT_RESET_ARB); + EXPECT_EQ(error::kLostContext, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -// TODO(gman): Complete this test. -// TEST_F(GLES2DecoderTest, CompressedTexImage2DGLError) { -// } - -// TODO(gman): BufferData - -// TODO(gman): BufferDataImmediate - -// TODO(gman): BufferSubData - -// TODO(gman): BufferSubDataImmediate - -// TODO(gman): CompressedTexImage2D - -// TODO(gman): CompressedTexImage2DImmediate - -// TODO(gman): CompressedTexSubImage2DImmediate - -// TODO(gman): DeleteProgram - -// TODO(gman): DeleteShader - -// TODO(gman): PixelStorei +TEST_P(GLES2DecoderTest, LoseContextCHROMIUMInvalidArgs0_0) { + EXPECT_CALL(*mock_decoder_, LoseContext(_)) + .Times(0); + cmds::LoseContextCHROMIUM cmd; + cmd.Init(GL_NONE, GL_GUILTY_CONTEXT_RESET_ARB); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} -// TODO(gman): TexImage2D +TEST_P(GLES2DecoderTest, LoseContextCHROMIUMInvalidArgs1_0) { + EXPECT_CALL(*mock_decoder_, LoseContext(_)) + .Times(0); + cmds::LoseContextCHROMIUM cmd; + cmd.Init(GL_GUILTY_CONTEXT_RESET_ARB, GL_NONE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} -// TODO(gman): TexImage2DImmediate +INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderTest, ::testing::Bool()); -// TODO(gman): TexSubImage2DImmediate +INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderWithShaderTest, ::testing::Bool()); -// TODO(gman): UseProgram +INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderManualInitTest, ::testing::Bool()); -// TODO(gman): SwapBuffers +INSTANTIATE_TEST_CASE_P(Service, + GLES2DecoderRGBBackbufferTest, + ::testing::Bool()); } // namespace gles2 } // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest.h b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest.h new file mode 100644 index 00000000000..fea20abba52 --- /dev/null +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest.h @@ -0,0 +1,80 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_H_ +#define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_H_ + +#include "gpu/command_buffer/common/gles2_cmd_format.h" +#include "gpu/command_buffer/common/gles2_cmd_utils.h" +#include "gpu/command_buffer/service/buffer_manager.h" +#include "gpu/command_buffer/service/cmd_buffer_engine.h" +#include "gpu/command_buffer/service/context_group.h" +#include "gpu/command_buffer/service/framebuffer_manager.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h" +#include "gpu/command_buffer/service/program_manager.h" +#include "gpu/command_buffer/service/query_manager.h" +#include "gpu/command_buffer/service/renderbuffer_manager.h" +#include "gpu/command_buffer/service/shader_manager.h" +#include "gpu/command_buffer/service/test_helper.h" +#include "gpu/command_buffer/service/texture_manager.h" +#include "gpu/command_buffer/service/vertex_array_manager.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_context_stub_with_extensions.h" +#include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface_stub.h" + +namespace base { +class CommandLine; +} + +namespace gpu { +namespace gles2 { + +class GLES2DecoderTest : public GLES2DecoderTestBase { + public: + GLES2DecoderTest() {} + + protected: + void CheckReadPixelsOutOfRange(GLint in_read_x, + GLint in_read_y, + GLsizei in_read_width, + GLsizei in_read_height, + bool init); +}; + +class GLES2DecoderWithShaderTest : public GLES2DecoderWithShaderTestBase { + public: + GLES2DecoderWithShaderTest() : GLES2DecoderWithShaderTestBase() {} + + void CheckTextureChangesMarkFBOAsNotComplete(bool bound_fbo); + void CheckRenderbufferChangesMarkFBOAsNotComplete(bool bound_fbo); +}; + +class GLES2DecoderRGBBackbufferTest : public GLES2DecoderWithShaderTest { + public: + GLES2DecoderRGBBackbufferTest() {} + + virtual void SetUp(); +}; + +class GLES2DecoderManualInitTest : public GLES2DecoderWithShaderTest { + public: + GLES2DecoderManualInitTest() {} + + // Override default setup so nothing gets setup. + virtual void SetUp(); + + void DirtyStateMaskTest(GLuint color_bits, + bool depth_mask, + GLuint front_stencil_mask, + GLuint back_stencil_mask); + void EnableDisableTest(GLenum cap, bool enable, bool expect_set); +}; + +} // namespace gles2 +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_H_ diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h index ac8a8f206ef..3eb5acb7279 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_0_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // It is included by gles2_cmd_decoder_unittest_base.cc @@ -35,50 +37,30 @@ void GLES2DecoderTestBase::SetupInitStateExpectations() { EXPECT_CALL(*gl_, ClearColor(0.0f, 0.0f, 0.0f, 0.0f)) .Times(1) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ClearDepth(1.0f)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ClearStencil(0)) - .Times(1) - .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ClearDepth(1.0f)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, ClearStencil(0)).Times(1).RetiresOnSaturation(); EXPECT_CALL(*gl_, ColorMask(true, true, true, true)) .Times(1) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, CullFace(GL_BACK)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DepthFunc(GL_LESS)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DepthMask(true)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DepthRange(0.0f, 1.0f)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, FrontFace(GL_CCW)) - .Times(1) - .RetiresOnSaturation(); + EXPECT_CALL(*gl_, CullFace(GL_BACK)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, DepthFunc(GL_LESS)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, DepthMask(true)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, DepthRange(0.0f, 1.0f)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, FrontFace(GL_CCW)).Times(1).RetiresOnSaturation(); EXPECT_CALL(*gl_, Hint(GL_GENERATE_MIPMAP_HINT, GL_DONT_CARE)) .Times(1) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, LineWidth(1.0f)) - .Times(1) - .RetiresOnSaturation(); + EXPECT_CALL(*gl_, LineWidth(1.0f)).Times(1).RetiresOnSaturation(); EXPECT_CALL(*gl_, PixelStorei(GL_PACK_ALIGNMENT, 4)) .Times(1) .RetiresOnSaturation(); EXPECT_CALL(*gl_, PixelStorei(GL_UNPACK_ALIGNMENT, 4)) .Times(1) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, PolygonOffset(0.0f, 0.0f)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, SampleCoverage(1.0f, false)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL( - *gl_, Scissor(kViewportX, kViewportY, kViewportWidth, kViewportHeight)) + EXPECT_CALL(*gl_, PolygonOffset(0.0f, 0.0f)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, SampleCoverage(1.0f, false)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, + Scissor(kViewportX, kViewportY, kViewportWidth, kViewportHeight)) .Times(1) .RetiresOnSaturation(); EXPECT_CALL(*gl_, StencilFuncSeparate(GL_FRONT, GL_ALWAYS, 0, 0xFFFFFFFFU)) @@ -99,10 +81,9 @@ void GLES2DecoderTestBase::SetupInitStateExpectations() { EXPECT_CALL(*gl_, StencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_KEEP)) .Times(1) .RetiresOnSaturation(); - EXPECT_CALL( - *gl_, Viewport(kViewportX, kViewportY, kViewportWidth, kViewportHeight)) + EXPECT_CALL(*gl_, + Viewport(kViewportX, kViewportY, kViewportWidth, kViewportHeight)) .Times(1) .RetiresOnSaturation(); } #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_0_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc index 9c3d7339afe..10f6af17389 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1.cc @@ -37,6 +37,8 @@ class GLES2DecoderTest1 : public GLES2DecoderTestBase { GLES2DecoderTest1() { } }; +INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderTest1, ::testing::Bool()); + template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::GenerateMipmap, 0>( bool valid) { @@ -45,14 +47,6 @@ void GLES2DecoderTestBase::SpecializedSetup<cmds::GenerateMipmap, 0>( GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, kSharedMemoryId, kSharedMemoryOffset); if (valid) { - EXPECT_CALL(*gl_, TexParameteri( - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, TexParameteri( - GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR)) - .Times(1) - .RetiresOnSaturation(); EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) @@ -281,6 +275,26 @@ void GLES2DecoderTestBase::SpecializedSetup<cmds::GetVertexAttribiv, 0>( } }; +template <> +void GLES2DecoderTestBase::SpecializedSetup<cmds::RenderbufferStorage, 0>( + bool valid) { + DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, + kServiceRenderbufferId); + if (valid) { + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + RenderbufferStorageEXT(GL_RENDERBUFFER, _, 3, 4)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + } +} + + #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h" } // namespace gles2 diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h index d89779b1f3e..32e20d82720 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // It is included by gles2_cmd_decoder_unittest_1.cc @@ -12,7 +14,7 @@ // TODO(gman): ActiveTexture -TEST_F(GLES2DecoderTest1, AttachShaderValidArgs) { +TEST_P(GLES2DecoderTest1, AttachShaderValidArgs) { EXPECT_CALL(*gl_, AttachShader(kServiceProgramId, kServiceShaderId)); SpecializedSetup<cmds::AttachShader, 0>(true); cmds::AttachShader cmd; @@ -20,11 +22,9 @@ TEST_F(GLES2DecoderTest1, AttachShaderValidArgs) { EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -// TODO(gman): BindAttribLocation - // TODO(gman): BindAttribLocationBucket -TEST_F(GLES2DecoderTest1, BindBufferValidArgs) { +TEST_P(GLES2DecoderTest1, BindBufferValidArgs) { EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, kServiceBufferId)); SpecializedSetup<cmds::BindBuffer, 0>(true); cmds::BindBuffer cmd; @@ -33,10 +33,10 @@ TEST_F(GLES2DecoderTest1, BindBufferValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, BindBufferValidArgsNewId) { +TEST_P(GLES2DecoderTest1, BindBufferValidArgsNewId) { EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, kNewServiceId)); EXPECT_CALL(*gl_, GenBuffersARB(1, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)); + .WillOnce(SetArgumentPointee<1>(kNewServiceId)); SpecializedSetup<cmds::BindBuffer, 0>(true); cmds::BindBuffer cmd; cmd.Init(GL_ARRAY_BUFFER, kNewClientId); @@ -45,7 +45,7 @@ TEST_F(GLES2DecoderTest1, BindBufferValidArgsNewId) { EXPECT_TRUE(GetBuffer(kNewClientId) != NULL); } -TEST_F(GLES2DecoderTest1, BindBufferInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, BindBufferInvalidArgs0_0) { EXPECT_CALL(*gl_, BindBuffer(_, _)).Times(0); SpecializedSetup<cmds::BindBuffer, 0>(false); cmds::BindBuffer cmd; @@ -54,7 +54,7 @@ TEST_F(GLES2DecoderTest1, BindBufferInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BindFramebufferValidArgs) { +TEST_P(GLES2DecoderTest1, BindFramebufferValidArgs) { EXPECT_CALL(*gl_, BindFramebufferEXT(GL_FRAMEBUFFER, kServiceFramebufferId)); SpecializedSetup<cmds::BindFramebuffer, 0>(true); cmds::BindFramebuffer cmd; @@ -63,10 +63,10 @@ TEST_F(GLES2DecoderTest1, BindFramebufferValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, BindFramebufferValidArgsNewId) { +TEST_P(GLES2DecoderTest1, BindFramebufferValidArgsNewId) { EXPECT_CALL(*gl_, BindFramebufferEXT(GL_FRAMEBUFFER, kNewServiceId)); EXPECT_CALL(*gl_, GenFramebuffersEXT(1, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)); + .WillOnce(SetArgumentPointee<1>(kNewServiceId)); SpecializedSetup<cmds::BindFramebuffer, 0>(true); cmds::BindFramebuffer cmd; cmd.Init(GL_FRAMEBUFFER, kNewClientId); @@ -75,7 +75,7 @@ TEST_F(GLES2DecoderTest1, BindFramebufferValidArgsNewId) { EXPECT_TRUE(GetFramebuffer(kNewClientId) != NULL); } -TEST_F(GLES2DecoderTest1, BindFramebufferInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, BindFramebufferInvalidArgs0_0) { EXPECT_CALL(*gl_, BindFramebufferEXT(_, _)).Times(0); SpecializedSetup<cmds::BindFramebuffer, 0>(false); cmds::BindFramebuffer cmd; @@ -84,7 +84,7 @@ TEST_F(GLES2DecoderTest1, BindFramebufferInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BindFramebufferInvalidArgs0_1) { +TEST_P(GLES2DecoderTest1, BindFramebufferInvalidArgs0_1) { EXPECT_CALL(*gl_, BindFramebufferEXT(_, _)).Times(0); SpecializedSetup<cmds::BindFramebuffer, 0>(false); cmds::BindFramebuffer cmd; @@ -93,9 +93,9 @@ TEST_F(GLES2DecoderTest1, BindFramebufferInvalidArgs0_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BindRenderbufferValidArgs) { - EXPECT_CALL( - *gl_, BindRenderbufferEXT(GL_RENDERBUFFER, kServiceRenderbufferId)); +TEST_P(GLES2DecoderTest1, BindRenderbufferValidArgs) { + EXPECT_CALL(*gl_, + BindRenderbufferEXT(GL_RENDERBUFFER, kServiceRenderbufferId)); SpecializedSetup<cmds::BindRenderbuffer, 0>(true); cmds::BindRenderbuffer cmd; cmd.Init(GL_RENDERBUFFER, client_renderbuffer_id_); @@ -103,10 +103,10 @@ TEST_F(GLES2DecoderTest1, BindRenderbufferValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, BindRenderbufferValidArgsNewId) { +TEST_P(GLES2DecoderTest1, BindRenderbufferValidArgsNewId) { EXPECT_CALL(*gl_, BindRenderbufferEXT(GL_RENDERBUFFER, kNewServiceId)); EXPECT_CALL(*gl_, GenRenderbuffersEXT(1, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)); + .WillOnce(SetArgumentPointee<1>(kNewServiceId)); SpecializedSetup<cmds::BindRenderbuffer, 0>(true); cmds::BindRenderbuffer cmd; cmd.Init(GL_RENDERBUFFER, kNewClientId); @@ -115,7 +115,7 @@ TEST_F(GLES2DecoderTest1, BindRenderbufferValidArgsNewId) { EXPECT_TRUE(GetRenderbuffer(kNewClientId) != NULL); } -TEST_F(GLES2DecoderTest1, BindRenderbufferInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, BindRenderbufferInvalidArgs0_0) { EXPECT_CALL(*gl_, BindRenderbufferEXT(_, _)).Times(0); SpecializedSetup<cmds::BindRenderbuffer, 0>(false); cmds::BindRenderbuffer cmd; @@ -124,7 +124,7 @@ TEST_F(GLES2DecoderTest1, BindRenderbufferInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BindTextureValidArgs) { +TEST_P(GLES2DecoderTest1, BindTextureValidArgs) { EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)); SpecializedSetup<cmds::BindTexture, 0>(true); cmds::BindTexture cmd; @@ -133,10 +133,10 @@ TEST_F(GLES2DecoderTest1, BindTextureValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, BindTextureValidArgsNewId) { +TEST_P(GLES2DecoderTest1, BindTextureValidArgsNewId) { EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kNewServiceId)); EXPECT_CALL(*gl_, GenTextures(1, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)); + .WillOnce(SetArgumentPointee<1>(kNewServiceId)); SpecializedSetup<cmds::BindTexture, 0>(true); cmds::BindTexture cmd; cmd.Init(GL_TEXTURE_2D, kNewClientId); @@ -145,7 +145,7 @@ TEST_F(GLES2DecoderTest1, BindTextureValidArgsNewId) { EXPECT_TRUE(GetTexture(kNewClientId) != NULL); } -TEST_F(GLES2DecoderTest1, BindTextureInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, BindTextureInvalidArgs0_0) { EXPECT_CALL(*gl_, BindTexture(_, _)).Times(0); SpecializedSetup<cmds::BindTexture, 0>(false); cmds::BindTexture cmd; @@ -154,7 +154,7 @@ TEST_F(GLES2DecoderTest1, BindTextureInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BindTextureInvalidArgs0_1) { +TEST_P(GLES2DecoderTest1, BindTextureInvalidArgs0_1) { EXPECT_CALL(*gl_, BindTexture(_, _)).Times(0); SpecializedSetup<cmds::BindTexture, 0>(false); cmds::BindTexture cmd; @@ -163,7 +163,7 @@ TEST_F(GLES2DecoderTest1, BindTextureInvalidArgs0_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BlendColorValidArgs) { +TEST_P(GLES2DecoderTest1, BlendColorValidArgs) { EXPECT_CALL(*gl_, BlendColor(1, 2, 3, 4)); SpecializedSetup<cmds::BlendColor, 0>(true); cmds::BlendColor cmd; @@ -172,7 +172,7 @@ TEST_F(GLES2DecoderTest1, BlendColorValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, BlendEquationValidArgs) { +TEST_P(GLES2DecoderTest1, BlendEquationValidArgs) { EXPECT_CALL(*gl_, BlendEquation(GL_FUNC_SUBTRACT)); SpecializedSetup<cmds::BlendEquation, 0>(true); cmds::BlendEquation cmd; @@ -181,7 +181,7 @@ TEST_F(GLES2DecoderTest1, BlendEquationValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, BlendEquationInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, BlendEquationInvalidArgs0_0) { EXPECT_CALL(*gl_, BlendEquation(_)).Times(0); SpecializedSetup<cmds::BlendEquation, 0>(false); cmds::BlendEquation cmd; @@ -190,7 +190,7 @@ TEST_F(GLES2DecoderTest1, BlendEquationInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BlendEquationInvalidArgs0_1) { +TEST_P(GLES2DecoderTest1, BlendEquationInvalidArgs0_1) { EXPECT_CALL(*gl_, BlendEquation(_)).Times(0); SpecializedSetup<cmds::BlendEquation, 0>(false); cmds::BlendEquation cmd; @@ -199,7 +199,7 @@ TEST_F(GLES2DecoderTest1, BlendEquationInvalidArgs0_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BlendEquationSeparateValidArgs) { +TEST_P(GLES2DecoderTest1, BlendEquationSeparateValidArgs) { EXPECT_CALL(*gl_, BlendEquationSeparate(GL_FUNC_SUBTRACT, GL_FUNC_ADD)); SpecializedSetup<cmds::BlendEquationSeparate, 0>(true); cmds::BlendEquationSeparate cmd; @@ -208,7 +208,7 @@ TEST_F(GLES2DecoderTest1, BlendEquationSeparateValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs0_0) { EXPECT_CALL(*gl_, BlendEquationSeparate(_, _)).Times(0); SpecializedSetup<cmds::BlendEquationSeparate, 0>(false); cmds::BlendEquationSeparate cmd; @@ -217,7 +217,7 @@ TEST_F(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs0_1) { +TEST_P(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs0_1) { EXPECT_CALL(*gl_, BlendEquationSeparate(_, _)).Times(0); SpecializedSetup<cmds::BlendEquationSeparate, 0>(false); cmds::BlendEquationSeparate cmd; @@ -226,7 +226,7 @@ TEST_F(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs0_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs1_0) { +TEST_P(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs1_0) { EXPECT_CALL(*gl_, BlendEquationSeparate(_, _)).Times(0); SpecializedSetup<cmds::BlendEquationSeparate, 0>(false); cmds::BlendEquationSeparate cmd; @@ -235,7 +235,7 @@ TEST_F(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs1_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs1_1) { +TEST_P(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs1_1) { EXPECT_CALL(*gl_, BlendEquationSeparate(_, _)).Times(0); SpecializedSetup<cmds::BlendEquationSeparate, 0>(false); cmds::BlendEquationSeparate cmd; @@ -244,7 +244,7 @@ TEST_F(GLES2DecoderTest1, BlendEquationSeparateInvalidArgs1_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, BlendFuncValidArgs) { +TEST_P(GLES2DecoderTest1, BlendFuncValidArgs) { EXPECT_CALL(*gl_, BlendFunc(GL_ZERO, GL_ZERO)); SpecializedSetup<cmds::BlendFunc, 0>(true); cmds::BlendFunc cmd; @@ -253,7 +253,7 @@ TEST_F(GLES2DecoderTest1, BlendFuncValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, BlendFuncSeparateValidArgs) { +TEST_P(GLES2DecoderTest1, BlendFuncSeparateValidArgs) { EXPECT_CALL(*gl_, BlendFuncSeparate(GL_ZERO, GL_ZERO, GL_ZERO, GL_ZERO)); SpecializedSetup<cmds::BlendFuncSeparate, 0>(true); cmds::BlendFuncSeparate cmd; @@ -265,8 +265,7 @@ TEST_F(GLES2DecoderTest1, BlendFuncSeparateValidArgs) { // TODO(gman): BufferSubData - -TEST_F(GLES2DecoderTest1, CheckFramebufferStatusValidArgs) { +TEST_P(GLES2DecoderTest1, CheckFramebufferStatusValidArgs) { EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)); SpecializedSetup<cmds::CheckFramebufferStatus, 0>(true); cmds::CheckFramebufferStatus cmd; @@ -275,7 +274,7 @@ TEST_F(GLES2DecoderTest1, CheckFramebufferStatusValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, CheckFramebufferStatusInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, CheckFramebufferStatusInvalidArgs0_0) { EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(_)).Times(0); SpecializedSetup<cmds::CheckFramebufferStatus, 0>(false); cmds::CheckFramebufferStatus cmd; @@ -284,7 +283,7 @@ TEST_F(GLES2DecoderTest1, CheckFramebufferStatusInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, CheckFramebufferStatusInvalidArgs0_1) { +TEST_P(GLES2DecoderTest1, CheckFramebufferStatusInvalidArgs0_1) { EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(_)).Times(0); SpecializedSetup<cmds::CheckFramebufferStatus, 0>(false); cmds::CheckFramebufferStatus cmd; @@ -293,7 +292,7 @@ TEST_F(GLES2DecoderTest1, CheckFramebufferStatusInvalidArgs0_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, CheckFramebufferStatusInvalidArgsBadSharedMemoryId) { +TEST_P(GLES2DecoderTest1, CheckFramebufferStatusInvalidArgsBadSharedMemoryId) { EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)).Times(0); SpecializedSetup<cmds::CheckFramebufferStatus, 0>(false); cmds::CheckFramebufferStatus cmd; @@ -303,7 +302,7 @@ TEST_F(GLES2DecoderTest1, CheckFramebufferStatusInvalidArgsBadSharedMemoryId) { EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } -TEST_F(GLES2DecoderTest1, ClearValidArgs) { +TEST_P(GLES2DecoderTest1, ClearValidArgs) { EXPECT_CALL(*gl_, Clear(1)); SpecializedSetup<cmds::Clear, 0>(true); cmds::Clear cmd; @@ -312,7 +311,7 @@ TEST_F(GLES2DecoderTest1, ClearValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, ClearColorValidArgs) { +TEST_P(GLES2DecoderTest1, ClearColorValidArgs) { EXPECT_CALL(*gl_, ClearColor(1, 2, 3, 4)); SpecializedSetup<cmds::ClearColor, 0>(true); cmds::ClearColor cmd; @@ -321,7 +320,7 @@ TEST_F(GLES2DecoderTest1, ClearColorValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, ClearDepthfValidArgs) { +TEST_P(GLES2DecoderTest1, ClearDepthfValidArgs) { EXPECT_CALL(*gl_, ClearDepth(0.5f)); SpecializedSetup<cmds::ClearDepthf, 0>(true); cmds::ClearDepthf cmd; @@ -330,7 +329,7 @@ TEST_F(GLES2DecoderTest1, ClearDepthfValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, ClearStencilValidArgs) { +TEST_P(GLES2DecoderTest1, ClearStencilValidArgs) { EXPECT_CALL(*gl_, ClearStencil(1)); SpecializedSetup<cmds::ClearStencil, 0>(true); cmds::ClearStencil cmd; @@ -339,7 +338,7 @@ TEST_F(GLES2DecoderTest1, ClearStencilValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, ColorMaskValidArgs) { +TEST_P(GLES2DecoderTest1, ColorMaskValidArgs) { SpecializedSetup<cmds::ColorMask, 0>(true); cmds::ColorMask cmd; cmd.Init(true, true, true, true); @@ -347,15 +346,15 @@ TEST_F(GLES2DecoderTest1, ColorMaskValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } // TODO(gman): CompileShader +// TODO(gman): CompressedTexImage2DBucket // TODO(gman): CompressedTexImage2D -// TODO(gman): CompressedTexImage2DBucket +// TODO(gman): CompressedTexSubImage2DBucket // TODO(gman): CompressedTexSubImage2D -// TODO(gman): CompressedTexSubImage2DBucket // TODO(gman): CopyTexImage2D -TEST_F(GLES2DecoderTest1, CopyTexSubImage2DValidArgs) { +TEST_P(GLES2DecoderTest1, CopyTexSubImage2DValidArgs) { EXPECT_CALL(*gl_, CopyTexSubImage2D(GL_TEXTURE_2D, 2, 3, 4, 5, 6, 7, 8)); SpecializedSetup<cmds::CopyTexSubImage2D, 0>(true); cmds::CopyTexSubImage2D cmd; @@ -364,7 +363,7 @@ TEST_F(GLES2DecoderTest1, CopyTexSubImage2DValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, CopyTexSubImage2DInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, CopyTexSubImage2DInvalidArgs0_0) { EXPECT_CALL(*gl_, CopyTexSubImage2D(_, _, _, _, _, _, _, _)).Times(0); SpecializedSetup<cmds::CopyTexSubImage2D, 0>(false); cmds::CopyTexSubImage2D cmd; @@ -373,7 +372,7 @@ TEST_F(GLES2DecoderTest1, CopyTexSubImage2DInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, CopyTexSubImage2DInvalidArgs6_0) { +TEST_P(GLES2DecoderTest1, CopyTexSubImage2DInvalidArgs6_0) { EXPECT_CALL(*gl_, CopyTexSubImage2D(_, _, _, _, _, _, _, _)).Times(0); SpecializedSetup<cmds::CopyTexSubImage2D, 0>(false); cmds::CopyTexSubImage2D cmd; @@ -382,7 +381,7 @@ TEST_F(GLES2DecoderTest1, CopyTexSubImage2DInvalidArgs6_0) { EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); } -TEST_F(GLES2DecoderTest1, CopyTexSubImage2DInvalidArgs7_0) { +TEST_P(GLES2DecoderTest1, CopyTexSubImage2DInvalidArgs7_0) { EXPECT_CALL(*gl_, CopyTexSubImage2D(_, _, _, _, _, _, _, _)).Times(0); SpecializedSetup<cmds::CopyTexSubImage2D, 0>(false); cmds::CopyTexSubImage2D cmd; @@ -391,9 +390,8 @@ TEST_F(GLES2DecoderTest1, CopyTexSubImage2DInvalidArgs7_0) { EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); } -TEST_F(GLES2DecoderTest1, CreateProgramValidArgs) { - EXPECT_CALL(*gl_, CreateProgram()) - .WillOnce(Return(kNewServiceId)); +TEST_P(GLES2DecoderTest1, CreateProgramValidArgs) { + EXPECT_CALL(*gl_, CreateProgram()).WillOnce(Return(kNewServiceId)); SpecializedSetup<cmds::CreateProgram, 0>(true); cmds::CreateProgram cmd; cmd.Init(kNewClientId); @@ -402,7 +400,7 @@ TEST_F(GLES2DecoderTest1, CreateProgramValidArgs) { EXPECT_TRUE(GetProgram(kNewClientId) != NULL); } -TEST_F(GLES2DecoderTest1, CreateShaderValidArgs) { +TEST_P(GLES2DecoderTest1, CreateShaderValidArgs) { EXPECT_CALL(*gl_, CreateShader(GL_VERTEX_SHADER)) .WillOnce(Return(kNewServiceId)); SpecializedSetup<cmds::CreateShader, 0>(true); @@ -413,7 +411,7 @@ TEST_F(GLES2DecoderTest1, CreateShaderValidArgs) { EXPECT_TRUE(GetShader(kNewClientId) != NULL); } -TEST_F(GLES2DecoderTest1, CreateShaderInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, CreateShaderInvalidArgs0_0) { EXPECT_CALL(*gl_, CreateShader(_)).Times(0); SpecializedSetup<cmds::CreateShader, 0>(false); cmds::CreateShader cmd; @@ -422,7 +420,7 @@ TEST_F(GLES2DecoderTest1, CreateShaderInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, CullFaceValidArgs) { +TEST_P(GLES2DecoderTest1, CullFaceValidArgs) { EXPECT_CALL(*gl_, CullFace(GL_FRONT)); SpecializedSetup<cmds::CullFace, 0>(true); cmds::CullFace cmd; @@ -431,34 +429,8 @@ TEST_F(GLES2DecoderTest1, CullFaceValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, DeleteBuffersValidArgs) { - EXPECT_CALL( - *gl_, - DeleteBuffersARB(1, Pointee(kServiceBufferId))) - .Times(1); - GetSharedMemoryAs<GLuint*>()[0] = client_buffer_id_; - SpecializedSetup<cmds::DeleteBuffers, 0>(true); - cmds::DeleteBuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE( - GetBuffer(client_buffer_id_) == NULL); -} - -TEST_F(GLES2DecoderTest1, DeleteBuffersInvalidArgs) { - GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId; - SpecializedSetup<cmds::DeleteBuffers, 0>(false); - cmds::DeleteBuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest1, DeleteBuffersImmediateValidArgs) { - EXPECT_CALL( - *gl_, - DeleteBuffersARB(1, Pointee(kServiceBufferId))) - .Times(1); +TEST_P(GLES2DecoderTest1, DeleteBuffersImmediateValidArgs) { + EXPECT_CALL(*gl_, DeleteBuffersARB(1, Pointee(kServiceBufferId))).Times(1); cmds::DeleteBuffersImmediate& cmd = *GetImmediateAs<cmds::DeleteBuffersImmediate>(); SpecializedSetup<cmds::DeleteBuffersImmediate, 0>(true); @@ -466,47 +438,20 @@ TEST_F(GLES2DecoderTest1, DeleteBuffersImmediateValidArgs) { EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(client_buffer_id_))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE( - GetBuffer(client_buffer_id_) == NULL); + EXPECT_TRUE(GetBuffer(client_buffer_id_) == NULL); } -TEST_F(GLES2DecoderTest1, DeleteBuffersImmediateInvalidArgs) { +TEST_P(GLES2DecoderTest1, DeleteBuffersImmediateInvalidArgs) { cmds::DeleteBuffersImmediate& cmd = *GetImmediateAs<cmds::DeleteBuffersImmediate>(); SpecializedSetup<cmds::DeleteBuffersImmediate, 0>(false); GLuint temp = kInvalidClientId; cmd.Init(1, &temp); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); -} - -TEST_F(GLES2DecoderTest1, DeleteFramebuffersValidArgs) { - EXPECT_CALL( - *gl_, - DeleteFramebuffersEXT(1, Pointee(kServiceFramebufferId))) - .Times(1); - GetSharedMemoryAs<GLuint*>()[0] = client_framebuffer_id_; - SpecializedSetup<cmds::DeleteFramebuffers, 0>(true); - cmds::DeleteFramebuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE( - GetFramebuffer(client_framebuffer_id_) == NULL); -} - -TEST_F(GLES2DecoderTest1, DeleteFramebuffersInvalidArgs) { - GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId; - SpecializedSetup<cmds::DeleteFramebuffers, 0>(false); - cmds::DeleteFramebuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); } -TEST_F(GLES2DecoderTest1, DeleteFramebuffersImmediateValidArgs) { - EXPECT_CALL( - *gl_, - DeleteFramebuffersEXT(1, Pointee(kServiceFramebufferId))) +TEST_P(GLES2DecoderTest1, DeleteFramebuffersImmediateValidArgs) { + EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, Pointee(kServiceFramebufferId))) .Times(1); cmds::DeleteFramebuffersImmediate& cmd = *GetImmediateAs<cmds::DeleteFramebuffersImmediate>(); @@ -515,21 +460,19 @@ TEST_F(GLES2DecoderTest1, DeleteFramebuffersImmediateValidArgs) { EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(client_framebuffer_id_))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE( - GetFramebuffer(client_framebuffer_id_) == NULL); + EXPECT_TRUE(GetFramebuffer(client_framebuffer_id_) == NULL); } -TEST_F(GLES2DecoderTest1, DeleteFramebuffersImmediateInvalidArgs) { +TEST_P(GLES2DecoderTest1, DeleteFramebuffersImmediateInvalidArgs) { cmds::DeleteFramebuffersImmediate& cmd = *GetImmediateAs<cmds::DeleteFramebuffersImmediate>(); SpecializedSetup<cmds::DeleteFramebuffersImmediate, 0>(false); GLuint temp = kInvalidClientId; cmd.Init(1, &temp); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); } -TEST_F(GLES2DecoderTest1, DeleteProgramValidArgs) { +TEST_P(GLES2DecoderTest1, DeleteProgramValidArgs) { EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)); SpecializedSetup<cmds::DeleteProgram, 0>(true); cmds::DeleteProgram cmd; @@ -538,33 +481,8 @@ TEST_F(GLES2DecoderTest1, DeleteProgramValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, DeleteRenderbuffersValidArgs) { - EXPECT_CALL( - *gl_, - DeleteRenderbuffersEXT(1, Pointee(kServiceRenderbufferId))) - .Times(1); - GetSharedMemoryAs<GLuint*>()[0] = client_renderbuffer_id_; - SpecializedSetup<cmds::DeleteRenderbuffers, 0>(true); - cmds::DeleteRenderbuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE( - GetRenderbuffer(client_renderbuffer_id_) == NULL); -} - -TEST_F(GLES2DecoderTest1, DeleteRenderbuffersInvalidArgs) { - GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId; - SpecializedSetup<cmds::DeleteRenderbuffers, 0>(false); - cmds::DeleteRenderbuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest1, DeleteRenderbuffersImmediateValidArgs) { - EXPECT_CALL( - *gl_, - DeleteRenderbuffersEXT(1, Pointee(kServiceRenderbufferId))) +TEST_P(GLES2DecoderTest1, DeleteRenderbuffersImmediateValidArgs) { + EXPECT_CALL(*gl_, DeleteRenderbuffersEXT(1, Pointee(kServiceRenderbufferId))) .Times(1); cmds::DeleteRenderbuffersImmediate& cmd = *GetImmediateAs<cmds::DeleteRenderbuffersImmediate>(); @@ -573,21 +491,19 @@ TEST_F(GLES2DecoderTest1, DeleteRenderbuffersImmediateValidArgs) { EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(client_renderbuffer_id_))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE( - GetRenderbuffer(client_renderbuffer_id_) == NULL); + EXPECT_TRUE(GetRenderbuffer(client_renderbuffer_id_) == NULL); } -TEST_F(GLES2DecoderTest1, DeleteRenderbuffersImmediateInvalidArgs) { +TEST_P(GLES2DecoderTest1, DeleteRenderbuffersImmediateInvalidArgs) { cmds::DeleteRenderbuffersImmediate& cmd = *GetImmediateAs<cmds::DeleteRenderbuffersImmediate>(); SpecializedSetup<cmds::DeleteRenderbuffersImmediate, 0>(false); GLuint temp = kInvalidClientId; cmd.Init(1, &temp); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); } -TEST_F(GLES2DecoderTest1, DeleteShaderValidArgs) { +TEST_P(GLES2DecoderTest1, DeleteShaderValidArgs) { EXPECT_CALL(*gl_, DeleteShader(kServiceShaderId)); SpecializedSetup<cmds::DeleteShader, 0>(true); cmds::DeleteShader cmd; @@ -596,34 +512,8 @@ TEST_F(GLES2DecoderTest1, DeleteShaderValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, DeleteTexturesValidArgs) { - EXPECT_CALL( - *gl_, - DeleteTextures(1, Pointee(kServiceTextureId))) - .Times(1); - GetSharedMemoryAs<GLuint*>()[0] = client_texture_id_; - SpecializedSetup<cmds::DeleteTextures, 0>(true); - cmds::DeleteTextures cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE( - GetTexture(client_texture_id_) == NULL); -} - -TEST_F(GLES2DecoderTest1, DeleteTexturesInvalidArgs) { - GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId; - SpecializedSetup<cmds::DeleteTextures, 0>(false); - cmds::DeleteTextures cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest1, DeleteTexturesImmediateValidArgs) { - EXPECT_CALL( - *gl_, - DeleteTextures(1, Pointee(kServiceTextureId))) - .Times(1); +TEST_P(GLES2DecoderTest1, DeleteTexturesImmediateValidArgs) { + EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(kServiceTextureId))).Times(1); cmds::DeleteTexturesImmediate& cmd = *GetImmediateAs<cmds::DeleteTexturesImmediate>(); SpecializedSetup<cmds::DeleteTexturesImmediate, 0>(true); @@ -631,21 +521,19 @@ TEST_F(GLES2DecoderTest1, DeleteTexturesImmediateValidArgs) { EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(client_texture_id_))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE( - GetTexture(client_texture_id_) == NULL); + EXPECT_TRUE(GetTexture(client_texture_id_) == NULL); } -TEST_F(GLES2DecoderTest1, DeleteTexturesImmediateInvalidArgs) { +TEST_P(GLES2DecoderTest1, DeleteTexturesImmediateInvalidArgs) { cmds::DeleteTexturesImmediate& cmd = *GetImmediateAs<cmds::DeleteTexturesImmediate>(); SpecializedSetup<cmds::DeleteTexturesImmediate, 0>(false); GLuint temp = kInvalidClientId; cmd.Init(1, &temp); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); } -TEST_F(GLES2DecoderTest1, DepthFuncValidArgs) { +TEST_P(GLES2DecoderTest1, DepthFuncValidArgs) { EXPECT_CALL(*gl_, DepthFunc(GL_NEVER)); SpecializedSetup<cmds::DepthFunc, 0>(true); cmds::DepthFunc cmd; @@ -654,7 +542,7 @@ TEST_F(GLES2DecoderTest1, DepthFuncValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, DepthMaskValidArgs) { +TEST_P(GLES2DecoderTest1, DepthMaskValidArgs) { SpecializedSetup<cmds::DepthMask, 0>(true); cmds::DepthMask cmd; cmd.Init(true); @@ -662,7 +550,7 @@ TEST_F(GLES2DecoderTest1, DepthMaskValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, DepthRangefValidArgs) { +TEST_P(GLES2DecoderTest1, DepthRangefValidArgs) { EXPECT_CALL(*gl_, DepthRange(1, 2)); SpecializedSetup<cmds::DepthRangef, 0>(true); cmds::DepthRangef cmd; @@ -671,7 +559,7 @@ TEST_F(GLES2DecoderTest1, DepthRangefValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, DetachShaderValidArgs) { +TEST_P(GLES2DecoderTest1, DetachShaderValidArgs) { EXPECT_CALL(*gl_, DetachShader(kServiceProgramId, kServiceShaderId)); SpecializedSetup<cmds::DetachShader, 0>(true); cmds::DetachShader cmd; @@ -680,8 +568,8 @@ TEST_F(GLES2DecoderTest1, DetachShaderValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, DisableValidArgs) { - EXPECT_CALL(*gl_, Disable(GL_BLEND)); +TEST_P(GLES2DecoderTest1, DisableValidArgs) { + SetupExpectationsForEnableDisable(GL_BLEND, false); SpecializedSetup<cmds::Disable, 0>(true); cmds::Disable cmd; cmd.Init(GL_BLEND); @@ -689,7 +577,7 @@ TEST_F(GLES2DecoderTest1, DisableValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, DisableInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, DisableInvalidArgs0_0) { EXPECT_CALL(*gl_, Disable(_)).Times(0); SpecializedSetup<cmds::Disable, 0>(false); cmds::Disable cmd; @@ -698,7 +586,7 @@ TEST_F(GLES2DecoderTest1, DisableInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, DisableInvalidArgs0_1) { +TEST_P(GLES2DecoderTest1, DisableInvalidArgs0_1) { EXPECT_CALL(*gl_, Disable(_)).Times(0); SpecializedSetup<cmds::Disable, 0>(false); cmds::Disable cmd; @@ -707,7 +595,7 @@ TEST_F(GLES2DecoderTest1, DisableInvalidArgs0_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, DisableVertexAttribArrayValidArgs) { +TEST_P(GLES2DecoderTest1, DisableVertexAttribArrayValidArgs) { EXPECT_CALL(*gl_, DisableVertexAttribArray(1)); SpecializedSetup<cmds::DisableVertexAttribArray, 0>(true); cmds::DisableVertexAttribArray cmd; @@ -719,9 +607,8 @@ TEST_F(GLES2DecoderTest1, DisableVertexAttribArrayValidArgs) { // TODO(gman): DrawElements - -TEST_F(GLES2DecoderTest1, EnableValidArgs) { - EXPECT_CALL(*gl_, Enable(GL_BLEND)); +TEST_P(GLES2DecoderTest1, EnableValidArgs) { + SetupExpectationsForEnableDisable(GL_BLEND, true); SpecializedSetup<cmds::Enable, 0>(true); cmds::Enable cmd; cmd.Init(GL_BLEND); @@ -729,7 +616,7 @@ TEST_F(GLES2DecoderTest1, EnableValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, EnableInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, EnableInvalidArgs0_0) { EXPECT_CALL(*gl_, Enable(_)).Times(0); SpecializedSetup<cmds::Enable, 0>(false); cmds::Enable cmd; @@ -738,7 +625,7 @@ TEST_F(GLES2DecoderTest1, EnableInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, EnableInvalidArgs0_1) { +TEST_P(GLES2DecoderTest1, EnableInvalidArgs0_1) { EXPECT_CALL(*gl_, Enable(_)).Times(0); SpecializedSetup<cmds::Enable, 0>(false); cmds::Enable cmd; @@ -747,7 +634,7 @@ TEST_F(GLES2DecoderTest1, EnableInvalidArgs0_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, EnableVertexAttribArrayValidArgs) { +TEST_P(GLES2DecoderTest1, EnableVertexAttribArrayValidArgs) { EXPECT_CALL(*gl_, EnableVertexAttribArray(1)); SpecializedSetup<cmds::EnableVertexAttribArray, 0>(true); cmds::EnableVertexAttribArray cmd; @@ -756,7 +643,7 @@ TEST_F(GLES2DecoderTest1, EnableVertexAttribArrayValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, FinishValidArgs) { +TEST_P(GLES2DecoderTest1, FinishValidArgs) { EXPECT_CALL(*gl_, Finish()); SpecializedSetup<cmds::Finish, 0>(true); cmds::Finish cmd; @@ -765,7 +652,7 @@ TEST_F(GLES2DecoderTest1, FinishValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, FlushValidArgs) { +TEST_P(GLES2DecoderTest1, FlushValidArgs) { EXPECT_CALL(*gl_, Flush()); SpecializedSetup<cmds::Flush, 0>(true); cmds::Flush cmd; @@ -774,112 +661,110 @@ TEST_F(GLES2DecoderTest1, FlushValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, FramebufferRenderbufferValidArgs) { - EXPECT_CALL( - *gl_, FramebufferRenderbufferEXT( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - kServiceRenderbufferId)); +TEST_P(GLES2DecoderTest1, FramebufferRenderbufferValidArgs) { + EXPECT_CALL(*gl_, + FramebufferRenderbufferEXT(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + kServiceRenderbufferId)); SpecializedSetup<cmds::FramebufferRenderbuffer, 0>(true); cmds::FramebufferRenderbuffer cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_); + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + client_renderbuffer_id_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, FramebufferRenderbufferInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, FramebufferRenderbufferInvalidArgs0_0) { EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(_, _, _, _)).Times(0); SpecializedSetup<cmds::FramebufferRenderbuffer, 0>(false); cmds::FramebufferRenderbuffer cmd; - cmd.Init( - GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_); + cmd.Init(GL_DRAW_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + client_renderbuffer_id_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, FramebufferRenderbufferInvalidArgs0_1) { +TEST_P(GLES2DecoderTest1, FramebufferRenderbufferInvalidArgs0_1) { EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(_, _, _, _)).Times(0); SpecializedSetup<cmds::FramebufferRenderbuffer, 0>(false); cmds::FramebufferRenderbuffer cmd; - cmd.Init( - GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, - client_renderbuffer_id_); + cmd.Init(GL_READ_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + client_renderbuffer_id_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, FramebufferRenderbufferInvalidArgs2_0) { +TEST_P(GLES2DecoderTest1, FramebufferRenderbufferInvalidArgs2_0) { EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(_, _, _, _)).Times(0); SpecializedSetup<cmds::FramebufferRenderbuffer, 0>(false); cmds::FramebufferRenderbuffer cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER, - client_renderbuffer_id_); + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER, + client_renderbuffer_id_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, FramebufferTexture2DValidArgs) { - EXPECT_CALL( - *gl_, FramebufferTexture2DEXT( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - kServiceTextureId, 0)); +TEST_P(GLES2DecoderTest1, FramebufferTexture2DValidArgs) { + EXPECT_CALL(*gl_, + FramebufferTexture2DEXT(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kServiceTextureId, + 0)); SpecializedSetup<cmds::FramebufferTexture2D, 0>(true); cmds::FramebufferTexture2D cmd; cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_, - 0); + GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, FramebufferTexture2DInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, FramebufferTexture2DInvalidArgs0_0) { EXPECT_CALL(*gl_, FramebufferTexture2DEXT(_, _, _, _, _)).Times(0); SpecializedSetup<cmds::FramebufferTexture2D, 0>(false); cmds::FramebufferTexture2D cmd; - cmd.Init( - GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - client_texture_id_, 0); + cmd.Init(GL_DRAW_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + client_texture_id_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, FramebufferTexture2DInvalidArgs0_1) { +TEST_P(GLES2DecoderTest1, FramebufferTexture2DInvalidArgs0_1) { EXPECT_CALL(*gl_, FramebufferTexture2DEXT(_, _, _, _, _)).Times(0); SpecializedSetup<cmds::FramebufferTexture2D, 0>(false); cmds::FramebufferTexture2D cmd; - cmd.Init( - GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - client_texture_id_, 0); + cmd.Init(GL_READ_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + client_texture_id_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, FramebufferTexture2DInvalidArgs2_0) { +TEST_P(GLES2DecoderTest1, FramebufferTexture2DInvalidArgs2_0) { EXPECT_CALL(*gl_, FramebufferTexture2DEXT(_, _, _, _, _)).Times(0); SpecializedSetup<cmds::FramebufferTexture2D, 0>(false); cmds::FramebufferTexture2D cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_PROXY_TEXTURE_CUBE_MAP, - client_texture_id_, 0); + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_PROXY_TEXTURE_CUBE_MAP, + client_texture_id_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, FramebufferTexture2DInvalidArgs4_0) { - EXPECT_CALL(*gl_, FramebufferTexture2DEXT(_, _, _, _, _)).Times(0); - SpecializedSetup<cmds::FramebufferTexture2D, 0>(false); - cmds::FramebufferTexture2D cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, client_texture_id_, - 1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest1, FrontFaceValidArgs) { +TEST_P(GLES2DecoderTest1, FrontFaceValidArgs) { EXPECT_CALL(*gl_, FrontFace(GL_CW)); SpecializedSetup<cmds::FrontFace, 0>(true); cmds::FrontFace cmd; @@ -888,41 +773,19 @@ TEST_F(GLES2DecoderTest1, FrontFaceValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GenBuffersValidArgs) { - EXPECT_CALL(*gl_, GenBuffersARB(1, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)); - GetSharedMemoryAs<GLuint*>()[0] = kNewClientId; - SpecializedSetup<cmds::GenBuffers, 0>(true); - cmds::GenBuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE(GetBuffer(kNewClientId) != NULL); -} - -TEST_F(GLES2DecoderTest1, GenBuffersInvalidArgs) { - EXPECT_CALL(*gl_, GenBuffersARB(_, _)).Times(0); - GetSharedMemoryAs<GLuint*>()[0] = client_buffer_id_; - SpecializedSetup<cmds::GenBuffers, 0>(false); - cmds::GenBuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest1, GenBuffersImmediateValidArgs) { +TEST_P(GLES2DecoderTest1, GenBuffersImmediateValidArgs) { EXPECT_CALL(*gl_, GenBuffersARB(1, _)) .WillOnce(SetArgumentPointee<1>(kNewServiceId)); cmds::GenBuffersImmediate* cmd = GetImmediateAs<cmds::GenBuffersImmediate>(); GLuint temp = kNewClientId; SpecializedSetup<cmds::GenBuffersImmediate, 0>(true); cmd->Init(1, &temp); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(*cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(*cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); EXPECT_TRUE(GetBuffer(kNewClientId) != NULL); } -TEST_F(GLES2DecoderTest1, GenBuffersImmediateInvalidArgs) { +TEST_P(GLES2DecoderTest1, GenBuffersImmediateInvalidArgs) { EXPECT_CALL(*gl_, GenBuffersARB(_, _)).Times(0); cmds::GenBuffersImmediate* cmd = GetImmediateAs<cmds::GenBuffersImmediate>(); SpecializedSetup<cmds::GenBuffersImmediate, 0>(false); @@ -931,7 +794,7 @@ TEST_F(GLES2DecoderTest1, GenBuffersImmediateInvalidArgs) { ExecuteImmediateCmd(*cmd, sizeof(&client_buffer_id_))); } -TEST_F(GLES2DecoderTest1, GenerateMipmapValidArgs) { +TEST_P(GLES2DecoderTest1, GenerateMipmapValidArgs) { EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D)); SpecializedSetup<cmds::GenerateMipmap, 0>(true); cmds::GenerateMipmap cmd; @@ -940,7 +803,7 @@ TEST_F(GLES2DecoderTest1, GenerateMipmapValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GenerateMipmapInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, GenerateMipmapInvalidArgs0_0) { EXPECT_CALL(*gl_, GenerateMipmapEXT(_)).Times(0); SpecializedSetup<cmds::GenerateMipmap, 0>(false); cmds::GenerateMipmap cmd; @@ -949,7 +812,7 @@ TEST_F(GLES2DecoderTest1, GenerateMipmapInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GenerateMipmapInvalidArgs0_1) { +TEST_P(GLES2DecoderTest1, GenerateMipmapInvalidArgs0_1) { EXPECT_CALL(*gl_, GenerateMipmapEXT(_)).Times(0); SpecializedSetup<cmds::GenerateMipmap, 0>(false); cmds::GenerateMipmap cmd; @@ -958,28 +821,7 @@ TEST_F(GLES2DecoderTest1, GenerateMipmapInvalidArgs0_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GenFramebuffersValidArgs) { - EXPECT_CALL(*gl_, GenFramebuffersEXT(1, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)); - GetSharedMemoryAs<GLuint*>()[0] = kNewClientId; - SpecializedSetup<cmds::GenFramebuffers, 0>(true); - cmds::GenFramebuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE(GetFramebuffer(kNewClientId) != NULL); -} - -TEST_F(GLES2DecoderTest1, GenFramebuffersInvalidArgs) { - EXPECT_CALL(*gl_, GenFramebuffersEXT(_, _)).Times(0); - GetSharedMemoryAs<GLuint*>()[0] = client_framebuffer_id_; - SpecializedSetup<cmds::GenFramebuffers, 0>(false); - cmds::GenFramebuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest1, GenFramebuffersImmediateValidArgs) { +TEST_P(GLES2DecoderTest1, GenFramebuffersImmediateValidArgs) { EXPECT_CALL(*gl_, GenFramebuffersEXT(1, _)) .WillOnce(SetArgumentPointee<1>(kNewServiceId)); cmds::GenFramebuffersImmediate* cmd = @@ -987,13 +829,12 @@ TEST_F(GLES2DecoderTest1, GenFramebuffersImmediateValidArgs) { GLuint temp = kNewClientId; SpecializedSetup<cmds::GenFramebuffersImmediate, 0>(true); cmd->Init(1, &temp); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(*cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(*cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); EXPECT_TRUE(GetFramebuffer(kNewClientId) != NULL); } -TEST_F(GLES2DecoderTest1, GenFramebuffersImmediateInvalidArgs) { +TEST_P(GLES2DecoderTest1, GenFramebuffersImmediateInvalidArgs) { EXPECT_CALL(*gl_, GenFramebuffersEXT(_, _)).Times(0); cmds::GenFramebuffersImmediate* cmd = GetImmediateAs<cmds::GenFramebuffersImmediate>(); @@ -1003,28 +844,7 @@ TEST_F(GLES2DecoderTest1, GenFramebuffersImmediateInvalidArgs) { ExecuteImmediateCmd(*cmd, sizeof(&client_framebuffer_id_))); } -TEST_F(GLES2DecoderTest1, GenRenderbuffersValidArgs) { - EXPECT_CALL(*gl_, GenRenderbuffersEXT(1, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)); - GetSharedMemoryAs<GLuint*>()[0] = kNewClientId; - SpecializedSetup<cmds::GenRenderbuffers, 0>(true); - cmds::GenRenderbuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE(GetRenderbuffer(kNewClientId) != NULL); -} - -TEST_F(GLES2DecoderTest1, GenRenderbuffersInvalidArgs) { - EXPECT_CALL(*gl_, GenRenderbuffersEXT(_, _)).Times(0); - GetSharedMemoryAs<GLuint*>()[0] = client_renderbuffer_id_; - SpecializedSetup<cmds::GenRenderbuffers, 0>(false); - cmds::GenRenderbuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest1, GenRenderbuffersImmediateValidArgs) { +TEST_P(GLES2DecoderTest1, GenRenderbuffersImmediateValidArgs) { EXPECT_CALL(*gl_, GenRenderbuffersEXT(1, _)) .WillOnce(SetArgumentPointee<1>(kNewServiceId)); cmds::GenRenderbuffersImmediate* cmd = @@ -1032,13 +852,12 @@ TEST_F(GLES2DecoderTest1, GenRenderbuffersImmediateValidArgs) { GLuint temp = kNewClientId; SpecializedSetup<cmds::GenRenderbuffersImmediate, 0>(true); cmd->Init(1, &temp); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(*cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(*cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); EXPECT_TRUE(GetRenderbuffer(kNewClientId) != NULL); } -TEST_F(GLES2DecoderTest1, GenRenderbuffersImmediateInvalidArgs) { +TEST_P(GLES2DecoderTest1, GenRenderbuffersImmediateInvalidArgs) { EXPECT_CALL(*gl_, GenRenderbuffersEXT(_, _)).Times(0); cmds::GenRenderbuffersImmediate* cmd = GetImmediateAs<cmds::GenRenderbuffersImmediate>(); @@ -1048,28 +867,7 @@ TEST_F(GLES2DecoderTest1, GenRenderbuffersImmediateInvalidArgs) { ExecuteImmediateCmd(*cmd, sizeof(&client_renderbuffer_id_))); } -TEST_F(GLES2DecoderTest1, GenTexturesValidArgs) { - EXPECT_CALL(*gl_, GenTextures(1, _)) - .WillOnce(SetArgumentPointee<1>(kNewServiceId)); - GetSharedMemoryAs<GLuint*>()[0] = kNewClientId; - SpecializedSetup<cmds::GenTextures, 0>(true); - cmds::GenTextures cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); - EXPECT_TRUE(GetTexture(kNewClientId) != NULL); -} - -TEST_F(GLES2DecoderTest1, GenTexturesInvalidArgs) { - EXPECT_CALL(*gl_, GenTextures(_, _)).Times(0); - GetSharedMemoryAs<GLuint*>()[0] = client_texture_id_; - SpecializedSetup<cmds::GenTextures, 0>(false); - cmds::GenTextures cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest1, GenTexturesImmediateValidArgs) { +TEST_P(GLES2DecoderTest1, GenTexturesImmediateValidArgs) { EXPECT_CALL(*gl_, GenTextures(1, _)) .WillOnce(SetArgumentPointee<1>(kNewServiceId)); cmds::GenTexturesImmediate* cmd = @@ -1077,13 +875,12 @@ TEST_F(GLES2DecoderTest1, GenTexturesImmediateValidArgs) { GLuint temp = kNewClientId; SpecializedSetup<cmds::GenTexturesImmediate, 0>(true); cmd->Init(1, &temp); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(*cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(*cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); EXPECT_TRUE(GetTexture(kNewClientId) != NULL); } -TEST_F(GLES2DecoderTest1, GenTexturesImmediateInvalidArgs) { +TEST_P(GLES2DecoderTest1, GenTexturesImmediateInvalidArgs) { EXPECT_CALL(*gl_, GenTextures(_, _)).Times(0); cmds::GenTexturesImmediate* cmd = GetImmediateAs<cmds::GenTexturesImmediate>(); @@ -1100,10 +897,7 @@ TEST_F(GLES2DecoderTest1, GenTexturesImmediateInvalidArgs) { // TODO(gman): GetAttribLocation -// TODO(gman): GetAttribLocationBucket - - -TEST_F(GLES2DecoderTest1, GetBooleanvValidArgs) { +TEST_P(GLES2DecoderTest1, GetBooleanvValidArgs) { EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) @@ -1116,13 +910,12 @@ TEST_F(GLES2DecoderTest1, GetBooleanvValidArgs) { cmds::GetBooleanv cmd; cmd.Init(GL_ACTIVE_TEXTURE, shared_memory_id_, shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( - GL_ACTIVE_TEXTURE), + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ACTIVE_TEXTURE), result->GetNumResults()); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetBooleanvInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, GetBooleanvInvalidArgs0_0) { EXPECT_CALL(*gl_, GetBooleanv(_, _)).Times(0); SpecializedSetup<cmds::GetBooleanv, 0>(false); cmds::GetBooleanv::Result* result = @@ -1135,7 +928,7 @@ TEST_F(GLES2DecoderTest1, GetBooleanvInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetBooleanvInvalidArgs1_0) { +TEST_P(GLES2DecoderTest1, GetBooleanvInvalidArgs1_0) { EXPECT_CALL(*gl_, GetBooleanv(_, _)).Times(0); SpecializedSetup<cmds::GetBooleanv, 0>(false); cmds::GetBooleanv::Result* result = @@ -1147,7 +940,7 @@ TEST_F(GLES2DecoderTest1, GetBooleanvInvalidArgs1_0) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetBooleanvInvalidArgs1_1) { +TEST_P(GLES2DecoderTest1, GetBooleanvInvalidArgs1_1) { EXPECT_CALL(*gl_, GetBooleanv(_, _)).Times(0); SpecializedSetup<cmds::GetBooleanv, 0>(false); cmds::GetBooleanv::Result* result = @@ -1159,53 +952,55 @@ TEST_F(GLES2DecoderTest1, GetBooleanvInvalidArgs1_1) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetBufferParameterivValidArgs) { +TEST_P(GLES2DecoderTest1, GetBufferParameterivValidArgs) { SpecializedSetup<cmds::GetBufferParameteriv, 0>(true); typedef cmds::GetBufferParameteriv::Result Result; Result* result = static_cast<Result*>(shared_memory_address_); result->size = 0; cmds::GetBufferParameteriv cmd; - cmd.Init( - GL_ARRAY_BUFFER, GL_BUFFER_SIZE, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_ARRAY_BUFFER, + GL_BUFFER_SIZE, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( - GL_BUFFER_SIZE), + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_BUFFER_SIZE), result->GetNumResults()); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetBufferParameterivInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, GetBufferParameterivInvalidArgs0_0) { EXPECT_CALL(*gl_, GetBufferParameteriv(_, _, _)).Times(0); SpecializedSetup<cmds::GetBufferParameteriv, 0>(false); cmds::GetBufferParameteriv::Result* result = static_cast<cmds::GetBufferParameteriv::Result*>(shared_memory_address_); result->size = 0; cmds::GetBufferParameteriv cmd; - cmd.Init( - GL_RENDERBUFFER, GL_BUFFER_SIZE, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_RENDERBUFFER, + GL_BUFFER_SIZE, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetBufferParameterivInvalidArgs1_0) { +TEST_P(GLES2DecoderTest1, GetBufferParameterivInvalidArgs1_0) { EXPECT_CALL(*gl_, GetBufferParameteriv(_, _, _)).Times(0); SpecializedSetup<cmds::GetBufferParameteriv, 0>(false); cmds::GetBufferParameteriv::Result* result = static_cast<cmds::GetBufferParameteriv::Result*>(shared_memory_address_); result->size = 0; cmds::GetBufferParameteriv cmd; - cmd.Init( - GL_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_ARRAY_BUFFER, + GL_PIXEL_PACK_BUFFER, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetBufferParameterivInvalidArgs2_0) { +TEST_P(GLES2DecoderTest1, GetBufferParameterivInvalidArgs2_0) { EXPECT_CALL(*gl_, GetBufferParameteriv(_, _, _)).Times(0); SpecializedSetup<cmds::GetBufferParameteriv, 0>(false); cmds::GetBufferParameteriv::Result* result = @@ -1217,21 +1012,22 @@ TEST_F(GLES2DecoderTest1, GetBufferParameterivInvalidArgs2_0) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetBufferParameterivInvalidArgs2_1) { +TEST_P(GLES2DecoderTest1, GetBufferParameterivInvalidArgs2_1) { EXPECT_CALL(*gl_, GetBufferParameteriv(_, _, _)).Times(0); SpecializedSetup<cmds::GetBufferParameteriv, 0>(false); cmds::GetBufferParameteriv::Result* result = static_cast<cmds::GetBufferParameteriv::Result*>(shared_memory_address_); result->size = 0; cmds::GetBufferParameteriv cmd; - cmd.Init( - GL_ARRAY_BUFFER, GL_BUFFER_SIZE, shared_memory_id_, - kInvalidSharedMemoryOffset); + cmd.Init(GL_ARRAY_BUFFER, + GL_BUFFER_SIZE, + shared_memory_id_, + kInvalidSharedMemoryOffset); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetErrorValidArgs) { +TEST_P(GLES2DecoderTest1, GetErrorValidArgs) { EXPECT_CALL(*gl_, GetError()); SpecializedSetup<cmds::GetError, 0>(true); cmds::GetError cmd; @@ -1240,7 +1036,7 @@ TEST_F(GLES2DecoderTest1, GetErrorValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetErrorInvalidArgsBadSharedMemoryId) { +TEST_P(GLES2DecoderTest1, GetErrorInvalidArgsBadSharedMemoryId) { EXPECT_CALL(*gl_, GetError()).Times(0); SpecializedSetup<cmds::GetError, 0>(false); cmds::GetError cmd; @@ -1250,7 +1046,7 @@ TEST_F(GLES2DecoderTest1, GetErrorInvalidArgsBadSharedMemoryId) { EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } -TEST_F(GLES2DecoderTest1, GetFloatvValidArgs) { +TEST_P(GLES2DecoderTest1, GetFloatvValidArgs) { EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) @@ -1263,13 +1059,12 @@ TEST_F(GLES2DecoderTest1, GetFloatvValidArgs) { cmds::GetFloatv cmd; cmd.Init(GL_ACTIVE_TEXTURE, shared_memory_id_, shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( - GL_ACTIVE_TEXTURE), + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ACTIVE_TEXTURE), result->GetNumResults()); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetFloatvInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, GetFloatvInvalidArgs0_0) { EXPECT_CALL(*gl_, GetFloatv(_, _)).Times(0); SpecializedSetup<cmds::GetFloatv, 0>(false); cmds::GetFloatv::Result* result = @@ -1282,7 +1077,7 @@ TEST_F(GLES2DecoderTest1, GetFloatvInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetFloatvInvalidArgs1_0) { +TEST_P(GLES2DecoderTest1, GetFloatvInvalidArgs1_0) { EXPECT_CALL(*gl_, GetFloatv(_, _)).Times(0); SpecializedSetup<cmds::GetFloatv, 0>(false); cmds::GetFloatv::Result* result = @@ -1294,7 +1089,7 @@ TEST_F(GLES2DecoderTest1, GetFloatvInvalidArgs1_0) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetFloatvInvalidArgs1_1) { +TEST_P(GLES2DecoderTest1, GetFloatvInvalidArgs1_1) { EXPECT_CALL(*gl_, GetFloatv(_, _)).Times(0); SpecializedSetup<cmds::GetFloatv, 0>(false); cmds::GetFloatv::Result* result = @@ -1306,7 +1101,7 @@ TEST_F(GLES2DecoderTest1, GetFloatvInvalidArgs1_1) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetFramebufferAttachmentParameterivValidArgs) { +TEST_P(GLES2DecoderTest1, GetFramebufferAttachmentParameterivValidArgs) { EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) @@ -1314,16 +1109,19 @@ TEST_F(GLES2DecoderTest1, GetFramebufferAttachmentParameterivValidArgs) { SpecializedSetup<cmds::GetFramebufferAttachmentParameteriv, 0>(true); typedef cmds::GetFramebufferAttachmentParameteriv::Result Result; Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL( - *gl_, GetFramebufferAttachmentParameterivEXT( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, result->GetData())); + EXPECT_CALL(*gl_, + GetFramebufferAttachmentParameterivEXT( + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, + result->GetData())); result->size = 0; cmds::GetFramebufferAttachmentParameteriv cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE), @@ -1331,76 +1129,81 @@ TEST_F(GLES2DecoderTest1, GetFramebufferAttachmentParameterivValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetFramebufferAttachmentParameterivInvalidArgs0_0) { - EXPECT_CALL( - *gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _)).Times(0); +TEST_P(GLES2DecoderTest1, GetFramebufferAttachmentParameterivInvalidArgs0_0) { + EXPECT_CALL(*gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _)) + .Times(0); SpecializedSetup<cmds::GetFramebufferAttachmentParameteriv, 0>(false); cmds::GetFramebufferAttachmentParameteriv::Result* result = static_cast<cmds::GetFramebufferAttachmentParameteriv::Result*>( shared_memory_address_); result->size = 0; cmds::GetFramebufferAttachmentParameteriv cmd; - cmd.Init( - GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_DRAW_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetFramebufferAttachmentParameterivInvalidArgs0_1) { - EXPECT_CALL( - *gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _)).Times(0); +TEST_P(GLES2DecoderTest1, GetFramebufferAttachmentParameterivInvalidArgs0_1) { + EXPECT_CALL(*gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _)) + .Times(0); SpecializedSetup<cmds::GetFramebufferAttachmentParameteriv, 0>(false); cmds::GetFramebufferAttachmentParameteriv::Result* result = static_cast<cmds::GetFramebufferAttachmentParameteriv::Result*>( shared_memory_address_); result->size = 0; cmds::GetFramebufferAttachmentParameteriv cmd; - cmd.Init( - GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_READ_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetFramebufferAttachmentParameterivInvalidArgs3_0) { - EXPECT_CALL( - *gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _)).Times(0); +TEST_P(GLES2DecoderTest1, GetFramebufferAttachmentParameterivInvalidArgs3_0) { + EXPECT_CALL(*gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _)) + .Times(0); SpecializedSetup<cmds::GetFramebufferAttachmentParameteriv, 0>(false); cmds::GetFramebufferAttachmentParameteriv::Result* result = static_cast<cmds::GetFramebufferAttachmentParameteriv::Result*>( shared_memory_address_); result->size = 0; cmds::GetFramebufferAttachmentParameteriv cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, kInvalidSharedMemoryId, 0); + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, + kInvalidSharedMemoryId, + 0); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetFramebufferAttachmentParameterivInvalidArgs3_1) { - EXPECT_CALL( - *gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _)).Times(0); +TEST_P(GLES2DecoderTest1, GetFramebufferAttachmentParameterivInvalidArgs3_1) { + EXPECT_CALL(*gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _)) + .Times(0); SpecializedSetup<cmds::GetFramebufferAttachmentParameteriv, 0>(false); cmds::GetFramebufferAttachmentParameteriv::Result* result = static_cast<cmds::GetFramebufferAttachmentParameteriv::Result*>( shared_memory_address_); result->size = 0; cmds::GetFramebufferAttachmentParameteriv cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, shared_memory_id_, - kInvalidSharedMemoryOffset); + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, + shared_memory_id_, + kInvalidSharedMemoryOffset); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetIntegervValidArgs) { +TEST_P(GLES2DecoderTest1, GetIntegervValidArgs) { EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) @@ -1413,13 +1216,12 @@ TEST_F(GLES2DecoderTest1, GetIntegervValidArgs) { cmds::GetIntegerv cmd; cmd.Init(GL_ACTIVE_TEXTURE, shared_memory_id_, shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( - GL_ACTIVE_TEXTURE), + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ACTIVE_TEXTURE), result->GetNumResults()); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetIntegervInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, GetIntegervInvalidArgs0_0) { EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(0); SpecializedSetup<cmds::GetIntegerv, 0>(false); cmds::GetIntegerv::Result* result = @@ -1432,7 +1234,7 @@ TEST_F(GLES2DecoderTest1, GetIntegervInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetIntegervInvalidArgs1_0) { +TEST_P(GLES2DecoderTest1, GetIntegervInvalidArgs1_0) { EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(0); SpecializedSetup<cmds::GetIntegerv, 0>(false); cmds::GetIntegerv::Result* result = @@ -1444,7 +1246,7 @@ TEST_F(GLES2DecoderTest1, GetIntegervInvalidArgs1_0) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetIntegervInvalidArgs1_1) { +TEST_P(GLES2DecoderTest1, GetIntegervInvalidArgs1_1) { EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(0); SpecializedSetup<cmds::GetIntegerv, 0>(false); cmds::GetIntegerv::Result* result = @@ -1456,23 +1258,23 @@ TEST_F(GLES2DecoderTest1, GetIntegervInvalidArgs1_1) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetProgramivValidArgs) { +TEST_P(GLES2DecoderTest1, GetProgramivValidArgs) { SpecializedSetup<cmds::GetProgramiv, 0>(true); typedef cmds::GetProgramiv::Result Result; Result* result = static_cast<Result*>(shared_memory_address_); result->size = 0; cmds::GetProgramiv cmd; - cmd.Init( - client_program_id_, GL_DELETE_STATUS, shared_memory_id_, - shared_memory_offset_); + cmd.Init(client_program_id_, + GL_DELETE_STATUS, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( - GL_DELETE_STATUS), + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DELETE_STATUS), result->GetNumResults()); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetProgramivInvalidArgs2_0) { +TEST_P(GLES2DecoderTest1, GetProgramivInvalidArgs2_0) { EXPECT_CALL(*gl_, GetProgramiv(_, _, _)).Times(0); SpecializedSetup<cmds::GetProgramiv, 0>(false); cmds::GetProgramiv::Result* result = @@ -1484,23 +1286,24 @@ TEST_F(GLES2DecoderTest1, GetProgramivInvalidArgs2_0) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetProgramivInvalidArgs2_1) { +TEST_P(GLES2DecoderTest1, GetProgramivInvalidArgs2_1) { EXPECT_CALL(*gl_, GetProgramiv(_, _, _)).Times(0); SpecializedSetup<cmds::GetProgramiv, 0>(false); cmds::GetProgramiv::Result* result = static_cast<cmds::GetProgramiv::Result*>(shared_memory_address_); result->size = 0; cmds::GetProgramiv cmd; - cmd.Init( - client_program_id_, GL_DELETE_STATUS, shared_memory_id_, - kInvalidSharedMemoryOffset); + cmd.Init(client_program_id_, + GL_DELETE_STATUS, + shared_memory_id_, + kInvalidSharedMemoryOffset); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetProgramInfoLogValidArgs) { +TEST_P(GLES2DecoderTest1, GetProgramInfoLogValidArgs) { const char* kInfo = "hello"; - const uint32 kBucketId = 123; + const uint32_t kBucketId = 123; SpecializedSetup<cmds::GetProgramInfoLog, 0>(true); cmds::GetProgramInfoLog cmd; @@ -1509,20 +1312,20 @@ TEST_F(GLES2DecoderTest1, GetProgramInfoLogValidArgs) { CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); ASSERT_TRUE(bucket != NULL); EXPECT_EQ(strlen(kInfo) + 1, bucket->size()); - EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kInfo, - bucket->size())); + EXPECT_EQ(0, + memcmp(bucket->GetData(0, bucket->size()), kInfo, bucket->size())); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetProgramInfoLogInvalidArgs) { - const uint32 kBucketId = 123; +TEST_P(GLES2DecoderTest1, GetProgramInfoLogInvalidArgs) { + const uint32_t kBucketId = 123; cmds::GetProgramInfoLog cmd; cmd.Init(kInvalidClientId, kBucketId); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetRenderbufferParameterivValidArgs) { +TEST_P(GLES2DecoderTest1, GetRenderbufferParameterivValidArgs) { EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) @@ -1531,13 +1334,15 @@ TEST_F(GLES2DecoderTest1, GetRenderbufferParameterivValidArgs) { typedef cmds::GetRenderbufferParameteriv::Result Result; Result* result = static_cast<Result*>(shared_memory_address_); EXPECT_CALL( - *gl_, GetRenderbufferParameterivEXT( + *gl_, + GetRenderbufferParameterivEXT( GL_RENDERBUFFER, GL_RENDERBUFFER_RED_SIZE, result->GetData())); result->size = 0; cmds::GetRenderbufferParameteriv cmd; - cmd.Init( - GL_RENDERBUFFER, GL_RENDERBUFFER_RED_SIZE, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_RENDERBUFFER, + GL_RENDERBUFFER_RED_SIZE, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( GL_RENDERBUFFER_RED_SIZE), @@ -1545,7 +1350,7 @@ TEST_F(GLES2DecoderTest1, GetRenderbufferParameterivValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetRenderbufferParameterivInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, GetRenderbufferParameterivInvalidArgs0_0) { EXPECT_CALL(*gl_, GetRenderbufferParameterivEXT(_, _, _)).Times(0); SpecializedSetup<cmds::GetRenderbufferParameteriv, 0>(false); cmds::GetRenderbufferParameteriv::Result* result = @@ -1553,15 +1358,16 @@ TEST_F(GLES2DecoderTest1, GetRenderbufferParameterivInvalidArgs0_0) { shared_memory_address_); result->size = 0; cmds::GetRenderbufferParameteriv cmd; - cmd.Init( - GL_FRAMEBUFFER, GL_RENDERBUFFER_RED_SIZE, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_FRAMEBUFFER, + GL_RENDERBUFFER_RED_SIZE, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetRenderbufferParameterivInvalidArgs2_0) { +TEST_P(GLES2DecoderTest1, GetRenderbufferParameterivInvalidArgs2_0) { EXPECT_CALL(*gl_, GetRenderbufferParameterivEXT(_, _, _)).Times(0); SpecializedSetup<cmds::GetRenderbufferParameteriv, 0>(false); cmds::GetRenderbufferParameteriv::Result* result = @@ -1575,7 +1381,7 @@ TEST_F(GLES2DecoderTest1, GetRenderbufferParameterivInvalidArgs2_0) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetRenderbufferParameterivInvalidArgs2_1) { +TEST_P(GLES2DecoderTest1, GetRenderbufferParameterivInvalidArgs2_1) { EXPECT_CALL(*gl_, GetRenderbufferParameterivEXT(_, _, _)).Times(0); SpecializedSetup<cmds::GetRenderbufferParameteriv, 0>(false); cmds::GetRenderbufferParameteriv::Result* result = @@ -1583,14 +1389,15 @@ TEST_F(GLES2DecoderTest1, GetRenderbufferParameterivInvalidArgs2_1) { shared_memory_address_); result->size = 0; cmds::GetRenderbufferParameteriv cmd; - cmd.Init( - GL_RENDERBUFFER, GL_RENDERBUFFER_RED_SIZE, shared_memory_id_, - kInvalidSharedMemoryOffset); + cmd.Init(GL_RENDERBUFFER, + GL_RENDERBUFFER_RED_SIZE, + shared_memory_id_, + kInvalidSharedMemoryOffset); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetShaderivValidArgs) { +TEST_P(GLES2DecoderTest1, GetShaderivValidArgs) { EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) @@ -1598,21 +1405,21 @@ TEST_F(GLES2DecoderTest1, GetShaderivValidArgs) { SpecializedSetup<cmds::GetShaderiv, 0>(true); typedef cmds::GetShaderiv::Result Result; Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL( - *gl_, GetShaderiv(kServiceShaderId, GL_SHADER_TYPE, result->GetData())); + EXPECT_CALL(*gl_, + GetShaderiv(kServiceShaderId, GL_SHADER_TYPE, result->GetData())); result->size = 0; cmds::GetShaderiv cmd; - cmd.Init( - client_shader_id_, GL_SHADER_TYPE, shared_memory_id_, - shared_memory_offset_); + cmd.Init(client_shader_id_, + GL_SHADER_TYPE, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( - GL_SHADER_TYPE), + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_SHADER_TYPE), result->GetNumResults()); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetShaderivInvalidArgs2_0) { +TEST_P(GLES2DecoderTest1, GetShaderivInvalidArgs2_0) { EXPECT_CALL(*gl_, GetShaderiv(_, _, _)).Times(0); SpecializedSetup<cmds::GetShaderiv, 0>(false); cmds::GetShaderiv::Result* result = @@ -1624,16 +1431,17 @@ TEST_F(GLES2DecoderTest1, GetShaderivInvalidArgs2_0) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetShaderivInvalidArgs2_1) { +TEST_P(GLES2DecoderTest1, GetShaderivInvalidArgs2_1) { EXPECT_CALL(*gl_, GetShaderiv(_, _, _)).Times(0); SpecializedSetup<cmds::GetShaderiv, 0>(false); cmds::GetShaderiv::Result* result = static_cast<cmds::GetShaderiv::Result*>(shared_memory_address_); result->size = 0; cmds::GetShaderiv cmd; - cmd.Init( - client_shader_id_, GL_SHADER_TYPE, shared_memory_id_, - kInvalidSharedMemoryOffset); + cmd.Init(client_shader_id_, + GL_SHADER_TYPE, + shared_memory_id_, + kInvalidSharedMemoryOffset); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); } @@ -1643,8 +1451,7 @@ TEST_F(GLES2DecoderTest1, GetShaderivInvalidArgs2_1) { // TODO(gman): GetShaderSource // TODO(gman): GetString - -TEST_F(GLES2DecoderTest1, GetTexParameterfvValidArgs) { +TEST_P(GLES2DecoderTest1, GetTexParameterfvValidArgs) { EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) @@ -1652,52 +1459,55 @@ TEST_F(GLES2DecoderTest1, GetTexParameterfvValidArgs) { SpecializedSetup<cmds::GetTexParameterfv, 0>(true); typedef cmds::GetTexParameterfv::Result Result; Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL( - *gl_, GetTexParameterfv( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, result->GetData())); + EXPECT_CALL(*gl_, + GetTexParameterfv( + GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, result->GetData())); result->size = 0; cmds::GetTexParameterfv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_TEXTURE_2D, + GL_TEXTURE_MAG_FILTER, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( - GL_TEXTURE_MAG_FILTER), - result->GetNumResults()); + EXPECT_EQ( + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_TEXTURE_MAG_FILTER), + result->GetNumResults()); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetTexParameterfvInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, GetTexParameterfvInvalidArgs0_0) { EXPECT_CALL(*gl_, GetTexParameterfv(_, _, _)).Times(0); SpecializedSetup<cmds::GetTexParameterfv, 0>(false); cmds::GetTexParameterfv::Result* result = static_cast<cmds::GetTexParameterfv::Result*>(shared_memory_address_); result->size = 0; cmds::GetTexParameterfv cmd; - cmd.Init( - GL_PROXY_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_PROXY_TEXTURE_CUBE_MAP, + GL_TEXTURE_MAG_FILTER, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetTexParameterfvInvalidArgs1_0) { +TEST_P(GLES2DecoderTest1, GetTexParameterfvInvalidArgs1_0) { EXPECT_CALL(*gl_, GetTexParameterfv(_, _, _)).Times(0); SpecializedSetup<cmds::GetTexParameterfv, 0>(false); cmds::GetTexParameterfv::Result* result = static_cast<cmds::GetTexParameterfv::Result*>(shared_memory_address_); result->size = 0; cmds::GetTexParameterfv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_GENERATE_MIPMAP, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_TEXTURE_2D, + GL_GENERATE_MIPMAP, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetTexParameterfvInvalidArgs2_0) { +TEST_P(GLES2DecoderTest1, GetTexParameterfvInvalidArgs2_0) { EXPECT_CALL(*gl_, GetTexParameterfv(_, _, _)).Times(0); SpecializedSetup<cmds::GetTexParameterfv, 0>(false); cmds::GetTexParameterfv::Result* result = @@ -1709,21 +1519,22 @@ TEST_F(GLES2DecoderTest1, GetTexParameterfvInvalidArgs2_0) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetTexParameterfvInvalidArgs2_1) { +TEST_P(GLES2DecoderTest1, GetTexParameterfvInvalidArgs2_1) { EXPECT_CALL(*gl_, GetTexParameterfv(_, _, _)).Times(0); SpecializedSetup<cmds::GetTexParameterfv, 0>(false); cmds::GetTexParameterfv::Result* result = static_cast<cmds::GetTexParameterfv::Result*>(shared_memory_address_); result->size = 0; cmds::GetTexParameterfv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - kInvalidSharedMemoryOffset); + cmd.Init(GL_TEXTURE_2D, + GL_TEXTURE_MAG_FILTER, + shared_memory_id_, + kInvalidSharedMemoryOffset); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetTexParameterivValidArgs) { +TEST_P(GLES2DecoderTest1, GetTexParameterivValidArgs) { EXPECT_CALL(*gl_, GetError()) .WillOnce(Return(GL_NO_ERROR)) .WillOnce(Return(GL_NO_ERROR)) @@ -1731,52 +1542,55 @@ TEST_F(GLES2DecoderTest1, GetTexParameterivValidArgs) { SpecializedSetup<cmds::GetTexParameteriv, 0>(true); typedef cmds::GetTexParameteriv::Result Result; Result* result = static_cast<Result*>(shared_memory_address_); - EXPECT_CALL( - *gl_, GetTexParameteriv( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, result->GetData())); + EXPECT_CALL(*gl_, + GetTexParameteriv( + GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, result->GetData())); result->size = 0; cmds::GetTexParameteriv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_TEXTURE_2D, + GL_TEXTURE_MAG_FILTER, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( - GL_TEXTURE_MAG_FILTER), - result->GetNumResults()); + EXPECT_EQ( + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_TEXTURE_MAG_FILTER), + result->GetNumResults()); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetTexParameterivInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, GetTexParameterivInvalidArgs0_0) { EXPECT_CALL(*gl_, GetTexParameteriv(_, _, _)).Times(0); SpecializedSetup<cmds::GetTexParameteriv, 0>(false); cmds::GetTexParameteriv::Result* result = static_cast<cmds::GetTexParameteriv::Result*>(shared_memory_address_); result->size = 0; cmds::GetTexParameteriv cmd; - cmd.Init( - GL_PROXY_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_PROXY_TEXTURE_CUBE_MAP, + GL_TEXTURE_MAG_FILTER, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetTexParameterivInvalidArgs1_0) { +TEST_P(GLES2DecoderTest1, GetTexParameterivInvalidArgs1_0) { EXPECT_CALL(*gl_, GetTexParameteriv(_, _, _)).Times(0); SpecializedSetup<cmds::GetTexParameteriv, 0>(false); cmds::GetTexParameteriv::Result* result = static_cast<cmds::GetTexParameteriv::Result*>(shared_memory_address_); result->size = 0; cmds::GetTexParameteriv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_GENERATE_MIPMAP, shared_memory_id_, - shared_memory_offset_); + cmd.Init(GL_TEXTURE_2D, + GL_GENERATE_MIPMAP, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetTexParameterivInvalidArgs2_0) { +TEST_P(GLES2DecoderTest1, GetTexParameterivInvalidArgs2_0) { EXPECT_CALL(*gl_, GetTexParameteriv(_, _, _)).Times(0); SpecializedSetup<cmds::GetTexParameteriv, 0>(false); cmds::GetTexParameteriv::Result* result = @@ -1788,16 +1602,17 @@ TEST_F(GLES2DecoderTest1, GetTexParameterivInvalidArgs2_0) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetTexParameterivInvalidArgs2_1) { +TEST_P(GLES2DecoderTest1, GetTexParameterivInvalidArgs2_1) { EXPECT_CALL(*gl_, GetTexParameteriv(_, _, _)).Times(0); SpecializedSetup<cmds::GetTexParameteriv, 0>(false); cmds::GetTexParameteriv::Result* result = static_cast<cmds::GetTexParameteriv::Result*>(shared_memory_address_); result->size = 0; cmds::GetTexParameteriv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - kInvalidSharedMemoryOffset); + cmd.Init(GL_TEXTURE_2D, + GL_TEXTURE_MAG_FILTER, + shared_memory_id_, + kInvalidSharedMemoryOffset); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); } @@ -1807,18 +1622,16 @@ TEST_F(GLES2DecoderTest1, GetTexParameterivInvalidArgs2_1) { // TODO(gman): GetUniformLocation -// TODO(gman): GetUniformLocationBucket - - -TEST_F(GLES2DecoderTest1, GetVertexAttribfvValidArgs) { +TEST_P(GLES2DecoderTest1, GetVertexAttribfvValidArgs) { SpecializedSetup<cmds::GetVertexAttribfv, 0>(true); typedef cmds::GetVertexAttribfv::Result Result; Result* result = static_cast<Result*>(shared_memory_address_); result->size = 0; cmds::GetVertexAttribfv cmd; - cmd.Init( - 1, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, shared_memory_id_, - shared_memory_offset_); + cmd.Init(1, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( GL_VERTEX_ATTRIB_ARRAY_NORMALIZED), @@ -1826,7 +1639,7 @@ TEST_F(GLES2DecoderTest1, GetVertexAttribfvValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetVertexAttribfvInvalidArgs2_0) { +TEST_P(GLES2DecoderTest1, GetVertexAttribfvInvalidArgs2_0) { EXPECT_CALL(*gl_, GetVertexAttribfv(_, _, _)).Times(0); SpecializedSetup<cmds::GetVertexAttribfv, 0>(false); cmds::GetVertexAttribfv::Result* result = @@ -1838,29 +1651,31 @@ TEST_F(GLES2DecoderTest1, GetVertexAttribfvInvalidArgs2_0) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetVertexAttribfvInvalidArgs2_1) { +TEST_P(GLES2DecoderTest1, GetVertexAttribfvInvalidArgs2_1) { EXPECT_CALL(*gl_, GetVertexAttribfv(_, _, _)).Times(0); SpecializedSetup<cmds::GetVertexAttribfv, 0>(false); cmds::GetVertexAttribfv::Result* result = static_cast<cmds::GetVertexAttribfv::Result*>(shared_memory_address_); result->size = 0; cmds::GetVertexAttribfv cmd; - cmd.Init( - 1, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, shared_memory_id_, - kInvalidSharedMemoryOffset); + cmd.Init(1, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, + shared_memory_id_, + kInvalidSharedMemoryOffset); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetVertexAttribivValidArgs) { +TEST_P(GLES2DecoderTest1, GetVertexAttribivValidArgs) { SpecializedSetup<cmds::GetVertexAttribiv, 0>(true); typedef cmds::GetVertexAttribiv::Result Result; Result* result = static_cast<Result*>(shared_memory_address_); result->size = 0; cmds::GetVertexAttribiv cmd; - cmd.Init( - 1, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, shared_memory_id_, - shared_memory_offset_); + cmd.Init(1, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, + shared_memory_id_, + shared_memory_offset_); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( GL_VERTEX_ATTRIB_ARRAY_NORMALIZED), @@ -1868,7 +1683,7 @@ TEST_F(GLES2DecoderTest1, GetVertexAttribivValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, GetVertexAttribivInvalidArgs2_0) { +TEST_P(GLES2DecoderTest1, GetVertexAttribivInvalidArgs2_0) { EXPECT_CALL(*gl_, GetVertexAttribiv(_, _, _)).Times(0); SpecializedSetup<cmds::GetVertexAttribiv, 0>(false); cmds::GetVertexAttribiv::Result* result = @@ -1880,23 +1695,23 @@ TEST_F(GLES2DecoderTest1, GetVertexAttribivInvalidArgs2_0) { EXPECT_EQ(0u, result->size); } -TEST_F(GLES2DecoderTest1, GetVertexAttribivInvalidArgs2_1) { +TEST_P(GLES2DecoderTest1, GetVertexAttribivInvalidArgs2_1) { EXPECT_CALL(*gl_, GetVertexAttribiv(_, _, _)).Times(0); SpecializedSetup<cmds::GetVertexAttribiv, 0>(false); cmds::GetVertexAttribiv::Result* result = static_cast<cmds::GetVertexAttribiv::Result*>(shared_memory_address_); result->size = 0; cmds::GetVertexAttribiv cmd; - cmd.Init( - 1, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, shared_memory_id_, - kInvalidSharedMemoryOffset); + cmd.Init(1, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, + shared_memory_id_, + kInvalidSharedMemoryOffset); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); } // TODO(gman): GetVertexAttribPointerv - -TEST_F(GLES2DecoderTest1, HintValidArgs) { +TEST_P(GLES2DecoderTest1, HintValidArgs) { EXPECT_CALL(*gl_, Hint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST)); SpecializedSetup<cmds::Hint, 0>(true); cmds::Hint cmd; @@ -1905,7 +1720,7 @@ TEST_F(GLES2DecoderTest1, HintValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, HintInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, HintInvalidArgs0_0) { EXPECT_CALL(*gl_, Hint(_, _)).Times(0); SpecializedSetup<cmds::Hint, 0>(false); cmds::Hint cmd; @@ -1914,7 +1729,7 @@ TEST_F(GLES2DecoderTest1, HintInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, IsBufferValidArgs) { +TEST_P(GLES2DecoderTest1, IsBufferValidArgs) { SpecializedSetup<cmds::IsBuffer, 0>(true); cmds::IsBuffer cmd; cmd.Init(client_buffer_id_, shared_memory_id_, shared_memory_offset_); @@ -1922,7 +1737,7 @@ TEST_F(GLES2DecoderTest1, IsBufferValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, IsBufferInvalidArgsBadSharedMemoryId) { +TEST_P(GLES2DecoderTest1, IsBufferInvalidArgsBadSharedMemoryId) { SpecializedSetup<cmds::IsBuffer, 0>(false); cmds::IsBuffer cmd; cmd.Init(client_buffer_id_, kInvalidSharedMemoryId, shared_memory_offset_); @@ -1931,7 +1746,7 @@ TEST_F(GLES2DecoderTest1, IsBufferInvalidArgsBadSharedMemoryId) { EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } -TEST_F(GLES2DecoderTest1, IsEnabledValidArgs) { +TEST_P(GLES2DecoderTest1, IsEnabledValidArgs) { SpecializedSetup<cmds::IsEnabled, 0>(true); cmds::IsEnabled cmd; cmd.Init(GL_BLEND, shared_memory_id_, shared_memory_offset_); @@ -1939,7 +1754,7 @@ TEST_F(GLES2DecoderTest1, IsEnabledValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, IsEnabledInvalidArgs0_0) { +TEST_P(GLES2DecoderTest1, IsEnabledInvalidArgs0_0) { EXPECT_CALL(*gl_, IsEnabled(_)).Times(0); SpecializedSetup<cmds::IsEnabled, 0>(false); cmds::IsEnabled cmd; @@ -1948,7 +1763,7 @@ TEST_F(GLES2DecoderTest1, IsEnabledInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, IsEnabledInvalidArgs0_1) { +TEST_P(GLES2DecoderTest1, IsEnabledInvalidArgs0_1) { EXPECT_CALL(*gl_, IsEnabled(_)).Times(0); SpecializedSetup<cmds::IsEnabled, 0>(false); cmds::IsEnabled cmd; @@ -1957,7 +1772,7 @@ TEST_F(GLES2DecoderTest1, IsEnabledInvalidArgs0_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest1, IsEnabledInvalidArgsBadSharedMemoryId) { +TEST_P(GLES2DecoderTest1, IsEnabledInvalidArgsBadSharedMemoryId) { SpecializedSetup<cmds::IsEnabled, 0>(false); cmds::IsEnabled cmd; cmd.Init(GL_BLEND, kInvalidSharedMemoryId, shared_memory_offset_); @@ -1966,7 +1781,7 @@ TEST_F(GLES2DecoderTest1, IsEnabledInvalidArgsBadSharedMemoryId) { EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } -TEST_F(GLES2DecoderTest1, IsFramebufferValidArgs) { +TEST_P(GLES2DecoderTest1, IsFramebufferValidArgs) { SpecializedSetup<cmds::IsFramebuffer, 0>(true); cmds::IsFramebuffer cmd; cmd.Init(client_framebuffer_id_, shared_memory_id_, shared_memory_offset_); @@ -1974,7 +1789,7 @@ TEST_F(GLES2DecoderTest1, IsFramebufferValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, IsFramebufferInvalidArgsBadSharedMemoryId) { +TEST_P(GLES2DecoderTest1, IsFramebufferInvalidArgsBadSharedMemoryId) { SpecializedSetup<cmds::IsFramebuffer, 0>(false); cmds::IsFramebuffer cmd; cmd.Init( @@ -1985,7 +1800,7 @@ TEST_F(GLES2DecoderTest1, IsFramebufferInvalidArgsBadSharedMemoryId) { EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } -TEST_F(GLES2DecoderTest1, IsProgramValidArgs) { +TEST_P(GLES2DecoderTest1, IsProgramValidArgs) { SpecializedSetup<cmds::IsProgram, 0>(true); cmds::IsProgram cmd; cmd.Init(client_program_id_, shared_memory_id_, shared_memory_offset_); @@ -1993,7 +1808,7 @@ TEST_F(GLES2DecoderTest1, IsProgramValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest1, IsProgramInvalidArgsBadSharedMemoryId) { +TEST_P(GLES2DecoderTest1, IsProgramInvalidArgsBadSharedMemoryId) { SpecializedSetup<cmds::IsProgram, 0>(false); cmds::IsProgram cmd; cmd.Init(client_program_id_, kInvalidSharedMemoryId, shared_memory_offset_); @@ -2001,5 +1816,140 @@ TEST_F(GLES2DecoderTest1, IsProgramInvalidArgsBadSharedMemoryId) { cmd.Init(client_program_id_, shared_memory_id_, kInvalidSharedMemoryOffset); EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); } -#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_1_AUTOGEN_H_ +TEST_P(GLES2DecoderTest1, IsRenderbufferValidArgs) { + SpecializedSetup<cmds::IsRenderbuffer, 0>(true); + cmds::IsRenderbuffer cmd; + cmd.Init(client_renderbuffer_id_, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest1, IsRenderbufferInvalidArgsBadSharedMemoryId) { + SpecializedSetup<cmds::IsRenderbuffer, 0>(false); + cmds::IsRenderbuffer cmd; + cmd.Init( + client_renderbuffer_id_, kInvalidSharedMemoryId, shared_memory_offset_); + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); + cmd.Init( + client_renderbuffer_id_, shared_memory_id_, kInvalidSharedMemoryOffset); + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderTest1, IsShaderValidArgs) { + SpecializedSetup<cmds::IsShader, 0>(true); + cmds::IsShader cmd; + cmd.Init(client_shader_id_, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest1, IsShaderInvalidArgsBadSharedMemoryId) { + SpecializedSetup<cmds::IsShader, 0>(false); + cmds::IsShader cmd; + cmd.Init(client_shader_id_, kInvalidSharedMemoryId, shared_memory_offset_); + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); + cmd.Init(client_shader_id_, shared_memory_id_, kInvalidSharedMemoryOffset); + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderTest1, IsTextureValidArgs) { + SpecializedSetup<cmds::IsTexture, 0>(true); + cmds::IsTexture cmd; + cmd.Init(client_texture_id_, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest1, IsTextureInvalidArgsBadSharedMemoryId) { + SpecializedSetup<cmds::IsTexture, 0>(false); + cmds::IsTexture cmd; + cmd.Init(client_texture_id_, kInvalidSharedMemoryId, shared_memory_offset_); + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); + cmd.Init(client_texture_id_, shared_memory_id_, kInvalidSharedMemoryOffset); + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderTest1, LineWidthValidArgs) { + EXPECT_CALL(*gl_, LineWidth(0.5f)); + SpecializedSetup<cmds::LineWidth, 0>(true); + cmds::LineWidth cmd; + cmd.Init(0.5f); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest1, LineWidthInvalidValue0_0) { + SpecializedSetup<cmds::LineWidth, 0>(false); + cmds::LineWidth cmd; + cmd.Init(0.0f); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderTest1, LinkProgramValidArgs) { + EXPECT_CALL(*gl_, LinkProgram(kServiceProgramId)); + SpecializedSetup<cmds::LinkProgram, 0>(true); + cmds::LinkProgram cmd; + cmd.Init(client_program_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} +// TODO(gman): PixelStorei + +TEST_P(GLES2DecoderTest1, PolygonOffsetValidArgs) { + EXPECT_CALL(*gl_, PolygonOffset(1, 2)); + SpecializedSetup<cmds::PolygonOffset, 0>(true); + cmds::PolygonOffset cmd; + cmd.Init(1, 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} +// TODO(gman): ReadPixels + +// TODO(gman): ReleaseShaderCompiler + +TEST_P(GLES2DecoderTest1, RenderbufferStorageValidArgs) { + SpecializedSetup<cmds::RenderbufferStorage, 0>(true); + cmds::RenderbufferStorage cmd; + cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, 4); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest1, RenderbufferStorageInvalidArgs0_0) { + EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0); + SpecializedSetup<cmds::RenderbufferStorage, 0>(false); + cmds::RenderbufferStorage cmd; + cmd.Init(GL_FRAMEBUFFER, GL_RGBA4, 3, 4); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} + +TEST_P(GLES2DecoderTest1, RenderbufferStorageInvalidArgs2_0) { + EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0); + SpecializedSetup<cmds::RenderbufferStorage, 0>(false); + cmds::RenderbufferStorage cmd; + cmd.Init(GL_RENDERBUFFER, GL_RGBA4, -1, 4); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderTest1, RenderbufferStorageInvalidArgs3_0) { + EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0); + SpecializedSetup<cmds::RenderbufferStorage, 0>(false); + cmds::RenderbufferStorage cmd; + cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, -1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderTest1, SampleCoverageValidArgs) { + EXPECT_CALL(*gl_, SampleCoverage(1, true)); + SpecializedSetup<cmds::SampleCoverage, 0>(true); + cmds::SampleCoverage cmd; + cmd.Init(1, true); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} +#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_1_AUTOGEN_H_ diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2.cc index 8c9c6ecd839..221aa332a48 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2.cc +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2.cc @@ -15,6 +15,7 @@ using ::gfx::MockGLInterface; using ::testing::_; +using ::testing::AnyNumber; using ::testing::DoAll; using ::testing::InSequence; using ::testing::MatcherCast; @@ -30,43 +31,236 @@ namespace gles2 { class GLES2DecoderTest2 : public GLES2DecoderTestBase { public: GLES2DecoderTest2() { } -}; -template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::GenQueriesEXT, 0>( - bool valid) { - if (!valid) { - // Make the client_query_id_ so that trying to make it again - // will fail. - GetSharedMemoryAs<GLuint*>()[0] = client_query_id_; - cmds::GenQueriesEXT cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + void TestAcceptedUniform(GLenum uniform_type, uint32 accepts_apis) { + SetupShaderForUniform(uniform_type); + bool valid_uniform = false; + + EXPECT_CALL(*gl_, Uniform1i(1, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, Uniform1iv(1, _, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, Uniform2iv(1, _, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, Uniform3iv(1, _, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, Uniform4iv(1, _, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, Uniform1f(1, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, Uniform1fv(1, _, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, Uniform2fv(1, _, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, Uniform3fv(1, _, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, Uniform4fv(1, _, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, UniformMatrix2fv(1, _, _, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, UniformMatrix3fv(1, _, _, _)).Times(AnyNumber()); + EXPECT_CALL(*gl_, UniformMatrix4fv(1, _, _, _)).Times(AnyNumber()); + + { + valid_uniform = accepts_apis & Program::kUniform1i; + cmds::Uniform1i cmd; + cmd.Init(1, 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform1i; + cmds::Uniform1ivImmediate& cmd = + *GetImmediateAs<cmds::Uniform1ivImmediate>(); + GLint data[2][1] = {{0}}; + cmd.Init(1, 2, &data[0][0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(data))); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform2i; + cmds::Uniform2i cmd; + cmd.Init(1, 2, 3); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform2i; + cmds::Uniform2ivImmediate& cmd = + *GetImmediateAs<cmds::Uniform2ivImmediate>(); + GLint data[2][2] = {{0}}; + cmd.Init(1, 2, &data[0][0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(data))); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform3i; + cmds::Uniform3i cmd; + cmd.Init(1, 2, 3, 4); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform3i; + cmds::Uniform3ivImmediate& cmd = + *GetImmediateAs<cmds::Uniform3ivImmediate>(); + GLint data[2][3] = {{0}}; + cmd.Init(1, 2, &data[0][0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(data))); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform4i; + cmds::Uniform4i cmd; + cmd.Init(1, 2, 3, 4, 5); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform4i; + cmds::Uniform4ivImmediate& cmd = + *GetImmediateAs<cmds::Uniform4ivImmediate>(); + GLint data[2][4] = {{0}}; + cmd.Init(1, 2, &data[0][0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(data))); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + //////////////////// + + { + valid_uniform = accepts_apis & Program::kUniform1f; + cmds::Uniform1f cmd; + cmd.Init(1, 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform1f; + cmds::Uniform1fvImmediate& cmd = + *GetImmediateAs<cmds::Uniform1fvImmediate>(); + GLfloat data[2][1] = {{0.0f}}; + cmd.Init(1, 2, &data[0][0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(data))); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform2f; + cmds::Uniform2f cmd; + cmd.Init(1, 2, 3); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform2f; + cmds::Uniform2fvImmediate& cmd = + *GetImmediateAs<cmds::Uniform2fvImmediate>(); + GLfloat data[2][2] = {{0.0f}}; + cmd.Init(1, 2, &data[0][0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(data))); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform3f; + cmds::Uniform3f cmd; + cmd.Init(1, 2, 3, 4); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform3f; + cmds::Uniform3fvImmediate& cmd = + *GetImmediateAs<cmds::Uniform3fvImmediate>(); + GLfloat data[2][3] = {{0.0f}}; + cmd.Init(1, 2, &data[0][0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(data))); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform4f; + cmds::Uniform4f cmd; + cmd.Init(1, 2, 3, 4, 5); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniform4f; + cmds::Uniform4fvImmediate& cmd = + *GetImmediateAs<cmds::Uniform4fvImmediate>(); + GLfloat data[2][4] = {{0.0f}}; + cmd.Init(1, 2, &data[0][0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(data))); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniformMatrix2f; + cmds::UniformMatrix2fvImmediate& cmd = + *GetImmediateAs<cmds::UniformMatrix2fvImmediate>(); + GLfloat data[2][2 * 2] = {{0.0f}}; + + cmd.Init(1, 2, &data[0][0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(data))); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniformMatrix3f; + cmds::UniformMatrix3fvImmediate& cmd = + *GetImmediateAs<cmds::UniformMatrix3fvImmediate>(); + GLfloat data[2][3 * 3] = {{0.0f}}; + cmd.Init(1, 2, &data[0][0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(data))); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } + + { + valid_uniform = accepts_apis & Program::kUniformMatrix4f; + cmds::UniformMatrix4fvImmediate& cmd = + *GetImmediateAs<cmds::UniformMatrix4fvImmediate>(); + GLfloat data[2][4 * 4] = {{0.0f}}; + cmd.Init(1, 2, &data[0][0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(data))); + EXPECT_EQ(valid_uniform ? GL_NO_ERROR : GL_INVALID_OPERATION, + GetGLError()); + } } }; +INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderTest2, ::testing::Bool()); + template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::GenQueriesEXTImmediate, 0>( bool valid) { if (!valid) { // Make the client_query_id_ so that trying to make it again // will fail. - GetSharedMemoryAs<GLuint*>()[0] = client_query_id_; - cmds::GenQueriesEXT cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - } -}; - -template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::DeleteQueriesEXT, 0>( - bool valid) { - if (valid) { - // Make the client_query_id_ so that trying to delete it will succeed. - GetSharedMemoryAs<GLuint*>()[0] = client_query_id_; - cmds::GenQueriesEXT cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + cmds::GenQueriesEXTImmediate& cmd = + *GetImmediateAs<cmds::GenQueriesEXTImmediate>(); + cmd.Init(1, &client_query_id_); + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(cmd, sizeof(client_query_id_))); } }; @@ -75,10 +269,11 @@ void GLES2DecoderTestBase::SpecializedSetup<cmds::DeleteQueriesEXTImmediate, 0>( bool valid) { if (valid) { // Make the client_query_id_ so that trying to delete it will succeed. - GetSharedMemoryAs<GLuint*>()[0] = client_query_id_; - cmds::GenQueriesEXT cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + cmds::GenQueriesEXTImmediate& cmd = + *GetImmediateAs<cmds::GenQueriesEXTImmediate>(); + cmd.Init(1, &client_query_id_); + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(cmd, sizeof(client_query_id_))); } }; @@ -134,6 +329,21 @@ void GLES2DecoderTestBase::SpecializedSetup<cmds::LinkProgram, 0>( }; template <> +void GLES2DecoderTestBase::SpecializedSetup<cmds::UseProgram, 0>( + bool /* valid */) { + // Needs the same setup as LinkProgram. + SpecializedSetup<cmds::LinkProgram, 0>(false); + + EXPECT_CALL(*gl_, LinkProgram(kServiceProgramId)) + .Times(1) + .RetiresOnSaturation(); + + cmds::LinkProgram link_cmd; + link_cmd.Init(client_program_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(link_cmd)); +}; + +template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::ValidateProgram, 0>( bool /* valid */) { // Needs the same setup as LinkProgram. @@ -160,24 +370,12 @@ void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform1f, 0>( }; template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform1fv, 0>( - bool /* valid */) { - SetupShaderForUniform(GL_FLOAT); -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform1fvImmediate, 0>( bool /* valid */) { SetupShaderForUniform(GL_FLOAT); }; template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform1iv, 0>( - bool /* valid */) { - SetupShaderForUniform(GL_INT); -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform1ivImmediate, 0>( bool /* valid */) { SetupShaderForUniform(GL_INT); @@ -196,18 +394,6 @@ void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform2i, 0>( }; template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform2fv, 0>( - bool /* valid */) { - SetupShaderForUniform(GL_FLOAT_VEC2); -}; - -template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform2iv, 0>( - bool /* valid */) { - SetupShaderForUniform(GL_INT_VEC2); -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform2fvImmediate, 0>( bool /* valid */) { SetupShaderForUniform(GL_FLOAT_VEC2); @@ -232,18 +418,6 @@ void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform3i, 0>( }; template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform3fv, 0>( - bool /* valid */) { - SetupShaderForUniform(GL_FLOAT_VEC3); -}; - -template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform3iv, 0>( - bool /* valid */) { - SetupShaderForUniform(GL_INT_VEC3); -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform3fvImmediate, 0>( bool /* valid */) { SetupShaderForUniform(GL_FLOAT_VEC3); @@ -268,18 +442,6 @@ void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform4i, 0>( }; template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform4fv, 0>( - bool /* valid */) { - SetupShaderForUniform(GL_FLOAT_VEC4); -}; - -template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform4iv, 0>( - bool /* valid */) { - SetupShaderForUniform(GL_INT_VEC4); -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform4fvImmediate, 0>( bool /* valid */) { SetupShaderForUniform(GL_FLOAT_VEC4); @@ -292,61 +454,24 @@ void GLES2DecoderTestBase::SpecializedSetup<cmds::Uniform4ivImmediate, 0>( }; template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::UniformMatrix2fv, 0>( - bool /* valid */) { - SetupShaderForUniform(GL_FLOAT_MAT2); -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::UniformMatrix2fvImmediate, 0>( bool /* valid */) { SetupShaderForUniform(GL_FLOAT_MAT2); }; template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::UniformMatrix3fv, 0>( - bool /* valid */) { - SetupShaderForUniform(GL_FLOAT_MAT3); -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::UniformMatrix3fvImmediate, 0>( bool /* valid */) { SetupShaderForUniform(GL_FLOAT_MAT3); }; template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::UniformMatrix4fv, 0>( - bool /* valid */) { - SetupShaderForUniform(GL_FLOAT_MAT4); -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::UniformMatrix4fvImmediate, 0>( bool /* valid */) { SetupShaderForUniform(GL_FLOAT_MAT4); }; template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::RenderbufferStorage, 0>( - bool valid) { - DoBindRenderbuffer(GL_RENDERBUFFER, client_renderbuffer_id_, - kServiceRenderbufferId); - if (valid) { - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, - RenderbufferStorageEXT(GL_RENDERBUFFER, _, 3, 4)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, GetError()) - .WillOnce(Return(GL_NO_ERROR)) - .RetiresOnSaturation(); - } -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::TexParameterf, 0>( bool /* valid */) { DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); @@ -359,24 +484,12 @@ void GLES2DecoderTestBase::SpecializedSetup<cmds::TexParameteri, 0>( }; template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::TexParameterfv, 0>( - bool /* valid */) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::TexParameterfvImmediate, 0>( bool /* valid */) { DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); }; template <> -void GLES2DecoderTestBase::SpecializedSetup<cmds::TexParameteriv, 0>( - bool /* valid */) { - DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); -}; - -template <> void GLES2DecoderTestBase::SpecializedSetup<cmds::TexParameterivImmediate, 0>( bool /* valid */) { DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); @@ -384,6 +497,66 @@ void GLES2DecoderTestBase::SpecializedSetup<cmds::TexParameterivImmediate, 0>( #include "gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h" +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_INT) { + TestAcceptedUniform(GL_INT, Program::kUniform1i); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_INT_VEC2) { + TestAcceptedUniform(GL_INT_VEC2, Program::kUniform2i); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_INT_VEC3) { + TestAcceptedUniform(GL_INT_VEC3, Program::kUniform3i); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_INT_VEC4) { + TestAcceptedUniform(GL_INT_VEC4, Program::kUniform4i); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_BOOL) { + TestAcceptedUniform(GL_BOOL, Program::kUniform1i | Program::kUniform1f); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_BOOL_VEC2) { + TestAcceptedUniform(GL_BOOL_VEC2, Program::kUniform2i | Program::kUniform2f); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_BOOL_VEC3) { + TestAcceptedUniform(GL_BOOL_VEC3, Program::kUniform3i | Program::kUniform3f); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_BOOL_VEC4) { + TestAcceptedUniform(GL_BOOL_VEC4, Program::kUniform4i | Program::kUniform4f); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniformTypeFLOAT) { + TestAcceptedUniform(GL_FLOAT, Program::kUniform1f); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_FLOAT_VEC2) { + TestAcceptedUniform(GL_FLOAT_VEC2, Program::kUniform2f); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_FLOAT_VEC3) { + TestAcceptedUniform(GL_FLOAT_VEC3, Program::kUniform3f); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_FLOAT_VEC4) { + TestAcceptedUniform(GL_FLOAT_VEC4, Program::kUniform4f); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_FLOAT_MAT2) { + TestAcceptedUniform(GL_FLOAT_MAT2, Program::kUniformMatrix2f); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_FLOAT_MAT3) { + TestAcceptedUniform(GL_FLOAT_MAT3, Program::kUniformMatrix3f); +} + +TEST_P(GLES2DecoderTest2, AcceptsUniform_GL_FLOAT_MAT4) { + TestAcceptedUniform(GL_FLOAT_MAT4, Program::kUniformMatrix4f); +} + } // namespace gles2 } // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h index db72cac7225..dd2cd0edafb 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h @@ -1,154 +1,18 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // It is included by gles2_cmd_decoder_unittest_2.cc #ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_ #define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_ - -TEST_F(GLES2DecoderTest2, IsRenderbufferValidArgs) { - SpecializedSetup<cmds::IsRenderbuffer, 0>(true); - cmds::IsRenderbuffer cmd; - cmd.Init(client_renderbuffer_id_, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, IsRenderbufferInvalidArgsBadSharedMemoryId) { - SpecializedSetup<cmds::IsRenderbuffer, 0>(false); - cmds::IsRenderbuffer cmd; - cmd.Init( - client_renderbuffer_id_, kInvalidSharedMemoryId, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - cmd.Init( - client_renderbuffer_id_, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, IsShaderValidArgs) { - SpecializedSetup<cmds::IsShader, 0>(true); - cmds::IsShader cmd; - cmd.Init(client_shader_id_, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, IsShaderInvalidArgsBadSharedMemoryId) { - SpecializedSetup<cmds::IsShader, 0>(false); - cmds::IsShader cmd; - cmd.Init(client_shader_id_, kInvalidSharedMemoryId, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - cmd.Init(client_shader_id_, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, IsTextureValidArgs) { - SpecializedSetup<cmds::IsTexture, 0>(true); - cmds::IsTexture cmd; - cmd.Init(client_texture_id_, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, IsTextureInvalidArgsBadSharedMemoryId) { - SpecializedSetup<cmds::IsTexture, 0>(false); - cmds::IsTexture cmd; - cmd.Init(client_texture_id_, kInvalidSharedMemoryId, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - cmd.Init(client_texture_id_, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, LineWidthValidArgs) { - EXPECT_CALL(*gl_, LineWidth(0.5f)); - SpecializedSetup<cmds::LineWidth, 0>(true); - cmds::LineWidth cmd; - cmd.Init(0.5f); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, LineWidthInvalidValue0_0) { - SpecializedSetup<cmds::LineWidth, 0>(false); - cmds::LineWidth cmd; - cmd.Init(0.0f); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, LinkProgramValidArgs) { - EXPECT_CALL(*gl_, LinkProgram(kServiceProgramId)); - SpecializedSetup<cmds::LinkProgram, 0>(true); - cmds::LinkProgram cmd; - cmd.Init(client_program_id_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} -// TODO(gman): PixelStorei - - -TEST_F(GLES2DecoderTest2, PolygonOffsetValidArgs) { - EXPECT_CALL(*gl_, PolygonOffset(1, 2)); - SpecializedSetup<cmds::PolygonOffset, 0>(true); - cmds::PolygonOffset cmd; - cmd.Init(1, 2); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} -// TODO(gman): ReadPixels - -// TODO(gman): ReleaseShaderCompiler - -TEST_F(GLES2DecoderTest2, RenderbufferStorageValidArgs) { - SpecializedSetup<cmds::RenderbufferStorage, 0>(true); - cmds::RenderbufferStorage cmd; - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, 4); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, RenderbufferStorageInvalidArgs0_0) { - EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0); - SpecializedSetup<cmds::RenderbufferStorage, 0>(false); - cmds::RenderbufferStorage cmd; - cmd.Init(GL_FRAMEBUFFER, GL_RGBA4, 3, 4); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, RenderbufferStorageInvalidArgs2_0) { - EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0); - SpecializedSetup<cmds::RenderbufferStorage, 0>(false); - cmds::RenderbufferStorage cmd; - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, -1, 4); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, RenderbufferStorageInvalidArgs3_0) { - EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0); - SpecializedSetup<cmds::RenderbufferStorage, 0>(false); - cmds::RenderbufferStorage cmd; - cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, -1); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, SampleCoverageValidArgs) { - EXPECT_CALL(*gl_, SampleCoverage(1, true)); - SpecializedSetup<cmds::SampleCoverage, 0>(true); - cmds::SampleCoverage cmd; - cmd.Init(1, true); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, ScissorValidArgs) { +TEST_P(GLES2DecoderTest2, ScissorValidArgs) { EXPECT_CALL(*gl_, Scissor(1, 2, 3, 4)); SpecializedSetup<cmds::Scissor, 0>(true); cmds::Scissor cmd; @@ -157,7 +21,7 @@ TEST_F(GLES2DecoderTest2, ScissorValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, ScissorInvalidArgs2_0) { +TEST_P(GLES2DecoderTest2, ScissorInvalidArgs2_0) { EXPECT_CALL(*gl_, Scissor(_, _, _, _)).Times(0); SpecializedSetup<cmds::Scissor, 0>(false); cmds::Scissor cmd; @@ -166,7 +30,7 @@ TEST_F(GLES2DecoderTest2, ScissorInvalidArgs2_0) { EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); } -TEST_F(GLES2DecoderTest2, ScissorInvalidArgs3_0) { +TEST_P(GLES2DecoderTest2, ScissorInvalidArgs3_0) { EXPECT_CALL(*gl_, Scissor(_, _, _, _)).Times(0); SpecializedSetup<cmds::Scissor, 0>(false); cmds::Scissor cmd; @@ -176,11 +40,9 @@ TEST_F(GLES2DecoderTest2, ScissorInvalidArgs3_0) { } // TODO(gman): ShaderBinary -// TODO(gman): ShaderSource - // TODO(gman): ShaderSourceBucket -TEST_F(GLES2DecoderTest2, StencilFuncValidArgs) { +TEST_P(GLES2DecoderTest2, StencilFuncValidArgs) { EXPECT_CALL(*gl_, StencilFunc(GL_NEVER, 2, 3)); SpecializedSetup<cmds::StencilFunc, 0>(true); cmds::StencilFunc cmd; @@ -189,7 +51,7 @@ TEST_F(GLES2DecoderTest2, StencilFuncValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, StencilFuncSeparateValidArgs) { +TEST_P(GLES2DecoderTest2, StencilFuncSeparateValidArgs) { EXPECT_CALL(*gl_, StencilFuncSeparate(GL_FRONT, GL_NEVER, 3, 4)); SpecializedSetup<cmds::StencilFuncSeparate, 0>(true); cmds::StencilFuncSeparate cmd; @@ -198,7 +60,7 @@ TEST_F(GLES2DecoderTest2, StencilFuncSeparateValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, StencilMaskValidArgs) { +TEST_P(GLES2DecoderTest2, StencilMaskValidArgs) { SpecializedSetup<cmds::StencilMask, 0>(true); cmds::StencilMask cmd; cmd.Init(1); @@ -206,7 +68,7 @@ TEST_F(GLES2DecoderTest2, StencilMaskValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, StencilMaskSeparateValidArgs) { +TEST_P(GLES2DecoderTest2, StencilMaskSeparateValidArgs) { SpecializedSetup<cmds::StencilMaskSeparate, 0>(true); cmds::StencilMaskSeparate cmd; cmd.Init(GL_FRONT, 2); @@ -214,7 +76,7 @@ TEST_F(GLES2DecoderTest2, StencilMaskSeparateValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, StencilOpValidArgs) { +TEST_P(GLES2DecoderTest2, StencilOpValidArgs) { EXPECT_CALL(*gl_, StencilOp(GL_KEEP, GL_INCR, GL_KEEP)); SpecializedSetup<cmds::StencilOp, 0>(true); cmds::StencilOp cmd; @@ -223,7 +85,7 @@ TEST_F(GLES2DecoderTest2, StencilOpValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, StencilOpSeparateValidArgs) { +TEST_P(GLES2DecoderTest2, StencilOpSeparateValidArgs) { EXPECT_CALL(*gl_, StencilOpSeparate(GL_FRONT, GL_INCR, GL_KEEP, GL_KEEP)); SpecializedSetup<cmds::StencilOpSeparate, 0>(true); cmds::StencilOpSeparate cmd; @@ -233,10 +95,9 @@ TEST_F(GLES2DecoderTest2, StencilOpSeparateValidArgs) { } // TODO(gman): TexImage2D - -TEST_F(GLES2DecoderTest2, TexParameterfValidArgs) { - EXPECT_CALL( - *gl_, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); +TEST_P(GLES2DecoderTest2, TexParameterfValidArgs) { + EXPECT_CALL(*gl_, + TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); SpecializedSetup<cmds::TexParameterf, 0>(true); cmds::TexParameterf cmd; cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -244,8 +105,8 @@ TEST_F(GLES2DecoderTest2, TexParameterfValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameterfInvalidArgs0_0) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); +TEST_P(GLES2DecoderTest2, TexParameterfInvalidArgs0_0) { + EXPECT_CALL(*gl_, TexParameterf(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameterf, 0>(false); cmds::TexParameterf cmd; cmd.Init(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -253,8 +114,8 @@ TEST_F(GLES2DecoderTest2, TexParameterfInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameterfInvalidArgs0_1) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); +TEST_P(GLES2DecoderTest2, TexParameterfInvalidArgs0_1) { + EXPECT_CALL(*gl_, TexParameterf(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameterf, 0>(false); cmds::TexParameterf cmd; cmd.Init(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -262,8 +123,8 @@ TEST_F(GLES2DecoderTest2, TexParameterfInvalidArgs0_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameterfInvalidArgs1_0) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); +TEST_P(GLES2DecoderTest2, TexParameterfInvalidArgs1_0) { + EXPECT_CALL(*gl_, TexParameterf(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameterf, 0>(false); cmds::TexParameterf cmd; cmd.Init(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_NEAREST); @@ -271,131 +132,65 @@ TEST_F(GLES2DecoderTest2, TexParameterfInvalidArgs1_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameterfvValidArgs) { - SpecializedSetup<cmds::TexParameterfv, 0>(true); - cmds::TexParameterfv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - shared_memory_offset_); - GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; - EXPECT_CALL( - *gl_, TexParameteri( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, - *reinterpret_cast<const GLfloat*>(shared_memory_address_))); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, TexParameterfvInvalidArgs0_0) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); - SpecializedSetup<cmds::TexParameterfv, 0>(false); - cmds::TexParameterfv cmd; - cmd.Init( - GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - shared_memory_offset_); - GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, TexParameterfvInvalidArgs0_1) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); - SpecializedSetup<cmds::TexParameterfv, 0>(false); - cmds::TexParameterfv cmd; - cmd.Init( - GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - shared_memory_offset_); - GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, TexParameterfvInvalidArgs1_0) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); - SpecializedSetup<cmds::TexParameterfv, 0>(false); - cmds::TexParameterfv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_GENERATE_MIPMAP, shared_memory_id_, - shared_memory_offset_); - GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, TexParameterfvInvalidArgs2_0) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); - SpecializedSetup<cmds::TexParameterfv, 0>(false); - cmds::TexParameterfv cmd; - cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, kInvalidSharedMemoryId, 0); - GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, TexParameterfvInvalidArgs2_1) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); - SpecializedSetup<cmds::TexParameterfv, 0>(false); - cmds::TexParameterfv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - kInvalidSharedMemoryOffset); - GetSharedMemoryAs<GLfloat*>()[0] = GL_NEAREST; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, TexParameterfvImmediateValidArgs) { +TEST_P(GLES2DecoderTest2, TexParameterfvImmediateValidArgs) { cmds::TexParameterfvImmediate& cmd = *GetImmediateAs<cmds::TexParameterfvImmediate>(); SpecializedSetup<cmds::TexParameterfvImmediate, 0>(true); - GLfloat temp[1] = { GL_NEAREST, }; + GLfloat temp[1] = { + GL_NEAREST, + }; cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &temp[0]); EXPECT_CALL( *gl_, - TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, *reinterpret_cast< - GLfloat*>(ImmediateDataAddress(&cmd)))); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + TexParameterf(GL_TEXTURE_2D, + GL_TEXTURE_MAG_FILTER, + *reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameterfvImmediateInvalidArgs0_0) { +TEST_P(GLES2DecoderTest2, TexParameterfvImmediateInvalidArgs0_0) { cmds::TexParameterfvImmediate& cmd = *GetImmediateAs<cmds::TexParameterfvImmediate>(); - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); + EXPECT_CALL(*gl_, TexParameterf(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameterfvImmediate, 0>(false); - GLfloat temp[1] = { GL_NEAREST, }; + GLfloat temp[1] = { + GL_NEAREST, + }; cmd.Init(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameterfvImmediateInvalidArgs0_1) { +TEST_P(GLES2DecoderTest2, TexParameterfvImmediateInvalidArgs0_1) { cmds::TexParameterfvImmediate& cmd = *GetImmediateAs<cmds::TexParameterfvImmediate>(); - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); + EXPECT_CALL(*gl_, TexParameterf(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameterfvImmediate, 0>(false); - GLfloat temp[1] = { GL_NEAREST, }; + GLfloat temp[1] = { + GL_NEAREST, + }; cmd.Init(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameterfvImmediateInvalidArgs1_0) { +TEST_P(GLES2DecoderTest2, TexParameterfvImmediateInvalidArgs1_0) { cmds::TexParameterfvImmediate& cmd = *GetImmediateAs<cmds::TexParameterfvImmediate>(); - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); + EXPECT_CALL(*gl_, TexParameterf(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameterfvImmediate, 0>(false); - GLfloat temp[1] = { GL_NEAREST, }; + GLfloat temp[1] = { + GL_NEAREST, + }; cmd.Init(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameteriValidArgs) { - EXPECT_CALL( - *gl_, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); +TEST_P(GLES2DecoderTest2, TexParameteriValidArgs) { + EXPECT_CALL(*gl_, + TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); SpecializedSetup<cmds::TexParameteri, 0>(true); cmds::TexParameteri cmd; cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -403,7 +198,7 @@ TEST_F(GLES2DecoderTest2, TexParameteriValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameteriInvalidArgs0_0) { +TEST_P(GLES2DecoderTest2, TexParameteriInvalidArgs0_0) { EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameteri, 0>(false); cmds::TexParameteri cmd; @@ -412,7 +207,7 @@ TEST_F(GLES2DecoderTest2, TexParameteriInvalidArgs0_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameteriInvalidArgs0_1) { +TEST_P(GLES2DecoderTest2, TexParameteriInvalidArgs0_1) { EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameteri, 0>(false); cmds::TexParameteri cmd; @@ -421,7 +216,7 @@ TEST_F(GLES2DecoderTest2, TexParameteriInvalidArgs0_1) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameteriInvalidArgs1_0) { +TEST_P(GLES2DecoderTest2, TexParameteriInvalidArgs1_0) { EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameteri, 0>(false); cmds::TexParameteri cmd; @@ -430,131 +225,64 @@ TEST_F(GLES2DecoderTest2, TexParameteriInvalidArgs1_0) { EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameterivValidArgs) { - SpecializedSetup<cmds::TexParameteriv, 0>(true); - cmds::TexParameteriv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - shared_memory_offset_); - GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; - EXPECT_CALL( - *gl_, TexParameteri( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, *reinterpret_cast<const GLint*>( - shared_memory_address_))); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, TexParameterivInvalidArgs0_0) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); - SpecializedSetup<cmds::TexParameteriv, 0>(false); - cmds::TexParameteriv cmd; - cmd.Init( - GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - shared_memory_offset_); - GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, TexParameterivInvalidArgs0_1) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); - SpecializedSetup<cmds::TexParameteriv, 0>(false); - cmds::TexParameteriv cmd; - cmd.Init( - GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - shared_memory_offset_); - GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, TexParameterivInvalidArgs1_0) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); - SpecializedSetup<cmds::TexParameteriv, 0>(false); - cmds::TexParameteriv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_GENERATE_MIPMAP, shared_memory_id_, - shared_memory_offset_); - GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, TexParameterivInvalidArgs2_0) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); - SpecializedSetup<cmds::TexParameteriv, 0>(false); - cmds::TexParameteriv cmd; - cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, kInvalidSharedMemoryId, 0); - GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, TexParameterivInvalidArgs2_1) { - EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); - SpecializedSetup<cmds::TexParameteriv, 0>(false); - cmds::TexParameteriv cmd; - cmd.Init( - GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, shared_memory_id_, - kInvalidSharedMemoryOffset); - GetSharedMemoryAs<GLint*>()[0] = GL_NEAREST; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, TexParameterivImmediateValidArgs) { +TEST_P(GLES2DecoderTest2, TexParameterivImmediateValidArgs) { cmds::TexParameterivImmediate& cmd = *GetImmediateAs<cmds::TexParameterivImmediate>(); SpecializedSetup<cmds::TexParameterivImmediate, 0>(true); - GLint temp[1] = { GL_NEAREST, }; + GLint temp[1] = { + GL_NEAREST, + }; cmd.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &temp[0]); EXPECT_CALL( *gl_, - TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, *reinterpret_cast< - GLint*>(ImmediateDataAddress(&cmd)))); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + TexParameteri(GL_TEXTURE_2D, + GL_TEXTURE_MAG_FILTER, + *reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameterivImmediateInvalidArgs0_0) { +TEST_P(GLES2DecoderTest2, TexParameterivImmediateInvalidArgs0_0) { cmds::TexParameterivImmediate& cmd = *GetImmediateAs<cmds::TexParameterivImmediate>(); EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameterivImmediate, 0>(false); - GLint temp[1] = { GL_NEAREST, }; + GLint temp[1] = { + GL_NEAREST, + }; cmd.Init(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameterivImmediateInvalidArgs0_1) { +TEST_P(GLES2DecoderTest2, TexParameterivImmediateInvalidArgs0_1) { cmds::TexParameterivImmediate& cmd = *GetImmediateAs<cmds::TexParameterivImmediate>(); EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameterivImmediate, 0>(false); - GLint temp[1] = { GL_NEAREST, }; + GLint temp[1] = { + GL_NEAREST, + }; cmd.Init(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } -TEST_F(GLES2DecoderTest2, TexParameterivImmediateInvalidArgs1_0) { +TEST_P(GLES2DecoderTest2, TexParameterivImmediateInvalidArgs1_0) { cmds::TexParameterivImmediate& cmd = *GetImmediateAs<cmds::TexParameterivImmediate>(); EXPECT_CALL(*gl_, TexParameteri(_, _, _)).Times(0); SpecializedSetup<cmds::TexParameterivImmediate, 0>(false); - GLint temp[1] = { GL_NEAREST, }; + GLint temp[1] = { + GL_NEAREST, + }; cmd.Init(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); } // TODO(gman): TexSubImage2D - -TEST_F(GLES2DecoderTest2, Uniform1fValidArgs) { +TEST_P(GLES2DecoderTest2, Uniform1fValidArgs) { EXPECT_CALL(*gl_, Uniform1fv(1, 1, _)); SpecializedSetup<cmds::Uniform1f, 0>(true); cmds::Uniform1f cmd; @@ -563,74 +291,23 @@ TEST_F(GLES2DecoderTest2, Uniform1fValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform1fvValidArgs) { - EXPECT_CALL( - *gl_, Uniform1fv( - 1, 2, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform1fv, 0>(true); - cmds::Uniform1fv cmd; - cmd.Init(1, 2, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform1fvInvalidArgs1_0) { - EXPECT_CALL(*gl_, Uniform1fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform1fv, 0>(false); - cmds::Uniform1fv cmd; - cmd.Init(1, -1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform1fvInvalidArgs2_0) { - EXPECT_CALL(*gl_, Uniform1fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform1fv, 0>(false); - cmds::Uniform1fv cmd; - cmd.Init(1, 2, kInvalidSharedMemoryId, 0); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform1fvInvalidArgs2_1) { - EXPECT_CALL(*gl_, Uniform1fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform1fv, 0>(false); - cmds::Uniform1fv cmd; - cmd.Init(1, 2, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform1fvValidArgsCountTooLarge) { - EXPECT_CALL( - *gl_, Uniform1fv( - 3, 3, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform1fv, 0>(true); - cmds::Uniform1fv cmd; - cmd.Init( - ProgramManager::MakeFakeLocation( - 1, 1), 5, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform1fvImmediateValidArgs) { - cmds::Uniform1fvImmediate& cmd = - *GetImmediateAs<cmds::Uniform1fvImmediate>(); +TEST_P(GLES2DecoderTest2, Uniform1fvImmediateValidArgs) { + cmds::Uniform1fvImmediate& cmd = *GetImmediateAs<cmds::Uniform1fvImmediate>(); EXPECT_CALL( *gl_, - Uniform1fv(1, 2, - reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + Uniform1fv(1, 2, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<cmds::Uniform1fvImmediate, 0>(true); - GLfloat temp[1 * 2] = { 0, }; + GLfloat temp[1 * 2] = { + 0, + }; cmd.Init(1, 2, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } // TODO(gman): Uniform1i -// TODO(gman): Uniform1iv // TODO(gman): Uniform1ivImmediate -TEST_F(GLES2DecoderTest2, Uniform2fValidArgs) { +TEST_P(GLES2DecoderTest2, Uniform2fValidArgs) { EXPECT_CALL(*gl_, Uniform2fv(1, 1, _)); SpecializedSetup<cmds::Uniform2f, 0>(true); cmds::Uniform2f cmd; @@ -639,71 +316,21 @@ TEST_F(GLES2DecoderTest2, Uniform2fValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform2fvValidArgs) { - EXPECT_CALL( - *gl_, Uniform2fv( - 1, 2, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform2fv, 0>(true); - cmds::Uniform2fv cmd; - cmd.Init(1, 2, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform2fvInvalidArgs1_0) { - EXPECT_CALL(*gl_, Uniform2fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform2fv, 0>(false); - cmds::Uniform2fv cmd; - cmd.Init(1, -1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform2fvInvalidArgs2_0) { - EXPECT_CALL(*gl_, Uniform2fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform2fv, 0>(false); - cmds::Uniform2fv cmd; - cmd.Init(1, 2, kInvalidSharedMemoryId, 0); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform2fvInvalidArgs2_1) { - EXPECT_CALL(*gl_, Uniform2fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform2fv, 0>(false); - cmds::Uniform2fv cmd; - cmd.Init(1, 2, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform2fvValidArgsCountTooLarge) { - EXPECT_CALL( - *gl_, Uniform2fv( - 3, 3, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform2fv, 0>(true); - cmds::Uniform2fv cmd; - cmd.Init( - ProgramManager::MakeFakeLocation( - 1, 1), 5, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform2fvImmediateValidArgs) { - cmds::Uniform2fvImmediate& cmd = - *GetImmediateAs<cmds::Uniform2fvImmediate>(); +TEST_P(GLES2DecoderTest2, Uniform2fvImmediateValidArgs) { + cmds::Uniform2fvImmediate& cmd = *GetImmediateAs<cmds::Uniform2fvImmediate>(); EXPECT_CALL( *gl_, - Uniform2fv(1, 2, - reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + Uniform2fv(1, 2, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<cmds::Uniform2fvImmediate, 0>(true); - GLfloat temp[2 * 2] = { 0, }; + GLfloat temp[2 * 2] = { + 0, + }; cmd.Init(1, 2, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform2iValidArgs) { +TEST_P(GLES2DecoderTest2, Uniform2iValidArgs) { EXPECT_CALL(*gl_, Uniform2iv(1, 1, _)); SpecializedSetup<cmds::Uniform2i, 0>(true); cmds::Uniform2i cmd; @@ -712,71 +339,21 @@ TEST_F(GLES2DecoderTest2, Uniform2iValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform2ivValidArgs) { - EXPECT_CALL( - *gl_, Uniform2iv( - 1, 2, reinterpret_cast<const GLint*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform2iv, 0>(true); - cmds::Uniform2iv cmd; - cmd.Init(1, 2, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform2ivInvalidArgs1_0) { - EXPECT_CALL(*gl_, Uniform2iv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform2iv, 0>(false); - cmds::Uniform2iv cmd; - cmd.Init(1, -1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform2ivInvalidArgs2_0) { - EXPECT_CALL(*gl_, Uniform2iv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform2iv, 0>(false); - cmds::Uniform2iv cmd; - cmd.Init(1, 2, kInvalidSharedMemoryId, 0); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform2ivInvalidArgs2_1) { - EXPECT_CALL(*gl_, Uniform2iv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform2iv, 0>(false); - cmds::Uniform2iv cmd; - cmd.Init(1, 2, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform2ivValidArgsCountTooLarge) { - EXPECT_CALL( - *gl_, Uniform2iv( - 3, 3, reinterpret_cast<const GLint*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform2iv, 0>(true); - cmds::Uniform2iv cmd; - cmd.Init( - ProgramManager::MakeFakeLocation( - 1, 1), 5, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform2ivImmediateValidArgs) { - cmds::Uniform2ivImmediate& cmd = - *GetImmediateAs<cmds::Uniform2ivImmediate>(); +TEST_P(GLES2DecoderTest2, Uniform2ivImmediateValidArgs) { + cmds::Uniform2ivImmediate& cmd = *GetImmediateAs<cmds::Uniform2ivImmediate>(); EXPECT_CALL( *gl_, - Uniform2iv(1, 2, - reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); + Uniform2iv(1, 2, reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<cmds::Uniform2ivImmediate, 0>(true); - GLint temp[2 * 2] = { 0, }; + GLint temp[2 * 2] = { + 0, + }; cmd.Init(1, 2, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform3fValidArgs) { +TEST_P(GLES2DecoderTest2, Uniform3fValidArgs) { EXPECT_CALL(*gl_, Uniform3fv(1, 1, _)); SpecializedSetup<cmds::Uniform3f, 0>(true); cmds::Uniform3f cmd; @@ -785,71 +362,21 @@ TEST_F(GLES2DecoderTest2, Uniform3fValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform3fvValidArgs) { - EXPECT_CALL( - *gl_, Uniform3fv( - 1, 2, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform3fv, 0>(true); - cmds::Uniform3fv cmd; - cmd.Init(1, 2, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform3fvInvalidArgs1_0) { - EXPECT_CALL(*gl_, Uniform3fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform3fv, 0>(false); - cmds::Uniform3fv cmd; - cmd.Init(1, -1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform3fvInvalidArgs2_0) { - EXPECT_CALL(*gl_, Uniform3fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform3fv, 0>(false); - cmds::Uniform3fv cmd; - cmd.Init(1, 2, kInvalidSharedMemoryId, 0); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform3fvInvalidArgs2_1) { - EXPECT_CALL(*gl_, Uniform3fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform3fv, 0>(false); - cmds::Uniform3fv cmd; - cmd.Init(1, 2, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform3fvValidArgsCountTooLarge) { - EXPECT_CALL( - *gl_, Uniform3fv( - 3, 3, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform3fv, 0>(true); - cmds::Uniform3fv cmd; - cmd.Init( - ProgramManager::MakeFakeLocation( - 1, 1), 5, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform3fvImmediateValidArgs) { - cmds::Uniform3fvImmediate& cmd = - *GetImmediateAs<cmds::Uniform3fvImmediate>(); +TEST_P(GLES2DecoderTest2, Uniform3fvImmediateValidArgs) { + cmds::Uniform3fvImmediate& cmd = *GetImmediateAs<cmds::Uniform3fvImmediate>(); EXPECT_CALL( *gl_, - Uniform3fv(1, 2, - reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + Uniform3fv(1, 2, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<cmds::Uniform3fvImmediate, 0>(true); - GLfloat temp[3 * 2] = { 0, }; + GLfloat temp[3 * 2] = { + 0, + }; cmd.Init(1, 2, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform3iValidArgs) { +TEST_P(GLES2DecoderTest2, Uniform3iValidArgs) { EXPECT_CALL(*gl_, Uniform3iv(1, 1, _)); SpecializedSetup<cmds::Uniform3i, 0>(true); cmds::Uniform3i cmd; @@ -858,71 +385,21 @@ TEST_F(GLES2DecoderTest2, Uniform3iValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform3ivValidArgs) { - EXPECT_CALL( - *gl_, Uniform3iv( - 1, 2, reinterpret_cast<const GLint*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform3iv, 0>(true); - cmds::Uniform3iv cmd; - cmd.Init(1, 2, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform3ivInvalidArgs1_0) { - EXPECT_CALL(*gl_, Uniform3iv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform3iv, 0>(false); - cmds::Uniform3iv cmd; - cmd.Init(1, -1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform3ivInvalidArgs2_0) { - EXPECT_CALL(*gl_, Uniform3iv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform3iv, 0>(false); - cmds::Uniform3iv cmd; - cmd.Init(1, 2, kInvalidSharedMemoryId, 0); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform3ivInvalidArgs2_1) { - EXPECT_CALL(*gl_, Uniform3iv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform3iv, 0>(false); - cmds::Uniform3iv cmd; - cmd.Init(1, 2, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform3ivValidArgsCountTooLarge) { - EXPECT_CALL( - *gl_, Uniform3iv( - 3, 3, reinterpret_cast<const GLint*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform3iv, 0>(true); - cmds::Uniform3iv cmd; - cmd.Init( - ProgramManager::MakeFakeLocation( - 1, 1), 5, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform3ivImmediateValidArgs) { - cmds::Uniform3ivImmediate& cmd = - *GetImmediateAs<cmds::Uniform3ivImmediate>(); +TEST_P(GLES2DecoderTest2, Uniform3ivImmediateValidArgs) { + cmds::Uniform3ivImmediate& cmd = *GetImmediateAs<cmds::Uniform3ivImmediate>(); EXPECT_CALL( *gl_, - Uniform3iv(1, 2, - reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); + Uniform3iv(1, 2, reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<cmds::Uniform3ivImmediate, 0>(true); - GLint temp[3 * 2] = { 0, }; + GLint temp[3 * 2] = { + 0, + }; cmd.Init(1, 2, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform4fValidArgs) { +TEST_P(GLES2DecoderTest2, Uniform4fValidArgs) { EXPECT_CALL(*gl_, Uniform4fv(1, 1, _)); SpecializedSetup<cmds::Uniform4f, 0>(true); cmds::Uniform4f cmd; @@ -931,71 +408,21 @@ TEST_F(GLES2DecoderTest2, Uniform4fValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform4fvValidArgs) { - EXPECT_CALL( - *gl_, Uniform4fv( - 1, 2, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform4fv, 0>(true); - cmds::Uniform4fv cmd; - cmd.Init(1, 2, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform4fvInvalidArgs1_0) { - EXPECT_CALL(*gl_, Uniform4fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform4fv, 0>(false); - cmds::Uniform4fv cmd; - cmd.Init(1, -1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform4fvInvalidArgs2_0) { - EXPECT_CALL(*gl_, Uniform4fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform4fv, 0>(false); - cmds::Uniform4fv cmd; - cmd.Init(1, 2, kInvalidSharedMemoryId, 0); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform4fvInvalidArgs2_1) { - EXPECT_CALL(*gl_, Uniform4fv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform4fv, 0>(false); - cmds::Uniform4fv cmd; - cmd.Init(1, 2, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform4fvValidArgsCountTooLarge) { - EXPECT_CALL( - *gl_, Uniform4fv( - 3, 3, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform4fv, 0>(true); - cmds::Uniform4fv cmd; - cmd.Init( - ProgramManager::MakeFakeLocation( - 1, 1), 5, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform4fvImmediateValidArgs) { - cmds::Uniform4fvImmediate& cmd = - *GetImmediateAs<cmds::Uniform4fvImmediate>(); +TEST_P(GLES2DecoderTest2, Uniform4fvImmediateValidArgs) { + cmds::Uniform4fvImmediate& cmd = *GetImmediateAs<cmds::Uniform4fvImmediate>(); EXPECT_CALL( *gl_, - Uniform4fv(1, 2, - reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + Uniform4fv(1, 2, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<cmds::Uniform4fvImmediate, 0>(true); - GLfloat temp[4 * 2] = { 0, }; + GLfloat temp[4 * 2] = { + 0, + }; cmd.Init(1, 2, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform4iValidArgs) { +TEST_P(GLES2DecoderTest2, Uniform4iValidArgs) { EXPECT_CALL(*gl_, Uniform4iv(1, 1, _)); SpecializedSetup<cmds::Uniform4i, 0>(true); cmds::Uniform4i cmd; @@ -1004,333 +431,87 @@ TEST_F(GLES2DecoderTest2, Uniform4iValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, Uniform4ivValidArgs) { - EXPECT_CALL( - *gl_, Uniform4iv( - 1, 2, reinterpret_cast<const GLint*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform4iv, 0>(true); - cmds::Uniform4iv cmd; - cmd.Init(1, 2, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform4ivInvalidArgs1_0) { - EXPECT_CALL(*gl_, Uniform4iv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform4iv, 0>(false); - cmds::Uniform4iv cmd; - cmd.Init(1, -1, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform4ivInvalidArgs2_0) { - EXPECT_CALL(*gl_, Uniform4iv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform4iv, 0>(false); - cmds::Uniform4iv cmd; - cmd.Init(1, 2, kInvalidSharedMemoryId, 0); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform4ivInvalidArgs2_1) { - EXPECT_CALL(*gl_, Uniform4iv(_, _, _)).Times(0); - SpecializedSetup<cmds::Uniform4iv, 0>(false); - cmds::Uniform4iv cmd; - cmd.Init(1, 2, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, Uniform4ivValidArgsCountTooLarge) { - EXPECT_CALL( - *gl_, Uniform4iv( - 3, 3, reinterpret_cast<const GLint*>(shared_memory_address_))); - SpecializedSetup<cmds::Uniform4iv, 0>(true); - cmds::Uniform4iv cmd; - cmd.Init( - ProgramManager::MakeFakeLocation( - 1, 1), 5, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, Uniform4ivImmediateValidArgs) { - cmds::Uniform4ivImmediate& cmd = - *GetImmediateAs<cmds::Uniform4ivImmediate>(); +TEST_P(GLES2DecoderTest2, Uniform4ivImmediateValidArgs) { + cmds::Uniform4ivImmediate& cmd = *GetImmediateAs<cmds::Uniform4ivImmediate>(); EXPECT_CALL( *gl_, - Uniform4iv(1, 2, - reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); + Uniform4iv(1, 2, reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<cmds::Uniform4ivImmediate, 0>(true); - GLint temp[4 * 2] = { 0, }; + GLint temp[4 * 2] = { + 0, + }; cmd.Init(1, 2, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, UniformMatrix2fvValidArgs) { - EXPECT_CALL( - *gl_, UniformMatrix2fv( - 1, 2, false, reinterpret_cast<const GLfloat*>( - shared_memory_address_))); - SpecializedSetup<cmds::UniformMatrix2fv, 0>(true); - cmds::UniformMatrix2fv cmd; - cmd.Init(1, 2, false, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix2fvInvalidArgs1_0) { - EXPECT_CALL(*gl_, UniformMatrix2fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix2fv, 0>(false); - cmds::UniformMatrix2fv cmd; - cmd.Init(1, -1, false, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix2fvInvalidArgs2_0) { - EXPECT_CALL(*gl_, UniformMatrix2fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix2fv, 0>(false); - cmds::UniformMatrix2fv cmd; - cmd.Init(1, 2, true, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix2fvInvalidArgs3_0) { - EXPECT_CALL(*gl_, UniformMatrix2fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix2fv, 0>(false); - cmds::UniformMatrix2fv cmd; - cmd.Init(1, 2, false, kInvalidSharedMemoryId, 0); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix2fvInvalidArgs3_1) { - EXPECT_CALL(*gl_, UniformMatrix2fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix2fv, 0>(false); - cmds::UniformMatrix2fv cmd; - cmd.Init(1, 2, false, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix2fvValidArgsCountTooLarge) { - EXPECT_CALL( - *gl_, UniformMatrix2fv( - 3, 3, false, reinterpret_cast<const GLfloat*>( - shared_memory_address_))); - SpecializedSetup<cmds::UniformMatrix2fv, 0>(true); - cmds::UniformMatrix2fv cmd; - cmd.Init( - ProgramManager::MakeFakeLocation( - 1, 1), 5, false, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix2fvImmediateValidArgs) { +TEST_P(GLES2DecoderTest2, UniformMatrix2fvImmediateValidArgs) { cmds::UniformMatrix2fvImmediate& cmd = *GetImmediateAs<cmds::UniformMatrix2fvImmediate>(); EXPECT_CALL( *gl_, - UniformMatrix2fv(1, 2, false, - reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + UniformMatrix2fv( + 1, 2, false, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<cmds::UniformMatrix2fvImmediate, 0>(true); - GLfloat temp[4 * 2] = { 0, }; - cmd.Init(1, 2, false, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix2fvImmediateInvalidArgs2_0) { - cmds::UniformMatrix2fvImmediate& cmd = - *GetImmediateAs<cmds::UniformMatrix2fvImmediate>(); - EXPECT_CALL(*gl_, UniformMatrix2fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix2fvImmediate, 0>(false); - GLfloat temp[4 * 2] = { 0, }; - cmd.Init(1, 2, true, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix3fvValidArgs) { - EXPECT_CALL( - *gl_, UniformMatrix3fv( - 1, 2, false, reinterpret_cast<const GLfloat*>( - shared_memory_address_))); - SpecializedSetup<cmds::UniformMatrix3fv, 0>(true); - cmds::UniformMatrix3fv cmd; - cmd.Init(1, 2, false, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix3fvInvalidArgs1_0) { - EXPECT_CALL(*gl_, UniformMatrix3fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix3fv, 0>(false); - cmds::UniformMatrix3fv cmd; - cmd.Init(1, -1, false, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix3fvInvalidArgs2_0) { - EXPECT_CALL(*gl_, UniformMatrix3fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix3fv, 0>(false); - cmds::UniformMatrix3fv cmd; - cmd.Init(1, 2, true, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix3fvInvalidArgs3_0) { - EXPECT_CALL(*gl_, UniformMatrix3fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix3fv, 0>(false); - cmds::UniformMatrix3fv cmd; - cmd.Init(1, 2, false, kInvalidSharedMemoryId, 0); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix3fvInvalidArgs3_1) { - EXPECT_CALL(*gl_, UniformMatrix3fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix3fv, 0>(false); - cmds::UniformMatrix3fv cmd; - cmd.Init(1, 2, false, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix3fvValidArgsCountTooLarge) { - EXPECT_CALL( - *gl_, UniformMatrix3fv( - 3, 3, false, reinterpret_cast<const GLfloat*>( - shared_memory_address_))); - SpecializedSetup<cmds::UniformMatrix3fv, 0>(true); - cmds::UniformMatrix3fv cmd; - cmd.Init( - ProgramManager::MakeFakeLocation( - 1, 1), 5, false, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + GLfloat temp[4 * 2] = { + 0, + }; + cmd.Init(1, 2, &temp[0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, UniformMatrix3fvImmediateValidArgs) { +TEST_P(GLES2DecoderTest2, UniformMatrix3fvImmediateValidArgs) { cmds::UniformMatrix3fvImmediate& cmd = *GetImmediateAs<cmds::UniformMatrix3fvImmediate>(); EXPECT_CALL( *gl_, - UniformMatrix3fv(1, 2, false, - reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + UniformMatrix3fv( + 1, 2, false, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<cmds::UniformMatrix3fvImmediate, 0>(true); - GLfloat temp[9 * 2] = { 0, }; - cmd.Init(1, 2, false, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix3fvImmediateInvalidArgs2_0) { - cmds::UniformMatrix3fvImmediate& cmd = - *GetImmediateAs<cmds::UniformMatrix3fvImmediate>(); - EXPECT_CALL(*gl_, UniformMatrix3fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix3fvImmediate, 0>(false); - GLfloat temp[9 * 2] = { 0, }; - cmd.Init(1, 2, true, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix4fvValidArgs) { - EXPECT_CALL( - *gl_, UniformMatrix4fv( - 1, 2, false, reinterpret_cast<const GLfloat*>( - shared_memory_address_))); - SpecializedSetup<cmds::UniformMatrix4fv, 0>(true); - cmds::UniformMatrix4fv cmd; - cmd.Init(1, 2, false, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix4fvInvalidArgs1_0) { - EXPECT_CALL(*gl_, UniformMatrix4fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix4fv, 0>(false); - cmds::UniformMatrix4fv cmd; - cmd.Init(1, -1, false, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix4fvInvalidArgs2_0) { - EXPECT_CALL(*gl_, UniformMatrix4fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix4fv, 0>(false); - cmds::UniformMatrix4fv cmd; - cmd.Init(1, 2, true, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix4fvInvalidArgs3_0) { - EXPECT_CALL(*gl_, UniformMatrix4fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix4fv, 0>(false); - cmds::UniformMatrix4fv cmd; - cmd.Init(1, 2, false, kInvalidSharedMemoryId, 0); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix4fvInvalidArgs3_1) { - EXPECT_CALL(*gl_, UniformMatrix4fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix4fv, 0>(false); - cmds::UniformMatrix4fv cmd; - cmd.Init(1, 2, false, shared_memory_id_, kInvalidSharedMemoryOffset); - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, UniformMatrix4fvValidArgsCountTooLarge) { - EXPECT_CALL( - *gl_, UniformMatrix4fv( - 3, 3, false, reinterpret_cast<const GLfloat*>( - shared_memory_address_))); - SpecializedSetup<cmds::UniformMatrix4fv, 0>(true); - cmds::UniformMatrix4fv cmd; - cmd.Init( - ProgramManager::MakeFakeLocation( - 1, 1), 5, false, shared_memory_id_, shared_memory_offset_); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + GLfloat temp[9 * 2] = { + 0, + }; + cmd.Init(1, 2, &temp[0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, UniformMatrix4fvImmediateValidArgs) { +TEST_P(GLES2DecoderTest2, UniformMatrix4fvImmediateValidArgs) { cmds::UniformMatrix4fvImmediate& cmd = *GetImmediateAs<cmds::UniformMatrix4fvImmediate>(); EXPECT_CALL( *gl_, - UniformMatrix4fv(1, 2, false, - reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + UniformMatrix4fv( + 1, 2, false, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); SpecializedSetup<cmds::UniformMatrix4fvImmediate, 0>(true); - GLfloat temp[16 * 2] = { 0, }; - cmd.Init(1, 2, false, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + GLfloat temp[16 * 2] = { + 0, + }; + cmd.Init(1, 2, &temp[0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, UniformMatrix4fvImmediateInvalidArgs2_0) { - cmds::UniformMatrix4fvImmediate& cmd = - *GetImmediateAs<cmds::UniformMatrix4fvImmediate>(); - EXPECT_CALL(*gl_, UniformMatrix4fv(_, _, _, _)).Times(0); - SpecializedSetup<cmds::UniformMatrix4fvImmediate, 0>(false); - GLfloat temp[16 * 2] = { 0, }; - cmd.Init(1, 2, true, &temp[0]); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); +TEST_P(GLES2DecoderTest2, UseProgramValidArgs) { + EXPECT_CALL(*gl_, UseProgram(kServiceProgramId)); + SpecializedSetup<cmds::UseProgram, 0>(true); + cmds::UseProgram cmd; + cmd.Init(client_program_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest2, UseProgramInvalidArgs0_0) { + EXPECT_CALL(*gl_, UseProgram(_)).Times(0); + SpecializedSetup<cmds::UseProgram, 0>(false); + cmds::UseProgram cmd; + cmd.Init(kInvalidClientId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); } -// TODO(gman): UseProgram -TEST_F(GLES2DecoderTest2, ValidateProgramValidArgs) { +TEST_P(GLES2DecoderTest2, ValidateProgramValidArgs) { EXPECT_CALL(*gl_, ValidateProgram(kServiceProgramId)); SpecializedSetup<cmds::ValidateProgram, 0>(true); cmds::ValidateProgram cmd; @@ -1339,7 +520,7 @@ TEST_F(GLES2DecoderTest2, ValidateProgramValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, VertexAttrib1fValidArgs) { +TEST_P(GLES2DecoderTest2, VertexAttrib1fValidArgs) { EXPECT_CALL(*gl_, VertexAttrib1f(1, 2)); SpecializedSetup<cmds::VertexAttrib1f, 0>(true); cmds::VertexAttrib1f cmd; @@ -1348,52 +529,22 @@ TEST_F(GLES2DecoderTest2, VertexAttrib1fValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, VertexAttrib1fvValidArgs) { - SpecializedSetup<cmds::VertexAttrib1fv, 0>(true); - cmds::VertexAttrib1fv cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_CALL( - *gl_, VertexAttrib1fv( - 1, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib1fvInvalidArgs1_0) { - EXPECT_CALL(*gl_, VertexAttrib1fv(_, _)).Times(0); - SpecializedSetup<cmds::VertexAttrib1fv, 0>(false); - cmds::VertexAttrib1fv cmd; - cmd.Init(1, kInvalidSharedMemoryId, 0); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib1fvInvalidArgs1_1) { - EXPECT_CALL(*gl_, VertexAttrib1fv(_, _)).Times(0); - SpecializedSetup<cmds::VertexAttrib1fv, 0>(false); - cmds::VertexAttrib1fv cmd; - cmd.Init(1, shared_memory_id_, kInvalidSharedMemoryOffset); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib1fvImmediateValidArgs) { +TEST_P(GLES2DecoderTest2, VertexAttrib1fvImmediateValidArgs) { cmds::VertexAttrib1fvImmediate& cmd = *GetImmediateAs<cmds::VertexAttrib1fvImmediate>(); SpecializedSetup<cmds::VertexAttrib1fvImmediate, 0>(true); - GLfloat temp[1] = { 0, }; + GLfloat temp[1] = { + 0, + }; cmd.Init(1, &temp[0]); - EXPECT_CALL( - *gl_, - VertexAttrib1fv(1, reinterpret_cast< - GLfloat*>(ImmediateDataAddress(&cmd)))); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_CALL(*gl_, + VertexAttrib1fv( + 1, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, VertexAttrib2fValidArgs) { +TEST_P(GLES2DecoderTest2, VertexAttrib2fValidArgs) { EXPECT_CALL(*gl_, VertexAttrib2f(1, 2, 3)); SpecializedSetup<cmds::VertexAttrib2f, 0>(true); cmds::VertexAttrib2f cmd; @@ -1402,52 +553,22 @@ TEST_F(GLES2DecoderTest2, VertexAttrib2fValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, VertexAttrib2fvValidArgs) { - SpecializedSetup<cmds::VertexAttrib2fv, 0>(true); - cmds::VertexAttrib2fv cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_CALL( - *gl_, VertexAttrib2fv( - 1, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib2fvInvalidArgs1_0) { - EXPECT_CALL(*gl_, VertexAttrib2fv(_, _)).Times(0); - SpecializedSetup<cmds::VertexAttrib2fv, 0>(false); - cmds::VertexAttrib2fv cmd; - cmd.Init(1, kInvalidSharedMemoryId, 0); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib2fvInvalidArgs1_1) { - EXPECT_CALL(*gl_, VertexAttrib2fv(_, _)).Times(0); - SpecializedSetup<cmds::VertexAttrib2fv, 0>(false); - cmds::VertexAttrib2fv cmd; - cmd.Init(1, shared_memory_id_, kInvalidSharedMemoryOffset); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib2fvImmediateValidArgs) { +TEST_P(GLES2DecoderTest2, VertexAttrib2fvImmediateValidArgs) { cmds::VertexAttrib2fvImmediate& cmd = *GetImmediateAs<cmds::VertexAttrib2fvImmediate>(); SpecializedSetup<cmds::VertexAttrib2fvImmediate, 0>(true); - GLfloat temp[2] = { 0, }; + GLfloat temp[2] = { + 0, + }; cmd.Init(1, &temp[0]); - EXPECT_CALL( - *gl_, - VertexAttrib2fv(1, reinterpret_cast< - GLfloat*>(ImmediateDataAddress(&cmd)))); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_CALL(*gl_, + VertexAttrib2fv( + 1, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, VertexAttrib3fValidArgs) { +TEST_P(GLES2DecoderTest2, VertexAttrib3fValidArgs) { EXPECT_CALL(*gl_, VertexAttrib3f(1, 2, 3, 4)); SpecializedSetup<cmds::VertexAttrib3f, 0>(true); cmds::VertexAttrib3f cmd; @@ -1456,52 +577,22 @@ TEST_F(GLES2DecoderTest2, VertexAttrib3fValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, VertexAttrib3fvValidArgs) { - SpecializedSetup<cmds::VertexAttrib3fv, 0>(true); - cmds::VertexAttrib3fv cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_CALL( - *gl_, VertexAttrib3fv( - 1, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib3fvInvalidArgs1_0) { - EXPECT_CALL(*gl_, VertexAttrib3fv(_, _)).Times(0); - SpecializedSetup<cmds::VertexAttrib3fv, 0>(false); - cmds::VertexAttrib3fv cmd; - cmd.Init(1, kInvalidSharedMemoryId, 0); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib3fvInvalidArgs1_1) { - EXPECT_CALL(*gl_, VertexAttrib3fv(_, _)).Times(0); - SpecializedSetup<cmds::VertexAttrib3fv, 0>(false); - cmds::VertexAttrib3fv cmd; - cmd.Init(1, shared_memory_id_, kInvalidSharedMemoryOffset); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib3fvImmediateValidArgs) { +TEST_P(GLES2DecoderTest2, VertexAttrib3fvImmediateValidArgs) { cmds::VertexAttrib3fvImmediate& cmd = *GetImmediateAs<cmds::VertexAttrib3fvImmediate>(); SpecializedSetup<cmds::VertexAttrib3fvImmediate, 0>(true); - GLfloat temp[3] = { 0, }; + GLfloat temp[3] = { + 0, + }; cmd.Init(1, &temp[0]); - EXPECT_CALL( - *gl_, - VertexAttrib3fv(1, reinterpret_cast< - GLfloat*>(ImmediateDataAddress(&cmd)))); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_CALL(*gl_, + VertexAttrib3fv( + 1, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, VertexAttrib4fValidArgs) { +TEST_P(GLES2DecoderTest2, VertexAttrib4fValidArgs) { EXPECT_CALL(*gl_, VertexAttrib4f(1, 2, 3, 4, 5)); SpecializedSetup<cmds::VertexAttrib4f, 0>(true); cmds::VertexAttrib4f cmd; @@ -1510,54 +601,23 @@ TEST_F(GLES2DecoderTest2, VertexAttrib4fValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, VertexAttrib4fvValidArgs) { - SpecializedSetup<cmds::VertexAttrib4fv, 0>(true); - cmds::VertexAttrib4fv cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_CALL( - *gl_, VertexAttrib4fv( - 1, reinterpret_cast<const GLfloat*>(shared_memory_address_))); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); - EXPECT_EQ(GL_NO_ERROR, GetGLError()); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib4fvInvalidArgs1_0) { - EXPECT_CALL(*gl_, VertexAttrib4fv(_, _)).Times(0); - SpecializedSetup<cmds::VertexAttrib4fv, 0>(false); - cmds::VertexAttrib4fv cmd; - cmd.Init(1, kInvalidSharedMemoryId, 0); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib4fvInvalidArgs1_1) { - EXPECT_CALL(*gl_, VertexAttrib4fv(_, _)).Times(0); - SpecializedSetup<cmds::VertexAttrib4fv, 0>(false); - cmds::VertexAttrib4fv cmd; - cmd.Init(1, shared_memory_id_, kInvalidSharedMemoryOffset); - GetSharedMemoryAs<GLfloat*>()[0] = 0; - EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); -} - -TEST_F(GLES2DecoderTest2, VertexAttrib4fvImmediateValidArgs) { +TEST_P(GLES2DecoderTest2, VertexAttrib4fvImmediateValidArgs) { cmds::VertexAttrib4fvImmediate& cmd = *GetImmediateAs<cmds::VertexAttrib4fvImmediate>(); SpecializedSetup<cmds::VertexAttrib4fvImmediate, 0>(true); - GLfloat temp[4] = { 0, }; + GLfloat temp[4] = { + 0, + }; cmd.Init(1, &temp[0]); - EXPECT_CALL( - *gl_, - VertexAttrib4fv(1, reinterpret_cast< - GLfloat*>(ImmediateDataAddress(&cmd)))); - EXPECT_EQ(error::kNoError, - ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_CALL(*gl_, + VertexAttrib4fv( + 1, reinterpret_cast<GLfloat*>(ImmediateDataAddress(&cmd)))); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } // TODO(gman): VertexAttribPointer - -TEST_F(GLES2DecoderTest2, ViewportValidArgs) { +TEST_P(GLES2DecoderTest2, ViewportValidArgs) { EXPECT_CALL(*gl_, Viewport(1, 2, 3, 4)); SpecializedSetup<cmds::Viewport, 0>(true); cmds::Viewport cmd; @@ -1566,7 +626,7 @@ TEST_F(GLES2DecoderTest2, ViewportValidArgs) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -TEST_F(GLES2DecoderTest2, ViewportInvalidArgs2_0) { +TEST_P(GLES2DecoderTest2, ViewportInvalidArgs2_0) { EXPECT_CALL(*gl_, Viewport(_, _, _, _)).Times(0); SpecializedSetup<cmds::Viewport, 0>(false); cmds::Viewport cmd; @@ -1575,7 +635,7 @@ TEST_F(GLES2DecoderTest2, ViewportInvalidArgs2_0) { EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); } -TEST_F(GLES2DecoderTest2, ViewportInvalidArgs3_0) { +TEST_P(GLES2DecoderTest2, ViewportInvalidArgs3_0) { EXPECT_CALL(*gl_, Viewport(_, _, _, _)).Times(0); SpecializedSetup<cmds::Viewport, 0>(false); cmds::Viewport cmd; @@ -1588,9 +648,7 @@ TEST_F(GLES2DecoderTest2, ViewportInvalidArgs3_0) { // TODO(gman): RenderbufferStorageMultisampleEXT // TODO(gman): FramebufferTexture2DMultisampleEXT // TODO(gman): TexStorage2DEXT -// TODO(gman): GenQueriesEXT // TODO(gman): GenQueriesEXTImmediate -// TODO(gman): DeleteQueriesEXT // TODO(gman): DeleteQueriesEXTImmediate // TODO(gman): BeginQueryEXT @@ -1600,17 +658,14 @@ TEST_F(GLES2DecoderTest2, ViewportInvalidArgs3_0) { // TODO(gman): PushGroupMarkerEXT - -TEST_F(GLES2DecoderTest2, PopGroupMarkerEXTValidArgs) { +TEST_P(GLES2DecoderTest2, PopGroupMarkerEXTValidArgs) { SpecializedSetup<cmds::PopGroupMarkerEXT, 0>(true); cmds::PopGroupMarkerEXT cmd; cmd.Init(); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -// TODO(gman): GenVertexArraysOES // TODO(gman): GenVertexArraysOESImmediate -// TODO(gman): DeleteVertexArraysOES // TODO(gman): DeleteVertexArraysOESImmediate // TODO(gman): IsVertexArrayOES // TODO(gman): BindVertexArrayOES @@ -1618,5 +673,52 @@ TEST_F(GLES2DecoderTest2, PopGroupMarkerEXTValidArgs) { // TODO(gman): GetMaxValueInBufferCHROMIUM // TODO(gman): GenSharedIdsCHROMIUM -#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_ +// TODO(gman): DeleteSharedIdsCHROMIUM + +// TODO(gman): RegisterSharedIdsCHROMIUM + +// TODO(gman): EnableFeatureCHROMIUM + +// TODO(gman): ResizeCHROMIUM +// TODO(gman): GetRequestableExtensionsCHROMIUM +// TODO(gman): RequestExtensionCHROMIUM + +// TODO(gman): GetMultipleIntegervCHROMIUM + +// TODO(gman): GetProgramInfoCHROMIUM + +// TODO(gman): GetTranslatedShaderSourceANGLE +// TODO(gman): PostSubBufferCHROMIUM +// TODO(gman): TexImageIOSurface2DCHROMIUM +// TODO(gman): CopyTextureCHROMIUM +// TODO(gman): DrawArraysInstancedANGLE +// TODO(gman): DrawElementsInstancedANGLE +// TODO(gman): VertexAttribDivisorANGLE +// TODO(gman): GenMailboxCHROMIUM + +// TODO(gman): ProduceTextureCHROMIUMImmediate +// TODO(gman): ProduceTextureDirectCHROMIUMImmediate +// TODO(gman): ConsumeTextureCHROMIUMImmediate +// TODO(gman): CreateAndConsumeTextureCHROMIUMImmediate +// TODO(gman): BindUniformLocationCHROMIUMBucket +// TODO(gman): BindTexImage2DCHROMIUM +// TODO(gman): ReleaseTexImage2DCHROMIUM +// TODO(gman): TraceBeginCHROMIUM + +// TODO(gman): TraceEndCHROMIUM +// TODO(gman): AsyncTexSubImage2DCHROMIUM + +// TODO(gman): AsyncTexImage2DCHROMIUM + +// TODO(gman): WaitAsyncTexImage2DCHROMIUM + +// TODO(gman): WaitAllAsyncTexImage2DCHROMIUM + +// TODO(gman): DiscardFramebufferEXTImmediate +// TODO(gman): LoseContextCHROMIUM +// TODO(gman): InsertSyncPointCHROMIUM + +// TODO(gman): WaitSyncPointCHROMIUM + +#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_ diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3.cc index b41eed2953a..3fadaf07634 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3.cc +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3.cc @@ -34,7 +34,9 @@ class GLES2DecoderTest3 : public GLES2DecoderTestBase { GLES2DecoderTest3() { } }; -TEST_F(GLES2DecoderTest3, TraceBeginCHROMIUM) { +INSTANTIATE_TEST_CASE_P(Service, GLES2DecoderTest3, ::testing::Bool()); + +TEST_P(GLES2DecoderTest3, TraceBeginCHROMIUM) { const uint32 kBucketId = 123; const char kName[] = "test_command"; SetBucketAsCString(kBucketId, kName); @@ -44,7 +46,7 @@ TEST_F(GLES2DecoderTest3, TraceBeginCHROMIUM) { EXPECT_EQ(error::kNoError, ExecuteCmd(begin_cmd)); } -TEST_F(GLES2DecoderTest3, TraceEndCHROMIUM) { +TEST_P(GLES2DecoderTest3, TraceEndCHROMIUM) { // Test end fails if no begin. TraceEndCHROMIUM end_cmd; end_cmd.Init(); diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h index ab338e46eff..adbde496acd 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h @@ -1,70 +1,19 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! // It is included by gles2_cmd_decoder_unittest_3.cc #ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_3_AUTOGEN_H_ #define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_3_AUTOGEN_H_ -// TODO(gman): DeleteSharedIdsCHROMIUM - -// TODO(gman): RegisterSharedIdsCHROMIUM - -// TODO(gman): EnableFeatureCHROMIUM - -// TODO(gman): ResizeCHROMIUM -// TODO(gman): GetRequestableExtensionsCHROMIUM - -// TODO(gman): RequestExtensionCHROMIUM - -// TODO(gman): GetMultipleIntegervCHROMIUM - -// TODO(gman): GetProgramInfoCHROMIUM - -// TODO(gman): CreateStreamTextureCHROMIUM - -// TODO(gman): DestroyStreamTextureCHROMIUM - -// TODO(gman): GetTranslatedShaderSourceANGLE -// TODO(gman): PostSubBufferCHROMIUM -// TODO(gman): TexImageIOSurface2DCHROMIUM -// TODO(gman): CopyTextureCHROMIUM -// TODO(gman): DrawArraysInstancedANGLE -// TODO(gman): DrawElementsInstancedANGLE -// TODO(gman): VertexAttribDivisorANGLE -// TODO(gman): GenMailboxCHROMIUM - -// TODO(gman): ProduceTextureCHROMIUM -// TODO(gman): ProduceTextureCHROMIUMImmediate -// TODO(gman): ConsumeTextureCHROMIUM -// TODO(gman): ConsumeTextureCHROMIUMImmediate -// TODO(gman): BindUniformLocationCHROMIUM - -// TODO(gman): BindUniformLocationCHROMIUMBucket -// TODO(gman): BindTexImage2DCHROMIUM -// TODO(gman): ReleaseTexImage2DCHROMIUM -// TODO(gman): TraceBeginCHROMIUM - -// TODO(gman): TraceEndCHROMIUM -// TODO(gman): AsyncTexSubImage2DCHROMIUM - -// TODO(gman): AsyncTexImage2DCHROMIUM - -// TODO(gman): WaitAsyncTexImage2DCHROMIUM - -// TODO(gman): DiscardFramebufferEXT -// TODO(gman): DiscardFramebufferEXTImmediate -// TODO(gman): LoseContextCHROMIUM - -// TODO(gman): InsertSyncPointCHROMIUM - -// TODO(gman): WaitSyncPointCHROMIUM - -// TODO(gman): DrawBuffersEXT // TODO(gman): DrawBuffersEXTImmediate -#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_3_AUTOGEN_H_ +// TODO(gman): DiscardBackbufferCHROMIUM +// TODO(gman): ScheduleOverlayPlaneCHROMIUM +#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_3_AUTOGEN_H_ diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_async_pixel.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_async_pixel.cc new file mode 100644 index 00000000000..d32870d9a1a --- /dev/null +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_async_pixel.cc @@ -0,0 +1,388 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" + +#include "base/command_line.h" +#include "base/strings/string_number_conversions.h" +#include "gpu/command_buffer/common/gles2_cmd_format.h" +#include "gpu/command_buffer/common/gles2_cmd_utils.h" +#include "gpu/command_buffer/common/id_allocator.h" +#include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" +#include "gpu/command_buffer/service/cmd_buffer_engine.h" +#include "gpu/command_buffer/service/context_group.h" +#include "gpu/command_buffer/service/context_state.h" +#include "gpu/command_buffer/service/gl_surface_mock.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" + +#include "gpu/command_buffer/service/gpu_switches.h" +#include "gpu/command_buffer/service/image_manager.h" +#include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/mocks.h" +#include "gpu/command_buffer/service/program_manager.h" +#include "gpu/command_buffer/service/test_helper.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_implementation.h" +#include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface_stub.h" + +#if !defined(GL_DEPTH24_STENCIL8) +#define GL_DEPTH24_STENCIL8 0x88F0 +#endif + +using ::gfx::MockGLInterface; +using ::testing::_; +using ::testing::DoAll; +using ::testing::InSequence; +using ::testing::Invoke; +using ::testing::MatcherCast; +using ::testing::Mock; +using ::testing::Pointee; +using ::testing::Return; +using ::testing::SaveArg; +using ::testing::SetArrayArgument; +using ::testing::SetArgumentPointee; +using ::testing::SetArgPointee; +using ::testing::StrEq; +using ::testing::StrictMock; + +namespace gpu { +namespace gles2 { + +using namespace cmds; + +TEST_P(GLES2DecoderManualInitTest, AsyncPixelTransfers) { + InitState init; + init.extensions = "GL_CHROMIUM_async_pixel_transfers"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + // Set up the texture. + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + TextureRef* texture_ref = GetTexture(client_texture_id_); + Texture* texture = texture_ref->texture(); + + // Set a mock Async delegate + StrictMock<gpu::MockAsyncPixelTransferManager>* manager = + new StrictMock<gpu::MockAsyncPixelTransferManager>; + manager->Initialize(group().texture_manager()); + decoder_->SetAsyncPixelTransferManagerForTest(manager); + StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL; + + // Tex(Sub)Image2D upload commands. + AsyncTexImage2DCHROMIUM teximage_cmd; + teximage_cmd.Init(GL_TEXTURE_2D, + 0, + GL_RGBA, + 8, + 8, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + 0, + 0, + 0); + AsyncTexSubImage2DCHROMIUM texsubimage_cmd; + texsubimage_cmd.Init(GL_TEXTURE_2D, + 0, + 0, + 0, + 8, + 8, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + 0, + 0, + 0); + WaitAsyncTexImage2DCHROMIUM wait_cmd; + wait_cmd.Init(GL_TEXTURE_2D); + WaitAllAsyncTexImage2DCHROMIUM wait_all_cmd; + wait_all_cmd.Init(); + + // No transfer state exists initially. + EXPECT_FALSE( + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + + base::Closure bind_callback; + + // AsyncTexImage2D + { + // Create transfer state since it doesn't exist. + EXPECT_EQ(texture_ref->num_observers(), 0); + EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) + .WillOnce(Return( + delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) + .RetiresOnSaturation(); + EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)) + .WillOnce(SaveArg<2>(&bind_callback)) + .RetiresOnSaturation(); + // Command succeeds. + EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ( + delegate, + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + EXPECT_TRUE(texture->IsImmutable()); + // The texture is safe but the level has not been defined yet. + EXPECT_TRUE(texture->SafeToRenderFrom()); + GLsizei width, height; + EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + EXPECT_EQ(texture_ref->num_observers(), 1); + } + { + // Async redefinitions are not allowed! + // Command fails. + EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ( + delegate, + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + EXPECT_TRUE(texture->IsImmutable()); + EXPECT_TRUE(texture->SafeToRenderFrom()); + } + + // Binding/defining of the async transfer + { + // TODO(epenner): We should check that the manager gets the + // BindCompletedAsyncTransfers() call, which is required to + // guarantee the delegate calls the bind callback. + + // Simulate the bind callback from the delegate. + bind_callback.Run(); + + // After the bind callback is run, the texture is safe, + // and has the right size etc. + EXPECT_TRUE(texture->SafeToRenderFrom()); + GLsizei width, height; + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + EXPECT_EQ(width, 8); + EXPECT_EQ(height, 8); + } + + // AsyncTexSubImage2D + EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); + decoder_->GetAsyncPixelTransferManager()->ClearPixelTransferDelegateForTest( + texture_ref); + EXPECT_EQ(texture_ref->num_observers(), 0); + texture->SetImmutable(false); + { + // Create transfer state since it doesn't exist. + EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) + .WillOnce(Return( + delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) + .RetiresOnSaturation(); + EXPECT_CALL(*delegate, AsyncTexSubImage2D(_, _)).RetiresOnSaturation(); + // Command succeeds. + EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ( + delegate, + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + EXPECT_TRUE(texture->IsImmutable()); + EXPECT_TRUE(texture->SafeToRenderFrom()); + } + { + // No transfer is in progress. + EXPECT_CALL(*delegate, TransferIsInProgress()) + .WillOnce(Return(false)) // texSubImage validation + .WillOnce(Return(false)) // async validation + .RetiresOnSaturation(); + EXPECT_CALL(*delegate, AsyncTexSubImage2D(_, _)).RetiresOnSaturation(); + // Command succeeds. + EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ( + delegate, + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + EXPECT_TRUE(texture->IsImmutable()); + EXPECT_TRUE(texture->SafeToRenderFrom()); + } + { + // A transfer is still in progress! + EXPECT_CALL(*delegate, TransferIsInProgress()) + .WillOnce(Return(true)) + .RetiresOnSaturation(); + // No async call, command fails. + EXPECT_EQ(error::kNoError, ExecuteCmd(texsubimage_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ( + delegate, + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + EXPECT_TRUE(texture->IsImmutable()); + EXPECT_TRUE(texture->SafeToRenderFrom()); + } + + // Delete delegate on DeleteTexture. + { + EXPECT_EQ(texture_ref->num_observers(), 1); + EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); + DoDeleteTexture(client_texture_id_, kServiceTextureId); + EXPECT_FALSE( + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + texture = NULL; + texture_ref = NULL; + delegate = NULL; + } + + // WaitAsyncTexImage2D + { + // Get a fresh texture since the existing texture cannot be respecified + // asynchronously and AsyncTexSubImage2D does not involve binding. + EXPECT_CALL(*gl_, GenTextures(1, _)) + .WillOnce(SetArgumentPointee<1>(kServiceTextureId)); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + texture_ref = GetTexture(client_texture_id_); + texture = texture_ref->texture(); + texture->SetImmutable(false); + // Create transfer state since it doesn't exist. + EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) + .WillOnce(Return( + delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) + .RetiresOnSaturation(); + EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)).RetiresOnSaturation(); + // Start async transfer. + EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ( + delegate, + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + + EXPECT_TRUE(texture->IsImmutable()); + // Wait for completion. + EXPECT_CALL(*delegate, WaitForTransferCompletion()); + EXPECT_CALL(*manager, BindCompletedAsyncTransfers()); + EXPECT_EQ(error::kNoError, ExecuteCmd(wait_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + } + + // WaitAllAsyncTexImage2D + EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); + DoDeleteTexture(client_texture_id_, kServiceTextureId); + EXPECT_FALSE( + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + texture = NULL; + texture_ref = NULL; + delegate = NULL; + { + // Get a fresh texture since the existing texture cannot be respecified + // asynchronously and AsyncTexSubImage2D does not involve binding. + EXPECT_CALL(*gl_, GenTextures(1, _)) + .WillOnce(SetArgumentPointee<1>(kServiceTextureId)); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + texture_ref = GetTexture(client_texture_id_); + texture = texture_ref->texture(); + texture->SetImmutable(false); + // Create transfer state since it doesn't exist. + EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) + .WillOnce(Return( + delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) + .RetiresOnSaturation(); + EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)).RetiresOnSaturation(); + // Start async transfer. + EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ( + delegate, + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + + EXPECT_TRUE(texture->IsImmutable()); + // Wait for completion of all uploads. + EXPECT_CALL(*manager, WaitAllAsyncTexImage2D()).RetiresOnSaturation(); + EXPECT_CALL(*manager, BindCompletedAsyncTransfers()); + EXPECT_EQ(error::kNoError, ExecuteCmd(wait_all_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + } + + // Remove PixelTransferManager before the decoder destroys. + EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); + decoder_->ResetAsyncPixelTransferManagerForTest(); + manager = NULL; +} + +TEST_P(GLES2DecoderManualInitTest, AsyncPixelTransferManager) { + InitState init; + init.extensions = "GL_CHROMIUM_async_pixel_transfers"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + // Set up the texture. + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + TextureRef* texture_ref = GetTexture(client_texture_id_); + + // Set a mock Async delegate. + StrictMock<gpu::MockAsyncPixelTransferManager>* manager = + new StrictMock<gpu::MockAsyncPixelTransferManager>; + manager->Initialize(group().texture_manager()); + decoder_->SetAsyncPixelTransferManagerForTest(manager); + StrictMock<gpu::MockAsyncPixelTransferDelegate>* delegate = NULL; + + AsyncTexImage2DCHROMIUM teximage_cmd; + teximage_cmd.Init(GL_TEXTURE_2D, + 0, + GL_RGBA, + 8, + 8, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + 0, + 0, + 0); + + // No transfer delegate exists initially. + EXPECT_FALSE( + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + + // Create delegate on AsyncTexImage2D. + { + EXPECT_CALL(*manager, CreatePixelTransferDelegateImpl(texture_ref, _)) + .WillOnce(Return( + delegate = new StrictMock<gpu::MockAsyncPixelTransferDelegate>)) + .RetiresOnSaturation(); + EXPECT_CALL(*delegate, AsyncTexImage2D(_, _, _)).RetiresOnSaturation(); + + // Command succeeds. + EXPECT_EQ(error::kNoError, ExecuteCmd(teximage_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + } + + // Delegate is cached. + EXPECT_EQ(delegate, + decoder_->GetAsyncPixelTransferManager()->GetPixelTransferDelegate( + texture_ref)); + + // Delete delegate on manager teardown. + { + EXPECT_EQ(texture_ref->num_observers(), 1); + EXPECT_CALL(*delegate, Destroy()).RetiresOnSaturation(); + decoder_->ResetAsyncPixelTransferManagerForTest(); + manager = NULL; + + // Texture ref still valid. + EXPECT_EQ(texture_ref, GetTexture(client_texture_id_)); + EXPECT_EQ(texture_ref->num_observers(), 0); + } +} + +} // namespace gles2 +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_attribs.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_attribs.cc new file mode 100644 index 00000000000..3b000fca37c --- /dev/null +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_attribs.cc @@ -0,0 +1,485 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" + +#include "base/command_line.h" +#include "base/strings/string_number_conversions.h" +#include "gpu/command_buffer/common/gles2_cmd_format.h" +#include "gpu/command_buffer/common/gles2_cmd_utils.h" +#include "gpu/command_buffer/common/id_allocator.h" +#include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" +#include "gpu/command_buffer/service/cmd_buffer_engine.h" +#include "gpu/command_buffer/service/context_group.h" +#include "gpu/command_buffer/service/context_state.h" +#include "gpu/command_buffer/service/gl_surface_mock.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" + +#include "gpu/command_buffer/service/gpu_switches.h" +#include "gpu/command_buffer/service/image_manager.h" +#include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/mocks.h" +#include "gpu/command_buffer/service/program_manager.h" +#include "gpu/command_buffer/service/test_helper.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_implementation.h" +#include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface_stub.h" + +#if !defined(GL_DEPTH24_STENCIL8) +#define GL_DEPTH24_STENCIL8 0x88F0 +#endif + +using ::gfx::MockGLInterface; +using ::testing::_; +using ::testing::DoAll; +using ::testing::InSequence; +using ::testing::Invoke; +using ::testing::MatcherCast; +using ::testing::Mock; +using ::testing::Pointee; +using ::testing::Return; +using ::testing::SaveArg; +using ::testing::SetArrayArgument; +using ::testing::SetArgumentPointee; +using ::testing::SetArgPointee; +using ::testing::StrEq; +using ::testing::StrictMock; + +namespace gpu { +namespace gles2 { + +using namespace cmds; + +TEST_P(GLES2DecoderWithShaderTest, GetVertexAttribPointervSucceeds) { + const float dummy = 0; + const GLuint kOffsetToTestFor = sizeof(dummy) * 4; + const GLuint kIndexToTest = 1; + GetVertexAttribPointerv::Result* result = + static_cast<GetVertexAttribPointerv::Result*>(shared_memory_address_); + result->size = 0; + const GLuint* result_value = result->GetData(); + // Test that initial value is 0. + GetVertexAttribPointerv cmd; + cmd.Init(kIndexToTest, + GL_VERTEX_ATTRIB_ARRAY_POINTER, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(sizeof(*result_value), result->size); + EXPECT_EQ(0u, *result_value); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Set the value and see that we get it. + SetupVertexBuffer(); + DoVertexAttribPointer(kIndexToTest, 2, GL_FLOAT, 0, kOffsetToTestFor); + result->size = 0; + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(sizeof(*result_value), result->size); + EXPECT_EQ(kOffsetToTestFor, *result_value); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetVertexAttribPointervBadArgsFails) { + const GLuint kIndexToTest = 1; + GetVertexAttribPointerv::Result* result = + static_cast<GetVertexAttribPointerv::Result*>(shared_memory_address_); + result->size = 0; + const GLuint* result_value = result->GetData(); + // Test pname invalid fails. + GetVertexAttribPointerv cmd; + cmd.Init(kIndexToTest, + GL_VERTEX_ATTRIB_ARRAY_POINTER + 1, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0u, result->size); + EXPECT_EQ(kInitialResult, *result_value); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + + // Test index out of range fails. + result->size = 0; + cmd.Init(kNumVertexAttribs, + GL_VERTEX_ATTRIB_ARRAY_POINTER, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0u, result->size); + EXPECT_EQ(kInitialResult, *result_value); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + + // Test memory id bad fails. + cmd.Init(kIndexToTest, + GL_VERTEX_ATTRIB_ARRAY_POINTER, + kInvalidSharedMemoryId, + shared_memory_offset_); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + + // Test memory offset bad fails. + cmd.Init(kIndexToTest, + GL_VERTEX_ATTRIB_ARRAY_POINTER, + shared_memory_id_, + kInvalidSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, BindBufferToDifferentTargetFails) { + // Bind the buffer to GL_ARRAY_BUFFER + DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); + // Attempt to rebind to GL_ELEMENT_ARRAY_BUFFER + // NOTE: Real GLES2 does not have this restriction but WebGL and we do. + // This can be restriction can be removed at runtime. + EXPECT_CALL(*gl_, BindBuffer(_, _)).Times(0); + BindBuffer cmd; + cmd.Init(GL_ELEMENT_ARRAY_BUFFER, client_buffer_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, VertexAttribPointer) { + SetupVertexBuffer(); + static const GLenum types[] = { + GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, + GL_FLOAT, GL_FIXED, GL_INT, GL_UNSIGNED_INT, + }; + static const GLsizei sizes[] = { + 1, 1, 2, 2, 4, 4, 4, 4, + }; + static const GLuint indices[] = { + 0, 1, kNumVertexAttribs - 1, kNumVertexAttribs, + }; + static const GLsizei offset_mult[] = { + 0, 0, 1, 1, 2, 1000, + }; + static const GLsizei offset_offset[] = { + 0, 1, 0, 1, 0, 0, + }; + static const GLsizei stride_mult[] = { + -1, 0, 0, 1, 1, 2, 1000, + }; + static const GLsizei stride_offset[] = { + 0, 0, 1, 0, 1, 0, 0, + }; + for (size_t tt = 0; tt < arraysize(types); ++tt) { + GLenum type = types[tt]; + GLsizei num_bytes = sizes[tt]; + for (size_t ii = 0; ii < arraysize(indices); ++ii) { + GLuint index = indices[ii]; + for (GLint size = 0; size < 5; ++size) { + for (size_t oo = 0; oo < arraysize(offset_mult); ++oo) { + GLuint offset = num_bytes * offset_mult[oo] + offset_offset[oo]; + for (size_t ss = 0; ss < arraysize(stride_mult); ++ss) { + GLsizei stride = num_bytes * stride_mult[ss] + stride_offset[ss]; + for (int normalize = 0; normalize < 2; ++normalize) { + bool index_good = index < static_cast<GLuint>(kNumVertexAttribs); + bool size_good = (size > 0 && size < 5); + bool offset_good = (offset % num_bytes == 0); + bool stride_good = + (stride % num_bytes == 0) && stride >= 0 && stride <= 255; + bool type_good = (type != GL_INT && type != GL_UNSIGNED_INT && + type != GL_FIXED); + bool good = size_good && offset_good && stride_good && + type_good && index_good; + bool call = good && (type != GL_FIXED); + if (call) { + EXPECT_CALL(*gl_, + VertexAttribPointer(index, + size, + type, + normalize, + stride, + BufferOffset(offset))); + } + VertexAttribPointer cmd; + cmd.Init(index, size, type, normalize, stride, offset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + if (good) { + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + } else if (size_good && offset_good && stride_good && type_good && + !index_good) { + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + } else if (size_good && offset_good && stride_good && + !type_good && index_good) { + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + } else if (size_good && offset_good && !stride_good && + type_good && index_good) { + if (stride < 0 || stride > 255) { + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + } else { + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + } + } else if (size_good && !offset_good && stride_good && + type_good && index_good) { + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + } else if (!size_good && offset_good && stride_good && + type_good && index_good) { + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + } else { + EXPECT_NE(GL_NO_ERROR, GetGLError()); + } + } + } + } + } + } + } +} + +class GLES2DecoderVertexArraysOESTest : public GLES2DecoderWithShaderTest { + public: + GLES2DecoderVertexArraysOESTest() {} + + bool vertex_array_deleted_manually_; + + virtual void SetUp() { + InitState init; + init.gl_version = "opengl es 2.0"; + init.bind_generates_resource = true; + InitDecoder(init); + SetupDefaultProgram(); + + AddExpectationsForGenVertexArraysOES(); + GenHelper<GenVertexArraysOESImmediate>(client_vertexarray_id_); + + vertex_array_deleted_manually_ = false; + } + + virtual void TearDown() { + // This should only be set if the test handled deletion of the vertex array + // itself. Necessary because vertex_array_objects are not sharable, and thus + // not managed in the ContextGroup, meaning they will be destroyed during + // test tear down + if (!vertex_array_deleted_manually_) { + AddExpectationsForDeleteVertexArraysOES(); + } + + GLES2DecoderWithShaderTest::TearDown(); + } + + void GenVertexArraysOESImmediateValidArgs() { + AddExpectationsForGenVertexArraysOES(); + GenVertexArraysOESImmediate* cmd = + GetImmediateAs<GenVertexArraysOESImmediate>(); + GLuint temp = kNewClientId; + cmd->Init(1, &temp); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(*cmd, sizeof(temp))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_TRUE(GetVertexArrayInfo(kNewClientId) != NULL); + AddExpectationsForDeleteVertexArraysOES(); + } + + void GenVertexArraysOESImmediateInvalidArgs() { + EXPECT_CALL(*gl_, GenVertexArraysOES(_, _)).Times(0); + GenVertexArraysOESImmediate* cmd = + GetImmediateAs<GenVertexArraysOESImmediate>(); + cmd->Init(1, &client_vertexarray_id_); + EXPECT_EQ(error::kInvalidArguments, + ExecuteImmediateCmd(*cmd, sizeof(&client_vertexarray_id_))); + } + + void DeleteVertexArraysOESImmediateValidArgs() { + AddExpectationsForDeleteVertexArraysOES(); + DeleteVertexArraysOESImmediate& cmd = + *GetImmediateAs<DeleteVertexArraysOESImmediate>(); + cmd.Init(1, &client_vertexarray_id_); + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(cmd, sizeof(client_vertexarray_id_))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_TRUE(GetVertexArrayInfo(client_vertexarray_id_) == NULL); + vertex_array_deleted_manually_ = true; + } + + void DeleteVertexArraysOESImmediateInvalidArgs() { + DeleteVertexArraysOESImmediate& cmd = + *GetImmediateAs<DeleteVertexArraysOESImmediate>(); + GLuint temp = kInvalidClientId; + cmd.Init(1, &temp); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); + } + + void DeleteBoundVertexArraysOESImmediateValidArgs() { + BindVertexArrayOESValidArgs(); + + AddExpectationsForDeleteBoundVertexArraysOES(); + DeleteVertexArraysOESImmediate& cmd = + *GetImmediateAs<DeleteVertexArraysOESImmediate>(); + cmd.Init(1, &client_vertexarray_id_); + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(cmd, sizeof(client_vertexarray_id_))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_TRUE(GetVertexArrayInfo(client_vertexarray_id_) == NULL); + vertex_array_deleted_manually_ = true; + } + + void IsVertexArrayOESValidArgs() { + IsVertexArrayOES cmd; + cmd.Init(client_vertexarray_id_, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + } + + void IsVertexArrayOESInvalidArgsBadSharedMemoryId() { + IsVertexArrayOES cmd; + cmd.Init( + client_vertexarray_id_, kInvalidSharedMemoryId, shared_memory_offset_); + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); + cmd.Init( + client_vertexarray_id_, shared_memory_id_, kInvalidSharedMemoryOffset); + EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); + } + + void BindVertexArrayOESValidArgs() { + AddExpectationsForBindVertexArrayOES(); + BindVertexArrayOES cmd; + cmd.Init(client_vertexarray_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + } + + void BindVertexArrayOESValidArgsNewId() { + BindVertexArrayOES cmd; + cmd.Init(kNewClientId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + } +}; + +INSTANTIATE_TEST_CASE_P(Service, + GLES2DecoderVertexArraysOESTest, + ::testing::Bool()); + +class GLES2DecoderEmulatedVertexArraysOESTest + : public GLES2DecoderVertexArraysOESTest { + public: + GLES2DecoderEmulatedVertexArraysOESTest() {} + + virtual void SetUp() { + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + init.use_native_vao = false; + InitDecoder(init); + SetupDefaultProgram(); + + AddExpectationsForGenVertexArraysOES(); + GenHelper<GenVertexArraysOESImmediate>(client_vertexarray_id_); + + vertex_array_deleted_manually_ = false; + } +}; + +INSTANTIATE_TEST_CASE_P(Service, + GLES2DecoderEmulatedVertexArraysOESTest, + ::testing::Bool()); + +// Test vertex array objects with native support +TEST_P(GLES2DecoderVertexArraysOESTest, GenVertexArraysOESImmediateValidArgs) { + GenVertexArraysOESImmediateValidArgs(); +} +TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, + GenVertexArraysOESImmediateValidArgs) { + GenVertexArraysOESImmediateValidArgs(); +} + +TEST_P(GLES2DecoderVertexArraysOESTest, + GenVertexArraysOESImmediateInvalidArgs) { + GenVertexArraysOESImmediateInvalidArgs(); +} +TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, + GenVertexArraysOESImmediateInvalidArgs) { + GenVertexArraysOESImmediateInvalidArgs(); +} + +TEST_P(GLES2DecoderVertexArraysOESTest, + DeleteVertexArraysOESImmediateValidArgs) { + DeleteVertexArraysOESImmediateValidArgs(); +} +TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, + DeleteVertexArraysOESImmediateValidArgs) { + DeleteVertexArraysOESImmediateValidArgs(); +} + +TEST_P(GLES2DecoderVertexArraysOESTest, + DeleteVertexArraysOESImmediateInvalidArgs) { + DeleteVertexArraysOESImmediateInvalidArgs(); +} +TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, + DeleteVertexArraysOESImmediateInvalidArgs) { + DeleteVertexArraysOESImmediateInvalidArgs(); +} + +TEST_P(GLES2DecoderVertexArraysOESTest, + DeleteBoundVertexArraysOESImmediateValidArgs) { + DeleteBoundVertexArraysOESImmediateValidArgs(); +} +TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, + DeleteBoundVertexArraysOESImmediateValidArgs) { + DeleteBoundVertexArraysOESImmediateValidArgs(); +} + +TEST_P(GLES2DecoderVertexArraysOESTest, IsVertexArrayOESValidArgs) { + IsVertexArrayOESValidArgs(); +} +TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, IsVertexArrayOESValidArgs) { + IsVertexArrayOESValidArgs(); +} + +TEST_P(GLES2DecoderVertexArraysOESTest, + IsVertexArrayOESInvalidArgsBadSharedMemoryId) { + IsVertexArrayOESInvalidArgsBadSharedMemoryId(); +} +TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, + IsVertexArrayOESInvalidArgsBadSharedMemoryId) { + IsVertexArrayOESInvalidArgsBadSharedMemoryId(); +} + +TEST_P(GLES2DecoderVertexArraysOESTest, BindVertexArrayOESValidArgs) { + BindVertexArrayOESValidArgs(); +} +TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, BindVertexArrayOESValidArgs) { + BindVertexArrayOESValidArgs(); +} + +TEST_P(GLES2DecoderVertexArraysOESTest, BindVertexArrayOESValidArgsNewId) { + BindVertexArrayOESValidArgsNewId(); +} +TEST_P(GLES2DecoderEmulatedVertexArraysOESTest, + BindVertexArrayOESValidArgsNewId) { + BindVertexArrayOESValidArgsNewId(); +} + +TEST_P(GLES2DecoderTest, BufferDataGLError) { + GLenum target = GL_ARRAY_BUFFER; + GLsizeiptr size = 4; + DoBindBuffer(GL_ARRAY_BUFFER, client_buffer_id_, kServiceBufferId); + BufferManager* manager = group().buffer_manager(); + Buffer* buffer = manager->GetBuffer(client_buffer_id_); + ASSERT_TRUE(buffer != NULL); + EXPECT_EQ(0, buffer->size()); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_OUT_OF_MEMORY)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, BufferData(target, size, _, GL_STREAM_DRAW)) + .Times(1) + .RetiresOnSaturation(); + BufferData cmd; + cmd.Init(target, size, 0, 0, GL_STREAM_DRAW); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); + EXPECT_EQ(0, buffer->size()); +} + +// TODO(gman): BufferData + +// TODO(gman): BufferDataImmediate + +// TODO(gman): BufferSubData + +// TODO(gman): BufferSubDataImmediate + +} // namespace gles2 +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc index 9534b627adc..57c9c9dd6a6 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc @@ -14,7 +14,6 @@ #include "gpu/command_buffer/common/gles2_cmd_utils.h" #include "gpu/command_buffer/service/cmd_buffer_engine.h" #include "gpu/command_buffer/service/context_group.h" -#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" #include "gpu/command_buffer/service/logger.h" #include "gpu/command_buffer/service/program_manager.h" #include "gpu/command_buffer/service/test_helper.h" @@ -22,11 +21,14 @@ #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_implementation.h" #include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface.h" using ::gfx::MockGLInterface; using ::testing::_; using ::testing::DoAll; using ::testing::InSequence; +using ::testing::Invoke; +using ::testing::InvokeWithoutArgs; using ::testing::MatcherCast; using ::testing::Pointee; using ::testing::Return; @@ -35,6 +37,45 @@ using ::testing::SetArgPointee; using ::testing::SetArgumentPointee; using ::testing::StrEq; using ::testing::StrictMock; +using ::testing::WithArg; + +namespace { + +void NormalizeInitState(gpu::gles2::GLES2DecoderTestBase::InitState* init) { + CHECK(init); + const char* kVAOExtensions[] = { + "GL_OES_vertex_array_object", + "GL_ARB_vertex_array_object", + "GL_APPLE_vertex_array_object" + }; + bool contains_vao_extension = false; + for (size_t ii = 0; ii < arraysize(kVAOExtensions); ++ii) { + if (init->extensions.find(kVAOExtensions[ii]) != std::string::npos) { + contains_vao_extension = true; + break; + } + } + if (init->use_native_vao) { + if (contains_vao_extension) + return; + if (!init->extensions.empty()) + init->extensions += " "; + if (StartsWithASCII(init->gl_version, "opengl es", false)) { + init->extensions += kVAOExtensions[0]; + } else { +#if !defined(OS_MACOSX) + init->extensions += kVAOExtensions[1]; +#else + init->extensions += kVAOExtensions[2]; +#endif // OS_MACOSX + } + } else { + // Make sure we don't set up an invalid InitState. + CHECK(!contains_vao_extension); + } +} + +} // namespace Anonymous namespace gpu { namespace gles2 { @@ -53,22 +94,29 @@ GLES2DecoderTestBase::GLES2DecoderTestBase() client_vertex_shader_id_(121), client_fragment_shader_id_(122), client_query_id_(123), - client_vertexarray_id_(124) { + client_vertexarray_id_(124), + ignore_cached_state_for_test_(GetParam()), + cached_color_mask_red_(true), + cached_color_mask_green_(true), + cached_color_mask_blue_(true), + cached_color_mask_alpha_(true), + cached_depth_mask_(true), + cached_stencil_front_mask_(0xFFFFFFFFU), + cached_stencil_back_mask_(0xFFFFFFFFU) { memset(immediate_buffer_, 0xEE, sizeof(immediate_buffer_)); } GLES2DecoderTestBase::~GLES2DecoderTestBase() {} void GLES2DecoderTestBase::SetUp() { - InitDecoder( - "", // extensions - true, // has alpha - true, // has depth - false, // has stencil - true, // request alpha - true, // request depth - false, // request stencil - true); // bind generates resource + InitState init; + init.gl_version = "3.0"; + init.has_alpha = true; + init.has_depth = true; + init.request_alpha = true; + init.request_depth = true; + init.bind_generates_resource = true; + InitDecoder(init); } void GLES2DecoderTestBase::AddExpectationsForVertexAttribManager() { @@ -79,65 +127,73 @@ void GLES2DecoderTestBase::AddExpectationsForVertexAttribManager() { } } -void GLES2DecoderTestBase::InitDecoder( - const char* extensions, - bool has_alpha, - bool has_depth, - bool has_stencil, - bool request_alpha, - bool request_depth, - bool request_stencil, - bool bind_generates_resource) { - InitDecoderWithCommandLine(extensions, - has_alpha, - has_depth, - has_stencil, - request_alpha, - request_depth, - request_stencil, - bind_generates_resource, - NULL); +GLES2DecoderTestBase::InitState::InitState() + : has_alpha(false), + has_depth(false), + has_stencil(false), + request_alpha(false), + request_depth(false), + request_stencil(false), + bind_generates_resource(false), + lose_context_when_out_of_memory(false), + use_native_vao(true) { +} + +void GLES2DecoderTestBase::InitDecoder(const InitState& init) { + InitDecoderWithCommandLine(init, NULL); } void GLES2DecoderTestBase::InitDecoderWithCommandLine( - const char* extensions, - bool has_alpha, - bool has_depth, - bool has_stencil, - bool request_alpha, - bool request_depth, - bool request_stencil, - bool bind_generates_resource, - const CommandLine* command_line) { + const InitState& init, + const base::CommandLine* command_line) { + InitState normalized_init = init; + NormalizeInitState(&normalized_init); Framebuffer::ClearFramebufferCompleteComboMap(); + + gfx::SetGLGetProcAddressProc(gfx::MockGLInterface::GetGLProcAddress); + gfx::GLSurface::InitializeOneOffWithMockBindingsForTests(); + gl_.reset(new StrictMock<MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); + ::gfx::MockGLInterface::SetGLInterface(gl_.get()); + + SetupMockGLBehaviors(); // Only create stream texture manager if extension is requested. std::vector<std::string> list; - base::SplitString(std::string(extensions), ' ', &list); - if (std::find(list.begin(), list.end(), - "GL_CHROMIUM_stream_texture") != list.end()) - stream_texture_manager_.reset(new StrictMock<MockStreamTextureManager>); + base::SplitString(normalized_init.extensions, ' ', &list); scoped_refptr<FeatureInfo> feature_info; if (command_line) feature_info = new FeatureInfo(*command_line); - group_ = scoped_refptr<ContextGroup>(new ContextGroup( - NULL, - NULL, - memory_tracker_, - stream_texture_manager_.get(), - feature_info.get(), - bind_generates_resource)); - // These two workarounds are always turned on. - group_->feature_info( - )->workarounds_.set_texture_filter_before_generating_mipmap = true; - group_->feature_info()->workarounds_.clear_alpha_in_readpixels = true; + group_ = scoped_refptr<ContextGroup>( + new ContextGroup(NULL, + NULL, + memory_tracker_, + new ShaderTranslatorCache, + feature_info.get(), + normalized_init.bind_generates_resource)); + bool use_default_textures = normalized_init.bind_generates_resource; InSequence sequence; - TestHelper::SetupContextGroupInitExpectations(gl_.get(), - DisallowedFeatures(), extensions); + surface_ = new gfx::GLSurfaceStub; + surface_->SetSize(gfx::Size(kBackBufferWidth, kBackBufferHeight)); + + // Context needs to be created before initializing ContextGroup, which will + // in turn initialize FeatureInfo, which needs a context to determine + // extension support. + context_ = new gfx::GLContextStubWithExtensions; + context_->AddExtensionsString(normalized_init.extensions.c_str()); + context_->SetGLVersionString(normalized_init.gl_version.c_str()); + + context_->MakeCurrent(surface_.get()); + gfx::GLSurface::InitializeDynamicMockBindingsForTests(context_); + + TestHelper::SetupContextGroupInitExpectations( + gl_.get(), + DisallowedFeatures(), + normalized_init.extensions.c_str(), + normalized_init.gl_version.c_str(), + normalized_init.bind_generates_resource); // We initialize the ContextGroup with a MockGLES2Decoder so that // we can use the ContextGroup to figure out how the real GLES2Decoder @@ -146,7 +202,15 @@ void GLES2DecoderTestBase::InitDecoderWithCommandLine( EXPECT_TRUE( group_->Initialize(mock_decoder_.get(), DisallowedFeatures())); - AddExpectationsForVertexAttribManager(); + if (group_->feature_info()->feature_flags().native_vertex_array_object) { + EXPECT_CALL(*gl_, GenVertexArraysOES(1, _)) + .WillOnce(SetArgumentPointee<1>(kServiceVertexArrayId)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, BindVertexArrayOES(_)).Times(1).RetiresOnSaturation(); + } + + if (group_->feature_info()->workarounds().init_vertex_attributes) + AddExpectationsForVertexAttribManager(); AddExpectationsForBindVertexArrayOES(); @@ -183,25 +247,36 @@ void GLES2DecoderTestBase::InitDecoderWithCommandLine( .Times(1) .RetiresOnSaturation(); if (group_->feature_info()->feature_flags().oes_egl_image_external) { - EXPECT_CALL(*gl_, BindTexture( - GL_TEXTURE_EXTERNAL_OES, - TestHelper::kServiceDefaultExternalTextureId)) + EXPECT_CALL(*gl_, + BindTexture(GL_TEXTURE_EXTERNAL_OES, + use_default_textures + ? TestHelper::kServiceDefaultExternalTextureId + : 0)) .Times(1) .RetiresOnSaturation(); } if (group_->feature_info()->feature_flags().arb_texture_rectangle) { - EXPECT_CALL(*gl_, BindTexture( - GL_TEXTURE_RECTANGLE_ARB, - TestHelper::kServiceDefaultRectangleTextureId)) + EXPECT_CALL( + *gl_, + BindTexture(GL_TEXTURE_RECTANGLE_ARB, + use_default_textures + ? TestHelper::kServiceDefaultRectangleTextureId + : 0)) .Times(1) .RetiresOnSaturation(); } - EXPECT_CALL(*gl_, BindTexture( - GL_TEXTURE_CUBE_MAP, TestHelper::kServiceDefaultTextureCubemapId)) + EXPECT_CALL(*gl_, + BindTexture(GL_TEXTURE_CUBE_MAP, + use_default_textures + ? TestHelper::kServiceDefaultTextureCubemapId + : 0)) .Times(1) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, BindTexture( - GL_TEXTURE_2D, TestHelper::kServiceDefaultTexture2dId)) + EXPECT_CALL( + *gl_, + BindTexture( + GL_TEXTURE_2D, + use_default_textures ? TestHelper::kServiceDefaultTexture2dId : 0)) .Times(1) .RetiresOnSaturation(); } @@ -213,14 +288,14 @@ void GLES2DecoderTestBase::InitDecoderWithCommandLine( .Times(1) .RetiresOnSaturation(); EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _)) - .WillOnce(SetArgumentPointee<1>(has_alpha ? 8 : 0)) - .RetiresOnSaturation(); + .WillOnce(SetArgumentPointee<1>(normalized_init.has_alpha ? 8 : 0)) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) - .WillOnce(SetArgumentPointee<1>(has_depth ? 24 : 0)) - .RetiresOnSaturation(); + .WillOnce(SetArgumentPointee<1>(normalized_init.has_depth ? 24 : 0)) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) - .WillOnce(SetArgumentPointee<1>(has_stencil ? 8 : 0)) - .RetiresOnSaturation(); + .WillOnce(SetArgumentPointee<1>(normalized_init.has_stencil ? 8 : 0)) + .RetiresOnSaturation(); EXPECT_CALL(*gl_, Enable(GL_VERTEX_PROGRAM_POINT_SIZE)) .Times(1) @@ -269,28 +344,29 @@ void GLES2DecoderTestBase::InitDecoderWithCommandLine( #endif engine_.reset(new StrictMock<MockCommandBufferEngine>()); - gpu::Buffer buffer = engine_->GetSharedMemoryBuffer(kSharedMemoryId); + scoped_refptr<gpu::Buffer> buffer = + engine_->GetSharedMemoryBuffer(kSharedMemoryId); shared_memory_offset_ = kSharedMemoryOffset; - shared_memory_address_ = reinterpret_cast<int8*>(buffer.ptr) + - shared_memory_offset_; + shared_memory_address_ = + reinterpret_cast<int8*>(buffer->memory()) + shared_memory_offset_; shared_memory_id_ = kSharedMemoryId; - shared_memory_base_ = buffer.ptr; + shared_memory_base_ = buffer->memory(); - surface_ = new gfx::GLSurfaceStub; - surface_->SetSize(gfx::Size(kBackBufferWidth, kBackBufferHeight)); - - context_ = new gfx::GLContextStub; - - context_->MakeCurrent(surface_.get()); + static const int32 kLoseContextWhenOutOfMemory = 0x10003; int32 attributes[] = { - EGL_ALPHA_SIZE, request_alpha ? 8 : 0, - EGL_DEPTH_SIZE, request_depth ? 24 : 0, - EGL_STENCIL_SIZE, request_stencil ? 8 : 0, - }; + EGL_ALPHA_SIZE, + normalized_init.request_alpha ? 8 : 0, + EGL_DEPTH_SIZE, + normalized_init.request_depth ? 24 : 0, + EGL_STENCIL_SIZE, + normalized_init.request_stencil ? 8 : 0, + kLoseContextWhenOutOfMemory, + normalized_init.lose_context_when_out_of_memory ? 1 : 0, }; std::vector<int32> attribs(attributes, attributes + arraysize(attributes)); decoder_.reset(GLES2Decoder::Create(group_.get())); + decoder_->SetIgnoreCachedStateForTest(ignore_cached_state_for_test_); decoder_->GetLogger()->set_log_synthesized_gl_errors(false); decoder_->Initialize(surface_, context_, @@ -300,6 +376,7 @@ void GLES2DecoderTestBase::InitDecoderWithCommandLine( attribs); decoder_->MakeCurrent(); decoder_->set_engine(engine_.get()); + decoder_->BeginDecoding(); EXPECT_CALL(*gl_, GenBuffersARB(_, _)) .WillOnce(SetArgumentPointee<1>(kServiceBufferId)) @@ -328,20 +405,33 @@ void GLES2DecoderTestBase::InitDecoderWithCommandLine( EXPECT_EQ(GL_NO_ERROR, GetGLError()); } -void GLES2DecoderTestBase::TearDown() { +void GLES2DecoderTestBase::ResetDecoder() { + if (!decoder_.get()) + return; // All Tests should have read all their GLErrors before getting here. EXPECT_EQ(GL_NO_ERROR, GetGLError()); EXPECT_CALL(*gl_, DeleteBuffersARB(1, _)) .Times(2) .RetiresOnSaturation(); + if (group_->feature_info()->feature_flags().native_vertex_array_object) { + EXPECT_CALL(*gl_, DeleteVertexArraysOES(1, Pointee(kServiceVertexArrayId))) + .Times(1) + .RetiresOnSaturation(); + } + decoder_->EndDecoding(); decoder_->Destroy(true); decoder_.reset(); group_->Destroy(mock_decoder_.get(), false); engine_.reset(); - ::gfx::GLInterface::SetGLInterface(NULL); + ::gfx::MockGLInterface::SetGLInterface(NULL); gl_.reset(); + gfx::ClearGLBindings(); +} + +void GLES2DecoderTestBase::TearDown() { + ResetDecoder(); } void GLES2DecoderTestBase::ExpectEnableDisable(GLenum cap, bool enable) { @@ -429,12 +519,13 @@ void GLES2DecoderTestBase::SetBucketAsCString( } } -void GLES2DecoderTestBase::SetupClearTextureExpections( +void GLES2DecoderTestBase::SetupClearTextureExpectations( GLuint service_id, GLuint old_service_id, GLenum bind_target, GLenum target, GLint level, + GLenum internal_format, GLenum format, GLenum type, GLsizei width, @@ -443,7 +534,7 @@ void GLES2DecoderTestBase::SetupClearTextureExpections( .Times(1) .RetiresOnSaturation(); EXPECT_CALL(*gl_, TexImage2D( - target, level, format, width, height, 0, format, type, _)) + target, level, internal_format, width, height, 0, format, type, _)) .Times(1) .RetiresOnSaturation(); EXPECT_CALL(*gl_, BindTexture(bind_target, old_service_id)) @@ -530,9 +621,7 @@ void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearingMulti( EXPECT_CALL(*gl_, ClearColor(0.0f, 0.0f, 0.0f, 0.0f)) .Times(1) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, ColorMask(true, true, true, true)) - .Times(1) - .RetiresOnSaturation(); + SetupExpectationsForColorMask(true, true, true, true); } if ((clear_bits & GL_STENCIL_BUFFER_BIT) != 0) { EXPECT_CALL(*gl_, ClearStencil(0)) @@ -546,13 +635,9 @@ void GLES2DecoderTestBase::SetupExpectationsForFramebufferClearingMulti( EXPECT_CALL(*gl_, ClearDepth(1.0f)) .Times(1) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DepthMask(1)) - .Times(1) - .RetiresOnSaturation(); + SetupExpectationsForDepthMask(true); } - EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST)) - .Times(1) - .RetiresOnSaturation(); + SetupExpectationsForEnableDisable(GL_SCISSOR_TEST, false); EXPECT_CALL(*gl_, Clear(clear_bits)) .Times(1) .RetiresOnSaturation(); @@ -616,102 +701,167 @@ void GLES2DecoderTestBase::DoDeleteBuffer( EXPECT_CALL(*gl_, DeleteBuffersARB(1, Pointee(service_id))) .Times(1) .RetiresOnSaturation(); - cmds::DeleteBuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - memcpy(shared_memory_address_, &client_id, sizeof(client_id)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); -} - -void GLES2DecoderTestBase::SetupExpectationsForApplyingDirtyState( - bool framebuffer_is_rgb, - bool framebuffer_has_depth, - bool framebuffer_has_stencil, - GLuint color_bits, - bool depth_mask, - bool depth_enabled, - GLuint front_stencil_mask, - GLuint back_stencil_mask, - bool stencil_enabled, - bool cull_face_enabled, - bool scissor_test_enabled, - bool blend_enabled) { - EXPECT_CALL(*gl_, ColorMask( - (color_bits & 0x1000) != 0, - (color_bits & 0x0100) != 0, - (color_bits & 0x0010) != 0, - (color_bits & 0x0001) && !framebuffer_is_rgb)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, DepthMask(depth_mask)) - .Times(1) - .RetiresOnSaturation(); - if (framebuffer_has_depth && depth_enabled) { - EXPECT_CALL(*gl_, Enable(GL_DEPTH_TEST)) - .Times(1) - .RetiresOnSaturation(); - } else { - EXPECT_CALL(*gl_, Disable(GL_DEPTH_TEST)) + GenHelper<cmds::DeleteBuffersImmediate>(client_id); +} + +void GLES2DecoderTestBase::SetupExpectationsForColorMask(bool red, + bool green, + bool blue, + bool alpha) { + if (ignore_cached_state_for_test_ || cached_color_mask_red_ != red || + cached_color_mask_green_ != green || cached_color_mask_blue_ != blue || + cached_color_mask_alpha_ != alpha) { + cached_color_mask_red_ = red; + cached_color_mask_green_ = green; + cached_color_mask_blue_ = blue; + cached_color_mask_alpha_ = alpha; + EXPECT_CALL(*gl_, ColorMask(red, green, blue, alpha)) .Times(1) .RetiresOnSaturation(); } - EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, front_stencil_mask)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, back_stencil_mask)) - .Times(1) - .RetiresOnSaturation(); - if (framebuffer_has_stencil && stencil_enabled) { - EXPECT_CALL(*gl_, Enable(GL_STENCIL_TEST)) - .Times(1) - .RetiresOnSaturation(); - } else { - EXPECT_CALL(*gl_, Disable(GL_STENCIL_TEST)) - .Times(1) - .RetiresOnSaturation(); +} + +void GLES2DecoderTestBase::SetupExpectationsForDepthMask(bool mask) { + if (ignore_cached_state_for_test_ || cached_depth_mask_ != mask) { + cached_depth_mask_ = mask; + EXPECT_CALL(*gl_, DepthMask(mask)).Times(1).RetiresOnSaturation(); } - if (cull_face_enabled) { - EXPECT_CALL(*gl_, Enable(GL_CULL_FACE)) - .Times(1) - .RetiresOnSaturation(); - } else { - EXPECT_CALL(*gl_, Disable(GL_CULL_FACE)) +} + +void GLES2DecoderTestBase::SetupExpectationsForStencilMask(uint32 front_mask, + uint32 back_mask) { + if (ignore_cached_state_for_test_ || + cached_stencil_front_mask_ != front_mask) { + cached_stencil_front_mask_ = front_mask; + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_FRONT, front_mask)) .Times(1) .RetiresOnSaturation(); } - if (scissor_test_enabled) { - EXPECT_CALL(*gl_, Enable(GL_SCISSOR_TEST)) - .Times(1) - .RetiresOnSaturation(); - } else { - EXPECT_CALL(*gl_, Disable(GL_SCISSOR_TEST)) + + if (ignore_cached_state_for_test_ || + cached_stencil_back_mask_ != back_mask) { + cached_stencil_back_mask_ = back_mask; + EXPECT_CALL(*gl_, StencilMaskSeparate(GL_BACK, back_mask)) .Times(1) .RetiresOnSaturation(); } - if (blend_enabled) { - EXPECT_CALL(*gl_, Enable(GL_BLEND)) - .Times(1) - .RetiresOnSaturation(); +} + +void GLES2DecoderTestBase::SetupExpectationsForEnableDisable(GLenum cap, + bool enable) { + switch (cap) { + case GL_BLEND: + if (enable_flags_.cached_blend == enable && + !ignore_cached_state_for_test_) + return; + enable_flags_.cached_blend = enable; + break; + case GL_CULL_FACE: + if (enable_flags_.cached_cull_face == enable && + !ignore_cached_state_for_test_) + return; + enable_flags_.cached_cull_face = enable; + break; + case GL_DEPTH_TEST: + if (enable_flags_.cached_depth_test == enable && + !ignore_cached_state_for_test_) + return; + enable_flags_.cached_depth_test = enable; + break; + case GL_DITHER: + if (enable_flags_.cached_dither == enable && + !ignore_cached_state_for_test_) + return; + enable_flags_.cached_dither = enable; + break; + case GL_POLYGON_OFFSET_FILL: + if (enable_flags_.cached_polygon_offset_fill == enable && + !ignore_cached_state_for_test_) + return; + enable_flags_.cached_polygon_offset_fill = enable; + break; + case GL_SAMPLE_ALPHA_TO_COVERAGE: + if (enable_flags_.cached_sample_alpha_to_coverage == enable && + !ignore_cached_state_for_test_) + return; + enable_flags_.cached_sample_alpha_to_coverage = enable; + break; + case GL_SAMPLE_COVERAGE: + if (enable_flags_.cached_sample_coverage == enable && + !ignore_cached_state_for_test_) + return; + enable_flags_.cached_sample_coverage = enable; + break; + case GL_SCISSOR_TEST: + if (enable_flags_.cached_scissor_test == enable && + !ignore_cached_state_for_test_) + return; + enable_flags_.cached_scissor_test = enable; + break; + case GL_STENCIL_TEST: + if (enable_flags_.cached_stencil_test == enable && + !ignore_cached_state_for_test_) + return; + enable_flags_.cached_stencil_test = enable; + break; + default: + NOTREACHED(); + return; + } + if (enable) { + EXPECT_CALL(*gl_, Enable(cap)).Times(1).RetiresOnSaturation(); } else { - EXPECT_CALL(*gl_, Disable(GL_BLEND)) - .Times(1) - .RetiresOnSaturation(); + EXPECT_CALL(*gl_, Disable(cap)).Times(1).RetiresOnSaturation(); } } +void GLES2DecoderTestBase::SetupExpectationsForApplyingDirtyState( + bool framebuffer_is_rgb, + bool framebuffer_has_depth, + bool framebuffer_has_stencil, + GLuint color_bits, + bool depth_mask, + bool depth_enabled, + GLuint front_stencil_mask, + GLuint back_stencil_mask, + bool stencil_enabled) { + bool color_mask_red = (color_bits & 0x1000) != 0; + bool color_mask_green = (color_bits & 0x0100) != 0; + bool color_mask_blue = (color_bits & 0x0010) != 0; + bool color_mask_alpha = (color_bits & 0x0001) && !framebuffer_is_rgb; + + SetupExpectationsForColorMask( + color_mask_red, color_mask_green, color_mask_blue, color_mask_alpha); + SetupExpectationsForDepthMask(depth_mask); + SetupExpectationsForStencilMask(front_stencil_mask, back_stencil_mask); + SetupExpectationsForEnableDisable(GL_DEPTH_TEST, + framebuffer_has_depth && depth_enabled); + SetupExpectationsForEnableDisable(GL_STENCIL_TEST, + framebuffer_has_stencil && stencil_enabled); +} + void GLES2DecoderTestBase::SetupExpectationsForApplyingDefaultDirtyState() { - SetupExpectationsForApplyingDirtyState( - false, // Framebuffer is RGB - false, // Framebuffer has depth - false, // Framebuffer has stencil - 0x1111, // color bits - true, // depth mask - false, // depth enabled - 0, // front stencil mask - 0, // back stencil mask - false, // stencil enabled - false, // cull_face_enabled - false, // scissor_test_enabled - false); // blend_enabled + SetupExpectationsForApplyingDirtyState(false, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1111, // color bits + true, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled +} + +GLES2DecoderTestBase::EnableFlags::EnableFlags() + : cached_blend(false), + cached_cull_face(false), + cached_depth_test(false), + cached_dither(true), + cached_polygon_offset_fill(false), + cached_sample_alpha_to_coverage(false), + cached_sample_coverage(false), + cached_scissor_test(false), + cached_stencil_test(false) { } void GLES2DecoderTestBase::DoBindFramebuffer( @@ -746,10 +896,7 @@ void GLES2DecoderTestBase::DoDeleteFramebuffer( EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, Pointee(service_id))) .Times(1) .RetiresOnSaturation(); - cmds::DeleteFramebuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - memcpy(shared_memory_address_, &client_id, sizeof(client_id)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + GenHelper<cmds::DeleteFramebuffersImmediate>(client_id); } void GLES2DecoderTestBase::DoBindRenderbuffer( @@ -772,10 +919,7 @@ void GLES2DecoderTestBase::DoDeleteRenderbuffer( EXPECT_CALL(*gl_, DeleteRenderbuffersEXT(1, Pointee(service_id))) .Times(1) .RetiresOnSaturation(); - cmds::DeleteRenderbuffers cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - memcpy(shared_memory_address_, &client_id, sizeof(client_id)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + GenHelper<cmds::DeleteRenderbuffersImmediate>(client_id); } void GLES2DecoderTestBase::DoBindTexture( @@ -797,10 +941,7 @@ void GLES2DecoderTestBase::DoDeleteTexture( EXPECT_CALL(*gl_, DeleteTextures(1, Pointee(service_id))) .Times(1) .RetiresOnSaturation(); - cmds::DeleteTextures cmd; - cmd.Init(1, shared_memory_id_, shared_memory_offset_); - memcpy(shared_memory_address_, &client_id, sizeof(client_id)); - EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + GenHelper<cmds::DeleteTexturesImmediate>(client_id); } void GLES2DecoderTestBase::DoTexImage2D( @@ -819,11 +960,33 @@ void GLES2DecoderTestBase::DoTexImage2D( .WillOnce(Return(GL_NO_ERROR)) .RetiresOnSaturation(); cmds::TexImage2D cmd; - cmd.Init(target, level, internal_format, width, height, border, format, + cmd.Init(target, level, internal_format, width, height, format, type, shared_memory_id, shared_memory_offset); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); } +void GLES2DecoderTestBase::DoTexImage2DConvertInternalFormat( + GLenum target, GLint level, GLenum requested_internal_format, + GLsizei width, GLsizei height, GLint border, + GLenum format, GLenum type, + uint32 shared_memory_id, uint32 shared_memory_offset, + GLenum expected_internal_format) { + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, TexImage2D(target, level, expected_internal_format, + width, height, border, format, type, _)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + cmds::TexImage2D cmd; + cmd.Init(target, level, requested_internal_format, width, height, + format, type, shared_memory_id, shared_memory_offset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + void GLES2DecoderTestBase::DoCompressedTexImage2D( GLenum target, GLint level, GLenum format, GLsizei width, GLsizei height, GLint border, @@ -842,7 +1005,7 @@ void GLES2DecoderTestBase::DoCompressedTexImage2D( bucket->SetSize(size); cmds::CompressedTexImage2DBucket cmd; cmd.Init( - target, level, format, width, height, border, + target, level, format, width, height, bucket_id); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); } @@ -880,7 +1043,7 @@ void GLES2DecoderTestBase::DoFramebufferTexture2D( .WillOnce(Return(error)) .RetiresOnSaturation(); cmds::FramebufferTexture2D cmd; - cmd.Init(target, attachment, textarget, texture_client_id, level); + cmd.Init(target, attachment, textarget, texture_client_id); EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); } @@ -945,6 +1108,12 @@ void GLES2DecoderTestBase::AddExpectationsForDeleteVertexArraysOES(){ } } +void GLES2DecoderTestBase::AddExpectationsForDeleteBoundVertexArraysOES() { + // Expectations are the same as a delete, followed by binding VAO 0. + AddExpectationsForDeleteVertexArraysOES(); + AddExpectationsForBindVertexArrayOES(); +} + void GLES2DecoderTestBase::AddExpectationsForBindVertexArrayOES() { if (group_->feature_info()->feature_flags().native_vertex_array_object) { EXPECT_CALL(*gl_, BindVertexArrayOES(_)) @@ -1255,6 +1424,19 @@ void GLES2DecoderTestBase::SetupShader( EXPECT_EQ(error::kNoError, ExecuteCmd(link_cmd)); } +void GLES2DecoderTestBase::DoEnableDisable(GLenum cap, bool enable) { + SetupExpectationsForEnableDisable(cap, enable); + if (enable) { + cmds::Enable cmd; + cmd.Init(cap); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + } else { + cmds::Disable cmd; + cmd.Init(cap); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + } +} + void GLES2DecoderTestBase::DoEnableVertexAttribArray(GLint index) { EXPECT_CALL(*gl_, EnableVertexAttribArray(index)) .Times(1) @@ -1360,12 +1542,6 @@ void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0WithError( EXPECT_CALL(*gl_, VertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL)) .Times(1) .RetiresOnSaturation(); - EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, 0)) - .Times(1) - .RetiresOnSaturation(); - EXPECT_CALL(*gl_, VertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, NULL)) - .Times(1) - .RetiresOnSaturation(); EXPECT_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, buffer_id)) .Times(1) .RetiresOnSaturation(); @@ -1378,18 +1554,35 @@ void GLES2DecoderTestBase::AddExpectationsForSimulatedAttrib0( num_vertices, buffer_id, GL_NO_ERROR); } +void GLES2DecoderTestBase::SetupMockGLBehaviors() { + ON_CALL(*gl_, BindVertexArrayOES(_)) + .WillByDefault(Invoke( + &gl_states_, + &GLES2DecoderTestBase::MockGLStates::OnBindVertexArrayOES)); + ON_CALL(*gl_, BindBuffer(GL_ARRAY_BUFFER, _)) + .WillByDefault(WithArg<1>(Invoke( + &gl_states_, + &GLES2DecoderTestBase::MockGLStates::OnBindArrayBuffer))); + ON_CALL(*gl_, VertexAttribPointer(_, _, _, _, _, NULL)) + .WillByDefault(InvokeWithoutArgs( + &gl_states_, + &GLES2DecoderTestBase::MockGLStates::OnVertexAttribNullPointer)); +} + GLES2DecoderWithShaderTestBase::MockCommandBufferEngine:: MockCommandBufferEngine() { - data_.reset(new int8[kSharedBufferSize]); + + scoped_ptr<base::SharedMemory> shm(new base::SharedMemory()); + shm->CreateAndMapAnonymous(kSharedBufferSize); + valid_buffer_ = MakeBufferFromSharedMemory(shm.Pass(), kSharedBufferSize); + ClearSharedMemory(); - valid_buffer_.ptr = data_.get(); - valid_buffer_.size = kSharedBufferSize; } GLES2DecoderWithShaderTestBase::MockCommandBufferEngine:: ~MockCommandBufferEngine() {} -gpu::Buffer +scoped_refptr<gpu::Buffer> GLES2DecoderWithShaderTestBase::MockCommandBufferEngine::GetSharedMemoryBuffer( int32 shm_id) { return shm_id == kSharedMemoryId ? valid_buffer_ : invalid_buffer_; diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h index 55436192c06..8456698344e 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h @@ -12,27 +12,29 @@ #include "gpu/command_buffer/service/context_group.h" #include "gpu/command_buffer/service/framebuffer_manager.h" #include "gpu/command_buffer/service/gles2_cmd_decoder.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" #include "gpu/command_buffer/service/program_manager.h" #include "gpu/command_buffer/service/query_manager.h" #include "gpu/command_buffer/service/renderbuffer_manager.h" #include "gpu/command_buffer/service/shader_manager.h" -#include "gpu/command_buffer/service/stream_texture_manager_mock.h" #include "gpu/command_buffer/service/test_helper.h" #include "gpu/command_buffer/service/texture_manager.h" #include "gpu/command_buffer/service/vertex_array_manager.h" #include "testing/gtest/include/gtest/gtest.h" -#include "ui/gl/gl_context_stub.h" +#include "ui/gl/gl_context_stub_with_extensions.h" #include "ui/gl/gl_surface_stub.h" #include "ui/gl/gl_mock.h" +namespace base { class CommandLine; +} namespace gpu { namespace gles2 { class MemoryTracker; -class GLES2DecoderTestBase : public testing::Test { +class GLES2DecoderTestBase : public ::testing::TestWithParam<bool> { public: GLES2DecoderTestBase(); virtual ~GLES2DecoderTestBase(); @@ -140,11 +142,6 @@ class GLES2DecoderTestBase : public testing::Test { return group_->program_manager(); } - ::testing::StrictMock<MockStreamTextureManager>* - stream_texture_manager() const { - return stream_texture_manager_.get(); - } - void DoCreateProgram(GLuint client_id, GLuint service_id); void DoCreateShader(GLenum shader_type, GLuint client_id, GLuint service_id); @@ -154,26 +151,27 @@ class GLES2DecoderTestBase : public testing::Test { memory_tracker_ = memory_tracker; } - void InitDecoder( - const char* extensions, - bool has_alpha, - bool has_depth, - bool has_stencil, - bool request_alpha, - bool request_depth, - bool request_stencil, - bool bind_generates_resource); - - void InitDecoderWithCommandLine( - const char* extensions, - bool has_alpha, - bool has_depth, - bool has_stencil, - bool request_alpha, - bool request_depth, - bool request_stencil, - bool bind_generates_resource, - const CommandLine* command_line); + struct InitState { + InitState(); + + std::string extensions; + std::string gl_version; + bool has_alpha; + bool has_depth; + bool has_stencil; + bool request_alpha; + bool request_depth; + bool request_stencil; + bool bind_generates_resource; + bool lose_context_when_out_of_memory; + bool use_native_vao; // default is true. + }; + + void InitDecoder(const InitState& init); + void InitDecoderWithCommandLine(const InitState& init, + const base::CommandLine* command_line); + + void ResetDecoder(); const ContextGroup& group() const { return *group_.get(); @@ -248,6 +246,12 @@ class GLES2DecoderTestBase : public testing::Test { GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, uint32 shared_memory_id, uint32 shared_memory_offset); + void DoTexImage2DConvertInternalFormat( + GLenum target, GLint level, GLenum requested_internal_format, + GLsizei width, GLsizei height, GLint border, + GLenum format, GLenum type, + uint32 shared_memory_id, uint32 shared_memory_offset, + GLenum expected_internal_format); void DoRenderbufferStorage( GLenum target, GLenum internal_format, GLenum actual_format, GLsizei width, GLsizei height, GLenum error); @@ -266,6 +270,8 @@ class GLES2DecoderTestBase : public testing::Test { GLuint index, GLint size, GLenum type, GLsizei stride, GLuint offset); void DoVertexAttribDivisorANGLE(GLuint index, GLuint divisor); + void DoEnableDisable(GLenum cap, bool enable); + void DoEnableVertexAttribArray(GLint index); void DoBufferData(GLenum target, GLsizei size); @@ -282,12 +288,13 @@ class GLES2DecoderTestBase : public testing::Test { void DeleteIndexBuffer(); - void SetupClearTextureExpections( + void SetupClearTextureExpectations( GLuint service_id, GLuint old_service_id, GLenum bind_target, GLenum target, GLint level, + GLenum internal_format, GLenum format, GLenum type, GLsizei width, @@ -326,6 +333,15 @@ class GLES2DecoderTestBase : public testing::Test { GLclampf restore_depth, bool restore_scissor_test); + void SetupExpectationsForDepthMask(bool mask); + void SetupExpectationsForEnableDisable(GLenum cap, bool enable); + void SetupExpectationsForColorMask(bool red, + bool green, + bool blue, + bool alpha); + void SetupExpectationsForStencilMask(uint32 front_mask, + uint32 back_mask); + void SetupExpectationsForApplyingDirtyState( bool framebuffer_is_rgb, bool framebuffer_has_depth, @@ -335,10 +351,7 @@ class GLES2DecoderTestBase : public testing::Test { bool depth_enabled, GLuint front_stencil_mask, GLuint back_stencil_mask, - bool stencil_enabled, - bool cull_face_enabled, - bool scissor_test_enabled, - bool blend_enabled); + bool stencil_enabled); void SetupExpectationsForApplyingDefaultDirtyState(); @@ -350,6 +363,7 @@ class GLES2DecoderTestBase : public testing::Test { void AddExpectationsForGenVertexArraysOES(); void AddExpectationsForDeleteVertexArraysOES(); + void AddExpectationsForDeleteBoundVertexArraysOES(); void AddExpectationsForBindVertexArrayOES(); void AddExpectationsForRestoreAttribState(GLuint attrib); @@ -481,8 +495,8 @@ class GLES2DecoderTestBase : public testing::Test { // Use StrictMock to make 100% sure we know how GL will be called. scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; scoped_refptr<gfx::GLSurfaceStub> surface_; - scoped_refptr<gfx::GLContextStub> context_; - scoped_ptr<GLES2Decoder> mock_decoder_; + scoped_refptr<gfx::GLContextStubWithExtensions> context_; + scoped_ptr<MockGLES2Decoder> mock_decoder_; scoped_ptr<GLES2Decoder> decoder_; MemoryTracker* memory_tracker_; @@ -505,6 +519,30 @@ class GLES2DecoderTestBase : public testing::Test { int8 immediate_buffer_[256]; + const bool ignore_cached_state_for_test_; + bool cached_color_mask_red_; + bool cached_color_mask_green_; + bool cached_color_mask_blue_; + bool cached_color_mask_alpha_; + bool cached_depth_mask_; + uint32 cached_stencil_front_mask_; + uint32 cached_stencil_back_mask_; + + struct EnableFlags { + EnableFlags(); + bool cached_blend; + bool cached_cull_face; + bool cached_depth_test; + bool cached_dither; + bool cached_polygon_offset_fill; + bool cached_sample_alpha_to_coverage; + bool cached_sample_coverage; + bool cached_scissor_test; + bool cached_stencil_test; + }; + + EnableFlags enable_flags_; + private: class MockCommandBufferEngine : public CommandBufferEngine { public: @@ -512,10 +550,11 @@ class GLES2DecoderTestBase : public testing::Test { virtual ~MockCommandBufferEngine(); - virtual gpu::Buffer GetSharedMemoryBuffer(int32 shm_id) OVERRIDE; + virtual scoped_refptr<gpu::Buffer> GetSharedMemoryBuffer(int32 shm_id) + OVERRIDE; void ClearSharedMemory() { - memset(data_.get(), kInitialMemoryValue, kSharedBufferSize); + memset(valid_buffer_->memory(), kInitialMemoryValue, kSharedBufferSize); } virtual void set_token(int32 token) OVERRIDE; @@ -529,17 +568,51 @@ class GLES2DecoderTestBase : public testing::Test { virtual int32 GetGetOffset() OVERRIDE; private: - scoped_ptr<int8[]> data_; - gpu::Buffer valid_buffer_; - gpu::Buffer invalid_buffer_; + scoped_refptr<gpu::Buffer> valid_buffer_; + scoped_refptr<gpu::Buffer> invalid_buffer_; }; + // MockGLStates is used to track GL states and emulate driver + // behaviors on top of MockGLInterface. + class MockGLStates { + public: + MockGLStates() + : bound_array_buffer_object_(0), + bound_vertex_array_object_(0) { + } + + ~MockGLStates() { + } + + void OnBindArrayBuffer(GLuint id) { + bound_array_buffer_object_ = id; + } + + void OnBindVertexArrayOES(GLuint id) { + bound_vertex_array_object_ = id; + } + + void OnVertexAttribNullPointer() { + // When a vertex array object is bound, some drivers (AMD Linux, + // Qualcomm, etc.) have a bug where it incorrectly generates an + // GL_INVALID_OPERATION on glVertexAttribPointer() if pointer + // is NULL, no buffer is bound on GL_ARRAY_BUFFER. + // Make sure we don't trigger this bug. + if (bound_vertex_array_object_ != 0) + EXPECT_TRUE(bound_array_buffer_object_ != 0); + } + + private: + GLuint bound_array_buffer_object_; + GLuint bound_vertex_array_object_; + }; // class MockGLStates + void AddExpectationsForVertexAttribManager(); + void SetupMockGLBehaviors(); scoped_ptr< ::testing::StrictMock<MockCommandBufferEngine> > engine_; - scoped_ptr< ::testing::StrictMock<MockStreamTextureManager> > - stream_texture_manager_; scoped_refptr<ContextGroup> group_; + MockGLStates gl_states_; }; class GLES2DecoderWithShaderTestBase : public GLES2DecoderTestBase { @@ -554,6 +627,10 @@ class GLES2DecoderWithShaderTestBase : public GLES2DecoderTestBase { }; +// SpecializedSetup specializations that are needed in multiple unittest files. +template <> +void GLES2DecoderTestBase::SpecializedSetup<cmds::LinkProgram, 0>(bool valid); + } // namespace gles2 } // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc new file mode 100644 index 00000000000..49ebfc3f27a --- /dev/null +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_context_state.cc @@ -0,0 +1,428 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" + +#include "base/command_line.h" +#include "base/strings/string_number_conversions.h" +#include "gpu/command_buffer/common/gles2_cmd_format.h" +#include "gpu/command_buffer/common/gles2_cmd_utils.h" +#include "gpu/command_buffer/common/id_allocator.h" +#include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" +#include "gpu/command_buffer/service/cmd_buffer_engine.h" +#include "gpu/command_buffer/service/context_group.h" +#include "gpu/command_buffer/service/context_state.h" +#include "gpu/command_buffer/service/gl_surface_mock.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" + +#include "gpu/command_buffer/service/gpu_switches.h" +#include "gpu/command_buffer/service/image_manager.h" +#include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/mocks.h" +#include "gpu/command_buffer/service/program_manager.h" +#include "gpu/command_buffer/service/test_helper.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_implementation.h" +#include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface_stub.h" + +#if !defined(GL_DEPTH24_STENCIL8) +#define GL_DEPTH24_STENCIL8 0x88F0 +#endif + +using ::gfx::MockGLInterface; +using ::testing::_; +using ::testing::DoAll; +using ::testing::InSequence; +using ::testing::Invoke; +using ::testing::MatcherCast; +using ::testing::Mock; +using ::testing::Pointee; +using ::testing::Return; +using ::testing::SaveArg; +using ::testing::SetArrayArgument; +using ::testing::SetArgumentPointee; +using ::testing::SetArgPointee; +using ::testing::StrEq; +using ::testing::StrictMock; + +namespace gpu { +namespace gles2 { + +using namespace cmds; + +class GLES2DecoderRestoreStateTest : public GLES2DecoderManualInitTest { + public: + GLES2DecoderRestoreStateTest() {} + + protected: + void AddExpectationsForActiveTexture(GLenum unit); + void AddExpectationsForBindTexture(GLenum target, GLuint id); + void InitializeContextState(ContextState* state, + uint32 non_default_unit, + uint32 active_unit); +}; + +INSTANTIATE_TEST_CASE_P(Service, + GLES2DecoderRestoreStateTest, + ::testing::Bool()); + +void GLES2DecoderRestoreStateTest::AddExpectationsForActiveTexture( + GLenum unit) { + EXPECT_CALL(*gl_, ActiveTexture(unit)).Times(1).RetiresOnSaturation(); +} + +void GLES2DecoderRestoreStateTest::AddExpectationsForBindTexture(GLenum target, + GLuint id) { + EXPECT_CALL(*gl_, BindTexture(target, id)).Times(1).RetiresOnSaturation(); +} + +void GLES2DecoderRestoreStateTest::InitializeContextState( + ContextState* state, + uint32 non_default_unit, + uint32 active_unit) { + state->texture_units.resize(group().max_texture_units()); + for (uint32 tt = 0; tt < state->texture_units.size(); ++tt) { + TextureRef* ref_cube_map = + group().texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); + state->texture_units[tt].bound_texture_cube_map = ref_cube_map; + TextureRef* ref_2d = + (tt == non_default_unit) + ? group().texture_manager()->GetTexture(client_texture_id_) + : group().texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D); + state->texture_units[tt].bound_texture_2d = ref_2d; + } + state->active_texture_unit = active_unit; +} + +TEST_P(GLES2DecoderRestoreStateTest, NullPreviousStateBGR) { + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + SetupTexture(); + + InSequence sequence; + // Expect to restore texture bindings for unit GL_TEXTURE0. + AddExpectationsForActiveTexture(GL_TEXTURE0); + AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); + AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, + TestHelper::kServiceDefaultTextureCubemapId); + + // Expect to restore texture bindings for remaining units. + for (uint32 i = 1; i < group().max_texture_units(); ++i) { + AddExpectationsForActiveTexture(GL_TEXTURE0 + i); + AddExpectationsForBindTexture(GL_TEXTURE_2D, + TestHelper::kServiceDefaultTexture2dId); + AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, + TestHelper::kServiceDefaultTextureCubemapId); + } + + // Expect to restore the active texture unit to GL_TEXTURE0. + AddExpectationsForActiveTexture(GL_TEXTURE0); + + GetDecoder()->RestoreAllTextureUnitBindings(NULL); +} + +TEST_P(GLES2DecoderRestoreStateTest, NullPreviousState) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + SetupTexture(); + + InSequence sequence; + // Expect to restore texture bindings for unit GL_TEXTURE0. + AddExpectationsForActiveTexture(GL_TEXTURE0); + AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); + AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0); + + // Expect to restore texture bindings for remaining units. + for (uint32 i = 1; i < group().max_texture_units(); ++i) { + AddExpectationsForActiveTexture(GL_TEXTURE0 + i); + AddExpectationsForBindTexture(GL_TEXTURE_2D, 0); + AddExpectationsForBindTexture(GL_TEXTURE_CUBE_MAP, 0); + } + + // Expect to restore the active texture unit to GL_TEXTURE0. + AddExpectationsForActiveTexture(GL_TEXTURE0); + + GetDecoder()->RestoreAllTextureUnitBindings(NULL); +} + +TEST_P(GLES2DecoderRestoreStateTest, WithPreviousStateBGR) { + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + SetupTexture(); + + // Construct a previous ContextState with all texture bindings + // set to default textures. + ContextState prev_state(NULL, NULL, NULL); + InitializeContextState(&prev_state, std::numeric_limits<uint32>::max(), 0); + + InSequence sequence; + // Expect to restore only GL_TEXTURE_2D binding for GL_TEXTURE0 unit, + // since the rest of the bindings haven't changed between the current + // state and the |prev_state|. + AddExpectationsForActiveTexture(GL_TEXTURE0); + AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); + + // Expect to restore active texture unit to GL_TEXTURE0. + AddExpectationsForActiveTexture(GL_TEXTURE0); + + GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); +} + +TEST_P(GLES2DecoderRestoreStateTest, WithPreviousState) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + SetupTexture(); + + // Construct a previous ContextState with all texture bindings + // set to default textures. + ContextState prev_state(NULL, NULL, NULL); + InitializeContextState(&prev_state, std::numeric_limits<uint32>::max(), 0); + + InSequence sequence; + // Expect to restore only GL_TEXTURE_2D binding for GL_TEXTURE0 unit, + // since the rest of the bindings haven't changed between the current + // state and the |prev_state|. + AddExpectationsForActiveTexture(GL_TEXTURE0); + AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); + + // Expect to restore active texture unit to GL_TEXTURE0. + AddExpectationsForActiveTexture(GL_TEXTURE0); + + GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); +} + +TEST_P(GLES2DecoderRestoreStateTest, ActiveUnit1) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + + // Bind a non-default texture to GL_TEXTURE1 unit. + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1)); + ActiveTexture cmd; + cmd.Init(GL_TEXTURE1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + SetupTexture(); + + // Construct a previous ContextState with all texture bindings + // set to default textures. + ContextState prev_state(NULL, NULL, NULL); + InitializeContextState(&prev_state, std::numeric_limits<uint32>::max(), 0); + + InSequence sequence; + // Expect to restore only GL_TEXTURE_2D binding for GL_TEXTURE1 unit, + // since the rest of the bindings haven't changed between the current + // state and the |prev_state|. + AddExpectationsForActiveTexture(GL_TEXTURE1); + AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); + + // Expect to restore active texture unit to GL_TEXTURE1. + AddExpectationsForActiveTexture(GL_TEXTURE1); + + GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); +} + +TEST_P(GLES2DecoderRestoreStateTest, NonDefaultUnit0BGR) { + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + // Bind a non-default texture to GL_TEXTURE1 unit. + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1)); + SpecializedSetup<ActiveTexture, 0>(true); + ActiveTexture cmd; + cmd.Init(GL_TEXTURE1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + SetupTexture(); + + // Construct a previous ContextState with GL_TEXTURE_2D target in + // GL_TEXTURE0 unit bound to a non-default texture and the rest + // set to default textures. + ContextState prev_state(NULL, NULL, NULL); + InitializeContextState(&prev_state, 0, kServiceTextureId); + + InSequence sequence; + // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE0 unit to + // a default texture. + AddExpectationsForActiveTexture(GL_TEXTURE0); + AddExpectationsForBindTexture(GL_TEXTURE_2D, + TestHelper::kServiceDefaultTexture2dId); + + // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE1 unit to + // non-default. + AddExpectationsForActiveTexture(GL_TEXTURE1); + AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); + + // Expect to restore active texture unit to GL_TEXTURE1. + AddExpectationsForActiveTexture(GL_TEXTURE1); + + GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); +} + +TEST_P(GLES2DecoderRestoreStateTest, NonDefaultUnit1BGR) { + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + // Bind a non-default texture to GL_TEXTURE0 unit. + SetupTexture(); + + // Construct a previous ContextState with GL_TEXTURE_2D target in + // GL_TEXTURE1 unit bound to a non-default texture and the rest + // set to default textures. + ContextState prev_state(NULL, NULL, NULL); + InitializeContextState(&prev_state, 1, kServiceTextureId); + + InSequence sequence; + // Expect to restore GL_TEXTURE_2D binding to the non-default texture + // for GL_TEXTURE0 unit. + AddExpectationsForActiveTexture(GL_TEXTURE0); + AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); + + // Expect to restore GL_TEXTURE_2D binding to the default texture + // for GL_TEXTURE1 unit. + AddExpectationsForActiveTexture(GL_TEXTURE1); + AddExpectationsForBindTexture(GL_TEXTURE_2D, + TestHelper::kServiceDefaultTexture2dId); + + // Expect to restore active texture unit to GL_TEXTURE0. + AddExpectationsForActiveTexture(GL_TEXTURE0); + + GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); +} + +TEST_P(GLES2DecoderRestoreStateTest, DefaultUnit0) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + + // Bind a non-default texture to GL_TEXTURE1 unit. + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1)); + SpecializedSetup<ActiveTexture, 0>(true); + ActiveTexture cmd; + cmd.Init(GL_TEXTURE1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + SetupTexture(); + + // Construct a previous ContextState with GL_TEXTURE_2D target in + // GL_TEXTURE0 unit bound to a non-default texture and the rest + // set to default textures. + ContextState prev_state(NULL, NULL, NULL); + InitializeContextState(&prev_state, 0, kServiceTextureId); + + InSequence sequence; + // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE0 unit to + // the 0 texture. + AddExpectationsForActiveTexture(GL_TEXTURE0); + AddExpectationsForBindTexture(GL_TEXTURE_2D, 0); + + // Expect to restore GL_TEXTURE_2D binding for GL_TEXTURE1 unit to + // non-default. + AddExpectationsForActiveTexture(GL_TEXTURE1); + AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); + + // Expect to restore active texture unit to GL_TEXTURE1. + AddExpectationsForActiveTexture(GL_TEXTURE1); + + GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); +} + +TEST_P(GLES2DecoderRestoreStateTest, DefaultUnit1) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + + // Bind a non-default texture to GL_TEXTURE0 unit. + SetupTexture(); + + // Construct a previous ContextState with GL_TEXTURE_2D target in + // GL_TEXTURE1 unit bound to a non-default texture and the rest + // set to default textures. + ContextState prev_state(NULL, NULL, NULL); + InitializeContextState(&prev_state, 1, kServiceTextureId); + + InSequence sequence; + // Expect to restore GL_TEXTURE_2D binding to the non-default texture + // for GL_TEXTURE0 unit. + AddExpectationsForActiveTexture(GL_TEXTURE0); + AddExpectationsForBindTexture(GL_TEXTURE_2D, kServiceTextureId); + + // Expect to restore GL_TEXTURE_2D binding to the 0 texture + // for GL_TEXTURE1 unit. + AddExpectationsForActiveTexture(GL_TEXTURE1); + AddExpectationsForBindTexture(GL_TEXTURE_2D, 0); + + // Expect to restore active texture unit to GL_TEXTURE0. + AddExpectationsForActiveTexture(GL_TEXTURE0); + + GetDecoder()->RestoreAllTextureUnitBindings(&prev_state); +} + +TEST_P(GLES2DecoderManualInitTest, ContextStateCapabilityCaching) { + struct TestInfo { + GLenum gl_enum; + bool default_state; + bool expect_set; + }; + + // TODO(vmiura): Should autogen this to match build_gles2_cmd_buffer.py. + TestInfo test[] = {{GL_BLEND, false, true}, + {GL_CULL_FACE, false, true}, + {GL_DEPTH_TEST, false, false}, + {GL_DITHER, true, true}, + {GL_POLYGON_OFFSET_FILL, false, true}, + {GL_SAMPLE_ALPHA_TO_COVERAGE, false, true}, + {GL_SAMPLE_COVERAGE, false, true}, + {GL_SCISSOR_TEST, false, true}, + {GL_STENCIL_TEST, false, false}, + {0, false, false}}; + + InitState init; + init.gl_version = "2.1"; + InitDecoder(init); + + for (int i = 0; test[i].gl_enum; i++) { + bool enable_state = test[i].default_state; + + // Test setting default state initially is ignored. + EnableDisableTest(test[i].gl_enum, enable_state, test[i].expect_set); + + // Test new and cached state changes. + for (int n = 0; n < 3; n++) { + enable_state = !enable_state; + EnableDisableTest(test[i].gl_enum, enable_state, test[i].expect_set); + EnableDisableTest(test[i].gl_enum, enable_state, test[i].expect_set); + } + } +} + +// TODO(vmiura): Tests for VAO restore. + +// TODO(vmiura): Tests for ContextState::RestoreAttribute(). + +// TODO(vmiura): Tests for ContextState::RestoreBufferBindings(). + +// TODO(vmiura): Tests for ContextState::RestoreProgramBindings(). + +// TODO(vmiura): Tests for ContextState::RestoreRenderbufferBindings(). + +// TODO(vmiura): Tests for ContextState::RestoreProgramBindings(). + +// TODO(vmiura): Tests for ContextState::RestoreGlobalState(). + +} // namespace gles2 +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc new file mode 100644 index 00000000000..3dfa4758082 --- /dev/null +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_drawing.cc @@ -0,0 +1,2284 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" + +#include "base/command_line.h" +#include "base/strings/string_number_conversions.h" +#include "gpu/command_buffer/common/gles2_cmd_format.h" +#include "gpu/command_buffer/common/gles2_cmd_utils.h" +#include "gpu/command_buffer/common/id_allocator.h" +#include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" +#include "gpu/command_buffer/service/cmd_buffer_engine.h" +#include "gpu/command_buffer/service/context_group.h" +#include "gpu/command_buffer/service/context_state.h" +#include "gpu/command_buffer/service/gl_surface_mock.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" + +#include "gpu/command_buffer/service/gpu_switches.h" +#include "gpu/command_buffer/service/image_manager.h" +#include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/mocks.h" +#include "gpu/command_buffer/service/program_manager.h" +#include "gpu/command_buffer/service/test_helper.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_implementation.h" +#include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface_stub.h" + +#if !defined(GL_DEPTH24_STENCIL8) +#define GL_DEPTH24_STENCIL8 0x88F0 +#endif + +using ::gfx::MockGLInterface; +using ::testing::_; +using ::testing::DoAll; +using ::testing::InSequence; +using ::testing::Invoke; +using ::testing::MatcherCast; +using ::testing::Mock; +using ::testing::Pointee; +using ::testing::Return; +using ::testing::SaveArg; +using ::testing::SetArrayArgument; +using ::testing::SetArgumentPointee; +using ::testing::SetArgPointee; +using ::testing::StrEq; +using ::testing::StrictMock; + +namespace gpu { +namespace gles2 { + +using namespace cmds; + +class GLES2DecoderGeometryInstancingTest : public GLES2DecoderWithShaderTest { + public: + GLES2DecoderGeometryInstancingTest() : GLES2DecoderWithShaderTest() {} + + virtual void SetUp() { + InitState init; + init.extensions = "GL_ANGLE_instanced_arrays"; + init.gl_version = "opengl es 2.0"; + init.has_alpha = true; + init.has_depth = true; + init.request_alpha = true; + init.request_depth = true; + init.bind_generates_resource = true; + InitDecoder(init); + SetupDefaultProgram(); + } +}; + +INSTANTIATE_TEST_CASE_P(Service, + GLES2DecoderGeometryInstancingTest, + ::testing::Bool()); + +void GLES2DecoderManualInitTest::DirtyStateMaskTest(GLuint color_bits, + bool depth_mask, + GLuint front_stencil_mask, + GLuint back_stencil_mask) { + ColorMask color_mask_cmd; + color_mask_cmd.Init((color_bits & 0x1000) != 0, + (color_bits & 0x0100) != 0, + (color_bits & 0x0010) != 0, + (color_bits & 0x0001) != 0); + EXPECT_EQ(error::kNoError, ExecuteCmd(color_mask_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + DepthMask depth_mask_cmd; + depth_mask_cmd.Init(depth_mask); + EXPECT_EQ(error::kNoError, ExecuteCmd(depth_mask_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + StencilMaskSeparate front_stencil_mask_cmd; + front_stencil_mask_cmd.Init(GL_FRONT, front_stencil_mask); + EXPECT_EQ(error::kNoError, ExecuteCmd(front_stencil_mask_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + StencilMaskSeparate back_stencil_mask_cmd; + back_stencil_mask_cmd.Init(GL_BACK, back_stencil_mask); + EXPECT_EQ(error::kNoError, ExecuteCmd(back_stencil_mask_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + SetupExpectationsForApplyingDirtyState( + false, // Framebuffer is RGB + true, // Framebuffer has depth + true, // Framebuffer has stencil + color_bits, // color bits + depth_mask, // depth mask + false, // depth enabled + front_stencil_mask, // front stencil mask + back_stencil_mask, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays draw_cmd; + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +// Test that with an RGB backbuffer if we set the color mask to 1,1,1,1 it is +// set to 1,1,1,0 at Draw time but is 1,1,1,1 at query time. +TEST_P(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMask) { + ColorMask cmd; + cmd.Init(true, true, true, true); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + SetupTexture(); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDirtyState(true, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1110, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays draw_cmd; + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_COLOR_WRITEMASK, result->GetData())) + .Times(0); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_COLOR_WRITEMASK, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ( + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_COLOR_WRITEMASK), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(1, result->GetData()[0]); + EXPECT_EQ(1, result->GetData()[1]); + EXPECT_EQ(1, result->GetData()[2]); + EXPECT_EQ(1, result->GetData()[3]); +} + +// Test that with no depth if we set DepthMask true that it's set to false at +// draw time but querying it returns true. +TEST_P(GLES2DecoderRGBBackbufferTest, RGBBackbufferDepthMask) { + EXPECT_CALL(*gl_, DepthMask(true)).Times(0).RetiresOnSaturation(); + DepthMask cmd; + cmd.Init(true); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + SetupTexture(); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDirtyState(true, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1110, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays draw_cmd; + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_WRITEMASK, result->GetData())) + .Times(0); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_DEPTH_WRITEMASK, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ( + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_WRITEMASK), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(1, result->GetData()[0]); +} + +// Test that with no stencil if we set the stencil mask it's still set to 0 at +// draw time but gets our value if we query. +TEST_P(GLES2DecoderRGBBackbufferTest, RGBBackbufferStencilMask) { + const GLint kMask = 123; + EXPECT_CALL(*gl_, StencilMask(kMask)).Times(0).RetiresOnSaturation(); + StencilMask cmd; + cmd.Init(kMask); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + SetupTexture(); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDirtyState(true, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1110, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays draw_cmd; + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_WRITEMASK, result->GetData())) + .Times(0); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_STENCIL_WRITEMASK, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ( + decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_WRITEMASK), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(kMask, result->GetData()[0]); +} + +// Test that if an FBO is bound we get the correct masks. +TEST_P(GLES2DecoderRGBBackbufferTest, RGBBackbufferColorMaskFBO) { + ColorMask cmd; + cmd.Init(true, true, true, true); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + SetupTexture(); + SetupVertexBuffer(); + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); + DoEnableVertexAttribArray(1); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + DoEnableVertexAttribArray(2); + DoVertexAttribPointer(2, 2, GL_FLOAT, 0, 0); + SetupExpectationsForApplyingDirtyState(true, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1110, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays draw_cmd; + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Check that no extra calls are made on the next draw. + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Setup Frame buffer. + // needs to be 1x1 or else it's not renderable. + const GLsizei kWidth = 1; + const GLsizei kHeight = 1; + const GLenum kFormat = GL_RGB; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + // Pass some data so the texture will be marked as cleared. + DoTexImage2D(GL_TEXTURE_2D, + 0, + kFormat, + kWidth, + kHeight, + 0, + kFormat, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + client_texture_id_, + kServiceTextureId, + 0, + GL_NO_ERROR); + EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) + .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) + .RetiresOnSaturation(); + + // This time state needs to be set. + SetupExpectationsForApplyingDirtyState(false, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1110, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Check that no extra calls are made on the next draw. + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Unbind + DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); + + SetupExpectationsForApplyingDirtyState(true, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1110, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, DepthEnableWithDepth) { + InitState init; + init.gl_version = "3.0"; + init.has_depth = true; + init.request_depth = true; + init.bind_generates_resource = true; + InitDecoder(init); + + Enable cmd; + cmd.Init(GL_DEPTH_TEST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + SetupDefaultProgram(); + SetupTexture(); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDirtyState(true, // Framebuffer is RGB + true, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1110, // color bits + true, // depth mask + true, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays draw_cmd; + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_TEST, _)) + .Times(0) + .RetiresOnSaturation(); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_DEPTH_TEST, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_TEST), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(1, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, DepthEnableWithoutRequestedDepth) { + InitState init; + init.gl_version = "3.0"; + init.has_depth = true; + init.bind_generates_resource = true; + InitDecoder(init); + + Enable cmd; + cmd.Init(GL_DEPTH_TEST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + SetupDefaultProgram(); + SetupTexture(); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDirtyState(true, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1110, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays draw_cmd; + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_TEST, _)) + .Times(0) + .RetiresOnSaturation(); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_DEPTH_TEST, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_TEST), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(1, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, StencilEnableWithStencil) { + InitState init; + init.gl_version = "3.0"; + init.has_stencil = true; + init.request_stencil = true; + init.bind_generates_resource = true; + InitDecoder(init); + + Enable cmd; + cmd.Init(GL_STENCIL_TEST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + SetupDefaultProgram(); + SetupTexture(); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDirtyState(true, // Framebuffer is RGB + false, // Framebuffer has depth + true, // Framebuffer has stencil + 0x1110, // color bits + false, // depth mask + false, // depth enabled + -1, // front stencil mask + -1, // back stencil mask + true); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays draw_cmd; + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, _)) + .Times(0) + .RetiresOnSaturation(); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_STENCIL_TEST, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_TEST), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(1, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, StencilEnableWithoutRequestedStencil) { + InitState init; + init.gl_version = "3.0"; + init.has_stencil = true; + init.bind_generates_resource = true; + InitDecoder(init); + + Enable cmd; + cmd.Init(GL_STENCIL_TEST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + SetupDefaultProgram(); + SetupTexture(); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDirtyState(true, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1110, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays draw_cmd; + draw_cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(draw_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_TEST, _)) + .Times(0) + .RetiresOnSaturation(); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_STENCIL_TEST, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_TEST), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(1, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, CachedColorMask) { + InitState init; + init.gl_version = "3.0"; + init.has_alpha = true; + init.has_depth = true; + init.has_stencil = true; + init.request_alpha = true; + init.request_depth = true; + init.request_stencil = true; + init.bind_generates_resource = true; + InitDecoder(init); + + SetupDefaultProgram(); + SetupAllNeededVertexBuffers(); + SetupTexture(); + + // Test all color_bits combinations twice. + for (int i = 0; i < 32; i++) { + GLuint color_bits = (i & 1 ? 0x0001 : 0x0000) | (i & 2 ? 0x0010 : 0x0000) | + (i & 4 ? 0x0100 : 0x0000) | (i & 8 ? 0x1000 : 0x0000); + + // Toggle depth_test to force ApplyDirtyState each time. + DirtyStateMaskTest(color_bits, false, 0xffffffff, 0xffffffff); + DirtyStateMaskTest(color_bits, true, 0xffffffff, 0xffffffff); + DirtyStateMaskTest(color_bits, false, 0xffffffff, 0xffffffff); + } +} + +TEST_P(GLES2DecoderManualInitTest, CachedDepthMask) { + InitState init; + init.gl_version = "3.0"; + init.has_alpha = true; + init.has_depth = true; + init.has_stencil = true; + init.request_alpha = true; + init.request_depth = true; + init.request_stencil = true; + init.bind_generates_resource = true; + InitDecoder(init); + + SetupDefaultProgram(); + SetupAllNeededVertexBuffers(); + SetupTexture(); + + // Test all depth_mask combinations twice. + for (int i = 0; i < 4; i++) { + bool depth_mask = (i & 1) == 1; + + // Toggle color masks to force ApplyDirtyState each time. + DirtyStateMaskTest(0x1010, depth_mask, 0xffffffff, 0xffffffff); + DirtyStateMaskTest(0x0101, depth_mask, 0xffffffff, 0xffffffff); + DirtyStateMaskTest(0x1010, depth_mask, 0xffffffff, 0xffffffff); + } +} + +TEST_P(GLES2DecoderManualInitTest, CachedStencilMask) { + InitState init; + init.gl_version = "3.0"; + init.has_alpha = true; + init.has_depth = true; + init.has_stencil = true; + init.request_alpha = true; + init.request_depth = true; + init.request_stencil = true; + init.bind_generates_resource = true; + InitDecoder(init); + + SetupDefaultProgram(); + SetupAllNeededVertexBuffers(); + SetupTexture(); + + // Test all stencil_mask combinations twice. + for (int i = 0; i < 4; i++) { + GLuint stencil_mask = (i & 1) ? 0xf0f0f0f0 : 0x0f0f0f0f; + + // Toggle color masks to force ApplyDirtyState each time. + DirtyStateMaskTest(0x1010, true, stencil_mask, 0xffffffff); + DirtyStateMaskTest(0x0101, true, stencil_mask, 0xffffffff); + DirtyStateMaskTest(0x1010, true, stencil_mask, 0xffffffff); + } + + for (int i = 0; i < 4; i++) { + GLuint stencil_mask = (i & 1) ? 0xf0f0f0f0 : 0x0f0f0f0f; + + // Toggle color masks to force ApplyDirtyState each time. + DirtyStateMaskTest(0x1010, true, 0xffffffff, stencil_mask); + DirtyStateMaskTest(0x0101, true, 0xffffffff, stencil_mask); + DirtyStateMaskTest(0x1010, true, 0xffffffff, stencil_mask); + } +} + +TEST_P(GLES2DecoderWithShaderTest, DrawArraysNoAttributesSucceeds) { + SetupTexture(); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDefaultDirtyState(); + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +// Tests when the math overflows (0x40000000 * sizeof GLfloat) +TEST_P(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0OverflowFails) { + const GLsizei kLargeCount = 0x40000000; + SetupTexture(); + EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kLargeCount); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); + EXPECT_FALSE(GetDecoder()->WasContextLost()); +} + +// Tests when the math overflows (0x7FFFFFFF + 1 = 0x8000000 verts) +TEST_P(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0PosToNegFails) { + const GLsizei kLargeCount = 0x7FFFFFFF; + SetupTexture(); + EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kLargeCount); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); + EXPECT_FALSE(GetDecoder()->WasContextLost()); +} + +// Tests when the driver returns an error +TEST_P(GLES2DecoderWithShaderTest, DrawArraysSimulatedAttrib0OOMFails) { + const GLsizei kFakeLargeCount = 0x1234; + SetupTexture(); + AddExpectationsForSimulatedAttrib0WithError( + kFakeLargeCount, 0, GL_OUT_OF_MEMORY); + EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kFakeLargeCount); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); + EXPECT_FALSE(GetDecoder()->WasContextLost()); +} + +// Test that we lose context. +TEST_P(GLES2DecoderManualInitTest, LoseContextWhenOOM) { + InitState init; + init.gl_version = "3.0"; + init.has_alpha = true; + init.has_depth = true; + init.request_alpha = true; + init.request_depth = true; + init.bind_generates_resource = true; + init.lose_context_when_out_of_memory = true; + InitDecoder(init); + SetupDefaultProgram(); + + const GLsizei kFakeLargeCount = 0x1234; + SetupTexture(); + AddExpectationsForSimulatedAttrib0WithError( + kFakeLargeCount, 0, GL_OUT_OF_MEMORY); + EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation(); + // Other contexts in the group should be lost also. + EXPECT_CALL(*mock_decoder_, LoseContext(GL_UNKNOWN_CONTEXT_RESET_ARB)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kFakeLargeCount); + // This context should be lost. + EXPECT_EQ(error::kLostContext, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); + EXPECT_TRUE(decoder_->WasContextLost()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawArraysBadTextureUsesBlack) { + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + // This is an NPOT texture. As the default filtering requires mips + // this should trigger replacing with black textures before rendering. + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + 3, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + { + InSequence sequence; + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL( + *gl_, BindTexture(GL_TEXTURE_2D, TestHelper::kServiceBlackTexture2dId)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)) + .Times(1) + .RetiresOnSaturation(); + } + SetupExpectationsForApplyingDefaultDirtyState(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawArraysMissingAttributesFails) { + DoEnableVertexAttribArray(1); + + EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, + DrawArraysMissingAttributesZeroCountSucceeds) { + DoEnableVertexAttribArray(1); + + EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, 0); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawArraysValidAttributesSucceeds) { + SetupTexture(); + SetupVertexBuffer(); + DoEnableVertexAttribArray(1); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); + SetupExpectationsForApplyingDefaultDirtyState(); + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +// Same as DrawArraysValidAttributesSucceeds, but with workaround +// |init_vertex_attributes|. +TEST_P(GLES2DecoderManualInitTest, InitVertexAttributes) { + CommandLine command_line(0, NULL); + command_line.AppendSwitchASCII( + switches::kGpuDriverBugWorkarounds, + base::IntToString(gpu::INIT_VERTEX_ATTRIBUTES)); + InitState init; + init.gl_version = "3.0"; + init.has_alpha = true; + init.has_depth = true; + init.request_alpha = true; + init.request_depth = true; + init.bind_generates_resource = true; + InitDecoderWithCommandLine(init, &command_line); + SetupDefaultProgram(); + SetupTexture(); + SetupVertexBuffer(); + DoEnableVertexAttribArray(1); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); + SetupExpectationsForApplyingDefaultDirtyState(); + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawArraysDeletedBufferFails) { + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + DeleteVertexBuffer(); + + EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawArraysDeletedProgramSucceeds) { + SetupTexture(); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDefaultDirtyState(); + DoDeleteProgram(client_program_id_, kServiceProgramId); + + EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)).Times(1); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawArraysWithInvalidModeFails) { + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0); + DrawArrays cmd; + cmd.Init(GL_QUADS, 0, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + cmd.Init(GL_POLYGON, 0, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawArraysInvalidCountFails) { + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + // Try start > 0 + EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 1, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Try with count > size + cmd.Init(GL_TRIANGLES, 0, kNumVertices + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Try with attrib offset > 0 + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 4); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Try with size > 2 (ie, vec3 instead of vec2) + DoVertexAttribPointer(1, 3, GL_FLOAT, 0, 0); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Try with stride > 8 (vec2 + vec2 byte) + DoVertexAttribPointer(1, 2, GL_FLOAT, sizeof(GLfloat) * 3, 0); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawArraysInstancedANGLEFails) { + SetupTexture(); + SetupVertexBuffer(); + DoEnableVertexAttribArray(1); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, VertexAttribDivisorANGLEFails) { + SetupTexture(); + SetupVertexBuffer(); + DoEnableVertexAttribArray(1); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(_, _)) + .Times(0) + .RetiresOnSaturation(); + + VertexAttribDivisorANGLE cmd; + cmd.Init(0, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawArraysInstancedANGLENoAttributesFails) { + SetupTexture(); + + EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawArraysInstancedANGLESimulatedAttrib0) { + SetupTexture(); + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); + SetupExpectationsForApplyingDefaultDirtyState(); + + DoVertexAttribDivisorANGLE(0, 1); + EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, 3)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 0)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 1)) + .Times(1) + .RetiresOnSaturation(); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices, 3); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawArraysInstancedANGLEMissingAttributesFails) { + DoEnableVertexAttribArray(1); + + EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)).Times(0); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawArraysInstancedANGLEMissingAttributesZeroCountSucceeds) { + DoEnableVertexAttribArray(1); + + EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)).Times(0); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, 0, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawArraysInstancedANGLEValidAttributesSucceeds) { + SetupTexture(); + SetupVertexBuffer(); + DoEnableVertexAttribArray(1); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + AddExpectationsForSimulatedAttrib0(kNumVertices, kServiceBufferId); + SetupExpectationsForApplyingDefaultDirtyState(); + + EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, 1)) + .Times(1) + .RetiresOnSaturation(); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawArraysInstancedANGLEWithInvalidModeFails) { + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)).Times(0); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_QUADS, 0, 1, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + cmd.Init(GL_POLYGON, 0, 1, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawArraysInstancedANGLEInvalidPrimcountFails) { + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)).Times(0); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, 1, -1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +// Per-instance data is twice as large, but number of instances is half +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawArraysInstancedANGLELargeInstanceSucceeds) { + SetupTexture(); + SetupVertexBuffer(); + SetupExpectationsForApplyingDefaultDirtyState(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); + DoVertexAttribDivisorANGLE(0, 1); + EXPECT_CALL( + *gl_, + DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, kNumVertices / 2)) + .Times(1) + .RetiresOnSaturation(); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices / 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +// Per-instance data is twice as large, but divisor is twice +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawArraysInstancedANGLELargeDivisorSucceeds) { + SetupTexture(); + SetupVertexBuffer(); + SetupExpectationsForApplyingDefaultDirtyState(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); + DoVertexAttribDivisorANGLE(0, 2); + EXPECT_CALL( + *gl_, + DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, DrawArraysInstancedANGLELargeFails) { + SetupTexture(); + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); + DoVertexAttribDivisorANGLE(0, 1); + EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices, kNumVertices + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + cmd.Init(GL_TRIANGLES, 0, kNumVertices + 1, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +// Per-index data is twice as large, but number of indices is half +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawArraysInstancedANGLELargeIndexSucceeds) { + SetupTexture(); + SetupVertexBuffer(); + SetupExpectationsForApplyingDefaultDirtyState(); + DoVertexAttribPointer(1, 4, GL_FLOAT, 0, 0); + + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); + DoVertexAttribDivisorANGLE(0, 1); + EXPECT_CALL( + *gl_, + DrawArraysInstancedANGLE(GL_TRIANGLES, 0, kNumVertices / 2, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices / 2, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawArraysInstancedANGLENoDivisor0Fails) { + SetupTexture(); + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); + DoVertexAttribDivisorANGLE(0, 1); + DoVertexAttribDivisorANGLE(1, 1); + EXPECT_CALL(*gl_, DrawArraysInstancedANGLE(_, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + DrawArraysInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsNoAttributesSucceeds) { + SetupTexture(); + SetupIndexBuffer(); + AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0); + SetupExpectationsForApplyingDefaultDirtyState(); + EXPECT_CALL(*gl_, + DrawElements(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + BufferOffset(kValidIndexRangeStart * 2))) + .Times(1) + .RetiresOnSaturation(); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsMissingAttributesFails) { + SetupIndexBuffer(); + DoEnableVertexAttribArray(1); + + EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, + DrawElementsMissingAttributesZeroCountSucceeds) { + SetupIndexBuffer(); + DoEnableVertexAttribArray(1); + + EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT, kValidIndexRangeStart * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsExtraAttributesFails) { + SetupIndexBuffer(); + DoEnableVertexAttribArray(6); + + EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsValidAttributesSucceeds) { + SetupTexture(); + SetupVertexBuffer(); + SetupIndexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId); + SetupExpectationsForApplyingDefaultDirtyState(); + + EXPECT_CALL(*gl_, + DrawElements(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + BufferOffset(kValidIndexRangeStart * 2))) + .Times(1) + .RetiresOnSaturation(); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsDeletedBufferFails) { + SetupVertexBuffer(); + SetupIndexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + DeleteIndexBuffer(); + + EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsDeletedProgramSucceeds) { + SetupTexture(); + SetupIndexBuffer(); + AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0); + SetupExpectationsForApplyingDefaultDirtyState(); + DoDeleteProgram(client_program_id_, kServiceProgramId); + + EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(1); + EXPECT_CALL(*gl_, DeleteProgram(kServiceProgramId)).Times(1); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsWithInvalidModeFails) { + SetupVertexBuffer(); + SetupIndexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); + DrawElements cmd; + cmd.Init(GL_QUADS, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + cmd.Init(GL_POLYGON, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsInvalidCountFails) { + SetupVertexBuffer(); + SetupIndexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + // Try start > 0 + EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, kNumIndices, GL_UNSIGNED_SHORT, 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Try with count > size + cmd.Init(GL_TRIANGLES, kNumIndices + 1, GL_UNSIGNED_SHORT, 0); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsOutOfRangeIndicesFails) { + SetupVertexBuffer(); + SetupIndexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, + kInvalidIndexRangeCount, + GL_UNSIGNED_SHORT, + kInvalidIndexRangeStart * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsOddOffsetForUint16Fails) { + SetupVertexBuffer(); + SetupIndexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(0); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, kInvalidIndexRangeCount, GL_UNSIGNED_SHORT, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsInstancedANGLEFails) { + SetupTexture(); + SetupVertexBuffer(); + SetupIndexBuffer(); + DoEnableVertexAttribArray(1); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLENoAttributesFails) { + SetupTexture(); + SetupIndexBuffer(); + + EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLESimulatedAttrib0) { + SetupTexture(); + SetupVertexBuffer(); + SetupIndexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId); + SetupExpectationsForApplyingDefaultDirtyState(); + + DoVertexAttribDivisorANGLE(0, 1); + EXPECT_CALL( + *gl_, + DrawElementsInstancedANGLE(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + BufferOffset(kValidIndexRangeStart * 2), + 3)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 0)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, VertexAttribDivisorANGLE(0, 1)) + .Times(1) + .RetiresOnSaturation(); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + 3); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLEMissingAttributesFails) { + SetupIndexBuffer(); + DoEnableVertexAttribArray(1); + + EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)).Times(0); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLEMissingAttributesZeroCountSucceeds) { + SetupIndexBuffer(); + DoEnableVertexAttribArray(1); + + EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)).Times(0); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, 0, GL_UNSIGNED_SHORT, kValidIndexRangeStart * 2, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLEValidAttributesSucceeds) { + SetupIndexBuffer(); + SetupTexture(); + SetupVertexBuffer(); + DoEnableVertexAttribArray(1); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, kServiceBufferId); + SetupExpectationsForApplyingDefaultDirtyState(); + + EXPECT_CALL( + *gl_, + DrawElementsInstancedANGLE(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + BufferOffset(kValidIndexRangeStart * 2), + 1)) + .Times(1) + .RetiresOnSaturation(); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLEWithInvalidModeFails) { + SetupIndexBuffer(); + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)).Times(0); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_QUADS, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + cmd.Init(GL_INVALID_ENUM, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} + +// Per-instance data is twice as large, but number of instances is half +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLELargeInstanceSucceeds) { + SetupTexture(); + SetupIndexBuffer(); + SetupVertexBuffer(); + SetupExpectationsForApplyingDefaultDirtyState(); + // Add offset so we're sure we're accessing data near the end of the buffer. + DoVertexAttribPointer( + 1, + 2, + GL_FLOAT, + 0, + (kNumVertices - kMaxValidIndex - 1) * 2 * sizeof(GLfloat)); + + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); + DoVertexAttribDivisorANGLE(0, 1); + EXPECT_CALL( + *gl_, + DrawElementsInstancedANGLE(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + BufferOffset(kValidIndexRangeStart * 2), + kNumVertices / 2)) + .Times(1) + .RetiresOnSaturation(); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + kNumVertices / 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +// Per-instance data is twice as large, but divisor is twice +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLELargeDivisorSucceeds) { + SetupTexture(); + SetupIndexBuffer(); + SetupVertexBuffer(); + SetupExpectationsForApplyingDefaultDirtyState(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 4, GL_FLOAT, 0, 0); + DoVertexAttribDivisorANGLE(0, 2); + EXPECT_CALL( + *gl_, + DrawElementsInstancedANGLE(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + BufferOffset(kValidIndexRangeStart * 2), + kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLELargeFails) { + SetupTexture(); + SetupIndexBuffer(); + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); + DoVertexAttribDivisorANGLE(0, 1); + EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + kNumVertices + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + cmd.Init(GL_TRIANGLES, + kInvalidIndexRangeCount, + GL_UNSIGNED_SHORT, + kInvalidIndexRangeStart * 2, + kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLEInvalidPrimcountFails) { + SetupTexture(); + SetupIndexBuffer(); + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); + DoVertexAttribDivisorANGLE(0, 1); + EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + -1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +// Per-index data is twice as large, but values of indices are smaller +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLELargeIndexSucceeds) { + SetupTexture(); + SetupIndexBuffer(); + SetupVertexBuffer(); + SetupExpectationsForApplyingDefaultDirtyState(); + DoVertexAttribPointer(1, 4, GL_FLOAT, 0, 0); + + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); + DoVertexAttribDivisorANGLE(0, 1); + EXPECT_CALL( + *gl_, + DrawElementsInstancedANGLE(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + BufferOffset(kValidIndexRangeStart * 2), + kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderGeometryInstancingTest, + DrawElementsInstancedANGLENoDivisor0Fails) { + SetupTexture(); + SetupIndexBuffer(); + SetupVertexBuffer(); + DoVertexAttribPointer(1, 2, GL_FLOAT, 0, 0); + + DoEnableVertexAttribArray(0); + DoVertexAttribPointer(0, 2, GL_FLOAT, 0, 0); + DoVertexAttribDivisorANGLE(0, 1); + DoVertexAttribDivisorANGLE(1, 1); + EXPECT_CALL(*gl_, DrawElementsInstancedANGLE(_, _, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + DrawElementsInstancedANGLE cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2, + kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawArraysClearsAfterTexImage2DNULL) { + SetupAllNeededVertexBuffers(); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + // Create an uncleared texture with 2 levels. + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoTexImage2D( + GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + // Expect 2 levels will be cleared. + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_2D, + GL_TEXTURE_2D, + 0, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + 2, + 2); + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_2D, + GL_TEXTURE_2D, + 1, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + 1, + 1); + SetupExpectationsForApplyingDefaultDirtyState(); + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // But not again + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawElementsClearsAfterTexImage2DNULL) { + SetupAllNeededVertexBuffers(); + SetupIndexBuffer(); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + // Create an uncleared texture with 2 levels. + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoTexImage2D( + GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + // Expect 2 levels will be cleared. + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_2D, + GL_TEXTURE_2D, + 0, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + 2, + 2); + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_2D, + GL_TEXTURE_2D, + 1, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + 1, + 1); + SetupExpectationsForApplyingDefaultDirtyState(); + + EXPECT_CALL(*gl_, + DrawElements(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + BufferOffset(kValidIndexRangeStart * 2))) + .Times(1) + .RetiresOnSaturation(); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // But not again + EXPECT_CALL(*gl_, + DrawElements(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + BufferOffset(kValidIndexRangeStart * 2))) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawClearsAfterTexImage2DNULLInFBO) { + const GLuint kFBOClientTextureId = 4100; + const GLuint kFBOServiceTextureId = 4101; + + SetupAllNeededVertexBuffers(); + // Register a texture id. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) + .RetiresOnSaturation(); + GenHelper<GenTexturesImmediate>(kFBOClientTextureId); + + // Setup "render to" texture. + DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kFBOClientTextureId, + kFBOServiceTextureId, + 0, + GL_NO_ERROR); + + // Setup "render from" texture. + SetupTexture(); + + SetupExpectationsForFramebufferClearing(GL_FRAMEBUFFER, // target + GL_COLOR_BUFFER_BIT, // clear bits + 0, + 0, + 0, + 0, // color + 0, // stencil + 1.0f, // depth + false); // scissor test + + SetupExpectationsForApplyingDirtyState(false, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1111, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // But not again. + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawWitFBOThatCantClearDoesNotDraw) { + const GLuint kFBOClientTextureId = 4100; + const GLuint kFBOServiceTextureId = 4101; + + // Register a texture id. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) + .RetiresOnSaturation(); + GenHelper<GenTexturesImmediate>(kFBOClientTextureId); + + // Setup "render to" texture. + DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kFBOClientTextureId, + kFBOServiceTextureId, + 0, + GL_NO_ERROR); + + // Setup "render from" texture. + SetupTexture(); + + EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) + .WillOnce(Return(GL_FRAMEBUFFER_UNSUPPORTED)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, DrawArrays(_, _, _)).Times(0).RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, DrawClearsAfterRenderbufferStorageInFBO) { + SetupTexture(); + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoRenderbufferStorage( + GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 100, 50, GL_NO_ERROR); + DoFramebufferRenderbuffer(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + client_renderbuffer_id_, + kServiceRenderbufferId, + GL_NO_ERROR); + + SetupExpectationsForFramebufferClearing(GL_FRAMEBUFFER, // target + GL_COLOR_BUFFER_BIT, // clear bits + 0, + 0, + 0, + 0, // color + 0, // stencil + 1.0f, // depth + false); // scissor test + + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDirtyState(false, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1111, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, DrawArraysClearsAfterTexImage2DNULLCubemap) { + InitState init; + init.gl_version = "opengl es 2.0"; + init.has_alpha = true; + init.has_depth = true; + init.request_alpha = true; + init.request_depth = true; + InitDecoder(init); + + static const GLenum faces[] = { + GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, + GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, + GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, + }; + SetupCubemapProgram(); + DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId); + // Fill out all the faces for 2 levels, leave 2 uncleared. + for (int ii = 0; ii < 6; ++ii) { + GLenum face = faces[ii]; + int32 shm_id = + (face == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) ? 0 : kSharedMemoryId; + uint32 shm_offset = + (face == GL_TEXTURE_CUBE_MAP_NEGATIVE_Y) ? 0 : kSharedMemoryOffset; + DoTexImage2D(face, + 0, + GL_RGBA, + 2, + 2, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + shm_id, + shm_offset); + DoTexImage2D(face, + 1, + GL_RGBA, + 1, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + shm_id, + shm_offset); + } + // Expect 2 levels will be cleared. + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_CUBE_MAP, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, + 0, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + 2, + 2); + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_CUBE_MAP, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, + 1, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + 1, + 1); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDefaultDirtyState(); + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, + DrawClearsAfterRenderbuffersWithMultipleAttachments) { + const GLuint kFBOClientTextureId = 4100; + const GLuint kFBOServiceTextureId = 4101; + + // Register a texture id. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) + .RetiresOnSaturation(); + GenHelper<GenTexturesImmediate>(kFBOClientTextureId); + + // Setup "render to" texture. + DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kFBOClientTextureId, + kFBOServiceTextureId, + 0, + GL_NO_ERROR); + + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoRenderbufferStorage(GL_RENDERBUFFER, + GL_DEPTH_COMPONENT16, + GL_DEPTH_COMPONENT, + 1, + 1, + GL_NO_ERROR); + DoFramebufferRenderbuffer(GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, + client_renderbuffer_id_, + kServiceRenderbufferId, + GL_NO_ERROR); + + SetupTexture(); + SetupExpectationsForFramebufferClearing( + GL_FRAMEBUFFER, // target + GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, // clear bits + 0, + 0, + 0, + 0, // color + 0, // stencil + 1.0f, // depth + false); // scissor test + + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDirtyState(false, // Framebuffer is RGB + true, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1111, // color bits + true, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, + DrawingWithFBOTwiceChecksForFBOCompleteOnce) { + const GLuint kFBOClientTextureId = 4100; + const GLuint kFBOServiceTextureId = 4101; + + SetupAllNeededVertexBuffers(); + + // Register a texture id. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) + .RetiresOnSaturation(); + GenHelper<GenTexturesImmediate>(kFBOClientTextureId); + + // Setup "render to" texture that is cleared. + DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + 1, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kFBOClientTextureId, + kFBOServiceTextureId, + 0, + GL_NO_ERROR); + + // Setup "render from" texture. + SetupTexture(); + + // Make sure we check for framebuffer complete. + EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) + .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) + .RetiresOnSaturation(); + + SetupExpectationsForApplyingDirtyState(false, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1111, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // But not again. + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, DrawClearsDepthTexture) { + InitState init; + init.extensions = "GL_ANGLE_depth_texture"; + init.gl_version = "opengl es 2.0"; + init.has_alpha = true; + init.has_depth = true; + init.request_alpha = true; + init.request_depth = true; + init.bind_generates_resource = true; + InitDecoder(init); + + SetupDefaultProgram(); + SetupAllNeededVertexBuffers(); + const GLenum attachment = GL_DEPTH_ATTACHMENT; + const GLenum target = GL_TEXTURE_2D; + const GLint level = 0; + DoBindTexture(target, client_texture_id_, kServiceTextureId); + + // Create a depth texture. + DoTexImage2D(target, + level, + GL_DEPTH_COMPONENT, + 1, + 1, + 0, + GL_DEPTH_COMPONENT, + GL_UNSIGNED_INT, + 0, + 0); + + // Enable GL_SCISSOR_TEST to make sure we disable it in the clear, + // then re-enable it. + DoEnableDisable(GL_SCISSOR_TEST, true); + + EXPECT_CALL(*gl_, GenFramebuffersEXT(1, _)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, _)) + .Times(1) + .RetiresOnSaturation(); + + EXPECT_CALL(*gl_, + FramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, + attachment, + target, + kServiceTextureId, + level)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_DRAW_FRAMEBUFFER_EXT)) + .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) + .RetiresOnSaturation(); + + EXPECT_CALL(*gl_, ClearStencil(0)).Times(1).RetiresOnSaturation(); + SetupExpectationsForStencilMask(-1, -1); + EXPECT_CALL(*gl_, ClearDepth(1.0f)).Times(1).RetiresOnSaturation(); + SetupExpectationsForDepthMask(true); + SetupExpectationsForEnableDisable(GL_SCISSOR_TEST, false); + + EXPECT_CALL(*gl_, Clear(GL_DEPTH_BUFFER_BIT)).Times(1).RetiresOnSaturation(); + + SetupExpectationsForRestoreClearState(0.0f, 0.0f, 0.0f, 0.0f, 0, 1.0f, true); + + EXPECT_CALL(*gl_, DeleteFramebuffersEXT(1, _)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, BindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0)) + .Times(1) + .RetiresOnSaturation(); + + SetupExpectationsForApplyingDefaultDirtyState(); + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +} // namespace gles2 +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc new file mode 100644 index 00000000000..571573add5b --- /dev/null +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_framebuffers.cc @@ -0,0 +1,2331 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" + +#include "base/command_line.h" +#include "base/strings/string_number_conversions.h" +#include "gpu/command_buffer/common/gles2_cmd_format.h" +#include "gpu/command_buffer/common/gles2_cmd_utils.h" +#include "gpu/command_buffer/common/id_allocator.h" +#include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" +#include "gpu/command_buffer/service/cmd_buffer_engine.h" +#include "gpu/command_buffer/service/context_group.h" +#include "gpu/command_buffer/service/context_state.h" +#include "gpu/command_buffer/service/gl_surface_mock.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" + +#include "gpu/command_buffer/service/gpu_switches.h" +#include "gpu/command_buffer/service/image_manager.h" +#include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/mocks.h" +#include "gpu/command_buffer/service/program_manager.h" +#include "gpu/command_buffer/service/test_helper.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_implementation.h" +#include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface_stub.h" + +#if !defined(GL_DEPTH24_STENCIL8) +#define GL_DEPTH24_STENCIL8 0x88F0 +#endif + +using ::gfx::MockGLInterface; +using ::testing::_; +using ::testing::DoAll; +using ::testing::InSequence; +using ::testing::Invoke; +using ::testing::MatcherCast; +using ::testing::Mock; +using ::testing::Pointee; +using ::testing::Return; +using ::testing::SaveArg; +using ::testing::SetArrayArgument; +using ::testing::SetArgumentPointee; +using ::testing::SetArgPointee; +using ::testing::StrEq; +using ::testing::StrictMock; + +namespace gpu { +namespace gles2 { + +using namespace cmds; + +class GLES2DecoderTestWithExtensionsOnGLES2 : public GLES2DecoderTest { + public: + GLES2DecoderTestWithExtensionsOnGLES2() {} + + virtual void SetUp() {} + void Init(const char* extensions) { + InitState init; + init.extensions = extensions; + init.gl_version = "opengl es 2.0"; + init.has_alpha = true; + init.has_depth = true; + init.request_alpha = true; + init.request_depth = true; + InitDecoder(init); + } +}; + +TEST_P(GLES2DecoderTest, CheckFramebufferStatusWithNoBoundTarget) { + EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(_)).Times(0); + CheckFramebufferStatus::Result* result = + static_cast<CheckFramebufferStatus::Result*>(shared_memory_address_); + *result = 0; + CheckFramebufferStatus cmd; + cmd.Init(GL_FRAMEBUFFER, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), *result); +} + +TEST_P(GLES2DecoderWithShaderTest, BindAndDeleteFramebuffer) { + SetupTexture(); + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDefaultDirtyState(); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoDeleteFramebuffer(client_framebuffer_id_, + kServiceFramebufferId, + true, + GL_FRAMEBUFFER, + 0, + true, + GL_FRAMEBUFFER, + 0); + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest, FramebufferRenderbufferWithNoBoundTarget) { + EXPECT_CALL(*gl_, FramebufferRenderbufferEXT(_, _, _, _)).Times(0); + FramebufferRenderbuffer cmd; + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + client_renderbuffer_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderTest, FramebufferTexture2DWithNoBoundTarget) { + EXPECT_CALL(*gl_, FramebufferTexture2DEXT(_, _, _, _, _)).Times(0); + FramebufferTexture2D cmd; + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + client_texture_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithNoBoundTarget) { + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetFramebufferAttachmentParameterivEXT(_, _, _, _)) + .Times(0); + GetFramebufferAttachmentParameteriv cmd; + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithRenderbuffer) { + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + FramebufferRenderbufferEXT(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + kServiceRenderbufferId)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + GetFramebufferAttachmentParameteriv::Result* result = + static_cast<GetFramebufferAttachmentParameteriv::Result*>( + shared_memory_address_); + result->size = 0; + const GLint* result_value = result->GetData(); + FramebufferRenderbuffer fbrb_cmd; + GetFramebufferAttachmentParameteriv cmd; + fbrb_cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + client_renderbuffer_id_); + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(static_cast<GLuint>(*result_value), client_renderbuffer_id_); +} + +TEST_P(GLES2DecoderTest, GetFramebufferAttachmentParameterivWithTexture) { + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + FramebufferTexture2DEXT(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kServiceTextureId, + 0)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + GetFramebufferAttachmentParameteriv::Result* result = + static_cast<GetFramebufferAttachmentParameteriv::Result*>( + shared_memory_address_); + result->SetNumResults(0); + const GLint* result_value = result->GetData(); + FramebufferTexture2D fbtex_cmd; + GetFramebufferAttachmentParameteriv cmd; + fbtex_cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + client_texture_id_); + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(static_cast<GLuint>(*result_value), client_texture_id_); +} + +TEST_P(GLES2DecoderTest, GetRenderbufferParameterivWithNoBoundTarget) { + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetRenderbufferParameterivEXT(_, _, _)).Times(0); + GetRenderbufferParameteriv cmd; + cmd.Init(GL_RENDERBUFFER, + GL_RENDERBUFFER_WIDTH, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderTest, RenderbufferStorageWithNoBoundTarget) { + EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)).Times(0); + RenderbufferStorage cmd; + cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 3, 4); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +namespace { + +// A class to emulate glReadPixels +class ReadPixelsEmulator { + public: + // pack_alignment is the alignment you want ReadPixels to use + // when copying. The actual data passed in pixels should be contiguous. + ReadPixelsEmulator(GLsizei width, + GLsizei height, + GLint bytes_per_pixel, + const void* src_pixels, + const void* expected_pixels, + GLint pack_alignment) + : width_(width), + height_(height), + pack_alignment_(pack_alignment), + bytes_per_pixel_(bytes_per_pixel), + src_pixels_(reinterpret_cast<const int8*>(src_pixels)), + expected_pixels_(reinterpret_cast<const int8*>(expected_pixels)) {} + + void ReadPixels(GLint x, + GLint y, + GLsizei width, + GLsizei height, + GLenum format, + GLenum type, + void* pixels) const { + DCHECK_GE(x, 0); + DCHECK_GE(y, 0); + DCHECK_LE(x + width, width_); + DCHECK_LE(y + height, height_); + for (GLint yy = 0; yy < height; ++yy) { + const int8* src = GetPixelAddress(src_pixels_, x, y + yy); + const void* dst = ComputePackAlignmentAddress(0, yy, width, pixels); + memcpy(const_cast<void*>(dst), src, width * bytes_per_pixel_); + } + } + + bool CompareRowSegment(GLint x, + GLint y, + GLsizei width, + const void* data) const { + DCHECK(x + width <= width_ || width == 0); + return memcmp(data, + GetPixelAddress(expected_pixels_, x, y), + width * bytes_per_pixel_) == 0; + } + + // Helper to compute address of pixel in pack aligned data. + const void* ComputePackAlignmentAddress(GLint x, + GLint y, + GLsizei width, + const void* address) const { + GLint unpadded_row_size = ComputeImageDataSize(width, 1); + GLint two_rows_size = ComputeImageDataSize(width, 2); + GLsizei padded_row_size = two_rows_size - unpadded_row_size; + GLint offset = y * padded_row_size + x * bytes_per_pixel_; + return static_cast<const int8*>(address) + offset; + } + + GLint ComputeImageDataSize(GLint width, GLint height) const { + GLint row_size = width * bytes_per_pixel_; + if (height > 1) { + GLint temp = row_size + pack_alignment_ - 1; + GLint padded_row_size = (temp / pack_alignment_) * pack_alignment_; + GLint size_of_all_but_last_row = (height - 1) * padded_row_size; + return size_of_all_but_last_row + row_size; + } else { + return height * row_size; + } + } + + private: + const int8* GetPixelAddress(const int8* base, GLint x, GLint y) const { + return base + (width_ * y + x) * bytes_per_pixel_; + } + + GLsizei width_; + GLsizei height_; + GLint pack_alignment_; + GLint bytes_per_pixel_; + const int8* src_pixels_; + const int8* expected_pixels_; +}; + +} // anonymous namespace + +void GLES2DecoderTest::CheckReadPixelsOutOfRange(GLint in_read_x, + GLint in_read_y, + GLsizei in_read_width, + GLsizei in_read_height, + bool init) { + const GLsizei kWidth = 5; + const GLsizei kHeight = 3; + const GLint kBytesPerPixel = 3; + const GLint kPackAlignment = 4; + const GLenum kFormat = GL_RGB; + static const int8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = { + 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19, 18, 19, 13, + 29, 28, 23, 22, 21, 22, 21, 29, 28, 23, 22, 21, 22, 21, 28, + 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32, 37, 32, 34, + }; + + ClearSharedMemory(); + + // We need to setup an FBO so we can know the max size that ReadPixels will + // access + if (init) { + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, + 0, + kFormat, + kWidth, + kHeight, + 0, + kFormat, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + client_texture_id_, + kServiceTextureId, + 0, + GL_NO_ERROR); + EXPECT_CALL(*gl_, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) + .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) + .RetiresOnSaturation(); + } + + ReadPixelsEmulator emu( + kWidth, kHeight, kBytesPerPixel, kSrcPixels, kSrcPixels, kPackAlignment); + typedef ReadPixels::Result Result; + Result* result = GetSharedMemoryAs<Result*>(); + uint32 result_shm_id = kSharedMemoryId; + uint32 result_shm_offset = kSharedMemoryOffset; + uint32 pixels_shm_id = kSharedMemoryId; + uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); + void* dest = &result[1]; + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + // ReadPixels will be called for valid size only even though the command + // is requesting a larger size. + GLint read_x = std::max(0, in_read_x); + GLint read_y = std::max(0, in_read_y); + GLint read_end_x = std::max(0, std::min(kWidth, in_read_x + in_read_width)); + GLint read_end_y = std::max(0, std::min(kHeight, in_read_y + in_read_height)); + GLint read_width = read_end_x - read_x; + GLint read_height = read_end_y - read_y; + if (read_width > 0 && read_height > 0) { + for (GLint yy = read_y; yy < read_end_y; ++yy) { + EXPECT_CALL( + *gl_, + ReadPixels(read_x, yy, read_width, 1, kFormat, GL_UNSIGNED_BYTE, _)) + .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels)) + .RetiresOnSaturation(); + } + } + ReadPixels cmd; + cmd.Init(in_read_x, + in_read_y, + in_read_width, + in_read_height, + kFormat, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + + GLint unpadded_row_size = emu.ComputeImageDataSize(in_read_width, 1); + scoped_ptr<int8[]> zero(new int8[unpadded_row_size]); + scoped_ptr<int8[]> pack(new int8[kPackAlignment]); + memset(zero.get(), 0, unpadded_row_size); + memset(pack.get(), kInitialMemoryValue, kPackAlignment); + for (GLint yy = 0; yy < in_read_height; ++yy) { + const int8* row = static_cast<const int8*>( + emu.ComputePackAlignmentAddress(0, yy, in_read_width, dest)); + GLint y = in_read_y + yy; + if (y < 0 || y >= kHeight) { + EXPECT_EQ(0, memcmp(zero.get(), row, unpadded_row_size)); + } else { + // check off left. + GLint num_left_pixels = std::max(-in_read_x, 0); + GLint num_left_bytes = num_left_pixels * kBytesPerPixel; + EXPECT_EQ(0, memcmp(zero.get(), row, num_left_bytes)); + + // check off right. + GLint num_right_pixels = std::max(in_read_x + in_read_width - kWidth, 0); + GLint num_right_bytes = num_right_pixels * kBytesPerPixel; + EXPECT_EQ(0, + memcmp(zero.get(), + row + unpadded_row_size - num_right_bytes, + num_right_bytes)); + + // check middle. + GLint x = std::max(in_read_x, 0); + GLint num_middle_pixels = + std::max(in_read_width - num_left_pixels - num_right_pixels, 0); + EXPECT_TRUE( + emu.CompareRowSegment(x, y, num_middle_pixels, row + num_left_bytes)); + } + + // check padding + if (yy != in_read_height - 1) { + GLint num_padding_bytes = + (kPackAlignment - 1) - (unpadded_row_size % kPackAlignment); + EXPECT_EQ(0, + memcmp(pack.get(), row + unpadded_row_size, num_padding_bytes)); + } + } +} + +TEST_P(GLES2DecoderTest, ReadPixels) { + const GLsizei kWidth = 5; + const GLsizei kHeight = 3; + const GLint kBytesPerPixel = 3; + const GLint kPackAlignment = 4; + static const int8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = { + 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19, 18, 19, 13, + 29, 28, 23, 22, 21, 22, 21, 29, 28, 23, 22, 21, 22, 21, 28, + 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32, 37, 32, 34, + }; + + surface_->SetSize(gfx::Size(INT_MAX, INT_MAX)); + + ReadPixelsEmulator emu( + kWidth, kHeight, kBytesPerPixel, kSrcPixels, kSrcPixels, kPackAlignment); + typedef ReadPixels::Result Result; + Result* result = GetSharedMemoryAs<Result*>(); + uint32 result_shm_id = kSharedMemoryId; + uint32 result_shm_offset = kSharedMemoryOffset; + uint32 pixels_shm_id = kSharedMemoryId; + uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); + void* dest = &result[1]; + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + ReadPixels(0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, _)) + .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels)); + ReadPixels cmd; + cmd.Init(0, + 0, + kWidth, + kHeight, + GL_RGB, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + for (GLint yy = 0; yy < kHeight; ++yy) { + EXPECT_TRUE(emu.CompareRowSegment( + 0, yy, kWidth, emu.ComputePackAlignmentAddress(0, yy, kWidth, dest))); + } +} + +TEST_P(GLES2DecoderRGBBackbufferTest, ReadPixelsNoAlphaBackbuffer) { + const GLsizei kWidth = 3; + const GLsizei kHeight = 3; + const GLint kBytesPerPixel = 4; + const GLint kPackAlignment = 4; + static const uint8 kExpectedPixels[kWidth * kHeight * kBytesPerPixel] = { + 12, 13, 14, 255, 19, 18, 19, 255, 13, 14, 18, 255, + 29, 28, 23, 255, 21, 22, 21, 255, 28, 23, 22, 255, + 31, 34, 39, 255, 32, 37, 32, 255, 34, 39, 37, 255, + }; + static const uint8 kSrcPixels[kWidth * kHeight * kBytesPerPixel] = { + 12, 13, 14, 18, 19, 18, 19, 12, 13, 14, 18, 19, 29, 28, 23, 22, 21, 22, + 21, 29, 28, 23, 22, 21, 31, 34, 39, 37, 32, 37, 32, 31, 34, 39, 37, 32, + }; + + surface_->SetSize(gfx::Size(INT_MAX, INT_MAX)); + + ReadPixelsEmulator emu(kWidth, + kHeight, + kBytesPerPixel, + kSrcPixels, + kExpectedPixels, + kPackAlignment); + typedef ReadPixels::Result Result; + Result* result = GetSharedMemoryAs<Result*>(); + uint32 result_shm_id = kSharedMemoryId; + uint32 result_shm_offset = kSharedMemoryOffset; + uint32 pixels_shm_id = kSharedMemoryId; + uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); + void* dest = &result[1]; + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + ReadPixels(0, 0, kWidth, kHeight, GL_RGBA, GL_UNSIGNED_BYTE, _)) + .WillOnce(Invoke(&emu, &ReadPixelsEmulator::ReadPixels)); + ReadPixels cmd; + cmd.Init(0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + for (GLint yy = 0; yy < kHeight; ++yy) { + EXPECT_TRUE(emu.CompareRowSegment( + 0, yy, kWidth, emu.ComputePackAlignmentAddress(0, yy, kWidth, dest))); + } +} + +TEST_P(GLES2DecoderTest, ReadPixelsOutOfRange) { + static GLint tests[][4] = { + { + -2, -1, 9, 5, + }, // out of range on all sides + { + 2, 1, 9, 5, + }, // out of range on right, bottom + { + -7, -4, 9, 5, + }, // out of range on left, top + { + 0, -5, 9, 5, + }, // completely off top + { + 0, 3, 9, 5, + }, // completely off bottom + { + -9, 0, 9, 5, + }, // completely off left + { + 5, 0, 9, 5, + }, // completely off right + }; + + for (size_t tt = 0; tt < arraysize(tests); ++tt) { + CheckReadPixelsOutOfRange( + tests[tt][0], tests[tt][1], tests[tt][2], tests[tt][3], tt == 0); + } +} + +TEST_P(GLES2DecoderTest, ReadPixelsInvalidArgs) { + typedef ReadPixels::Result Result; + Result* result = GetSharedMemoryAs<Result*>(); + uint32 result_shm_id = kSharedMemoryId; + uint32 result_shm_offset = kSharedMemoryOffset; + uint32 pixels_shm_id = kSharedMemoryId; + uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); + EXPECT_CALL(*gl_, ReadPixels(_, _, _, _, _, _, _)).Times(0); + ReadPixels cmd; + cmd.Init(0, + 0, + -1, + 1, + GL_RGB, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(0, + 0, + 1, + -1, + GL_RGB, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(0, + 0, + 1, + 1, + GL_RGB, + GL_INT, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + cmd.Init(0, + 0, + 1, + 1, + GL_RGB, + GL_UNSIGNED_BYTE, + kInvalidSharedMemoryId, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + false); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(0, + 0, + 1, + 1, + GL_RGB, + GL_UNSIGNED_BYTE, + pixels_shm_id, + kInvalidSharedMemoryOffset, + result_shm_id, + result_shm_offset, + false); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(0, + 0, + 1, + 1, + GL_RGB, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + kInvalidSharedMemoryId, + result_shm_offset, + false); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(0, + 0, + 1, + 1, + GL_RGB, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + kInvalidSharedMemoryOffset, + false); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderManualInitTest, ReadPixelsAsyncError) { + InitState init; + init.extensions = "GL_ARB_sync"; + init.gl_version = "opengl es 3.0"; + init.has_alpha = true; + init.request_alpha = true; + init.bind_generates_resource = true; + InitDecoder(init); + + typedef ReadPixels::Result Result; + Result* result = GetSharedMemoryAs<Result*>(); + + const GLsizei kWidth = 4; + const GLsizei kHeight = 4; + uint32 result_shm_id = kSharedMemoryId; + uint32 result_shm_offset = kSharedMemoryOffset; + uint32 pixels_shm_id = kSharedMemoryId; + uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); + + EXPECT_CALL(*gl_, GetError()) + // first error check must pass to get to the test + .WillOnce(Return(GL_NO_ERROR)) + // second check is after BufferData, simulate fail here + .WillOnce(Return(GL_INVALID_OPERATION)) + // third error check is fall-through call to sync ReadPixels + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + + EXPECT_CALL(*gl_, + ReadPixels(0, 0, kWidth, kHeight, GL_RGB, GL_UNSIGNED_BYTE, _)) + .Times(1); + EXPECT_CALL(*gl_, GenBuffersARB(1, _)).Times(1); + EXPECT_CALL(*gl_, BindBuffer(GL_PIXEL_PACK_BUFFER_ARB, _)).Times(2); + EXPECT_CALL(*gl_, + BufferData(GL_PIXEL_PACK_BUFFER_ARB, _, NULL, GL_STREAM_READ)) + .Times(1); + + ReadPixels cmd; + cmd.Init(0, + 0, + kWidth, + kHeight, + GL_RGB, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + true); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +// Check that if a renderbuffer is attached and GL returns +// GL_FRAMEBUFFER_COMPLETE that the buffer is cleared and state is restored. +TEST_P(GLES2DecoderTest, FramebufferRenderbufferClearColor) { + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + ClearColor color_cmd; + ColorMask color_mask_cmd; + Enable enable_cmd; + FramebufferRenderbuffer cmd; + color_cmd.Init(0.1f, 0.2f, 0.3f, 0.4f); + color_mask_cmd.Init(0, 1, 0, 1); + enable_cmd.Init(GL_SCISSOR_TEST); + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + client_renderbuffer_id_); + InSequence sequence; + EXPECT_CALL(*gl_, ClearColor(0.1f, 0.2f, 0.3f, 0.4f)) + .Times(1) + .RetiresOnSaturation(); + SetupExpectationsForEnableDisable(GL_SCISSOR_TEST, true); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + FramebufferRenderbufferEXT(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + kServiceRenderbufferId)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(color_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(color_mask_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(enable_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderTest, FramebufferRenderbufferClearDepth) { + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + ClearDepthf depth_cmd; + DepthMask depth_mask_cmd; + FramebufferRenderbuffer cmd; + depth_cmd.Init(0.5f); + depth_mask_cmd.Init(false); + cmd.Init(GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, + client_renderbuffer_id_); + InSequence sequence; + EXPECT_CALL(*gl_, ClearDepth(0.5f)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + FramebufferRenderbufferEXT(GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, + kServiceRenderbufferId)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(depth_mask_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderTest, FramebufferRenderbufferClearStencil) { + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + ClearStencil stencil_cmd; + StencilMaskSeparate stencil_mask_separate_cmd; + FramebufferRenderbuffer cmd; + stencil_cmd.Init(123); + stencil_mask_separate_cmd.Init(GL_BACK, 0x1234u); + cmd.Init(GL_FRAMEBUFFER, + GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, + client_renderbuffer_id_); + InSequence sequence; + EXPECT_CALL(*gl_, ClearStencil(123)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + FramebufferRenderbufferEXT(GL_FRAMEBUFFER, + GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, + kServiceRenderbufferId)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_mask_separate_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +#if 0 // Turn this test on once we allow GL_DEPTH_STENCIL_ATTACHMENT +TEST_P(GLES2DecoderTest, FramebufferRenderbufferClearDepthStencil) { + DoBindFramebuffer(GL_FRAMEBUFFER, client_framebuffer_id_, + kServiceFramebufferId); + ClearDepthf depth_cmd; + ClearStencil stencil_cmd; + FramebufferRenderbuffer cmd; + depth_cmd.Init(0.5f); + stencil_cmd.Init(123); + cmd.Init( + GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, + client_renderbuffer_id_); + InSequence sequence; + EXPECT_CALL(*gl_, ClearDepth(0.5f)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ClearStencil(123)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, FramebufferRenderbufferEXT( + GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, + kServiceRenderbufferId)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(depth_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(stencil_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} +#endif + +TEST_P(GLES2DecoderManualInitTest, ActualAlphaMatchesRequestedAlpha) { + InitState init; + init.gl_version = "3.0"; + init.has_alpha = true; + init.request_alpha = true; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _)) + .WillOnce(SetArgumentPointee<1>(8)) + .RetiresOnSaturation(); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(8, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, ActualAlphaDoesNotMatchRequestedAlpha) { + InitState init; + init.gl_version = "3.0"; + init.has_alpha = true; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_ALPHA_BITS, _)) + .WillOnce(SetArgumentPointee<1>(8)) + .RetiresOnSaturation(); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_ALPHA_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_ALPHA_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(0, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, ActualDepthMatchesRequestedDepth) { + InitState init; + init.gl_version = "3.0"; + init.has_depth = true; + init.request_depth = true; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) + .WillOnce(SetArgumentPointee<1>(24)) + .RetiresOnSaturation(); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(24, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, ActualDepthDoesNotMatchRequestedDepth) { + InitState init; + init.gl_version = "3.0"; + init.has_depth = true; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) + .WillOnce(SetArgumentPointee<1>(24)) + .RetiresOnSaturation(); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(0, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, ActualStencilMatchesRequestedStencil) { + InitState init; + init.gl_version = "3.0"; + init.has_stencil = true; + init.request_stencil = true; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) + .WillOnce(SetArgumentPointee<1>(8)) + .RetiresOnSaturation(); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(8, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, ActualStencilDoesNotMatchRequestedStencil) { + InitState init; + init.gl_version = "3.0"; + init.has_stencil = true; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) + .WillOnce(SetArgumentPointee<1>(8)) + .RetiresOnSaturation(); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(0, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, PackedDepthStencilReportsCorrectValues) { + InitState init; + init.extensions = "GL_OES_packed_depth_stencil"; + init.gl_version = "opengl es 2.0"; + init.has_depth = true; + init.has_stencil = true; + init.request_depth = true; + init.request_stencil = true; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) + .WillOnce(SetArgumentPointee<1>(8)) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(8, result->GetData()[0]); + result->size = 0; + cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) + .WillOnce(SetArgumentPointee<1>(24)) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(24, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, PackedDepthStencilNoRequestedStencil) { + InitState init; + init.extensions = "GL_OES_packed_depth_stencil"; + init.gl_version = "opengl es 2.0"; + init.has_depth = true; + init.has_stencil = true; + init.request_depth = true; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) + .WillOnce(SetArgumentPointee<1>(8)) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(0, result->GetData()[0]); + result->size = 0; + cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) + .WillOnce(SetArgumentPointee<1>(24)) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(24, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, PackedDepthStencilRenderbufferDepth) { + InitState init; + init.extensions = "GL_OES_packed_depth_stencil"; + init.gl_version = "opengl es 2.0"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) // for RenderbufferStoage + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) // for FramebufferRenderbuffer + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + + EXPECT_CALL( + *gl_, + RenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50)) + .Times(1) + .RetiresOnSaturation(); + RenderbufferStorage cmd; + cmd.Init(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_CALL(*gl_, + FramebufferRenderbufferEXT(GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, + kServiceRenderbufferId)) + .Times(1) + .RetiresOnSaturation(); + FramebufferRenderbuffer fbrb_cmd; + fbrb_cmd.Init(GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, + client_renderbuffer_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); + + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) + .WillOnce(SetArgumentPointee<1>(8)) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(0, result->GetData()[0]); + result->size = 0; + cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) + .WillOnce(SetArgumentPointee<1>(24)) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(24, result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, PackedDepthStencilRenderbufferStencil) { + InitState init; + init.extensions = "GL_OES_packed_depth_stencil"; + init.gl_version = "opengl es 2.0"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) // for RenderbufferStoage + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) // for FramebufferRenderbuffer + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) // for GetIntegerv + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + + EXPECT_CALL( + *gl_, + RenderbufferStorageEXT(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50)) + .Times(1) + .RetiresOnSaturation(); + RenderbufferStorage cmd; + cmd.Init(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 100, 50); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_CALL(*gl_, + FramebufferRenderbufferEXT(GL_FRAMEBUFFER, + GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, + kServiceRenderbufferId)) + .Times(1) + .RetiresOnSaturation(); + FramebufferRenderbuffer fbrb_cmd; + fbrb_cmd.Init(GL_FRAMEBUFFER, + GL_STENCIL_ATTACHMENT, + GL_RENDERBUFFER, + client_renderbuffer_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); + + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->size = 0; + GetIntegerv cmd2; + cmd2.Init(GL_STENCIL_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_CALL(*gl_, GetIntegerv(GL_STENCIL_BITS, _)) + .WillOnce(SetArgumentPointee<1>(8)) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_STENCIL_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(8, result->GetData()[0]); + result->size = 0; + cmd2.Init(GL_DEPTH_BITS, shared_memory_id_, shared_memory_offset_); + EXPECT_CALL(*gl_, GetIntegerv(GL_DEPTH_BITS, _)) + .WillOnce(SetArgumentPointee<1>(24)) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(GL_DEPTH_BITS), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(0, result->GetData()[0]); +} + +TEST_P(GLES2DecoderTest, FramebufferRenderbufferGLError) { + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_OUT_OF_MEMORY)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + FramebufferRenderbufferEXT(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + kServiceRenderbufferId)) + .Times(1) + .RetiresOnSaturation(); + FramebufferRenderbuffer cmd; + cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + client_renderbuffer_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); +} + +TEST_P(GLES2DecoderTest, FramebufferTexture2DGLError) { + const GLsizei kWidth = 5; + const GLsizei kHeight = 3; + const GLenum kFormat = GL_RGB; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, + 0, + kFormat, + kWidth, + kHeight, + 0, + kFormat, + GL_UNSIGNED_BYTE, + 0, + 0); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_OUT_OF_MEMORY)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + FramebufferTexture2DEXT(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kServiceTextureId, + 0)) + .Times(1) + .RetiresOnSaturation(); + FramebufferTexture2D fbtex_cmd; + fbtex_cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + client_texture_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); +} + +TEST_P(GLES2DecoderTest, RenderbufferStorageGLError) { + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_OUT_OF_MEMORY)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, RenderbufferStorageEXT(GL_RENDERBUFFER, GL_RGBA, 100, 50)) + .Times(1) + .RetiresOnSaturation(); + RenderbufferStorage cmd; + cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 100, 50); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); +} + +TEST_P(GLES2DecoderTest, RenderbufferStorageBadArgs) { + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + EXPECT_CALL(*gl_, RenderbufferStorageEXT(_, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + RenderbufferStorage cmd; + cmd.Init(GL_RENDERBUFFER, GL_RGBA4, TestHelper::kMaxRenderbufferSize + 1, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_RENDERBUFFER, GL_RGBA4, 1, TestHelper::kMaxRenderbufferSize + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, + RenderbufferStorageMultisampleCHROMIUMGLError) { + InitState init; + init.extensions = "GL_EXT_framebuffer_multisample"; + init.gl_version = "2.1"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_OUT_OF_MEMORY)) + .RetiresOnSaturation(); + EXPECT_CALL( + *gl_, + RenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, 1, GL_RGBA, 100, 50)) + .Times(1) + .RetiresOnSaturation(); + RenderbufferStorageMultisampleCHROMIUM cmd; + cmd.Init(GL_RENDERBUFFER, 1, GL_RGBA4, 100, 50); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, + RenderbufferStorageMultisampleCHROMIUMBadArgs) { + InitState init; + init.extensions = "GL_EXT_framebuffer_multisample"; + init.gl_version = "2.1"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + EXPECT_CALL(*gl_, RenderbufferStorageMultisampleEXT(_, _, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + RenderbufferStorageMultisampleCHROMIUM cmd; + cmd.Init(GL_RENDERBUFFER, + TestHelper::kMaxSamples + 1, + GL_RGBA4, + TestHelper::kMaxRenderbufferSize, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_RENDERBUFFER, + TestHelper::kMaxSamples, + GL_RGBA4, + TestHelper::kMaxRenderbufferSize + 1, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_RENDERBUFFER, + TestHelper::kMaxSamples, + GL_RGBA4, + 1, + TestHelper::kMaxRenderbufferSize + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, RenderbufferStorageMultisampleCHROMIUM) { + InitState init; + init.extensions = "GL_EXT_framebuffer_multisample"; + init.gl_version = "2.1"; + InitDecoder(init); + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + InSequence sequence; + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL( + *gl_, + RenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, + TestHelper::kMaxSamples, + GL_RGBA, + TestHelper::kMaxRenderbufferSize, + 1)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + RenderbufferStorageMultisampleCHROMIUM cmd; + cmd.Init(GL_RENDERBUFFER, + TestHelper::kMaxSamples, + GL_RGBA4, + TestHelper::kMaxRenderbufferSize, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, + RenderbufferStorageMultisampleEXTNotSupported) { + InitState init; + init.extensions = "GL_EXT_framebuffer_multisample"; + init.gl_version = "2.1"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + InSequence sequence; + // GL_EXT_framebuffer_multisample uses RenderbufferStorageMultisampleCHROMIUM. + RenderbufferStorageMultisampleEXT cmd; + cmd.Init(GL_RENDERBUFFER, + TestHelper::kMaxSamples, + GL_RGBA4, + TestHelper::kMaxRenderbufferSize, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +class GLES2DecoderMultisampledRenderToTextureTest + : public GLES2DecoderTestWithExtensionsOnGLES2 { + public: + void TestNotCompatibleWithRenderbufferStorageMultisampleCHROMIUM() { + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + RenderbufferStorageMultisampleCHROMIUM cmd; + cmd.Init(GL_RENDERBUFFER, + TestHelper::kMaxSamples, + GL_RGBA4, + TestHelper::kMaxRenderbufferSize, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + } + + void TestRenderbufferStorageMultisampleEXT(const char* extension) { + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + InSequence sequence; + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + if (strstr(extension, "GL_IMG_multisampled_render_to_texture")) { + EXPECT_CALL( + *gl_, + RenderbufferStorageMultisampleIMG(GL_RENDERBUFFER, + TestHelper::kMaxSamples, + GL_RGBA, + TestHelper::kMaxRenderbufferSize, + 1)) + .Times(1) + .RetiresOnSaturation(); + } else { + EXPECT_CALL( + *gl_, + RenderbufferStorageMultisampleEXT(GL_RENDERBUFFER, + TestHelper::kMaxSamples, + GL_RGBA, + TestHelper::kMaxRenderbufferSize, + 1)) + .Times(1) + .RetiresOnSaturation(); + } + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + RenderbufferStorageMultisampleEXT cmd; + cmd.Init(GL_RENDERBUFFER, + TestHelper::kMaxSamples, + GL_RGBA4, + TestHelper::kMaxRenderbufferSize, + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + } +}; + +INSTANTIATE_TEST_CASE_P(Service, + GLES2DecoderMultisampledRenderToTextureTest, + ::testing::Bool()); + +TEST_P(GLES2DecoderMultisampledRenderToTextureTest, + NotCompatibleWithRenderbufferStorageMultisampleCHROMIUM_EXT) { + Init("GL_EXT_multisampled_render_to_texture"); + TestNotCompatibleWithRenderbufferStorageMultisampleCHROMIUM(); +} + +TEST_P(GLES2DecoderMultisampledRenderToTextureTest, + NotCompatibleWithRenderbufferStorageMultisampleCHROMIUM_IMG) { + Init("GL_IMG_multisampled_render_to_texture"); + TestNotCompatibleWithRenderbufferStorageMultisampleCHROMIUM(); +} + +TEST_P(GLES2DecoderMultisampledRenderToTextureTest, + RenderbufferStorageMultisampleEXT_EXT) { + Init("GL_EXT_multisampled_render_to_texture"); + TestRenderbufferStorageMultisampleEXT( + "GL_EXT_multisampled_render_to_texture"); +} + +TEST_P(GLES2DecoderMultisampledRenderToTextureTest, + RenderbufferStorageMultisampleEXT_IMG) { + Init("GL_IMG_multisampled_render_to_texture"); + TestRenderbufferStorageMultisampleEXT( + "GL_IMG_multisampled_render_to_texture"); +} + +TEST_P(GLES2DecoderTest, ReadPixelsGLError) { + GLenum kFormat = GL_RGBA; + GLint x = 0; + GLint y = 0; + GLsizei width = 2; + GLsizei height = 4; + typedef ReadPixels::Result Result; + Result* result = GetSharedMemoryAs<Result*>(); + uint32 result_shm_id = kSharedMemoryId; + uint32 result_shm_offset = kSharedMemoryOffset; + uint32 pixels_shm_id = kSharedMemoryId; + uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_OUT_OF_MEMORY)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + ReadPixels(x, y, width, height, kFormat, GL_UNSIGNED_BYTE, _)) + .Times(1) + .RetiresOnSaturation(); + ReadPixels cmd; + cmd.Init(x, + y, + width, + height, + kFormat, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, UnClearedAttachmentsGetClearedOnClear) { + const GLuint kFBOClientTextureId = 4100; + const GLuint kFBOServiceTextureId = 4101; + + // Register a texture id. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) + .RetiresOnSaturation(); + GenHelper<GenTexturesImmediate>(kFBOClientTextureId); + + // Setup "render to" texture. + DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kFBOClientTextureId, + kFBOServiceTextureId, + 0, + GL_NO_ERROR); + + // Setup "render from" texture. + SetupTexture(); + + SetupExpectationsForFramebufferClearing(GL_FRAMEBUFFER, // target + GL_COLOR_BUFFER_BIT, // clear bits + 0, + 0, + 0, + 0, // color + 0, // stencil + 1.0f, // depth + false); // scissor test + SetupExpectationsForApplyingDirtyState(false, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1111, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, Clear(GL_COLOR_BUFFER_BIT)).Times(1).RetiresOnSaturation(); + + Clear cmd; + cmd.Init(GL_COLOR_BUFFER_BIT); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, UnClearedAttachmentsGetClearedOnReadPixels) { + const GLuint kFBOClientTextureId = 4100; + const GLuint kFBOServiceTextureId = 4101; + + // Register a texture id. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) + .RetiresOnSaturation(); + GenHelper<GenTexturesImmediate>(kFBOClientTextureId); + + // Setup "render to" texture. + DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kFBOClientTextureId, + kFBOServiceTextureId, + 0, + GL_NO_ERROR); + + // Setup "render from" texture. + SetupTexture(); + + SetupExpectationsForFramebufferClearing(GL_FRAMEBUFFER, // target + GL_COLOR_BUFFER_BIT, // clear bits + 0, + 0, + 0, + 0, // color + 0, // stencil + 1.0f, // depth + false); // scissor test + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, _)) + .Times(1) + .RetiresOnSaturation(); + typedef ReadPixels::Result Result; + Result* result = GetSharedMemoryAs<Result*>(); + uint32 result_shm_id = kSharedMemoryId; + uint32 result_shm_offset = kSharedMemoryOffset; + uint32 pixels_shm_id = kSharedMemoryId; + uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(*result); + ReadPixels cmd; + cmd.Init(0, + 0, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, + UnClearedAttachmentsGetClearedOnReadPixelsAndDrawBufferGetsRestored) { + InitState init; + init.extensions = "GL_EXT_framebuffer_multisample"; + init.gl_version = "2.1"; + init.bind_generates_resource = true; + InitDecoder(init); + const GLuint kFBOClientTextureId = 4100; + const GLuint kFBOServiceTextureId = 4101; + + // Register a texture id. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) + .RetiresOnSaturation(); + GenHelper<GenTexturesImmediate>(kFBOClientTextureId); + + // Setup "render from" texture. + DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoBindFramebuffer( + GL_READ_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_READ_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kFBOClientTextureId, + kFBOServiceTextureId, + 0, + GL_NO_ERROR); + + // Enable GL_SCISSOR_TEST to make sure we disable it in the clear, + // then re-enable after. + DoEnableDisable(GL_SCISSOR_TEST, true); + + SetupExpectationsForFramebufferClearingMulti( + kServiceFramebufferId, // read framebuffer service id + 0, // backbuffer service id + GL_READ_FRAMEBUFFER, // target + GL_COLOR_BUFFER_BIT, // clear bits + 0, + 0, + 0, + 0, // color + 0, // stencil + 1.0f, // depth + true); // scissor test + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, _)) + .Times(1) + .RetiresOnSaturation(); + typedef ReadPixels::Result Result; + uint32 result_shm_id = kSharedMemoryId; + uint32 result_shm_offset = kSharedMemoryOffset; + uint32 pixels_shm_id = kSharedMemoryId; + uint32 pixels_shm_offset = kSharedMemoryOffset + sizeof(Result); + ReadPixels cmd; + cmd.Init(0, + 0, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + pixels_shm_id, + pixels_shm_offset, + result_shm_id, + result_shm_offset, + false); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, CopyTexImageWithInCompleteFBOFails) { + GLenum target = GL_TEXTURE_2D; + GLint level = 0; + GLenum internal_format = GL_RGBA; + GLsizei width = 2; + GLsizei height = 4; + SetupTexture(); + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 0, 0, GL_NO_ERROR); + DoFramebufferRenderbuffer(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + client_renderbuffer_id_, + kServiceRenderbufferId, + GL_NO_ERROR); + + EXPECT_CALL(*gl_, CopyTexImage2D(_, _, _, _, _, _, _, _)) + .Times(0) + .RetiresOnSaturation(); + CopyTexImage2D cmd; + cmd.Init(target, level, internal_format, 0, 0, width, height); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_FRAMEBUFFER_OPERATION, GetGLError()); +} + +void GLES2DecoderWithShaderTest::CheckRenderbufferChangesMarkFBOAsNotComplete( + bool bound_fbo) { + FramebufferManager* framebuffer_manager = group().framebuffer_manager(); + SetupTexture(); + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 1, 1, GL_NO_ERROR); + DoFramebufferRenderbuffer(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + client_renderbuffer_id_, + kServiceRenderbufferId, + GL_NO_ERROR); + + if (!bound_fbo) { + DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); + } + + Framebuffer* framebuffer = + framebuffer_manager->GetFramebuffer(client_framebuffer_id_); + ASSERT_TRUE(framebuffer != NULL); + framebuffer_manager->MarkAsComplete(framebuffer); + EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); + + // Test that renderbufferStorage marks fbo as not complete. + DoRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, GL_RGBA, 1, 1, GL_NO_ERROR); + EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); + framebuffer_manager->MarkAsComplete(framebuffer); + EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); + + // Test deleting renderbuffer marks fbo as not complete. + DoDeleteRenderbuffer(client_renderbuffer_id_, kServiceRenderbufferId); + if (bound_fbo) { + EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); + } else { + EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); + } + // Cleanup + DoDeleteFramebuffer(client_framebuffer_id_, + kServiceFramebufferId, + bound_fbo, + GL_FRAMEBUFFER, + 0, + bound_fbo, + GL_FRAMEBUFFER, + 0); +} + +TEST_P(GLES2DecoderWithShaderTest, + RenderbufferChangesMarkFBOAsNotCompleteBoundFBO) { + CheckRenderbufferChangesMarkFBOAsNotComplete(true); +} + +TEST_P(GLES2DecoderWithShaderTest, + RenderbufferChangesMarkFBOAsNotCompleteUnboundFBO) { + CheckRenderbufferChangesMarkFBOAsNotComplete(false); +} + +void GLES2DecoderWithShaderTest::CheckTextureChangesMarkFBOAsNotComplete( + bool bound_fbo) { + FramebufferManager* framebuffer_manager = group().framebuffer_manager(); + const GLuint kFBOClientTextureId = 4100; + const GLuint kFBOServiceTextureId = 4101; + + // Register a texture id. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) + .RetiresOnSaturation(); + GenHelper<GenTexturesImmediate>(kFBOClientTextureId); + + SetupTexture(); + + // Setup "render to" texture. + DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kFBOClientTextureId, + kFBOServiceTextureId, + 0, + GL_NO_ERROR); + + DoBindRenderbuffer( + GL_RENDERBUFFER, client_renderbuffer_id_, kServiceRenderbufferId); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoRenderbufferStorage(GL_RENDERBUFFER, + GL_DEPTH_COMPONENT16, + GL_DEPTH_COMPONENT, + 1, + 1, + GL_NO_ERROR); + DoFramebufferRenderbuffer(GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, + GL_RENDERBUFFER, + client_renderbuffer_id_, + kServiceRenderbufferId, + GL_NO_ERROR); + + if (!bound_fbo) { + DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); + } + + Framebuffer* framebuffer = + framebuffer_manager->GetFramebuffer(client_framebuffer_id_); + ASSERT_TRUE(framebuffer != NULL); + framebuffer_manager->MarkAsComplete(framebuffer); + EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); + + // Test TexImage2D marks fbo as not complete. + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0, 0); + EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); + framebuffer_manager->MarkAsComplete(framebuffer); + EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); + + // Test CopyImage2D marks fbo as not complete. + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, 1, 0)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + CopyTexImage2D cmd; + cmd.Init(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 1, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); + + // Test deleting texture marks fbo as not complete. + framebuffer_manager->MarkAsComplete(framebuffer); + EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); + DoDeleteTexture(kFBOClientTextureId, kFBOServiceTextureId); + + if (bound_fbo) { + EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); + } else { + EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); + } + // Cleanup + DoDeleteFramebuffer(client_framebuffer_id_, + kServiceFramebufferId, + bound_fbo, + GL_FRAMEBUFFER, + 0, + bound_fbo, + GL_FRAMEBUFFER, + 0); +} + +TEST_P(GLES2DecoderWithShaderTest, TextureChangesMarkFBOAsNotCompleteBoundFBO) { + CheckTextureChangesMarkFBOAsNotComplete(true); +} + +TEST_P(GLES2DecoderWithShaderTest, + TextureChangesMarkFBOAsNotCompleteUnboundFBO) { + CheckTextureChangesMarkFBOAsNotComplete(false); +} + +TEST_P(GLES2DecoderTest, CanChangeSurface) { + scoped_refptr<GLSurfaceMock> other_surface(new GLSurfaceMock); + EXPECT_CALL(*other_surface.get(), GetBackingFrameBufferObject()) + .WillOnce(Return(7)); + EXPECT_CALL(*gl_, BindFramebufferEXT(GL_FRAMEBUFFER_EXT, 7)); + + decoder_->SetSurface(other_surface); +} + +TEST_P(GLES2DecoderTest, DrawBuffersEXTImmediateSuccceeds) { + const GLsizei count = 1; + const GLenum bufs[] = {GL_COLOR_ATTACHMENT0}; + DrawBuffersEXTImmediate& cmd = *GetImmediateAs<DrawBuffersEXTImmediate>(); + cmd.Init(count, bufs); + + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + EXPECT_CALL(*gl_, DrawBuffersARB(count, _)).Times(1).RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(bufs))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest, DrawBuffersEXTImmediateFails) { + const GLsizei count = 1; + const GLenum bufs[] = {GL_COLOR_ATTACHMENT1_EXT}; + DrawBuffersEXTImmediate& cmd = *GetImmediateAs<DrawBuffersEXTImmediate>(); + cmd.Init(count, bufs); + + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(bufs))); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderTest, DrawBuffersEXTImmediateBackbuffer) { + const GLsizei count = 1; + const GLenum bufs[] = {GL_BACK}; + DrawBuffersEXTImmediate& cmd = *GetImmediateAs<DrawBuffersEXTImmediate>(); + cmd.Init(count, bufs); + + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(bufs))); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + DoBindFramebuffer(GL_FRAMEBUFFER, 0, 0); // unbind + + EXPECT_CALL(*gl_, DrawBuffersARB(count, _)).Times(1).RetiresOnSaturation(); + + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(bufs))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, InvalidateFramebufferBinding) { + InitState init; + init.gl_version = "opengl es 3.0"; + InitDecoder(init); + + // EXPECT_EQ can't be used to compare function pointers + EXPECT_TRUE( + gfx::MockGLInterface::GetGLProcAddress("glInvalidateFramebuffer") == + gfx::g_driver_gl.fn.glDiscardFramebufferEXTFn); + EXPECT_TRUE( + gfx::MockGLInterface::GetGLProcAddress("glInvalidateFramebuffer") != + gfx::MockGLInterface::GetGLProcAddress("glDiscardFramebufferEXT")); +} + +TEST_P(GLES2DecoderManualInitTest, DiscardFramebufferEXT) { + InitState init; + init.extensions = "GL_EXT_discard_framebuffer"; + init.gl_version = "opengl es 2.0"; + InitDecoder(init); + + // EXPECT_EQ can't be used to compare function pointers + EXPECT_TRUE( + gfx::MockGLInterface::GetGLProcAddress("glDiscardFramebufferEXT") == + gfx::g_driver_gl.fn.glDiscardFramebufferEXTFn); + + const GLenum target = GL_FRAMEBUFFER; + const GLsizei count = 1; + const GLenum attachments[] = {GL_COLOR_ATTACHMENT0}; + + SetupTexture(); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + client_texture_id_, + kServiceTextureId, + 0, + GL_NO_ERROR); + FramebufferManager* framebuffer_manager = group().framebuffer_manager(); + Framebuffer* framebuffer = + framebuffer_manager->GetFramebuffer(client_framebuffer_id_); + EXPECT_TRUE(framebuffer->IsCleared()); + + EXPECT_CALL(*gl_, DiscardFramebufferEXT(target, count, _)) + .Times(1) + .RetiresOnSaturation(); + DiscardFramebufferEXTImmediate& cmd = + *GetImmediateAs<DiscardFramebufferEXTImmediate>(); + cmd.Init(target, count, attachments); + + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(attachments))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_FALSE(framebuffer->IsCleared()); +} + +TEST_P(GLES2DecoderTest, DiscardFramebufferEXTUnsupported) { + const GLenum target = GL_FRAMEBUFFER; + const GLsizei count = 1; + const GLenum attachments[] = {GL_COLOR_EXT}; + DiscardFramebufferEXTImmediate& cmd = + *GetImmediateAs<DiscardFramebufferEXTImmediate>(); + cmd.Init(target, count, attachments); + + // Should not result into a call into GL. + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(attachments))); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, + DiscardedAttachmentsEXTMarksFramebufferIncomplete) { + InitState init; + init.extensions = "GL_EXT_discard_framebuffer"; + init.gl_version = "opengl es 2.0"; + init.has_alpha = true; + init.bind_generates_resource = true; + InitDecoder(init); + + const GLuint kFBOClientTextureId = 4100; + const GLuint kFBOServiceTextureId = 4101; + + // Register a texture id. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) + .RetiresOnSaturation(); + GenHelper<GenTexturesImmediate>(kFBOClientTextureId); + + // Setup "render to" texture. + DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kFBOClientTextureId, + kFBOServiceTextureId, + 0, + GL_NO_ERROR); + + // Setup "render from" texture. + SetupTexture(); + + SetupExpectationsForFramebufferClearing(GL_FRAMEBUFFER, // target + GL_COLOR_BUFFER_BIT, // clear bits + 0, + 0, + 0, + 0, // color + 0, // stencil + 1.0f, // depth + false); // scissor test + SetupExpectationsForApplyingDirtyState(false, // Framebuffer is RGB + false, // Framebuffer has depth + false, // Framebuffer has stencil + 0x1111, // color bits + false, // depth mask + false, // depth enabled + 0, // front stencil mask + 0, // back stencil mask + false); // stencil enabled + + EXPECT_CALL(*gl_, Clear(GL_COLOR_BUFFER_BIT)).Times(1).RetiresOnSaturation(); + + Clear clear_cmd; + clear_cmd.Init(GL_COLOR_BUFFER_BIT); + EXPECT_EQ(error::kNoError, ExecuteCmd(clear_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Check that framebuffer is cleared and complete. + FramebufferManager* framebuffer_manager = group().framebuffer_manager(); + Framebuffer* framebuffer = + framebuffer_manager->GetFramebuffer(client_framebuffer_id_); + EXPECT_TRUE(framebuffer->IsCleared()); + EXPECT_TRUE(framebuffer_manager->IsComplete(framebuffer)); + + // Check that Discard GL_COLOR_ATTACHMENT0, sets the attachment as uncleared + // and the framebuffer as incomplete. + EXPECT_TRUE( + gfx::MockGLInterface::GetGLProcAddress("glDiscardFramebufferEXT") == + gfx::g_driver_gl.fn.glDiscardFramebufferEXTFn); + + const GLenum target = GL_FRAMEBUFFER; + const GLsizei count = 1; + const GLenum attachments[] = {GL_COLOR_ATTACHMENT0}; + + DiscardFramebufferEXTImmediate& discard_cmd = + *GetImmediateAs<DiscardFramebufferEXTImmediate>(); + discard_cmd.Init(target, count, attachments); + + EXPECT_CALL(*gl_, DiscardFramebufferEXT(target, count, _)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(discard_cmd, sizeof(attachments))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_FALSE(framebuffer->IsCleared()); + EXPECT_FALSE(framebuffer_manager->IsComplete(framebuffer)); +} + +TEST_P(GLES2DecoderManualInitTest, ReadFormatExtension) { + InitState init; + init.extensions = "GL_OES_read_format"; + init.gl_version = "2.1"; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()).Times(6).RetiresOnSaturation(); + + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + GetIntegerv cmd; + const GLuint kFBOClientTextureId = 4100; + const GLuint kFBOServiceTextureId = 4101; + + // Register a texture id. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) + .RetiresOnSaturation(); + GenHelper<GenTexturesImmediate>(kFBOClientTextureId); + + // Setup "render to" texture. + DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kFBOClientTextureId, + kFBOServiceTextureId, + 0, + GL_NO_ERROR); + + result->size = 0; + EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(1).RetiresOnSaturation(); + cmd.Init(GL_IMPLEMENTATION_COLOR_READ_FORMAT, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(1, result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + result->size = 0; + EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(1).RetiresOnSaturation(); + cmd.Init(GL_IMPLEMENTATION_COLOR_READ_TYPE, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(1, result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, NoReadFormatExtension) { + InitState init; + init.gl_version = "2.1"; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + GetIntegerv cmd; + const GLuint kFBOClientTextureId = 4100; + const GLuint kFBOServiceTextureId = 4101; + + // Register a texture id. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kFBOServiceTextureId)) + .RetiresOnSaturation(); + GenHelper<GenTexturesImmediate>(kFBOClientTextureId); + + // Setup "render to" texture. + DoBindTexture(GL_TEXTURE_2D, kFBOClientTextureId, kFBOServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + DoFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kFBOClientTextureId, + kFBOServiceTextureId, + 0, + GL_NO_ERROR); + + result->size = 0; + EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(0).RetiresOnSaturation(); + cmd.Init(GL_IMPLEMENTATION_COLOR_READ_FORMAT, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(1, result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + result->size = 0; + EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(0).RetiresOnSaturation(); + cmd.Init(GL_IMPLEMENTATION_COLOR_READ_TYPE, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(1, result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +// TODO(gman): PixelStorei + +// TODO(gman): SwapBuffers + +} // namespace gles2 +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc new file mode 100644 index 00000000000..ce123827fed --- /dev/null +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_programs.cc @@ -0,0 +1,1046 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" + +#include "base/command_line.h" +#include "base/strings/string_number_conversions.h" +#include "gpu/command_buffer/common/gles2_cmd_format.h" +#include "gpu/command_buffer/common/gles2_cmd_utils.h" +#include "gpu/command_buffer/common/id_allocator.h" +#include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" +#include "gpu/command_buffer/service/cmd_buffer_engine.h" +#include "gpu/command_buffer/service/context_group.h" +#include "gpu/command_buffer/service/context_state.h" +#include "gpu/command_buffer/service/gl_surface_mock.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" + +#include "gpu/command_buffer/service/gpu_switches.h" +#include "gpu/command_buffer/service/image_manager.h" +#include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/mocks.h" +#include "gpu/command_buffer/service/program_manager.h" +#include "gpu/command_buffer/service/test_helper.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_implementation.h" +#include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface_stub.h" + +#if !defined(GL_DEPTH24_STENCIL8) +#define GL_DEPTH24_STENCIL8 0x88F0 +#endif + +using ::gfx::MockGLInterface; +using ::testing::_; +using ::testing::DoAll; +using ::testing::InSequence; +using ::testing::Invoke; +using ::testing::MatcherCast; +using ::testing::Mock; +using ::testing::Pointee; +using ::testing::Return; +using ::testing::SaveArg; +using ::testing::SetArrayArgument; +using ::testing::SetArgumentPointee; +using ::testing::SetArgPointee; +using ::testing::StrEq; +using ::testing::StrictMock; + +namespace gpu { +namespace gles2 { + +using namespace cmds; + +TEST_P(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMValidArgs) { + const uint32 kBucketId = 123; + GetProgramInfoCHROMIUM cmd; + cmd.Init(client_program_id_, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); + EXPECT_GT(bucket->size(), 0u); +} + +TEST_P(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMInvalidArgs) { + const uint32 kBucketId = 123; + CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); + EXPECT_TRUE(bucket == NULL); + GetProgramInfoCHROMIUM cmd; + cmd.Init(kInvalidClientId, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + bucket = decoder_->GetBucket(kBucketId); + ASSERT_TRUE(bucket != NULL); + EXPECT_EQ(sizeof(ProgramInfoHeader), bucket->size()); + ProgramInfoHeader* info = + bucket->GetDataAs<ProgramInfoHeader*>(0, sizeof(ProgramInfoHeader)); + ASSERT_TRUE(info != 0); + EXPECT_EQ(0u, info->link_status); + EXPECT_EQ(0u, info->num_attribs); + EXPECT_EQ(0u, info->num_uniforms); +} + +TEST_P(GLES2DecoderWithShaderTest, GetUniformivSucceeds) { + GetUniformiv::Result* result = + static_cast<GetUniformiv::Result*>(shared_memory_address_); + result->size = 0; + GetUniformiv cmd; + cmd.Init(client_program_id_, + kUniform2FakeLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, GetUniformiv(kServiceProgramId, kUniform2RealLocation, _)) + .Times(1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), + result->size); +} + +TEST_P(GLES2DecoderWithShaderTest, GetUniformivArrayElementSucceeds) { + GetUniformiv::Result* result = + static_cast<GetUniformiv::Result*>(shared_memory_address_); + result->size = 0; + GetUniformiv cmd; + cmd.Init(client_program_id_, + kUniform2ElementFakeLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, + GetUniformiv(kServiceProgramId, kUniform2ElementRealLocation, _)) + .Times(1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), + result->size); +} + +TEST_P(GLES2DecoderWithShaderTest, GetUniformivBadProgramFails) { + GetUniformiv::Result* result = + static_cast<GetUniformiv::Result*>(shared_memory_address_); + result->size = 0; + GetUniformiv cmd; + // non-existant program + cmd.Init(kInvalidClientId, + kUniform2FakeLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, GetUniformiv(_, _, _)).Times(0); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0U, result->size); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +// Valid id that is not a program. The GL spec requires a different error for +// this case. +#if GLES2_TEST_SHADER_VS_PROGRAM_IDS + result->size = kInitialResult; + cmd.Init(client_shader_id_, + kUniform2FakeLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0U, result->size); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS + // Unlinked program + EXPECT_CALL(*gl_, CreateProgram()) + .Times(1) + .WillOnce(Return(kNewServiceId)) + .RetiresOnSaturation(); + CreateProgram cmd2; + cmd2.Init(kNewClientId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + result->size = kInitialResult; + cmd.Init(kNewClientId, + kUniform2FakeLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0U, result->size); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetUniformivBadLocationFails) { + GetUniformiv::Result* result = + static_cast<GetUniformiv::Result*>(shared_memory_address_); + result->size = 0; + GetUniformiv cmd; + // invalid location + cmd.Init(client_program_id_, + kInvalidUniformLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, GetUniformiv(_, _, _)).Times(0); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0U, result->size); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetUniformivBadSharedMemoryFails) { + GetUniformiv cmd; + cmd.Init(client_program_id_, + kUniform2FakeLocation, + kInvalidSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, GetUniformiv(_, _, _)).Times(0); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(client_program_id_, + kUniform2FakeLocation, + kSharedMemoryId, + kInvalidSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +}; + +TEST_P(GLES2DecoderWithShaderTest, GetUniformfvSucceeds) { + GetUniformfv::Result* result = + static_cast<GetUniformfv::Result*>(shared_memory_address_); + result->size = 0; + GetUniformfv cmd; + cmd.Init(client_program_id_, + kUniform2FakeLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, GetUniformfv(kServiceProgramId, kUniform2RealLocation, _)) + .Times(1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), + result->size); +} + +TEST_P(GLES2DecoderWithShaderTest, GetUniformfvArrayElementSucceeds) { + GetUniformfv::Result* result = + static_cast<GetUniformfv::Result*>(shared_memory_address_); + result->size = 0; + GetUniformfv cmd; + cmd.Init(client_program_id_, + kUniform2ElementFakeLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, + GetUniformfv(kServiceProgramId, kUniform2ElementRealLocation, _)) + .Times(1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GLES2Util::GetGLDataTypeSizeForUniforms(kUniform2Type), + result->size); +} + +TEST_P(GLES2DecoderWithShaderTest, GetUniformfvBadProgramFails) { + GetUniformfv::Result* result = + static_cast<GetUniformfv::Result*>(shared_memory_address_); + result->size = 0; + GetUniformfv cmd; + // non-existant program + cmd.Init(kInvalidClientId, + kUniform2FakeLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, GetUniformfv(_, _, _)).Times(0); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0U, result->size); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +// Valid id that is not a program. The GL spec requires a different error for +// this case. +#if GLES2_TEST_SHADER_VS_PROGRAM_IDS + result->size = kInitialResult; + cmd.Init(client_shader_id_, + kUniform2FakeLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0U, result->size); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS + // Unlinked program + EXPECT_CALL(*gl_, CreateProgram()) + .Times(1) + .WillOnce(Return(kNewServiceId)) + .RetiresOnSaturation(); + CreateProgram cmd2; + cmd2.Init(kNewClientId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + result->size = kInitialResult; + cmd.Init(kNewClientId, + kUniform2FakeLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0U, result->size); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetUniformfvBadLocationFails) { + GetUniformfv::Result* result = + static_cast<GetUniformfv::Result*>(shared_memory_address_); + result->size = 0; + GetUniformfv cmd; + // invalid location + cmd.Init(client_program_id_, + kInvalidUniformLocation, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, GetUniformfv(_, _, _)).Times(0); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0U, result->size); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetUniformfvBadSharedMemoryFails) { + GetUniformfv cmd; + cmd.Init(client_program_id_, + kUniform2FakeLocation, + kInvalidSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, GetUniformfv(_, _, _)).Times(0); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(client_program_id_, + kUniform2FakeLocation, + kSharedMemoryId, + kInvalidSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +}; + +TEST_P(GLES2DecoderWithShaderTest, GetAttachedShadersSucceeds) { + GetAttachedShaders cmd; + typedef GetAttachedShaders::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->size = 0; + EXPECT_CALL(*gl_, GetAttachedShaders(kServiceProgramId, 1, _, _)).WillOnce( + DoAll(SetArgumentPointee<2>(1), SetArgumentPointee<3>(kServiceShaderId))); + cmd.Init(client_program_id_, + shared_memory_id_, + shared_memory_offset_, + Result::ComputeSize(1)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(1, result->GetNumResults()); + EXPECT_EQ(client_shader_id_, result->GetData()[0]); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetAttachedShadersResultNotInitFail) { + GetAttachedShaders cmd; + typedef GetAttachedShaders::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->size = 1; + EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)).Times(0); + cmd.Init(client_program_id_, + shared_memory_id_, + shared_memory_offset_, + Result::ComputeSize(1)); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, GetAttachedShadersBadProgramFails) { + GetAttachedShaders cmd; + typedef GetAttachedShaders::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->size = 0; + EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)).Times(0); + cmd.Init(kInvalidClientId, + shared_memory_id_, + shared_memory_offset_, + Result::ComputeSize(1)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0U, result->size); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetAttachedShadersBadSharedMemoryFails) { + GetAttachedShaders cmd; + typedef GetAttachedShaders::Result Result; + cmd.Init(client_program_id_, + kInvalidSharedMemoryId, + shared_memory_offset_, + Result::ComputeSize(1)); + EXPECT_CALL(*gl_, GetAttachedShaders(_, _, _, _)).Times(0); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(client_program_id_, + shared_memory_id_, + kInvalidSharedMemoryOffset, + Result::ComputeSize(1)); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatSucceeds) { + ScopedGLImplementationSetter gl_impl(::gfx::kGLImplementationEGLGLES2); + GetShaderPrecisionFormat cmd; + typedef GetShaderPrecisionFormat::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->success = 0; + const GLint range[2] = {62, 62}; + const GLint precision = 16; + EXPECT_CALL(*gl_, GetShaderPrecisionFormat(_, _, _, _)) + .WillOnce(DoAll(SetArrayArgument<2>(range, range + 2), + SetArgumentPointee<3>(precision))) + .RetiresOnSaturation(); + cmd.Init(GL_VERTEX_SHADER, + GL_HIGH_FLOAT, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_NE(0, result->success); + EXPECT_EQ(range[0], result->min_range); + EXPECT_EQ(range[1], result->max_range); + EXPECT_EQ(precision, result->precision); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatResultNotInitFails) { + GetShaderPrecisionFormat cmd; + typedef GetShaderPrecisionFormat::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->success = 1; + // NOTE: GL might not be called. There is no Desktop OpenGL equivalent + cmd.Init(GL_VERTEX_SHADER, + GL_HIGH_FLOAT, + shared_memory_id_, + shared_memory_offset_); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, GetShaderPrecisionFormatBadArgsFails) { + typedef GetShaderPrecisionFormat::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->success = 0; + GetShaderPrecisionFormat cmd; + cmd.Init( + GL_TEXTURE_2D, GL_HIGH_FLOAT, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + result->success = 0; + cmd.Init(GL_VERTEX_SHADER, + GL_TEXTURE_2D, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, + GetShaderPrecisionFormatBadSharedMemoryFails) { + GetShaderPrecisionFormat cmd; + cmd.Init(GL_VERTEX_SHADER, + GL_HIGH_FLOAT, + kInvalidSharedMemoryId, + shared_memory_offset_); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(GL_VERTEX_SHADER, + GL_TEXTURE_2D, + shared_memory_id_, + kInvalidSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformSucceeds) { + const GLuint kUniformIndex = 1; + const uint32 kBucketId = 123; + GetActiveUniform cmd; + typedef GetActiveUniform::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->success = 0; + cmd.Init(client_program_id_, + kUniformIndex, + kBucketId, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_NE(0, result->success); + EXPECT_EQ(kUniform2Size, result->size); + EXPECT_EQ(kUniform2Type, result->type); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); + ASSERT_TRUE(bucket != NULL); + EXPECT_EQ( + 0, + memcmp( + bucket->GetData(0, bucket->size()), kUniform2Name, bucket->size())); +} + +TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformResultNotInitFails) { + const GLuint kUniformIndex = 1; + const uint32 kBucketId = 123; + GetActiveUniform cmd; + typedef GetActiveUniform::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->success = 1; + cmd.Init(client_program_id_, + kUniformIndex, + kBucketId, + shared_memory_id_, + shared_memory_offset_); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBadProgramFails) { + const GLuint kUniformIndex = 1; + const uint32 kBucketId = 123; + GetActiveUniform cmd; + typedef GetActiveUniform::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->success = 0; + cmd.Init(kInvalidClientId, + kUniformIndex, + kBucketId, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0, result->success); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +#if GLES2_TEST_SHADER_VS_PROGRAM_IDS + result->success = 0; + cmd.Init(client_shader_id_, + kUniformIndex, + kBucketId, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0, result->success); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS +} + +TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBadIndexFails) { + const uint32 kBucketId = 123; + GetActiveUniform cmd; + typedef GetActiveUniform::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->success = 0; + cmd.Init(client_program_id_, + kBadUniformIndex, + kBucketId, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0, result->success); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetActiveUniformBadSharedMemoryFails) { + const GLuint kUniformIndex = 1; + const uint32 kBucketId = 123; + GetActiveUniform cmd; + cmd.Init(client_program_id_, + kUniformIndex, + kBucketId, + kInvalidSharedMemoryId, + shared_memory_offset_); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(client_program_id_, + kUniformIndex, + kBucketId, + shared_memory_id_, + kInvalidSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, GetActiveAttribSucceeds) { + const GLuint kAttribIndex = 1; + const uint32 kBucketId = 123; + GetActiveAttrib cmd; + typedef GetActiveAttrib::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->success = 0; + cmd.Init(client_program_id_, + kAttribIndex, + kBucketId, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_NE(0, result->success); + EXPECT_EQ(kAttrib2Size, result->size); + EXPECT_EQ(kAttrib2Type, result->type); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); + ASSERT_TRUE(bucket != NULL); + EXPECT_EQ( + 0, + memcmp(bucket->GetData(0, bucket->size()), kAttrib2Name, bucket->size())); +} + +TEST_P(GLES2DecoderWithShaderTest, GetActiveAttribResultNotInitFails) { + const GLuint kAttribIndex = 1; + const uint32 kBucketId = 123; + GetActiveAttrib cmd; + typedef GetActiveAttrib::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->success = 1; + cmd.Init(client_program_id_, + kAttribIndex, + kBucketId, + shared_memory_id_, + shared_memory_offset_); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, GetActiveAttribBadProgramFails) { + const GLuint kAttribIndex = 1; + const uint32 kBucketId = 123; + GetActiveAttrib cmd; + typedef GetActiveAttrib::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->success = 0; + cmd.Init(kInvalidClientId, + kAttribIndex, + kBucketId, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0, result->success); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +#if GLES2_TEST_SHADER_VS_PROGRAM_IDS + result->success = 0; + cmd.Init(client_shader_id_, + kAttribIndex, + kBucketId, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0, result->success); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS +} + +TEST_P(GLES2DecoderWithShaderTest, GetActiveAttribBadIndexFails) { + const uint32 kBucketId = 123; + GetActiveAttrib cmd; + typedef GetActiveAttrib::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + result->success = 0; + cmd.Init(client_program_id_, + kBadAttribIndex, + kBucketId, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(0, result->success); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetActiveAttribBadSharedMemoryFails) { + const GLuint kAttribIndex = 1; + const uint32 kBucketId = 123; + GetActiveAttrib cmd; + cmd.Init(client_program_id_, + kAttribIndex, + kBucketId, + kInvalidSharedMemoryId, + shared_memory_offset_); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(client_program_id_, + kAttribIndex, + kBucketId, + shared_memory_id_, + kInvalidSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, GetShaderInfoLogValidArgs) { + const char* kInfo = "hello"; + const uint32 kBucketId = 123; + CompileShader compile_cmd; + GetShaderInfoLog cmd; + EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _)); + EXPECT_CALL(*gl_, CompileShader(kServiceShaderId)); + EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _)) + .WillOnce(SetArgumentPointee<2>(GL_FALSE)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_INFO_LOG_LENGTH, _)) + .WillOnce(SetArgumentPointee<2>(strlen(kInfo) + 1)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetShaderInfoLog(kServiceShaderId, strlen(kInfo) + 1, _, _)) + .WillOnce(DoAll(SetArgumentPointee<2>(strlen(kInfo)), + SetArrayArgument<3>(kInfo, kInfo + strlen(kInfo) + 1))); + compile_cmd.Init(client_shader_id_); + cmd.Init(client_shader_id_, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(compile_cmd)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId); + ASSERT_TRUE(bucket != NULL); + EXPECT_EQ(strlen(kInfo) + 1, bucket->size()); + EXPECT_EQ(0, + memcmp(bucket->GetData(0, bucket->size()), kInfo, bucket->size())); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetShaderInfoLogInvalidArgs) { + const uint32 kBucketId = 123; + GetShaderInfoLog cmd; + cmd.Init(kInvalidClientId, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderTest, CompileShaderValidArgs) { + EXPECT_CALL(*gl_, ShaderSource(kServiceShaderId, 1, _, _)); + EXPECT_CALL(*gl_, CompileShader(kServiceShaderId)); + EXPECT_CALL(*gl_, GetShaderiv(kServiceShaderId, GL_COMPILE_STATUS, _)) + .WillOnce(SetArgumentPointee<2>(GL_TRUE)) + .RetiresOnSaturation(); + CompileShader cmd; + cmd.Init(client_shader_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderTest, CompileShaderInvalidArgs) { + CompileShader cmd; + cmd.Init(kInvalidClientId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +#if GLES2_TEST_SHADER_VS_PROGRAM_IDS + cmd.Init(client_program_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS +} + +TEST_P(GLES2DecoderTest, ShaderSourceBucketAndGetShaderSourceValidArgs) { + const uint32 kInBucketId = 123; + const uint32 kOutBucketId = 125; + const char kSource[] = "hello"; + const uint32 kSourceSize = sizeof(kSource) - 1; + SetBucketAsCString(kInBucketId, kSource); + ShaderSourceBucket cmd; + cmd.Init(client_shader_id_, kInBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + ClearSharedMemory(); + GetShaderSource get_cmd; + get_cmd.Init(client_shader_id_, kOutBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(get_cmd)); + CommonDecoder::Bucket* bucket = decoder_->GetBucket(kOutBucketId); + ASSERT_TRUE(bucket != NULL); + EXPECT_EQ(kSourceSize + 1, bucket->size()); + EXPECT_EQ( + 0, memcmp(bucket->GetData(0, bucket->size()), kSource, bucket->size())); +} + +TEST_P(GLES2DecoderTest, ShaderSourceBucketInvalidArgs) { + const uint32 kBucketId = 123; + const char kSource[] = "hello"; + const uint32 kSourceSize = sizeof(kSource) - 1; + memcpy(shared_memory_address_, kSource, kSourceSize); + ShaderSourceBucket cmd; + // Test no bucket. + cmd.Init(client_texture_id_, kBucketId); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + // Test invalid client. + SetBucketAsCString(kBucketId, kSource); + cmd.Init(kInvalidClientId, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +#if GLES2_TEST_SHADER_VS_PROGRAM_IDS + SetBucketAsCString(kBucketId, kSource); + cmd.Init( + client_program_id_, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +#endif // GLES2_TEST_SHADER_VS_PROGRAM_IDS +} + +TEST_P(GLES2DecoderTest, ShaderSourceStripComments) { + const uint32 kInBucketId = 123; + const char kSource[] = "hello/*te\ast*/world//a\ab"; + SetBucketAsCString(kInBucketId, kSource); + ShaderSourceBucket cmd; + cmd.Init(client_shader_id_, kInBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, Uniform1iValidArgs) { + EXPECT_CALL(*gl_, Uniform1i(kUniform1RealLocation, 2)); + Uniform1i cmd; + cmd.Init(kUniform1FakeLocation, 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, Uniform1ivImmediateValidArgs) { + Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); + EXPECT_CALL(*gl_, + Uniform1iv(kUniform1RealLocation, + 1, + reinterpret_cast<GLint*>(ImmediateDataAddress(&cmd)))); + GLint temp[1 * 2] = { + 0, + }; + cmd.Init(kUniform1FakeLocation, 1, &temp[0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); +} + +TEST_P(GLES2DecoderWithShaderTest, Uniform1ivImmediateInvalidValidArgs) { + EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); + Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); + GLint temp[1 * 2] = { + 0, + }; + cmd.Init(kUniform1FakeLocation, 2, &temp[0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, Uniform1ivZeroCount) { + EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); + Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); + GLint temp = 0; + cmd.Init(kUniform1FakeLocation, 0, &temp); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, Uniform1iSamplerIsLmited) { + EXPECT_CALL(*gl_, Uniform1i(_, _)).Times(0); + Uniform1i cmd; + cmd.Init(kUniform1FakeLocation, kNumTextureUnits); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, Uniform1ivSamplerIsLimited) { + EXPECT_CALL(*gl_, Uniform1iv(_, _, _)).Times(0); + Uniform1ivImmediate& cmd = *GetImmediateAs<Uniform1ivImmediate>(); + GLint temp[] = {kNumTextureUnits}; + cmd.Init(kUniform1FakeLocation, 1, &temp[0]); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd, sizeof(temp))); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderTest, BindAttribLocationBucket) { + const uint32 kBucketId = 123; + const GLint kLocation = 2; + const char* kName = "testing"; + EXPECT_CALL(*gl_, + BindAttribLocation(kServiceProgramId, kLocation, StrEq(kName))) + .Times(1); + SetBucketAsCString(kBucketId, kName); + BindAttribLocationBucket cmd; + cmd.Init(client_program_id_, kLocation, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderTest, BindAttribLocationBucketInvalidArgs) { + const uint32 kBucketId = 123; + const GLint kLocation = 2; + const char* kName = "testing"; + EXPECT_CALL(*gl_, BindAttribLocation(_, _, _)).Times(0); + BindAttribLocationBucket cmd; + // check bucket does not exist. + cmd.Init(client_program_id_, kLocation, kBucketId); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + // check bucket is empty. + SetBucketAsCString(kBucketId, NULL); + cmd.Init(client_program_id_, kLocation, kBucketId); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + // Check bad program id + SetBucketAsCString(kBucketId, kName); + cmd.Init(kInvalidClientId, kLocation, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderWithShaderTest, GetAttribLocation) { + const uint32 kBucketId = 123; + const char* kNonExistentName = "foobar"; + typedef GetAttribLocation::Result Result; + Result* result = GetSharedMemoryAs<Result*>(); + SetBucketAsCString(kBucketId, kAttrib2Name); + *result = -1; + GetAttribLocation cmd; + cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(kAttrib2Location, *result); + SetBucketAsCString(kBucketId, kNonExistentName); + *result = -1; + cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(-1, *result); +} + +TEST_P(GLES2DecoderWithShaderTest, GetAttribLocationInvalidArgs) { + const uint32 kBucketId = 123; + typedef GetAttribLocation::Result Result; + Result* result = GetSharedMemoryAs<Result*>(); + *result = -1; + GetAttribLocation cmd; + // Check no bucket + cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(-1, *result); + // Check bad program id. + SetBucketAsCString(kBucketId, kAttrib2Name); + cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); + *result = -1; + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(-1, *result); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + // Check bad memory + cmd.Init(client_program_id_, + kBucketId, + kInvalidSharedMemoryId, + kSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(client_program_id_, + kBucketId, + kSharedMemoryId, + kInvalidSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, GetUniformLocation) { + const uint32 kBucketId = 123; + const char* kNonExistentName = "foobar"; + typedef GetUniformLocation::Result Result; + Result* result = GetSharedMemoryAs<Result*>(); + SetBucketAsCString(kBucketId, kUniform2Name); + *result = -1; + GetUniformLocation cmd; + cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(kUniform2FakeLocation, *result); + SetBucketAsCString(kBucketId, kNonExistentName); + *result = -1; + cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(-1, *result); +} + +TEST_P(GLES2DecoderWithShaderTest, GetUniformLocationInvalidArgs) { + const uint32 kBucketId = 123; + typedef GetUniformLocation::Result Result; + Result* result = GetSharedMemoryAs<Result*>(); + *result = -1; + GetUniformLocation cmd; + // Check no bucket + cmd.Init(client_program_id_, kBucketId, kSharedMemoryId, kSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(-1, *result); + // Check bad program id. + SetBucketAsCString(kBucketId, kUniform2Name); + cmd.Init(kInvalidClientId, kBucketId, kSharedMemoryId, kSharedMemoryOffset); + *result = -1; + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(-1, *result); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + // Check bad memory + cmd.Init(client_program_id_, + kBucketId, + kInvalidSharedMemoryId, + kSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(client_program_id_, + kBucketId, + kSharedMemoryId, + kInvalidSharedMemoryOffset); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderWithShaderTest, BindUniformLocationCHROMIUMBucket) { + const uint32 kBucketId = 123; + const GLint kLocation = 2; + const char* kName = "testing"; + const char* kBadName1 = "gl_testing"; + const char* kBadName2 = "testing[1]"; + + SetBucketAsCString(kBucketId, kName); + BindUniformLocationCHROMIUMBucket cmd; + cmd.Init(client_program_id_, + kLocation, + kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + // check negative location + SetBucketAsCString(kBucketId, kName); + cmd.Init(client_program_id_, -1, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + // check highest location + SetBucketAsCString(kBucketId, kName); + GLint kMaxLocation = + (kMaxFragmentUniformVectors + kMaxVertexUniformVectors) * 4 - 1; + cmd.Init(client_program_id_, + kMaxLocation, + kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + // check too high location + SetBucketAsCString(kBucketId, kName); + cmd.Init(client_program_id_, + kMaxLocation + 1, + kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + // check bad name "gl_..." + SetBucketAsCString(kBucketId, kBadName1); + cmd.Init(client_program_id_, + kLocation, + kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + // check bad name "name[1]" non zero + SetBucketAsCString(kBucketId, kBadName2); + cmd.Init(client_program_id_, + kLocation, + kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, ClearUniformsBeforeFirstProgramUse) { + CommandLine command_line(0, NULL); + command_line.AppendSwitchASCII( + switches::kGpuDriverBugWorkarounds, + base::IntToString(gpu::CLEAR_UNIFORMS_BEFORE_FIRST_PROGRAM_USE)); + InitState init; + init.gl_version = "3.0"; + init.has_alpha = true; + init.request_alpha = true; + init.bind_generates_resource = true; + InitDecoderWithCommandLine(init, &command_line); + { + static AttribInfo attribs[] = { + { + kAttrib1Name, kAttrib1Size, kAttrib1Type, kAttrib1Location, + }, + { + kAttrib2Name, kAttrib2Size, kAttrib2Type, kAttrib2Location, + }, + { + kAttrib3Name, kAttrib3Size, kAttrib3Type, kAttrib3Location, + }, + }; + static UniformInfo uniforms[] = { + {kUniform1Name, kUniform1Size, kUniform1Type, kUniform1FakeLocation, + kUniform1RealLocation, kUniform1DesiredLocation}, + {kUniform2Name, kUniform2Size, kUniform2Type, kUniform2FakeLocation, + kUniform2RealLocation, kUniform2DesiredLocation}, + {kUniform3Name, kUniform3Size, kUniform3Type, kUniform3FakeLocation, + kUniform3RealLocation, kUniform3DesiredLocation}, + }; + SetupShader(attribs, + arraysize(attribs), + uniforms, + arraysize(uniforms), + client_program_id_, + kServiceProgramId, + client_vertex_shader_id_, + kServiceVertexShaderId, + client_fragment_shader_id_, + kServiceFragmentShaderId); + TestHelper::SetupExpectationsForClearingUniforms( + gl_.get(), uniforms, arraysize(uniforms)); + } + + { + EXPECT_CALL(*gl_, UseProgram(kServiceProgramId)) + .Times(1) + .RetiresOnSaturation(); + cmds::UseProgram cmd; + cmd.Init(client_program_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + } +} + +// TODO(gman): DeleteProgram + +// TODO(gman): UseProgram + +// TODO(gman): DeleteShader + +} // namespace gles2 +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc new file mode 100644 index 00000000000..67618138982 --- /dev/null +++ b/chromium/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc @@ -0,0 +1,2831 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" + +#include "base/command_line.h" +#include "base/strings/string_number_conversions.h" +#include "gpu/command_buffer/common/gles2_cmd_format.h" +#include "gpu/command_buffer/common/gles2_cmd_utils.h" +#include "gpu/command_buffer/common/id_allocator.h" +#include "gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager.h" +#include "gpu/command_buffer/service/async_pixel_transfer_manager_mock.h" +#include "gpu/command_buffer/service/cmd_buffer_engine.h" +#include "gpu/command_buffer/service/context_group.h" +#include "gpu/command_buffer/service/context_state.h" +#include "gpu/command_buffer/service/gl_surface_mock.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder_unittest.h" + +#include "gpu/command_buffer/service/gpu_switches.h" +#include "gpu/command_buffer/service/image_manager.h" +#include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/mocks.h" +#include "gpu/command_buffer/service/program_manager.h" +#include "gpu/command_buffer/service/test_helper.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_implementation.h" +#include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface_stub.h" + +#if !defined(GL_DEPTH24_STENCIL8) +#define GL_DEPTH24_STENCIL8 0x88F0 +#endif + +using ::gfx::MockGLInterface; +using ::testing::_; +using ::testing::DoAll; +using ::testing::InSequence; +using ::testing::Invoke; +using ::testing::MatcherCast; +using ::testing::Mock; +using ::testing::Pointee; +using ::testing::Return; +using ::testing::SaveArg; +using ::testing::SetArrayArgument; +using ::testing::SetArgumentPointee; +using ::testing::SetArgPointee; +using ::testing::StrEq; +using ::testing::StrictMock; + +namespace gpu { +namespace gles2 { + +using namespace cmds; + +TEST_P(GLES2DecoderTest, GenerateMipmapWrongFormatsFails) { + EXPECT_CALL(*gl_, GenerateMipmapEXT(_)).Times(0); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + GenerateMipmap cmd; + cmd.Init(GL_TEXTURE_2D); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderTest, GenerateMipmapHandlesOutOfMemory) { + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + TextureManager* manager = group().texture_manager(); + TextureRef* texture_ref = manager->GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + GLint width = 0; + GLint height = 0; + EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height)); + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + 16, + 16, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D)).Times(1); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_OUT_OF_MEMORY)) + .RetiresOnSaturation(); + GenerateMipmap cmd; + cmd.Init(GL_TEXTURE_2D); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); + EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, 2, &width, &height)); +} + +TEST_P(GLES2DecoderTest, GenerateMipmapClearsUnclearedTexture) { + EXPECT_CALL(*gl_, GenerateMipmapEXT(_)).Times(0); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_2D, + GL_TEXTURE_2D, + 0, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + 2, + 2); + EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D)); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + GenerateMipmap cmd; + cmd.Init(GL_TEXTURE_2D); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +// Same as GenerateMipmapClearsUnclearedTexture, but with workaround +// |set_texture_filters_before_generating_mipmap|. +TEST_P(GLES2DecoderManualInitTest, SetTextureFiltersBeforeGenerateMipmap) { + CommandLine command_line(0, NULL); + command_line.AppendSwitchASCII( + switches::kGpuDriverBugWorkarounds, + base::IntToString(gpu::SET_TEXTURE_FILTER_BEFORE_GENERATING_MIPMAP)); + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoderWithCommandLine(init, &command_line); + + EXPECT_CALL(*gl_, GenerateMipmapEXT(_)).Times(0); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_2D, + GL_TEXTURE_2D, + 0, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + 2, + 2); + EXPECT_CALL( + *gl_, + TexParameteri( + GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GenerateMipmapEXT(GL_TEXTURE_2D)); + EXPECT_CALL( + *gl_, + TexParameteri( + GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + GenerateMipmap cmd; + cmd.Init(GL_TEXTURE_2D); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest, ActiveTextureValidArgs) { + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE1)); + SpecializedSetup<ActiveTexture, 0>(true); + ActiveTexture cmd; + cmd.Init(GL_TEXTURE1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest, ActiveTextureInvalidArgs) { + EXPECT_CALL(*gl_, ActiveTexture(_)).Times(0); + SpecializedSetup<ActiveTexture, 0>(false); + ActiveTexture cmd; + cmd.Init(GL_TEXTURE0 - 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + cmd.Init(kNumTextureUnits); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} + +TEST_P(GLES2DecoderTest, TexSubImage2DValidArgs) { + const int kWidth = 16; + const int kHeight = 8; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, + 1, + GL_RGBA, + kWidth, + kHeight, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, + TexSubImage2D(GL_TEXTURE_2D, + 1, + 1, + 0, + kWidth - 1, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + shared_memory_address_)) + .Times(1) + .RetiresOnSaturation(); + TexSubImage2D cmd; + cmd.Init(GL_TEXTURE_2D, + 1, + 1, + 0, + kWidth - 1, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest, TexSubImage2DBadArgs) { + const int kWidth = 16; + const int kHeight = 8; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, + 1, + GL_RGBA, + kWidth, + kHeight, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + 0, + 0); + TexSubImage2D cmd; + cmd.Init(GL_TEXTURE0, + 1, + 0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + cmd.Init(GL_TEXTURE_2D, + 1, + 0, + 0, + kWidth, + kHeight, + GL_TRUE, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + cmd.Init(GL_TEXTURE_2D, + 1, + 0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_INT, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + cmd.Init(GL_TEXTURE_2D, + 1, + -1, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_TEXTURE_2D, + 1, + 1, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_TEXTURE_2D, + 1, + 0, + -1, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_TEXTURE_2D, + 1, + 0, + 1, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_TEXTURE_2D, + 1, + 0, + 0, + kWidth + 1, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_TEXTURE_2D, + 1, + 0, + 0, + kWidth, + kHeight + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_TEXTURE_2D, + 1, + 0, + 0, + kWidth, + kHeight, + GL_RGB, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + cmd.Init(GL_TEXTURE_2D, + 1, + 0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_SHORT_4_4_4_4, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + cmd.Init(GL_TEXTURE_2D, + 1, + 0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + kInvalidSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + cmd.Init(GL_TEXTURE_2D, + 1, + 0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kInvalidSharedMemoryOffset, + GL_FALSE); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderTest, CopyTexSubImage2DValidArgs) { + const int kWidth = 16; + const int kHeight = 8; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, + 1, + GL_RGBA, + kWidth, + kHeight, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, + CopyTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight)) + .Times(1) + .RetiresOnSaturation(); + CopyTexSubImage2D cmd; + cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderTest, CopyTexSubImage2DBadArgs) { + const int kWidth = 16; + const int kHeight = 8; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, + 1, + GL_RGBA, + kWidth, + kHeight, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + 0, + 0); + CopyTexSubImage2D cmd; + cmd.Init(GL_TEXTURE0, 1, 0, 0, 0, 0, kWidth, kHeight); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + cmd.Init(GL_TEXTURE_2D, 1, -1, 0, 0, 0, kWidth, kHeight); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_TEXTURE_2D, 1, 1, 0, 0, 0, kWidth, kHeight); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_TEXTURE_2D, 1, 0, -1, 0, 0, kWidth, kHeight); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_TEXTURE_2D, 1, 0, 1, 0, 0, kWidth, kHeight); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth + 1, kHeight); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + cmd.Init(GL_TEXTURE_2D, 1, 0, 0, 0, 0, kWidth, kHeight + 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); +} + +TEST_P(GLES2DecoderTest, TexImage2DRedefinitionSucceeds) { + const int kWidth = 16; + const int kHeight = 8; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + EXPECT_CALL(*gl_, GetError()).WillRepeatedly(Return(GL_NO_ERROR)); + for (int ii = 0; ii < 2; ++ii) { + TexImage2D cmd; + if (ii == 0) { + EXPECT_CALL(*gl_, + TexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + kWidth, + kHeight, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + _)) + .Times(1) + .RetiresOnSaturation(); + cmd.Init(GL_TEXTURE_2D, + 0, + GL_RGBA, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + } else { + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_2D, + GL_TEXTURE_2D, + 0, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + kWidth, + kHeight); + cmd.Init(GL_TEXTURE_2D, + 0, + GL_RGBA, + kWidth, + kHeight, + GL_RGBA, + GL_UNSIGNED_BYTE, + 0, + 0); + } + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_CALL(*gl_, + TexSubImage2D(GL_TEXTURE_2D, + 0, + 0, + 0, + kWidth, + kHeight - 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + shared_memory_address_)) + .Times(1) + .RetiresOnSaturation(); + // Consider this TexSubImage2D command part of the previous TexImage2D + // (last GL_TRUE argument). It will be skipped if there are bugs in the + // redefinition case. + TexSubImage2D cmd2; + cmd2.Init(GL_TEXTURE_2D, + 0, + 0, + 0, + kWidth, + kHeight - 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_TRUE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + } +} + +TEST_P(GLES2DecoderTest, TexImage2DGLError) { + GLenum target = GL_TEXTURE_2D; + GLint level = 0; + GLenum internal_format = GL_RGBA; + GLsizei width = 2; + GLsizei height = 4; + GLint border = 0; + GLenum format = GL_RGBA; + GLenum type = GL_UNSIGNED_BYTE; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + TextureManager* manager = group().texture_manager(); + TextureRef* texture_ref = manager->GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_OUT_OF_MEMORY)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + TexImage2D(target, + level, + internal_format, + width, + height, + border, + format, + type, + _)) + .Times(1) + .RetiresOnSaturation(); + TexImage2D cmd; + cmd.Init(target, + level, + internal_format, + width, + height, + format, + type, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); + EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); +} + +TEST_P(GLES2DecoderTest, CopyTexImage2DGLError) { + GLenum target = GL_TEXTURE_2D; + GLint level = 0; + GLenum internal_format = GL_RGBA; + GLsizei width = 2; + GLsizei height = 4; + GLint border = 0; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + TextureManager* manager = group().texture_manager(); + TextureRef* texture_ref = manager->GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_OUT_OF_MEMORY)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + CopyTexImage2D( + target, level, internal_format, 0, 0, width, height, border)) + .Times(1) + .RetiresOnSaturation(); + CopyTexImage2D cmd; + cmd.Init(target, level, internal_format, 0, 0, width, height); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_OUT_OF_MEMORY, GetGLError()); + EXPECT_FALSE(texture->GetLevelSize(GL_TEXTURE_2D, level, &width, &height)); +} + +TEST_P(GLES2DecoderManualInitTest, CompressedTexImage2DBucketBadBucket) { + InitState init; + init.extensions = "GL_EXT_texture_compression_s3tc"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + const uint32 kBadBucketId = 123; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + CompressedTexImage2DBucket cmd; + cmd.Init(GL_TEXTURE_2D, + 0, + GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, + 4, + 4, + kBadBucketId); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + CompressedTexSubImage2DBucket cmd2; + cmd2.Init(GL_TEXTURE_2D, + 0, + 0, + 0, + 4, + 4, + GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, + kBadBucketId); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +namespace { + +struct S3TCTestData { + GLenum format; + size_t block_size; +}; + +} // anonymous namespace. + +TEST_P(GLES2DecoderManualInitTest, CompressedTexImage2DS3TC) { + InitState init; + init.extensions = "GL_EXT_texture_compression_s3tc"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + const uint32 kBucketId = 123; + CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId); + ASSERT_TRUE(bucket != NULL); + + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + + static const S3TCTestData test_data[] = { + { + GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, + }, + { + GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, + }, + { + GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 16, + }, + { + GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 16, + }, + }; + + for (size_t ii = 0; ii < arraysize(test_data); ++ii) { + const S3TCTestData& test = test_data[ii]; + CompressedTexImage2DBucket cmd; + // test small width. + DoCompressedTexImage2D( + GL_TEXTURE_2D, 0, test.format, 2, 4, 0, test.block_size, kBucketId); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // test bad width. + cmd.Init(GL_TEXTURE_2D, 0, test.format, 5, 4, kBucketId); + bucket->SetSize(test.block_size * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + // test small height. + DoCompressedTexImage2D( + GL_TEXTURE_2D, 0, test.format, 4, 2, 0, test.block_size, kBucketId); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // test too bad height. + cmd.Init(GL_TEXTURE_2D, 0, test.format, 4, 5, kBucketId); + bucket->SetSize(test.block_size * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + // test small for level 0. + DoCompressedTexImage2D( + GL_TEXTURE_2D, 0, test.format, 1, 1, 0, test.block_size, kBucketId); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // test small for level 0. + DoCompressedTexImage2D( + GL_TEXTURE_2D, 0, test.format, 2, 2, 0, test.block_size, kBucketId); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // test size too large. + cmd.Init(GL_TEXTURE_2D, 0, test.format, 4, 4, kBucketId); + bucket->SetSize(test.block_size * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + + // test size too small. + cmd.Init(GL_TEXTURE_2D, 0, test.format, 4, 4, kBucketId); + bucket->SetSize(test.block_size / 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + + // test with 3 mips. + DoCompressedTexImage2D( + GL_TEXTURE_2D, 0, test.format, 4, 4, 0, test.block_size, kBucketId); + DoCompressedTexImage2D( + GL_TEXTURE_2D, 1, test.format, 2, 2, 0, test.block_size, kBucketId); + DoCompressedTexImage2D( + GL_TEXTURE_2D, 2, test.format, 1, 1, 0, test.block_size, kBucketId); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Test a 16x16 + DoCompressedTexImage2D(GL_TEXTURE_2D, + 0, + test.format, + 16, + 16, + 0, + test.block_size * 4 * 4, + kBucketId); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + CompressedTexSubImage2DBucket sub_cmd; + bucket->SetSize(test.block_size); + // Test sub image bad xoffset + sub_cmd.Init(GL_TEXTURE_2D, 0, 1, 0, 4, 4, test.format, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + // Test sub image bad yoffset + sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 2, 4, 4, test.format, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + // Test sub image bad width + bucket->SetSize(test.block_size * 2); + sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 5, 4, test.format, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + // Test sub image bad height + sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 5, test.format, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + // Test sub image bad size + bucket->SetSize(test.block_size + 1); + sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, test.format, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + + for (GLint yoffset = 0; yoffset <= 8; yoffset += 4) { + for (GLint xoffset = 0; xoffset <= 8; xoffset += 4) { + for (GLsizei height = 4; height <= 8; height += 4) { + for (GLsizei width = 4; width <= 8; width += 4) { + GLsizei size = test.block_size * (width / 4) * (height / 4); + bucket->SetSize(size); + EXPECT_CALL(*gl_, + CompressedTexSubImage2D(GL_TEXTURE_2D, + 0, + xoffset, + yoffset, + width, + height, + test.format, + size, + _)) + .Times(1) + .RetiresOnSaturation(); + sub_cmd.Init(GL_TEXTURE_2D, + 0, + xoffset, + yoffset, + width, + height, + test.format, + kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + } + } + } + } + } +} + +TEST_P(GLES2DecoderManualInitTest, CompressedTexImage2DETC1) { + InitState init; + init.extensions = "GL_OES_compressed_ETC1_RGB8_texture"; + init.gl_version = "opengl es 2.0"; + init.bind_generates_resource = true; + InitDecoder(init); + const uint32 kBucketId = 123; + CommonDecoder::Bucket* bucket = decoder_->CreateBucket(kBucketId); + ASSERT_TRUE(bucket != NULL); + + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + + const GLenum kFormat = GL_ETC1_RGB8_OES; + const size_t kBlockSize = 8; + + CompressedTexImage2DBucket cmd; + // test small width. + DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 4, 8, 0, 16, kBucketId); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // test small height. + DoCompressedTexImage2D(GL_TEXTURE_2D, 0, kFormat, 8, 4, 0, 16, kBucketId); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // test size too large. + cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, kBucketId); + bucket->SetSize(kBlockSize * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + + // test size too small. + cmd.Init(GL_TEXTURE_2D, 0, kFormat, 4, 4, kBucketId); + bucket->SetSize(kBlockSize / 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + + // Test a 16x16 + DoCompressedTexImage2D( + GL_TEXTURE_2D, 0, kFormat, 16, 16, 0, kBlockSize * 16, kBucketId); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Test CompressedTexSubImage not allowed + CompressedTexSubImage2DBucket sub_cmd; + bucket->SetSize(kBlockSize); + sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 4, 4, kFormat, kBucketId); + EXPECT_EQ(error::kNoError, ExecuteCmd(sub_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + // Test TexSubImage not allowed for ETC1 compressed texture + TextureRef* texture_ref = GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + GLenum type, internal_format; + EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); + EXPECT_EQ(kFormat, internal_format); + TexSubImage2D texsub_cmd; + texsub_cmd.Init(GL_TEXTURE_2D, + 0, + 0, + 0, + 4, + 4, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(texsub_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + // Test CopyTexSubImage not allowed for ETC1 compressed texture + CopyTexSubImage2D copy_cmd; + copy_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 4, 4); + EXPECT_EQ(error::kNoError, ExecuteCmd(copy_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, EGLImageExternalBindTexture) { + InitState init; + init.extensions = "GL_OES_EGL_image_external"; + init.gl_version = "opengl es 2.0"; + init.bind_generates_resource = true; + InitDecoder(init); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_EXTERNAL_OES, kNewServiceId)); + EXPECT_CALL(*gl_, GenTextures(1, _)) + .WillOnce(SetArgumentPointee<1>(kNewServiceId)); + BindTexture cmd; + cmd.Init(GL_TEXTURE_EXTERNAL_OES, kNewClientId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + TextureRef* texture_ref = GetTexture(kNewClientId); + EXPECT_TRUE(texture_ref != NULL); + EXPECT_TRUE(texture_ref->texture()->target() == GL_TEXTURE_EXTERNAL_OES); +} + +TEST_P(GLES2DecoderManualInitTest, EGLImageExternalGetBinding) { + InitState init; + init.extensions = "GL_OES_EGL_image_external"; + init.gl_version = "opengl es 2.0"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, + GetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, result->GetData())) + .Times(0); + result->size = 0; + GetIntegerv cmd; + cmd.Init(GL_TEXTURE_BINDING_EXTERNAL_OES, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( + GL_TEXTURE_BINDING_EXTERNAL_OES), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTextureDefaults) { + InitState init; + init.extensions = "GL_OES_EGL_image_external"; + init.gl_version = "opengl es 2.0"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); + + TextureRef* texture_ref = GetTexture(client_texture_id_); + EXPECT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES); + EXPECT_TRUE(texture->min_filter() == GL_LINEAR); + EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); + EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); +} + +TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTextureParam) { + InitState init; + init.extensions = "GL_OES_EGL_image_external"; + init.gl_version = "opengl es 2.0"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); + + EXPECT_CALL(*gl_, + TexParameteri( + GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + EXPECT_CALL( + *gl_, + TexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + EXPECT_CALL( + *gl_, + TexParameteri( + GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + EXPECT_CALL( + *gl_, + TexParameteri( + GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + TexParameteri cmd; + cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + TextureRef* texture_ref = GetTexture(client_texture_id_); + EXPECT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES); + EXPECT_TRUE(texture->min_filter() == GL_LINEAR); + EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); + EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); +} + +TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTextureParamInvalid) { + InitState init; + init.extensions = "GL_OES_EGL_image_external"; + init.gl_version = "opengl es 2.0"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); + + TexParameteri cmd; + cmd.Init(GL_TEXTURE_EXTERNAL_OES, + GL_TEXTURE_MIN_FILTER, + GL_NEAREST_MIPMAP_NEAREST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + + cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_REPEAT); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + + cmd.Init(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_REPEAT); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + + TextureRef* texture_ref = GetTexture(client_texture_id_); + EXPECT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_TRUE(texture->target() == GL_TEXTURE_EXTERNAL_OES); + EXPECT_TRUE(texture->min_filter() == GL_LINEAR); + EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); + EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); +} + +TEST_P(GLES2DecoderManualInitTest, EGLImageExternalTexImage2DError) { + InitState init; + init.extensions = "GL_OES_EGL_image_external"; + init.gl_version = "opengl es 2.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + GLenum target = GL_TEXTURE_EXTERNAL_OES; + GLint level = 0; + GLenum internal_format = GL_RGBA; + GLsizei width = 2; + GLsizei height = 4; + GLenum format = GL_RGBA; + GLenum type = GL_UNSIGNED_BYTE; + DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); + ASSERT_TRUE(GetTexture(client_texture_id_) != NULL); + TexImage2D cmd; + cmd.Init(target, + level, + internal_format, + width, + height, + format, + type, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + + // TexImage2D is not allowed with GL_TEXTURE_EXTERNAL_OES targets. + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, DefaultTextureZero) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_2D, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + BindTexture cmd2; + cmd2.Init(GL_TEXTURE_CUBE_MAP, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, DefaultTextureBGR) { + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_2D, 0); + EXPECT_CALL( + *gl_, BindTexture(GL_TEXTURE_2D, TestHelper::kServiceDefaultTexture2dId)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + BindTexture cmd2; + cmd2.Init(GL_TEXTURE_CUBE_MAP, 0); + EXPECT_CALL(*gl_, + BindTexture(GL_TEXTURE_CUBE_MAP, + TestHelper::kServiceDefaultTextureCubemapId)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +// Test that default texture 0 is immutable. +TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameterf) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + + { + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_2D, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + TexParameterf cmd2; + cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + } + + { + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_CUBE_MAP, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + TexParameterf cmd2; + cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + } +} + +TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameteri) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + + { + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_2D, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + TexParameteri cmd2; + cmd2.Init(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + } + + { + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_CUBE_MAP, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + TexParameteri cmd2; + cmd2.Init(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + } +} + +TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameterfv) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + + { + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_2D, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + GLfloat data = GL_NEAREST; + TexParameterfvImmediate& cmd2 = + *GetImmediateAs<TexParameterfvImmediate>(); + cmd2.Init(GL_TEXTURE_2D, + GL_TEXTURE_MAG_FILTER, + &data); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd2, sizeof(data))); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + } + + { + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_CUBE_MAP, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + GLfloat data = GL_NEAREST; + TexParameterfvImmediate& cmd2 = + *GetImmediateAs<TexParameterfvImmediate>(); + cmd2.Init(GL_TEXTURE_CUBE_MAP, + GL_TEXTURE_MAG_FILTER, + &data); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd2, sizeof(data))); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + } +} + +TEST_P(GLES2DecoderManualInitTest, NoDefaultTexParameteriv) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + + { + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_2D, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + GLfloat data = GL_NEAREST; + TexParameterfvImmediate& cmd2 = + *GetImmediateAs<TexParameterfvImmediate>(); + cmd2.Init(GL_TEXTURE_2D, + GL_TEXTURE_MAG_FILTER, + &data); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd2, sizeof(data))); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + } + + { + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_CUBE_MAP, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_CUBE_MAP, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + GLfloat data = GL_NEAREST; + TexParameterfvImmediate& cmd2 = + *GetImmediateAs<TexParameterfvImmediate>(); + cmd2.Init(GL_TEXTURE_CUBE_MAP, + GL_TEXTURE_MAG_FILTER, + &data); + EXPECT_EQ(error::kNoError, ExecuteImmediateCmd(cmd2, sizeof(data))); + EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); + } +} + +TEST_P(GLES2DecoderManualInitTest, NoDefaultTexImage2D) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_2D, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + TexImage2D cmd2; + cmd2.Init(GL_TEXTURE_2D, + 0, + GL_RGBA, + 2, + 2, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, NoDefaultTexSubImage2D) { + InitState init; + init.gl_version = "3.0"; + InitDecoder(init); + + BindTexture cmd1; + cmd1.Init(GL_TEXTURE_2D, 0); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, 0)); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd1)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + TexSubImage2D cmd2; + cmd2.Init(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd2)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleBindTexture) { + InitState init; + init.extensions = "GL_ARB_texture_rectangle"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_RECTANGLE_ARB, kNewServiceId)); + EXPECT_CALL(*gl_, GenTextures(1, _)) + .WillOnce(SetArgumentPointee<1>(kNewServiceId)); + BindTexture cmd; + cmd.Init(GL_TEXTURE_RECTANGLE_ARB, kNewClientId); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + Texture* texture = GetTexture(kNewClientId)->texture(); + EXPECT_TRUE(texture != NULL); + EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); +} + +TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleGetBinding) { + InitState init; + init.extensions = "GL_ARB_texture_rectangle"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindTexture( + GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + EXPECT_CALL(*gl_, + GetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, result->GetData())) + .Times(0); + result->size = 0; + GetIntegerv cmd; + cmd.Init(GL_TEXTURE_BINDING_RECTANGLE_ARB, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned( + GL_TEXTURE_BINDING_RECTANGLE_ARB), + result->GetNumResults()); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + EXPECT_EQ(client_texture_id_, (uint32)result->GetData()[0]); +} + +TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTextureDefaults) { + InitState init; + init.extensions = "GL_ARB_texture_rectangle"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindTexture( + GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); + + Texture* texture = GetTexture(client_texture_id_)->texture(); + EXPECT_TRUE(texture != NULL); + EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); + EXPECT_TRUE(texture->min_filter() == GL_LINEAR); + EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); + EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); +} + +TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParam) { + InitState init; + init.extensions = "GL_ARB_texture_rectangle"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + DoBindTexture( + GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); + + EXPECT_CALL(*gl_, + TexParameteri( + GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + EXPECT_CALL(*gl_, + TexParameteri( + GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + EXPECT_CALL( + *gl_, + TexParameteri( + GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)); + EXPECT_CALL( + *gl_, + TexParameteri( + GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)); + TexParameteri cmd; + cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + Texture* texture = GetTexture(client_texture_id_)->texture(); + EXPECT_TRUE(texture != NULL); + EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); + EXPECT_TRUE(texture->min_filter() == GL_LINEAR); + EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); + EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); +} + +TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTextureParamInvalid) { + InitState init; + init.extensions = "GL_ARB_texture_rectangle"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + DoBindTexture( + GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); + + TexParameteri cmd; + cmd.Init(GL_TEXTURE_RECTANGLE_ARB, + GL_TEXTURE_MIN_FILTER, + GL_NEAREST_MIPMAP_NEAREST); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + + cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_REPEAT); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + + cmd.Init(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_REPEAT); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + + Texture* texture = GetTexture(client_texture_id_)->texture(); + EXPECT_TRUE(texture != NULL); + EXPECT_TRUE(texture->target() == GL_TEXTURE_RECTANGLE_ARB); + EXPECT_TRUE(texture->min_filter() == GL_LINEAR); + EXPECT_TRUE(texture->wrap_s() == GL_CLAMP_TO_EDGE); + EXPECT_TRUE(texture->wrap_t() == GL_CLAMP_TO_EDGE); +} + +TEST_P(GLES2DecoderManualInitTest, ARBTextureRectangleTexImage2DError) { + InitState init; + init.extensions = "GL_ARB_texture_rectangle"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + GLenum target = GL_TEXTURE_RECTANGLE_ARB; + GLint level = 0; + GLenum internal_format = GL_RGBA; + GLsizei width = 2; + GLsizei height = 4; + GLenum format = GL_RGBA; + GLenum type = GL_UNSIGNED_BYTE; + DoBindTexture( + GL_TEXTURE_RECTANGLE_ARB, client_texture_id_, kServiceTextureId); + ASSERT_TRUE(GetTexture(client_texture_id_) != NULL); + TexImage2D cmd; + cmd.Init(target, + level, + internal_format, + width, + height, + format, + type, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + + // TexImage2D is not allowed with GL_TEXTURE_RECTANGLE_ARB targets. + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, TexSubImage2DClearsAfterTexImage2DNULL) { + InitState init; + init.gl_version = "opengl es 2.0"; + init.has_alpha = true; + init.has_depth = true; + init.request_alpha = true; + init.request_depth = true; + InitDecoder(init); + + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_2D, + GL_TEXTURE_2D, + 0, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + 2, + 2); + EXPECT_CALL(*gl_, + TexSubImage2D(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + shared_memory_address_)) + .Times(1) + .RetiresOnSaturation(); + TexSubImage2D cmd; + cmd.Init(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + // Test if we call it again it does not clear. + EXPECT_CALL(*gl_, + TexSubImage2D(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + shared_memory_address_)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderTest, TexSubImage2DDoesNotClearAfterTexImage2DNULLThenData) { + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + 2, + 2, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_CALL(*gl_, + TexSubImage2D(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + shared_memory_address_)) + .Times(1) + .RetiresOnSaturation(); + TexSubImage2D cmd; + cmd.Init(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + // Test if we call it again it does not clear. + EXPECT_CALL(*gl_, + TexSubImage2D(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + shared_memory_address_)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P( + GLES2DecoderManualInitTest, + TexSubImage2DDoesNotClearAfterTexImage2DNULLThenDataWithTexImage2DIsFaster) { + CommandLine command_line(0, NULL); + command_line.AppendSwitchASCII( + switches::kGpuDriverBugWorkarounds, + base::IntToString(gpu::TEXSUBIMAGE2D_FASTER_THAN_TEXIMAGE2D)); + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoderWithCommandLine(init, &command_line); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + + { + // Uses texSubimage internally because the above workaround is active and + // the update is for the full size of the texture. + EXPECT_CALL(*gl_, + TexSubImage2D( + GL_TEXTURE_2D, 0, 0, 0, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, _)) + .Times(1) + .RetiresOnSaturation(); + cmds::TexImage2D cmd; + cmd.Init(GL_TEXTURE_2D, + 0, + GL_RGBA, + 2, + 2, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + } + + EXPECT_CALL(*gl_, + TexSubImage2D(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + shared_memory_address_)) + .Times(1) + .RetiresOnSaturation(); + TexSubImage2D cmd; + cmd.Init(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + // Test if we call it again it does not clear. + EXPECT_CALL(*gl_, + TexSubImage2D(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + shared_memory_address_)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderTest, TexSubImage2DClearsAfterTexImage2DWithDataThenNULL) { + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + // Put in data (so it should be marked as cleared) + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + 2, + 2, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + // Put in no data. + TexImage2D tex_cmd; + tex_cmd.Init( + GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + // It won't actually call TexImage2D, just mark it as uncleared. + EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd)); + // Next call to TexSubImage2d should clear. + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_2D, + GL_TEXTURE_2D, + 0, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + 2, + 2); + EXPECT_CALL(*gl_, + TexSubImage2D(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + shared_memory_address_)) + .Times(1) + .RetiresOnSaturation(); + TexSubImage2D cmd; + cmd.Init(GL_TEXTURE_2D, + 0, + 1, + 1, + 1, + 1, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderTest, CopyTexImage2DMarksTextureAsCleared) { + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + + TextureManager* manager = group().texture_manager(); + TextureRef* texture_ref = manager->GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1, 0)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + CopyTexImage2D cmd; + cmd.Init(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 1, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + + EXPECT_TRUE(texture->SafeToRenderFrom()); +} + +TEST_P(GLES2DecoderTest, CopyTexSubImage2DClearsUnclearedTexture) { + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_2D, + GL_TEXTURE_2D, + 0, + GL_RGBA, + GL_RGBA, + GL_UNSIGNED_BYTE, + 2, + 2); + EXPECT_CALL(*gl_, CopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1)) + .Times(1) + .RetiresOnSaturation(); + CopyTexSubImage2D cmd; + cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_P(GLES2DecoderManualInitTest, CompressedImage2DMarksTextureAsCleared) { + InitState init; + init.extensions = "GL_EXT_texture_compression_s3tc"; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL( + *gl_, + CompressedTexImage2D( + GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 0, 8, _)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + CompressedTexImage2D cmd; + cmd.Init(GL_TEXTURE_2D, + 0, + GL_COMPRESSED_RGB_S3TC_DXT1_EXT, + 4, + 4, + 8, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + TextureManager* manager = group().texture_manager(); + TextureRef* texture_ref = manager->GetTexture(client_texture_id_); + EXPECT_TRUE(texture_ref->texture()->SafeToRenderFrom()); +} + +TEST_P(GLES2DecoderTest, TextureUsageAngleExtNotEnabledByDefault) { + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + + TexParameteri cmd; + cmd.Init( + GL_TEXTURE_2D, GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} + +TEST_P(GLES2DecoderTest, ProduceAndConsumeTextureCHROMIUM) { + Mailbox mailbox = Mailbox::Generate(); + + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoTexImage2D( + GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + TextureRef* texture_ref = + group().texture_manager()->GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_EQ(kServiceTextureId, texture->service_id()); + + ProduceTextureCHROMIUMImmediate& produce_cmd = + *GetImmediateAs<ProduceTextureCHROMIUMImmediate>(); + produce_cmd.Init(GL_TEXTURE_2D, mailbox.name); + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(produce_cmd, sizeof(mailbox.name))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Texture didn't change. + GLsizei width; + GLsizei height; + GLenum type; + GLenum internal_format; + + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + EXPECT_EQ(3, width); + EXPECT_EQ(1, height); + EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); + EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); + EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); + + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); + EXPECT_EQ(2, width); + EXPECT_EQ(4, height); + EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format)); + EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); + EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); + + // Service ID has not changed. + EXPECT_EQ(kServiceTextureId, texture->service_id()); + + // Create new texture for consume. + EXPECT_CALL(*gl_, GenTextures(_, _)) + .WillOnce(SetArgumentPointee<1>(kNewServiceId)) + .RetiresOnSaturation(); + DoBindTexture(GL_TEXTURE_2D, kNewClientId, kNewServiceId); + + // Assigns and binds original service size texture ID. + EXPECT_CALL(*gl_, DeleteTextures(1, _)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) + .Times(1) + .RetiresOnSaturation(); + + ConsumeTextureCHROMIUMImmediate& consume_cmd = + *GetImmediateAs<ConsumeTextureCHROMIUMImmediate>(); + consume_cmd.Init(GL_TEXTURE_2D, mailbox.name); + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(consume_cmd, sizeof(mailbox.name))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Texture is redefined. + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + EXPECT_EQ(3, width); + EXPECT_EQ(1, height); + EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); + EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); + EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); + + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); + EXPECT_EQ(2, width); + EXPECT_EQ(4, height); + EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format)); + EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); + EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); + + // Service ID is restored. + EXPECT_EQ(kServiceTextureId, texture->service_id()); +} + +TEST_P(GLES2DecoderTest, ProduceAndConsumeDirectTextureCHROMIUM) { + Mailbox mailbox = Mailbox::Generate(); + + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + DoTexImage2D( + GL_TEXTURE_2D, 1, GL_RGBA, 2, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + TextureRef* texture_ref = + group().texture_manager()->GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_EQ(kServiceTextureId, texture->service_id()); + + ProduceTextureDirectCHROMIUMImmediate& produce_cmd = + *GetImmediateAs<ProduceTextureDirectCHROMIUMImmediate>(); + produce_cmd.Init(client_texture_id_, GL_TEXTURE_2D, mailbox.name); + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(produce_cmd, sizeof(mailbox.name))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Texture didn't change. + GLsizei width; + GLsizei height; + GLenum type; + GLenum internal_format; + + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + EXPECT_EQ(3, width); + EXPECT_EQ(1, height); + EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); + EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); + EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); + + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); + EXPECT_EQ(2, width); + EXPECT_EQ(4, height); + EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format)); + EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); + EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); + + // Service ID has not changed. + EXPECT_EQ(kServiceTextureId, texture->service_id()); + + // Consume the texture into a new client ID. + GLuint new_texture_id = kNewClientId; + CreateAndConsumeTextureCHROMIUMImmediate& consume_cmd = + *GetImmediateAs<CreateAndConsumeTextureCHROMIUMImmediate>(); + consume_cmd.Init(GL_TEXTURE_2D, new_texture_id, mailbox.name); + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(consume_cmd, sizeof(mailbox.name))); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Make sure the new client ID is associated with the produced service ID. + texture_ref = group().texture_manager()->GetTexture(new_texture_id); + ASSERT_TRUE(texture_ref != NULL); + texture = texture_ref->texture(); + EXPECT_EQ(kServiceTextureId, texture->service_id()); + + DoBindTexture(GL_TEXTURE_2D, kNewClientId, kServiceTextureId); + + // Texture is redefined. + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + EXPECT_EQ(3, width); + EXPECT_EQ(1, height); + EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); + EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); + EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); + + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 1, &width, &height)); + EXPECT_EQ(2, width); + EXPECT_EQ(4, height); + EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 1, &type, &internal_format)); + EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); + EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); +} + +TEST_P(GLES2DecoderTest, ProduceTextureCHROMIUMInvalidTarget) { + Mailbox mailbox = Mailbox::Generate(); + + DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, 3, 1, 0, GL_RGBA, + GL_UNSIGNED_BYTE, 0, 0); + TextureRef* texture_ref = + group().texture_manager()->GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_EQ(kServiceTextureId, texture->service_id()); + + ProduceTextureDirectCHROMIUMImmediate& produce_cmd = + *GetImmediateAs<ProduceTextureDirectCHROMIUMImmediate>(); + produce_cmd.Init(client_texture_id_, GL_TEXTURE_2D, mailbox.name); + EXPECT_EQ(error::kNoError, + ExecuteImmediateCmd(produce_cmd, sizeof(mailbox.name))); + + // ProduceTexture should fail it the texture and produce targets don't match. + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, DepthTextureBadArgs) { + InitState init; + init.extensions = "GL_ANGLE_depth_texture"; + init.gl_version = "opengl es 2.0"; + init.has_depth = true; + init.has_stencil = true; + init.request_depth = true; + init.request_stencil = true; + init.bind_generates_resource = true; + InitDecoder(init); + + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + // Check trying to upload data fails. + TexImage2D tex_cmd; + tex_cmd.Init(GL_TEXTURE_2D, + 0, + GL_DEPTH_COMPONENT, + 1, + 1, + GL_DEPTH_COMPONENT, + GL_UNSIGNED_INT, + kSharedMemoryId, + kSharedMemoryOffset); + EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + // Try level > 0. + tex_cmd.Init(GL_TEXTURE_2D, + 1, + GL_DEPTH_COMPONENT, + 1, + 1, + GL_DEPTH_COMPONENT, + GL_UNSIGNED_INT, + 0, + 0); + EXPECT_EQ(error::kNoError, ExecuteCmd(tex_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + // Make a 1 pixel depth texture. + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_DEPTH_COMPONENT, + 1, + 1, + 0, + GL_DEPTH_COMPONENT, + GL_UNSIGNED_INT, + 0, + 0); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // Check that trying to update it fails. + TexSubImage2D tex_sub_cmd; + tex_sub_cmd.Init(GL_TEXTURE_2D, + 0, + 0, + 0, + 1, + 1, + GL_DEPTH_COMPONENT, + GL_UNSIGNED_INT, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(tex_sub_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + // Check that trying to CopyTexImage2D fails + CopyTexImage2D copy_tex_cmd; + copy_tex_cmd.Init(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, 1, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(copy_tex_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); + + // Check that trying to CopyTexSubImage2D fails + CopyTexSubImage2D copy_sub_cmd; + copy_sub_cmd.Init(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(copy_sub_cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, GenerateMipmapDepthTexture) { + InitState init; + init.extensions = "GL_ANGLE_depth_texture"; + init.gl_version = "opengl es 2.0"; + init.has_depth = true; + init.has_stencil = true; + init.request_depth = true; + init.request_stencil = true; + init.bind_generates_resource = true; + InitDecoder(init); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_DEPTH_COMPONENT, + 2, + 2, + 0, + GL_DEPTH_COMPONENT, + GL_UNSIGNED_INT, + 0, + 0); + GenerateMipmap cmd; + cmd.Init(GL_TEXTURE_2D); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_INVALID_OPERATION, GetGLError()); +} + +TEST_P(GLES2DecoderTest, BindTexImage2DCHROMIUM) { + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + TextureRef* texture_ref = + group().texture_manager()->GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_EQ(kServiceTextureId, texture->service_id()); + + group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1); + EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL); + + GLsizei width; + GLsizei height; + GLenum type; + GLenum internal_format; + + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + EXPECT_EQ(3, width); + EXPECT_EQ(1, height); + EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); + EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); + EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); + EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); + + // Bind image to texture. + // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; + bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + // Image should now be set. + EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); + + // Define new texture image. + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + // Image should no longer be set. + EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); +} + +TEST_P(GLES2DecoderTest, BindTexImage2DCHROMIUMCubeMapNotAllowed) { + group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1); + DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId); + + BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; + bind_tex_image_2d_cmd.Init(GL_TEXTURE_CUBE_MAP, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); +} + +TEST_P(GLES2DecoderTest, OrphanGLImageWithTexImage2D) { + group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1); + DoBindTexture(GL_TEXTURE_CUBE_MAP, client_texture_id_, kServiceTextureId); + + BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; + bind_tex_image_2d_cmd.Init(GL_TEXTURE_CUBE_MAP, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); + EXPECT_EQ(GL_INVALID_ENUM, GetGLError()); + + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + TextureRef* texture_ref = + group().texture_manager()->GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); +} + +TEST_P(GLES2DecoderTest, ReleaseTexImage2DCHROMIUM) { + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, 3, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0, 0); + TextureRef* texture_ref = + group().texture_manager()->GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_EQ(kServiceTextureId, texture->service_id()); + + group().image_manager()->AddImage(gfx::GLImage::CreateGLImage(0).get(), 1); + EXPECT_FALSE(group().image_manager()->LookupImage(1) == NULL); + + GLsizei width; + GLsizei height; + GLenum type; + GLenum internal_format; + + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + EXPECT_EQ(3, width); + EXPECT_EQ(1, height); + EXPECT_TRUE(texture->GetLevelType(GL_TEXTURE_2D, 0, &type, &internal_format)); + EXPECT_EQ(static_cast<GLenum>(GL_RGBA), internal_format); + EXPECT_EQ(static_cast<GLenum>(GL_UNSIGNED_BYTE), type); + EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); + + // Bind image to texture. + // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; + bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + // Image should now be set. + EXPECT_FALSE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); + + // Release image from texture. + // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + ReleaseTexImage2DCHROMIUM release_tex_image_2d_cmd; + release_tex_image_2d_cmd.Init(GL_TEXTURE_2D, 1); + EXPECT_EQ(error::kNoError, ExecuteCmd(release_tex_image_2d_cmd)); + EXPECT_TRUE(texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height)); + // Image should no longer be set. + EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); +} + +class MockGLImage : public gfx::GLImage { + public: + MockGLImage() {} + + // Overridden from gfx::GLImage: + MOCK_METHOD0(Destroy, void()); + MOCK_METHOD0(GetSize, gfx::Size()); + MOCK_METHOD1(BindTexImage, bool(unsigned)); + MOCK_METHOD1(ReleaseTexImage, void(unsigned)); + MOCK_METHOD0(WillUseTexImage, void()); + MOCK_METHOD0(DidUseTexImage, void()); + MOCK_METHOD0(WillModifyTexImage, void()); + MOCK_METHOD0(DidModifyTexImage, void()); + + protected: + virtual ~MockGLImage() {} +}; + +TEST_P(GLES2DecoderWithShaderTest, UseTexImage) { + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + 1, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + kSharedMemoryId, + kSharedMemoryOffset); + + TextureRef* texture_ref = + group().texture_manager()->GetTexture(client_texture_id_); + ASSERT_TRUE(texture_ref != NULL); + Texture* texture = texture_ref->texture(); + EXPECT_EQ(kServiceTextureId, texture->service_id()); + + const int32 kImageId = 1; + scoped_refptr<MockGLImage> image(new MockGLImage); + group().image_manager()->AddImage(image.get(), kImageId); + + // Bind image to texture. + EXPECT_CALL(*image, BindTexImage(GL_TEXTURE_2D)) + .Times(1) + .WillOnce(Return(true)) + .RetiresOnSaturation(); + EXPECT_CALL(*image, GetSize()) + .Times(1) + .WillOnce(Return(gfx::Size(1, 1))) + .RetiresOnSaturation(); + // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + BindTexImage2DCHROMIUM bind_tex_image_2d_cmd; + bind_tex_image_2d_cmd.Init(GL_TEXTURE_2D, kImageId); + EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd)); + + AddExpectationsForSimulatedAttrib0(kNumVertices, 0); + SetupExpectationsForApplyingDefaultDirtyState(); + + // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(3).RetiresOnSaturation(); + EXPECT_CALL(*image, WillUseTexImage()).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*image, DidUseTexImage()).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, DrawArrays(GL_TRIANGLES, 0, kNumVertices)) + .Times(1) + .RetiresOnSaturation(); + DrawArrays cmd; + cmd.Init(GL_TRIANGLES, 0, kNumVertices); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + DoBindFramebuffer( + GL_FRAMEBUFFER, client_framebuffer_id_, kServiceFramebufferId); + // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) + .Times(2) + .RetiresOnSaturation(); + // Image will be 'in use' as long as bound to a framebuffer. + EXPECT_CALL(*image, WillUseTexImage()).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, + FramebufferTexture2DEXT(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + kServiceTextureId, + 0)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + FramebufferTexture2D fbtex_cmd; + fbtex_cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + client_texture_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(fbtex_cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + // ScopedGLErrorSuppressor calls GetError on its constructor and destructor. + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + FramebufferRenderbufferEXT(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + kServiceRenderbufferId)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kServiceTextureId)) + .Times(2) + .RetiresOnSaturation(); + // Image should no longer be 'in use' after being unbound from framebuffer. + EXPECT_CALL(*image, DidUseTexImage()).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + FramebufferRenderbuffer fbrb_cmd; + fbrb_cmd.Init(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_RENDERBUFFER, + client_renderbuffer_id_); + EXPECT_EQ(error::kNoError, ExecuteCmd(fbrb_cmd)); +} + +TEST_P(GLES2DecoderManualInitTest, DrawWithGLImageExternal) { + InitState init; + init.extensions = "GL_OES_EGL_image_external"; + init.gl_version = "opengl es 2.0"; + init.has_alpha = true; + init.has_depth = true; + init.request_alpha = true; + init.request_depth = true; + init.bind_generates_resource = true; + InitDecoder(init); + + TextureRef* texture_ref = GetTexture(client_texture_id_); + scoped_refptr<MockGLImage> image(new MockGLImage); + group().texture_manager()->SetTarget(texture_ref, GL_TEXTURE_EXTERNAL_OES); + group().texture_manager()->SetLevelInfo(texture_ref, + GL_TEXTURE_EXTERNAL_OES, + 0, + GL_RGBA, + 0, + 0, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + true); + group().texture_manager()->SetLevelImage( + texture_ref, GL_TEXTURE_EXTERNAL_OES, 0, image); + + DoBindTexture(GL_TEXTURE_EXTERNAL_OES, client_texture_id_, kServiceTextureId); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + SetupSamplerExternalProgram(); + SetupIndexBuffer(); + AddExpectationsForSimulatedAttrib0(kMaxValidIndex + 1, 0); + SetupExpectationsForApplyingDefaultDirtyState(); + EXPECT_TRUE(group().texture_manager()->CanRender(texture_ref)); + + InSequence s; + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*image, WillUseTexImage()).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, DrawElements(_, _, _, _)).Times(1); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*image, DidUseTexImage()).Times(1).RetiresOnSaturation(); + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, ActiveTexture(GL_TEXTURE0)).Times(1).RetiresOnSaturation(); + DrawElements cmd; + cmd.Init(GL_TRIANGLES, + kValidIndexRangeCount, + GL_UNSIGNED_SHORT, + kValidIndexRangeStart * 2); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, TexImage2DFloatOnGLES2) { + InitState init; + init.extensions = "GL_OES_texture_float"; + init.gl_version = "opengl es 2.0"; + InitDecoder(init); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0); + DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0, GL_LUMINANCE, GL_FLOAT, 0, 0); + DoTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0, GL_ALPHA, GL_FLOAT, 0, 0); + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_LUMINANCE_ALPHA, + 16, + 17, + 0, + GL_LUMINANCE_ALPHA, + GL_FLOAT, + 0, + 0); +} + +TEST_P(GLES2DecoderManualInitTest, TexImage2DFloatOnGLES3) { + InitState init; + init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float"; + init.gl_version = "opengl es 3.0"; + InitDecoder(init); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0); + DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 17, 0, GL_LUMINANCE, GL_FLOAT, 0, 0); + DoTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 17, 0, GL_ALPHA, GL_FLOAT, 0, 0); + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_LUMINANCE_ALPHA, + 16, + 17, + 0, + GL_LUMINANCE_ALPHA, + GL_FLOAT, + 0, + 0); +} + +TEST_P(GLES2DecoderManualInitTest, TexSubImage2DFloatOnGLES3) { + InitState init; + init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float"; + init.gl_version = "opengl es 3.0"; + InitDecoder(init); + const int kWidth = 8; + const int kHeight = 4; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA32F, + kWidth, + kHeight, + 0, + GL_RGBA, + GL_FLOAT, + 0, + 0); + EXPECT_CALL(*gl_, + TexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA32F, + kWidth, + kHeight, + 0, + GL_RGBA, + GL_FLOAT, + shared_memory_address_)) + .Times(1) + .RetiresOnSaturation(); + TexSubImage2D cmd; + cmd.Init(GL_TEXTURE_2D, + 0, + 0, + 0, + kWidth, + kHeight, + GL_RGBA, + GL_FLOAT, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, TexSubImage2DFloatDoesClearOnGLES3) { + InitState init; + init.extensions = "GL_OES_texture_float GL_EXT_color_buffer_float"; + init.gl_version = "opengl es 3.0"; + InitDecoder(init); + const int kWidth = 8; + const int kHeight = 4; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA32F, + kWidth, + kHeight, + 0, + GL_RGBA, + GL_FLOAT, + 0, + 0); + SetupClearTextureExpectations(kServiceTextureId, + kServiceTextureId, + GL_TEXTURE_2D, + GL_TEXTURE_2D, + 0, + GL_RGBA32F, + GL_RGBA, + GL_FLOAT, + kWidth, + kHeight); + EXPECT_CALL(*gl_, + TexSubImage2D(GL_TEXTURE_2D, + 0, + 1, + 0, + kWidth - 1, + kHeight, + GL_RGBA, + GL_FLOAT, + shared_memory_address_)) + .Times(1) + .RetiresOnSaturation(); + TexSubImage2D cmd; + cmd.Init(GL_TEXTURE_2D, + 0, + 1, + 0, + kWidth - 1, + kHeight, + GL_RGBA, + GL_FLOAT, + kSharedMemoryId, + kSharedMemoryOffset, + GL_FALSE); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +TEST_P(GLES2DecoderManualInitTest, TexImage2DFloatConvertsFormatDesktop) { + InitState init; + init.extensions = "GL_ARB_texture_float"; + init.gl_version = "2.1"; + InitDecoder(init); + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + DoTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 17, 0, GL_RGBA, GL_FLOAT, 0, 0); + DoTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, 16, 17, 0, GL_RGB, GL_FLOAT, 0, 0); + DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, + 0, + GL_RGBA, + 16, + 17, + 0, + GL_RGBA, + GL_FLOAT, + 0, + 0, + GL_RGBA32F_ARB); + DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, + 0, + GL_RGB, + 16, + 17, + 0, + GL_RGB, + GL_FLOAT, + 0, + 0, + GL_RGB32F_ARB); + DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, + 0, + GL_LUMINANCE, + 16, + 17, + 0, + GL_LUMINANCE, + GL_FLOAT, + 0, + 0, + GL_LUMINANCE32F_ARB); + DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, + 0, + GL_ALPHA, + 16, + 17, + 0, + GL_ALPHA, + GL_FLOAT, + 0, + 0, + GL_ALPHA32F_ARB); + DoTexImage2DConvertInternalFormat(GL_TEXTURE_2D, + 0, + GL_LUMINANCE_ALPHA, + 16, + 17, + 0, + GL_LUMINANCE_ALPHA, + GL_FLOAT, + 0, + 0, + GL_LUMINANCE_ALPHA32F_ARB); +} + +class GLES2DecoderCompressedFormatsTest : public GLES2DecoderManualInitTest { + public: + GLES2DecoderCompressedFormatsTest() {} + + static bool ValueInArray(GLint value, GLint* array, GLint count) { + for (GLint ii = 0; ii < count; ++ii) { + if (array[ii] == value) { + return true; + } + } + return false; + } + + void CheckFormats(const char* extension, const GLenum* formats, int count) { + InitState init; + init.extensions = extension; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + GetIntegerv cmd; + result->size = 0; + EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(0).RetiresOnSaturation(); + cmd.Init(GL_NUM_COMPRESSED_TEXTURE_FORMATS, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(1, result->GetNumResults()); + GLint num_formats = result->GetData()[0]; + EXPECT_EQ(count, num_formats); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + result->size = 0; + cmd.Init(GL_COMPRESSED_TEXTURE_FORMATS, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(num_formats, result->GetNumResults()); + + for (int i = 0; i < count; ++i) { + EXPECT_TRUE( + ValueInArray(formats[i], result->GetData(), result->GetNumResults())); + } + + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + } +}; + +INSTANTIATE_TEST_CASE_P(Service, + GLES2DecoderCompressedFormatsTest, + ::testing::Bool()); + +TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsS3TC) { + const GLenum formats[] = { + GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, + GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT}; + CheckFormats("GL_EXT_texture_compression_s3tc", formats, 4); +} + +TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsATC) { + const GLenum formats[] = {GL_ATC_RGB_AMD, GL_ATC_RGBA_EXPLICIT_ALPHA_AMD, + GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD}; + CheckFormats("GL_AMD_compressed_ATC_texture", formats, 3); +} + +TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsPVRTC) { + const GLenum formats[] = { + GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG, + GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}; + CheckFormats("GL_IMG_texture_compression_pvrtc", formats, 4); +} + +TEST_P(GLES2DecoderCompressedFormatsTest, GetCompressedTextureFormatsETC1) { + const GLenum formats[] = {GL_ETC1_RGB8_OES}; + CheckFormats("GL_OES_compressed_ETC1_RGB8_texture", formats, 1); +} + +TEST_P(GLES2DecoderManualInitTest, GetNoCompressedTextureFormats) { + InitState init; + init.gl_version = "3.0"; + init.bind_generates_resource = true; + InitDecoder(init); + + EXPECT_CALL(*gl_, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); + + typedef GetIntegerv::Result Result; + Result* result = static_cast<Result*>(shared_memory_address_); + GetIntegerv cmd; + result->size = 0; + EXPECT_CALL(*gl_, GetIntegerv(_, _)).Times(0).RetiresOnSaturation(); + cmd.Init(GL_NUM_COMPRESSED_TEXTURE_FORMATS, + shared_memory_id_, + shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(1, result->GetNumResults()); + GLint num_formats = result->GetData()[0]; + EXPECT_EQ(0, num_formats); + EXPECT_EQ(GL_NO_ERROR, GetGLError()); + + result->size = 0; + cmd.Init( + GL_COMPRESSED_TEXTURE_FORMATS, shared_memory_id_, shared_memory_offset_); + EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); + EXPECT_EQ(num_formats, result->GetNumResults()); + + EXPECT_EQ(GL_NO_ERROR, GetGLError()); +} + +// TODO(gman): Complete this test. +// TEST_P(GLES2DecoderTest, CompressedTexImage2DGLError) { +// } + +// TODO(gman): CompressedTexImage2D + +// TODO(gman): CompressedTexImage2DImmediate + +// TODO(gman): CompressedTexSubImage2DImmediate + +// TODO(gman): TexImage2D + +// TODO(gman): TexImage2DImmediate + +// TODO(gman): TexSubImage2DImmediate + +} // namespace gles2 +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_validation_autogen.h b/chromium/gpu/command_buffer/service/gles2_cmd_validation_autogen.h index 7e417882471..cbdf48f79ae 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_validation_autogen.h +++ b/chromium/gpu/command_buffer/service/gles2_cmd_validation_autogen.h @@ -1,9 +1,11 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! #ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_VALIDATION_AUTOGEN_H_ @@ -23,7 +25,6 @@ ValueValidator<GLenum> dst_blend_factor; ValueValidator<GLenum> equation; ValueValidator<GLenum> face_mode; ValueValidator<GLenum> face_type; -ValueValidator<GLboolean> false_only; ValueValidator<GLenum> frame_buffer_parameter; ValueValidator<GLenum> frame_buffer_target; ValueValidator<GLenum> g_l_state; @@ -53,7 +54,6 @@ ValueValidator<GLenum> src_blend_factor; ValueValidator<GLenum> stencil_op; ValueValidator<GLenum> string_type; ValueValidator<GLenum> texture_bind_target; -ValueValidator<GLint> texture_border; ValueValidator<GLenum> texture_format; ValueValidator<GLenum> texture_internal_format; ValueValidator<GLenum> texture_internal_format_storage; @@ -68,7 +68,5 @@ ValueValidator<GLint> vertex_attrib_size; ValueValidator<GLenum> vertex_attrib_type; ValueValidator<GLenum> vertex_attribute; ValueValidator<GLenum> vertex_pointer; -ValueValidator<GLint> zero_only; #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_VALIDATION_AUTOGEN_H_ - diff --git a/chromium/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h b/chromium/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h index 8975d202a6b..e344c30f875 100644 --- a/chromium/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h +++ b/chromium/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h @@ -1,675 +1,480 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file is auto-generated from // gpu/command_buffer/build_gles2_cmd_buffer.py +// It's formatted by clang-format using chromium coding style: +// clang-format -i -style=chromium filename // DO NOT EDIT! -#ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_VALIDATION_IMPLEMENTATION_AUTOGEN_H_ // NOLINT -#define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_VALIDATION_IMPLEMENTATION_AUTOGEN_H_ // NOLINT +#ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_VALIDATION_IMPLEMENTATION_AUTOGEN_H_ +#define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_VALIDATION_IMPLEMENTATION_AUTOGEN_H_ static const GLenum valid_attachment_table[] = { - GL_COLOR_ATTACHMENT0, - GL_DEPTH_ATTACHMENT, - GL_STENCIL_ATTACHMENT, + GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT, }; static const GLenum valid_backbuffer_attachment_table[] = { - GL_COLOR_EXT, - GL_DEPTH_EXT, - GL_STENCIL_EXT, + GL_COLOR_EXT, GL_DEPTH_EXT, GL_STENCIL_EXT, }; static const GLenum valid_blit_filter_table[] = { - GL_NEAREST, - GL_LINEAR, + GL_NEAREST, GL_LINEAR, }; static const GLenum valid_buffer_parameter_table[] = { - GL_BUFFER_SIZE, - GL_BUFFER_USAGE, + GL_BUFFER_SIZE, GL_BUFFER_USAGE, }; static const GLenum valid_buffer_target_table[] = { - GL_ARRAY_BUFFER, - GL_ELEMENT_ARRAY_BUFFER, + GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, }; static const GLenum valid_buffer_usage_table[] = { - GL_STREAM_DRAW, - GL_STATIC_DRAW, - GL_DYNAMIC_DRAW, + GL_STREAM_DRAW, GL_STATIC_DRAW, GL_DYNAMIC_DRAW, }; static const GLenum valid_capability_table[] = { - GL_BLEND, - GL_CULL_FACE, - GL_DEPTH_TEST, - GL_DITHER, - GL_POLYGON_OFFSET_FILL, - GL_SAMPLE_ALPHA_TO_COVERAGE, - GL_SAMPLE_COVERAGE, - GL_SCISSOR_TEST, - GL_STENCIL_TEST, + GL_BLEND, GL_CULL_FACE, GL_DEPTH_TEST, + GL_DITHER, GL_POLYGON_OFFSET_FILL, GL_SAMPLE_ALPHA_TO_COVERAGE, + GL_SAMPLE_COVERAGE, GL_SCISSOR_TEST, GL_STENCIL_TEST, }; static const GLenum valid_cmp_function_table[] = { - GL_NEVER, - GL_LESS, - GL_EQUAL, - GL_LEQUAL, - GL_GREATER, - GL_NOTEQUAL, - GL_GEQUAL, - GL_ALWAYS, + GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, + GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, GL_ALWAYS, }; static const GLenum valid_draw_mode_table[] = { - GL_POINTS, - GL_LINE_STRIP, - GL_LINE_LOOP, - GL_LINES, - GL_TRIANGLE_STRIP, - GL_TRIANGLE_FAN, - GL_TRIANGLES, + GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, + GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, }; static const GLenum valid_dst_blend_factor_table[] = { - GL_ZERO, - GL_ONE, - GL_SRC_COLOR, - GL_ONE_MINUS_SRC_COLOR, - GL_DST_COLOR, - GL_ONE_MINUS_DST_COLOR, - GL_SRC_ALPHA, - GL_ONE_MINUS_SRC_ALPHA, - GL_DST_ALPHA, - GL_ONE_MINUS_DST_ALPHA, - GL_CONSTANT_COLOR, - GL_ONE_MINUS_CONSTANT_COLOR, - GL_CONSTANT_ALPHA, - GL_ONE_MINUS_CONSTANT_ALPHA, + GL_ZERO, GL_ONE, + GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, + GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, + GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, + GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, + GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, + GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA, }; static const GLenum valid_equation_table[] = { - GL_FUNC_ADD, - GL_FUNC_SUBTRACT, - GL_FUNC_REVERSE_SUBTRACT, + GL_FUNC_ADD, GL_FUNC_SUBTRACT, GL_FUNC_REVERSE_SUBTRACT, }; static const GLenum valid_face_mode_table[] = { - GL_CW, - GL_CCW, + GL_CW, GL_CCW, }; static const GLenum valid_face_type_table[] = { - GL_FRONT, - GL_BACK, - GL_FRONT_AND_BACK, -}; - -static const GLboolean valid_false_only_table[] = { - false, + GL_FRONT, GL_BACK, GL_FRONT_AND_BACK, }; static const GLenum valid_frame_buffer_parameter_table[] = { - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, - GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, - GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, - GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, + GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, }; static const GLenum valid_frame_buffer_target_table[] = { - GL_FRAMEBUFFER, + GL_FRAMEBUFFER, }; static const GLenum valid_g_l_state_table[] = { - GL_ACTIVE_TEXTURE, - GL_ALIASED_LINE_WIDTH_RANGE, - GL_ALIASED_POINT_SIZE_RANGE, - GL_ALPHA_BITS, - GL_ARRAY_BUFFER_BINDING, - GL_BLUE_BITS, - GL_COMPRESSED_TEXTURE_FORMATS, - GL_CURRENT_PROGRAM, - GL_DEPTH_BITS, - GL_DEPTH_RANGE, - GL_ELEMENT_ARRAY_BUFFER_BINDING, - GL_FRAMEBUFFER_BINDING, - GL_GENERATE_MIPMAP_HINT, - GL_GREEN_BITS, - GL_IMPLEMENTATION_COLOR_READ_FORMAT, - GL_IMPLEMENTATION_COLOR_READ_TYPE, - GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, - GL_MAX_CUBE_MAP_TEXTURE_SIZE, - GL_MAX_FRAGMENT_UNIFORM_VECTORS, - GL_MAX_RENDERBUFFER_SIZE, - GL_MAX_TEXTURE_IMAGE_UNITS, - GL_MAX_TEXTURE_SIZE, - GL_MAX_VARYING_VECTORS, - GL_MAX_VERTEX_ATTRIBS, - GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, - GL_MAX_VERTEX_UNIFORM_VECTORS, - GL_MAX_VIEWPORT_DIMS, - GL_NUM_COMPRESSED_TEXTURE_FORMATS, - GL_NUM_SHADER_BINARY_FORMATS, - GL_PACK_ALIGNMENT, - GL_RED_BITS, - GL_RENDERBUFFER_BINDING, - GL_SAMPLE_BUFFERS, - GL_SAMPLE_COVERAGE_INVERT, - GL_SAMPLE_COVERAGE_VALUE, - GL_SAMPLES, - GL_SCISSOR_BOX, - GL_SHADER_BINARY_FORMATS, - GL_SHADER_COMPILER, - GL_SUBPIXEL_BITS, - GL_STENCIL_BITS, - GL_TEXTURE_BINDING_2D, - GL_TEXTURE_BINDING_CUBE_MAP, - GL_UNPACK_ALIGNMENT, - GL_UNPACK_FLIP_Y_CHROMIUM, - GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, - GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, - GL_VERTEX_ARRAY_BINDING_OES, - GL_VIEWPORT, - GL_BLEND_COLOR, - GL_BLEND_EQUATION_RGB, - GL_BLEND_EQUATION_ALPHA, - GL_BLEND_SRC_RGB, - GL_BLEND_DST_RGB, - GL_BLEND_SRC_ALPHA, - GL_BLEND_DST_ALPHA, - GL_COLOR_CLEAR_VALUE, - GL_DEPTH_CLEAR_VALUE, - GL_STENCIL_CLEAR_VALUE, - GL_COLOR_WRITEMASK, - GL_CULL_FACE_MODE, - GL_DEPTH_FUNC, - GL_DEPTH_WRITEMASK, - GL_DEPTH_RANGE, - GL_FRONT_FACE, - GL_GENERATE_MIPMAP_HINT, - GL_LINE_WIDTH, - GL_PACK_ALIGNMENT, - GL_UNPACK_ALIGNMENT, - GL_POLYGON_OFFSET_FACTOR, - GL_POLYGON_OFFSET_UNITS, - GL_SAMPLE_COVERAGE_VALUE, - GL_SAMPLE_COVERAGE_INVERT, - GL_SCISSOR_BOX, - GL_STENCIL_FUNC, - GL_STENCIL_REF, - GL_STENCIL_VALUE_MASK, - GL_STENCIL_BACK_FUNC, - GL_STENCIL_BACK_REF, - GL_STENCIL_BACK_VALUE_MASK, - GL_STENCIL_WRITEMASK, - GL_STENCIL_BACK_WRITEMASK, - GL_STENCIL_FAIL, - GL_STENCIL_PASS_DEPTH_FAIL, - GL_STENCIL_PASS_DEPTH_PASS, - GL_STENCIL_BACK_FAIL, - GL_STENCIL_BACK_PASS_DEPTH_FAIL, - GL_STENCIL_BACK_PASS_DEPTH_PASS, - GL_VIEWPORT, - GL_BLEND, - GL_CULL_FACE, - GL_DEPTH_TEST, - GL_DITHER, - GL_POLYGON_OFFSET_FILL, - GL_SAMPLE_ALPHA_TO_COVERAGE, - GL_SAMPLE_COVERAGE, - GL_SCISSOR_TEST, - GL_STENCIL_TEST, + GL_ACTIVE_TEXTURE, + GL_ALIASED_LINE_WIDTH_RANGE, + GL_ALIASED_POINT_SIZE_RANGE, + GL_ALPHA_BITS, + GL_ARRAY_BUFFER_BINDING, + GL_BLUE_BITS, + GL_COMPRESSED_TEXTURE_FORMATS, + GL_CURRENT_PROGRAM, + GL_DEPTH_BITS, + GL_DEPTH_RANGE, + GL_ELEMENT_ARRAY_BUFFER_BINDING, + GL_FRAMEBUFFER_BINDING, + GL_GENERATE_MIPMAP_HINT, + GL_GREEN_BITS, + GL_IMPLEMENTATION_COLOR_READ_FORMAT, + GL_IMPLEMENTATION_COLOR_READ_TYPE, + GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, + GL_MAX_CUBE_MAP_TEXTURE_SIZE, + GL_MAX_FRAGMENT_UNIFORM_VECTORS, + GL_MAX_RENDERBUFFER_SIZE, + GL_MAX_TEXTURE_IMAGE_UNITS, + GL_MAX_TEXTURE_SIZE, + GL_MAX_VARYING_VECTORS, + GL_MAX_VERTEX_ATTRIBS, + GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, + GL_MAX_VERTEX_UNIFORM_VECTORS, + GL_MAX_VIEWPORT_DIMS, + GL_NUM_COMPRESSED_TEXTURE_FORMATS, + GL_NUM_SHADER_BINARY_FORMATS, + GL_PACK_ALIGNMENT, + GL_RED_BITS, + GL_RENDERBUFFER_BINDING, + GL_SAMPLE_BUFFERS, + GL_SAMPLE_COVERAGE_INVERT, + GL_SAMPLE_COVERAGE_VALUE, + GL_SAMPLES, + GL_SCISSOR_BOX, + GL_SHADER_BINARY_FORMATS, + GL_SHADER_COMPILER, + GL_SUBPIXEL_BITS, + GL_STENCIL_BITS, + GL_TEXTURE_BINDING_2D, + GL_TEXTURE_BINDING_CUBE_MAP, + GL_UNPACK_ALIGNMENT, + GL_UNPACK_FLIP_Y_CHROMIUM, + GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, + GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, + GL_BIND_GENERATES_RESOURCE_CHROMIUM, + GL_VERTEX_ARRAY_BINDING_OES, + GL_VIEWPORT, + GL_BLEND_COLOR, + GL_BLEND_EQUATION_RGB, + GL_BLEND_EQUATION_ALPHA, + GL_BLEND_SRC_RGB, + GL_BLEND_DST_RGB, + GL_BLEND_SRC_ALPHA, + GL_BLEND_DST_ALPHA, + GL_COLOR_CLEAR_VALUE, + GL_DEPTH_CLEAR_VALUE, + GL_STENCIL_CLEAR_VALUE, + GL_COLOR_WRITEMASK, + GL_CULL_FACE_MODE, + GL_DEPTH_FUNC, + GL_DEPTH_WRITEMASK, + GL_FRONT_FACE, + GL_LINE_WIDTH, + GL_POLYGON_OFFSET_FACTOR, + GL_POLYGON_OFFSET_UNITS, + GL_STENCIL_FUNC, + GL_STENCIL_REF, + GL_STENCIL_VALUE_MASK, + GL_STENCIL_BACK_FUNC, + GL_STENCIL_BACK_REF, + GL_STENCIL_BACK_VALUE_MASK, + GL_STENCIL_WRITEMASK, + GL_STENCIL_BACK_WRITEMASK, + GL_STENCIL_FAIL, + GL_STENCIL_PASS_DEPTH_FAIL, + GL_STENCIL_PASS_DEPTH_PASS, + GL_STENCIL_BACK_FAIL, + GL_STENCIL_BACK_PASS_DEPTH_FAIL, + GL_STENCIL_BACK_PASS_DEPTH_PASS, + GL_BLEND, + GL_CULL_FACE, + GL_DEPTH_TEST, + GL_DITHER, + GL_POLYGON_OFFSET_FILL, + GL_SAMPLE_ALPHA_TO_COVERAGE, + GL_SAMPLE_COVERAGE, + GL_SCISSOR_TEST, + GL_STENCIL_TEST, }; static const GLenum valid_get_max_index_type_table[] = { - GL_UNSIGNED_BYTE, - GL_UNSIGNED_SHORT, - GL_UNSIGNED_INT, + GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, }; static const GLenum valid_get_tex_param_target_table[] = { - GL_TEXTURE_2D, - GL_TEXTURE_CUBE_MAP, + GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP, }; static const GLenum valid_hint_mode_table[] = { - GL_FASTEST, - GL_NICEST, - GL_DONT_CARE, + GL_FASTEST, GL_NICEST, GL_DONT_CARE, }; static const GLenum valid_hint_target_table[] = { - GL_GENERATE_MIPMAP_HINT, + GL_GENERATE_MIPMAP_HINT, }; static const GLenum valid_index_type_table[] = { - GL_UNSIGNED_BYTE, - GL_UNSIGNED_SHORT, + GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, }; static const GLenum valid_pixel_store_table[] = { - GL_PACK_ALIGNMENT, - GL_UNPACK_ALIGNMENT, - GL_UNPACK_FLIP_Y_CHROMIUM, - GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, - GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, + GL_PACK_ALIGNMENT, + GL_UNPACK_ALIGNMENT, + GL_UNPACK_FLIP_Y_CHROMIUM, + GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM, + GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM, }; static const GLint valid_pixel_store_alignment_table[] = { - 1, - 2, - 4, - 8, + 1, 2, 4, 8, }; static const GLenum valid_pixel_type_table[] = { - GL_UNSIGNED_BYTE, - GL_UNSIGNED_SHORT_5_6_5, - GL_UNSIGNED_SHORT_4_4_4_4, - GL_UNSIGNED_SHORT_5_5_5_1, + GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_SHORT_4_4_4_4, + GL_UNSIGNED_SHORT_5_5_5_1, }; static const GLenum valid_program_parameter_table[] = { - GL_DELETE_STATUS, - GL_LINK_STATUS, - GL_VALIDATE_STATUS, - GL_INFO_LOG_LENGTH, - GL_ATTACHED_SHADERS, - GL_ACTIVE_ATTRIBUTES, - GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, - GL_ACTIVE_UNIFORMS, - GL_ACTIVE_UNIFORM_MAX_LENGTH, + GL_DELETE_STATUS, GL_LINK_STATUS, + GL_VALIDATE_STATUS, GL_INFO_LOG_LENGTH, + GL_ATTACHED_SHADERS, GL_ACTIVE_ATTRIBUTES, + GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, GL_ACTIVE_UNIFORMS, + GL_ACTIVE_UNIFORM_MAX_LENGTH, }; static const GLenum valid_query_object_parameter_table[] = { - GL_QUERY_RESULT_EXT, - GL_QUERY_RESULT_AVAILABLE_EXT, + GL_QUERY_RESULT_EXT, GL_QUERY_RESULT_AVAILABLE_EXT, }; static const GLenum valid_query_parameter_table[] = { - GL_CURRENT_QUERY_EXT, + GL_CURRENT_QUERY_EXT, }; static const GLenum valid_query_target_table[] = { - GL_ANY_SAMPLES_PASSED_EXT, - GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, - GL_COMMANDS_ISSUED_CHROMIUM, - GL_LATENCY_QUERY_CHROMIUM, - GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, - GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, + GL_ANY_SAMPLES_PASSED_EXT, + GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT, + GL_COMMANDS_ISSUED_CHROMIUM, + GL_LATENCY_QUERY_CHROMIUM, + GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM, + GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, + GL_COMMANDS_COMPLETED_CHROMIUM, }; static const GLenum valid_read_pixel_format_table[] = { - GL_ALPHA, - GL_RGB, - GL_RGBA, + GL_ALPHA, GL_RGB, GL_RGBA, }; static const GLenum valid_read_pixel_type_table[] = { - GL_UNSIGNED_BYTE, - GL_UNSIGNED_SHORT_5_6_5, - GL_UNSIGNED_SHORT_4_4_4_4, - GL_UNSIGNED_SHORT_5_5_5_1, + GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_SHORT_4_4_4_4, + GL_UNSIGNED_SHORT_5_5_5_1, }; static const GLenum valid_render_buffer_format_table[] = { - GL_RGBA4, - GL_RGB565, - GL_RGB5_A1, - GL_DEPTH_COMPONENT16, - GL_STENCIL_INDEX8, + GL_RGBA4, GL_RGB565, GL_RGB5_A1, GL_DEPTH_COMPONENT16, GL_STENCIL_INDEX8, }; static const GLenum valid_render_buffer_parameter_table[] = { - GL_RENDERBUFFER_RED_SIZE, - GL_RENDERBUFFER_GREEN_SIZE, - GL_RENDERBUFFER_BLUE_SIZE, - GL_RENDERBUFFER_ALPHA_SIZE, - GL_RENDERBUFFER_DEPTH_SIZE, - GL_RENDERBUFFER_STENCIL_SIZE, - GL_RENDERBUFFER_WIDTH, - GL_RENDERBUFFER_HEIGHT, - GL_RENDERBUFFER_INTERNAL_FORMAT, + GL_RENDERBUFFER_RED_SIZE, GL_RENDERBUFFER_GREEN_SIZE, + GL_RENDERBUFFER_BLUE_SIZE, GL_RENDERBUFFER_ALPHA_SIZE, + GL_RENDERBUFFER_DEPTH_SIZE, GL_RENDERBUFFER_STENCIL_SIZE, + GL_RENDERBUFFER_WIDTH, GL_RENDERBUFFER_HEIGHT, + GL_RENDERBUFFER_INTERNAL_FORMAT, }; static const GLenum valid_render_buffer_target_table[] = { - GL_RENDERBUFFER, + GL_RENDERBUFFER, }; static const GLenum valid_reset_status_table[] = { - GL_GUILTY_CONTEXT_RESET_ARB, - GL_INNOCENT_CONTEXT_RESET_ARB, - GL_UNKNOWN_CONTEXT_RESET_ARB, + GL_GUILTY_CONTEXT_RESET_ARB, GL_INNOCENT_CONTEXT_RESET_ARB, + GL_UNKNOWN_CONTEXT_RESET_ARB, }; static const GLenum valid_shader_parameter_table[] = { - GL_SHADER_TYPE, - GL_DELETE_STATUS, - GL_COMPILE_STATUS, - GL_INFO_LOG_LENGTH, - GL_SHADER_SOURCE_LENGTH, - GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, + GL_SHADER_TYPE, GL_DELETE_STATUS, + GL_COMPILE_STATUS, GL_INFO_LOG_LENGTH, + GL_SHADER_SOURCE_LENGTH, GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, }; static const GLenum valid_shader_precision_table[] = { - GL_LOW_FLOAT, - GL_MEDIUM_FLOAT, - GL_HIGH_FLOAT, - GL_LOW_INT, - GL_MEDIUM_INT, - GL_HIGH_INT, + GL_LOW_FLOAT, GL_MEDIUM_FLOAT, GL_HIGH_FLOAT, + GL_LOW_INT, GL_MEDIUM_INT, GL_HIGH_INT, }; static const GLenum valid_shader_type_table[] = { - GL_VERTEX_SHADER, - GL_FRAGMENT_SHADER, + GL_VERTEX_SHADER, GL_FRAGMENT_SHADER, }; static const GLenum valid_src_blend_factor_table[] = { - GL_ZERO, - GL_ONE, - GL_SRC_COLOR, - GL_ONE_MINUS_SRC_COLOR, - GL_DST_COLOR, - GL_ONE_MINUS_DST_COLOR, - GL_SRC_ALPHA, - GL_ONE_MINUS_SRC_ALPHA, - GL_DST_ALPHA, - GL_ONE_MINUS_DST_ALPHA, - GL_CONSTANT_COLOR, - GL_ONE_MINUS_CONSTANT_COLOR, - GL_CONSTANT_ALPHA, - GL_ONE_MINUS_CONSTANT_ALPHA, - GL_SRC_ALPHA_SATURATE, + GL_ZERO, GL_ONE, + GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, + GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, + GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, + GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, + GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR, + GL_CONSTANT_ALPHA, GL_ONE_MINUS_CONSTANT_ALPHA, + GL_SRC_ALPHA_SATURATE, }; static const GLenum valid_stencil_op_table[] = { - GL_KEEP, - GL_ZERO, - GL_REPLACE, - GL_INCR, - GL_INCR_WRAP, - GL_DECR, - GL_DECR_WRAP, - GL_INVERT, + GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, + GL_INCR_WRAP, GL_DECR, GL_DECR_WRAP, GL_INVERT, }; static const GLenum valid_string_type_table[] = { - GL_VENDOR, - GL_RENDERER, - GL_VERSION, - GL_SHADING_LANGUAGE_VERSION, - GL_EXTENSIONS, + GL_VENDOR, GL_RENDERER, GL_VERSION, + GL_SHADING_LANGUAGE_VERSION, GL_EXTENSIONS, }; static const GLenum valid_texture_bind_target_table[] = { - GL_TEXTURE_2D, - GL_TEXTURE_CUBE_MAP, -}; - -static const GLint valid_texture_border_table[] = { - 0, + GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP, }; static const GLenum valid_texture_format_table[] = { - GL_ALPHA, - GL_LUMINANCE, - GL_LUMINANCE_ALPHA, - GL_RGB, - GL_RGBA, + GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA, }; static const GLenum valid_texture_internal_format_table[] = { - GL_ALPHA, - GL_LUMINANCE, - GL_LUMINANCE_ALPHA, - GL_RGB, - GL_RGBA, + GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA, }; static const GLenum valid_texture_internal_format_storage_table[] = { - GL_RGB565, - GL_RGBA4, - GL_RGB5_A1, - GL_ALPHA8_EXT, - GL_LUMINANCE8_EXT, - GL_LUMINANCE8_ALPHA8_EXT, - GL_RGB8_OES, - GL_RGBA8_OES, + GL_RGB565, GL_RGBA4, GL_RGB5_A1, GL_ALPHA8_EXT, + GL_LUMINANCE8_EXT, GL_LUMINANCE8_ALPHA8_EXT, GL_RGB8_OES, GL_RGBA8_OES, }; static const GLenum valid_texture_mag_filter_mode_table[] = { - GL_NEAREST, - GL_LINEAR, + GL_NEAREST, GL_LINEAR, }; static const GLenum valid_texture_min_filter_mode_table[] = { - GL_NEAREST, - GL_LINEAR, - GL_NEAREST_MIPMAP_NEAREST, - GL_LINEAR_MIPMAP_NEAREST, - GL_NEAREST_MIPMAP_LINEAR, - GL_LINEAR_MIPMAP_LINEAR, + GL_NEAREST, GL_LINEAR, + GL_NEAREST_MIPMAP_NEAREST, GL_LINEAR_MIPMAP_NEAREST, + GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_LINEAR, }; static const GLenum valid_texture_parameter_table[] = { - GL_TEXTURE_MAG_FILTER, - GL_TEXTURE_MIN_FILTER, - GL_TEXTURE_POOL_CHROMIUM, - GL_TEXTURE_WRAP_S, - GL_TEXTURE_WRAP_T, + GL_TEXTURE_MAG_FILTER, GL_TEXTURE_MIN_FILTER, GL_TEXTURE_POOL_CHROMIUM, + GL_TEXTURE_WRAP_S, GL_TEXTURE_WRAP_T, }; static const GLenum valid_texture_pool_table[] = { - GL_TEXTURE_POOL_MANAGED_CHROMIUM, - GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, + GL_TEXTURE_POOL_MANAGED_CHROMIUM, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM, }; static const GLenum valid_texture_target_table[] = { - GL_TEXTURE_2D, - GL_TEXTURE_CUBE_MAP_POSITIVE_X, - GL_TEXTURE_CUBE_MAP_NEGATIVE_X, - GL_TEXTURE_CUBE_MAP_POSITIVE_Y, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, - GL_TEXTURE_CUBE_MAP_POSITIVE_Z, - GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, + GL_TEXTURE_2D, GL_TEXTURE_CUBE_MAP_POSITIVE_X, + GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, + GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, }; static const GLenum valid_texture_usage_table[] = { - GL_NONE, - GL_FRAMEBUFFER_ATTACHMENT_ANGLE, + GL_NONE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE, }; static const GLenum valid_texture_wrap_mode_table[] = { - GL_CLAMP_TO_EDGE, - GL_MIRRORED_REPEAT, - GL_REPEAT, + GL_CLAMP_TO_EDGE, GL_MIRRORED_REPEAT, GL_REPEAT, }; static const GLint valid_vertex_attrib_size_table[] = { - 1, - 2, - 3, - 4, + 1, 2, 3, 4, }; static const GLenum valid_vertex_attrib_type_table[] = { - GL_BYTE, - GL_UNSIGNED_BYTE, - GL_SHORT, - GL_UNSIGNED_SHORT, - GL_FLOAT, + GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FLOAT, }; static const GLenum valid_vertex_attribute_table[] = { - GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, - GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, - GL_VERTEX_ATTRIB_ARRAY_ENABLED, - GL_VERTEX_ATTRIB_ARRAY_SIZE, - GL_VERTEX_ATTRIB_ARRAY_STRIDE, - GL_VERTEX_ATTRIB_ARRAY_TYPE, - GL_CURRENT_VERTEX_ATTRIB, + GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, + GL_VERTEX_ATTRIB_ARRAY_ENABLED, GL_VERTEX_ATTRIB_ARRAY_SIZE, + GL_VERTEX_ATTRIB_ARRAY_STRIDE, GL_VERTEX_ATTRIB_ARRAY_TYPE, + GL_CURRENT_VERTEX_ATTRIB, }; static const GLenum valid_vertex_pointer_table[] = { - GL_VERTEX_ATTRIB_ARRAY_POINTER, -}; - -static const GLint valid_zero_only_table[] = { - 0, + GL_VERTEX_ATTRIB_ARRAY_POINTER, }; Validators::Validators() - : attachment( - valid_attachment_table, arraysize(valid_attachment_table)), - backbuffer_attachment( - valid_backbuffer_attachment_table, arraysize( - valid_backbuffer_attachment_table)), - blit_filter( - valid_blit_filter_table, arraysize(valid_blit_filter_table)), - buffer_parameter( - valid_buffer_parameter_table, arraysize( - valid_buffer_parameter_table)), - buffer_target( - valid_buffer_target_table, arraysize(valid_buffer_target_table)), - buffer_usage( - valid_buffer_usage_table, arraysize(valid_buffer_usage_table)), - capability( - valid_capability_table, arraysize(valid_capability_table)), - cmp_function( - valid_cmp_function_table, arraysize(valid_cmp_function_table)), + : attachment(valid_attachment_table, arraysize(valid_attachment_table)), + backbuffer_attachment(valid_backbuffer_attachment_table, + arraysize(valid_backbuffer_attachment_table)), + blit_filter(valid_blit_filter_table, arraysize(valid_blit_filter_table)), + buffer_parameter(valid_buffer_parameter_table, + arraysize(valid_buffer_parameter_table)), + buffer_target(valid_buffer_target_table, + arraysize(valid_buffer_target_table)), + buffer_usage(valid_buffer_usage_table, + arraysize(valid_buffer_usage_table)), + capability(valid_capability_table, arraysize(valid_capability_table)), + cmp_function(valid_cmp_function_table, + arraysize(valid_cmp_function_table)), compressed_texture_format(), - draw_mode( - valid_draw_mode_table, arraysize(valid_draw_mode_table)), - dst_blend_factor( - valid_dst_blend_factor_table, arraysize( - valid_dst_blend_factor_table)), - equation( - valid_equation_table, arraysize(valid_equation_table)), - face_mode( - valid_face_mode_table, arraysize(valid_face_mode_table)), - face_type( - valid_face_type_table, arraysize(valid_face_type_table)), - false_only( - valid_false_only_table, arraysize(valid_false_only_table)), - frame_buffer_parameter( - valid_frame_buffer_parameter_table, arraysize( - valid_frame_buffer_parameter_table)), - frame_buffer_target( - valid_frame_buffer_target_table, arraysize( - valid_frame_buffer_target_table)), - g_l_state( - valid_g_l_state_table, arraysize(valid_g_l_state_table)), - get_max_index_type( - valid_get_max_index_type_table, arraysize( - valid_get_max_index_type_table)), - get_tex_param_target( - valid_get_tex_param_target_table, arraysize( - valid_get_tex_param_target_table)), - hint_mode( - valid_hint_mode_table, arraysize(valid_hint_mode_table)), - hint_target( - valid_hint_target_table, arraysize(valid_hint_target_table)), - index_type( - valid_index_type_table, arraysize(valid_index_type_table)), - pixel_store( - valid_pixel_store_table, arraysize(valid_pixel_store_table)), - pixel_store_alignment( - valid_pixel_store_alignment_table, arraysize( - valid_pixel_store_alignment_table)), - pixel_type( - valid_pixel_type_table, arraysize(valid_pixel_type_table)), - program_parameter( - valid_program_parameter_table, arraysize( - valid_program_parameter_table)), - query_object_parameter( - valid_query_object_parameter_table, arraysize( - valid_query_object_parameter_table)), - query_parameter( - valid_query_parameter_table, arraysize(valid_query_parameter_table)), - query_target( - valid_query_target_table, arraysize(valid_query_target_table)), - read_pixel_format( - valid_read_pixel_format_table, arraysize( - valid_read_pixel_format_table)), - read_pixel_type( - valid_read_pixel_type_table, arraysize(valid_read_pixel_type_table)), - render_buffer_format( - valid_render_buffer_format_table, arraysize( - valid_render_buffer_format_table)), - render_buffer_parameter( - valid_render_buffer_parameter_table, arraysize( - valid_render_buffer_parameter_table)), - render_buffer_target( - valid_render_buffer_target_table, arraysize( - valid_render_buffer_target_table)), - reset_status( - valid_reset_status_table, arraysize(valid_reset_status_table)), + draw_mode(valid_draw_mode_table, arraysize(valid_draw_mode_table)), + dst_blend_factor(valid_dst_blend_factor_table, + arraysize(valid_dst_blend_factor_table)), + equation(valid_equation_table, arraysize(valid_equation_table)), + face_mode(valid_face_mode_table, arraysize(valid_face_mode_table)), + face_type(valid_face_type_table, arraysize(valid_face_type_table)), + frame_buffer_parameter(valid_frame_buffer_parameter_table, + arraysize(valid_frame_buffer_parameter_table)), + frame_buffer_target(valid_frame_buffer_target_table, + arraysize(valid_frame_buffer_target_table)), + g_l_state(valid_g_l_state_table, arraysize(valid_g_l_state_table)), + get_max_index_type(valid_get_max_index_type_table, + arraysize(valid_get_max_index_type_table)), + get_tex_param_target(valid_get_tex_param_target_table, + arraysize(valid_get_tex_param_target_table)), + hint_mode(valid_hint_mode_table, arraysize(valid_hint_mode_table)), + hint_target(valid_hint_target_table, arraysize(valid_hint_target_table)), + index_type(valid_index_type_table, arraysize(valid_index_type_table)), + pixel_store(valid_pixel_store_table, arraysize(valid_pixel_store_table)), + pixel_store_alignment(valid_pixel_store_alignment_table, + arraysize(valid_pixel_store_alignment_table)), + pixel_type(valid_pixel_type_table, arraysize(valid_pixel_type_table)), + program_parameter(valid_program_parameter_table, + arraysize(valid_program_parameter_table)), + query_object_parameter(valid_query_object_parameter_table, + arraysize(valid_query_object_parameter_table)), + query_parameter(valid_query_parameter_table, + arraysize(valid_query_parameter_table)), + query_target(valid_query_target_table, + arraysize(valid_query_target_table)), + read_pixel_format(valid_read_pixel_format_table, + arraysize(valid_read_pixel_format_table)), + read_pixel_type(valid_read_pixel_type_table, + arraysize(valid_read_pixel_type_table)), + render_buffer_format(valid_render_buffer_format_table, + arraysize(valid_render_buffer_format_table)), + render_buffer_parameter(valid_render_buffer_parameter_table, + arraysize(valid_render_buffer_parameter_table)), + render_buffer_target(valid_render_buffer_target_table, + arraysize(valid_render_buffer_target_table)), + reset_status(valid_reset_status_table, + arraysize(valid_reset_status_table)), shader_binary_format(), - shader_parameter( - valid_shader_parameter_table, arraysize( - valid_shader_parameter_table)), - shader_precision( - valid_shader_precision_table, arraysize( - valid_shader_precision_table)), - shader_type( - valid_shader_type_table, arraysize(valid_shader_type_table)), - src_blend_factor( - valid_src_blend_factor_table, arraysize( - valid_src_blend_factor_table)), - stencil_op( - valid_stencil_op_table, arraysize(valid_stencil_op_table)), - string_type( - valid_string_type_table, arraysize(valid_string_type_table)), - texture_bind_target( - valid_texture_bind_target_table, arraysize( - valid_texture_bind_target_table)), - texture_border( - valid_texture_border_table, arraysize(valid_texture_border_table)), - texture_format( - valid_texture_format_table, arraysize(valid_texture_format_table)), - texture_internal_format( - valid_texture_internal_format_table, arraysize( - valid_texture_internal_format_table)), + shader_parameter(valid_shader_parameter_table, + arraysize(valid_shader_parameter_table)), + shader_precision(valid_shader_precision_table, + arraysize(valid_shader_precision_table)), + shader_type(valid_shader_type_table, arraysize(valid_shader_type_table)), + src_blend_factor(valid_src_blend_factor_table, + arraysize(valid_src_blend_factor_table)), + stencil_op(valid_stencil_op_table, arraysize(valid_stencil_op_table)), + string_type(valid_string_type_table, arraysize(valid_string_type_table)), + texture_bind_target(valid_texture_bind_target_table, + arraysize(valid_texture_bind_target_table)), + texture_format(valid_texture_format_table, + arraysize(valid_texture_format_table)), + texture_internal_format(valid_texture_internal_format_table, + arraysize(valid_texture_internal_format_table)), texture_internal_format_storage( - valid_texture_internal_format_storage_table, arraysize( - valid_texture_internal_format_storage_table)), - texture_mag_filter_mode( - valid_texture_mag_filter_mode_table, arraysize( - valid_texture_mag_filter_mode_table)), - texture_min_filter_mode( - valid_texture_min_filter_mode_table, arraysize( - valid_texture_min_filter_mode_table)), - texture_parameter( - valid_texture_parameter_table, arraysize( - valid_texture_parameter_table)), - texture_pool( - valid_texture_pool_table, arraysize(valid_texture_pool_table)), - texture_target( - valid_texture_target_table, arraysize(valid_texture_target_table)), - texture_usage( - valid_texture_usage_table, arraysize(valid_texture_usage_table)), - texture_wrap_mode( - valid_texture_wrap_mode_table, arraysize( - valid_texture_wrap_mode_table)), - vertex_attrib_size( - valid_vertex_attrib_size_table, arraysize( - valid_vertex_attrib_size_table)), - vertex_attrib_type( - valid_vertex_attrib_type_table, arraysize( - valid_vertex_attrib_type_table)), - vertex_attribute( - valid_vertex_attribute_table, arraysize( - valid_vertex_attribute_table)), - vertex_pointer( - valid_vertex_pointer_table, arraysize(valid_vertex_pointer_table)), - zero_only( - valid_zero_only_table, arraysize(valid_zero_only_table)) { + valid_texture_internal_format_storage_table, + arraysize(valid_texture_internal_format_storage_table)), + texture_mag_filter_mode(valid_texture_mag_filter_mode_table, + arraysize(valid_texture_mag_filter_mode_table)), + texture_min_filter_mode(valid_texture_min_filter_mode_table, + arraysize(valid_texture_min_filter_mode_table)), + texture_parameter(valid_texture_parameter_table, + arraysize(valid_texture_parameter_table)), + texture_pool(valid_texture_pool_table, + arraysize(valid_texture_pool_table)), + texture_target(valid_texture_target_table, + arraysize(valid_texture_target_table)), + texture_usage(valid_texture_usage_table, + arraysize(valid_texture_usage_table)), + texture_wrap_mode(valid_texture_wrap_mode_table, + arraysize(valid_texture_wrap_mode_table)), + vertex_attrib_size(valid_vertex_attrib_size_table, + arraysize(valid_vertex_attrib_size_table)), + vertex_attrib_type(valid_vertex_attrib_type_table, + arraysize(valid_vertex_attrib_type_table)), + vertex_attribute(valid_vertex_attribute_table, + arraysize(valid_vertex_attribute_table)), + vertex_pointer(valid_vertex_pointer_table, + arraysize(valid_vertex_pointer_table)) { } -#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_VALIDATION_IMPLEMENTATION_AUTOGEN_H_ // NOLINT - +#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_VALIDATION_IMPLEMENTATION_AUTOGEN_H_ diff --git a/chromium/gpu/command_buffer/service/gpu_control_service.cc b/chromium/gpu/command_buffer/service/gpu_control_service.cc index 7c0eb8c8044..f9f19eb2592 100644 --- a/chromium/gpu/command_buffer/service/gpu_control_service.cc +++ b/chromium/gpu/command_buffer/service/gpu_control_service.cc @@ -4,84 +4,21 @@ #include "gpu/command_buffer/service/gpu_control_service.h" -#include "gpu/command_buffer/client/gpu_memory_buffer_factory.h" #include "gpu/command_buffer/service/gpu_memory_buffer_manager.h" -#include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/query_manager.h" namespace gpu { GpuControlService::GpuControlService( GpuMemoryBufferManagerInterface* gpu_memory_buffer_manager, - GpuMemoryBufferFactory* gpu_memory_buffer_factory, - gles2::MailboxManager* mailbox_manager, - gles2::QueryManager* query_manager, - const gpu::Capabilities& decoder_capabilities) + gles2::QueryManager* query_manager) : gpu_memory_buffer_manager_(gpu_memory_buffer_manager), - gpu_memory_buffer_factory_(gpu_memory_buffer_factory), - mailbox_manager_(mailbox_manager), - query_manager_(query_manager), - capabilities_(decoder_capabilities) { - capabilities_.map_image = - gpu_memory_buffer_manager_ && gpu_memory_buffer_factory_; + query_manager_(query_manager) { } GpuControlService::~GpuControlService() { } -gpu::Capabilities GpuControlService::GetCapabilities() { - return capabilities_; -} - -gfx::GpuMemoryBuffer* GpuControlService::CreateGpuMemoryBuffer( - size_t width, - size_t height, - unsigned internalformat, - int32* id) { - *id = -1; - - CHECK(gpu_memory_buffer_factory_) << "No GPU memory buffer factory provided"; - linked_ptr<gfx::GpuMemoryBuffer> buffer = make_linked_ptr( - gpu_memory_buffer_factory_->CreateGpuMemoryBuffer(width, - height, - internalformat)); - if (!buffer.get()) - return NULL; - - static int32 next_id = 1; - *id = next_id++; - - if (!RegisterGpuMemoryBuffer(*id, - buffer->GetHandle(), - width, - height, - internalformat)) { - *id = -1; - return NULL; - } - - gpu_memory_buffers_[*id] = buffer; - return buffer.get(); -} - -void GpuControlService::DestroyGpuMemoryBuffer(int32 id) { - GpuMemoryBufferMap::iterator it = gpu_memory_buffers_.find(id); - if (it != gpu_memory_buffers_.end()) - gpu_memory_buffers_.erase(it); - - gpu_memory_buffer_manager_->DestroyGpuMemoryBuffer(id); -} - -uint32 GpuControlService::InsertSyncPoint() { - NOTREACHED(); - return 0u; -} - -void GpuControlService::SignalSyncPoint(uint32 sync_point, - const base::Closure& callback) { - NOTREACHED(); -} - void GpuControlService::SignalQuery(uint32 query_id, const base::Closure& callback) { DCHECK(query_manager_); @@ -92,42 +29,18 @@ void GpuControlService::SignalQuery(uint32 query_id, query->AddCallback(callback); } -void GpuControlService::SetSurfaceVisible(bool visible) { - NOTREACHED(); -} - -void GpuControlService::SendManagedMemoryStats( - const ManagedMemoryStats& stats) { - NOTREACHED(); -} - -void GpuControlService::Echo(const base::Closure& callback) { - NOTREACHED(); -} - -bool GpuControlService::RegisterGpuMemoryBuffer( +void GpuControlService::RegisterGpuMemoryBuffer( int32 id, gfx::GpuMemoryBufferHandle buffer, size_t width, size_t height, unsigned internalformat) { - return gpu_memory_buffer_manager_->RegisterGpuMemoryBuffer(id, - buffer, - width, - height, - internalformat); + gpu_memory_buffer_manager_->RegisterGpuMemoryBuffer( + id, buffer, width, height, internalformat); } -bool GpuControlService::GenerateMailboxNames( - unsigned num, std::vector<gpu::Mailbox>* names) { - DCHECK(names->empty()); - names->resize(num); - for (unsigned i = 0; i < num; ++i) { - gles2::MailboxName name; - mailbox_manager_->GenerateMailboxName(&name); - (*names)[i].SetName(name.key); - } - return true; +void GpuControlService::UnregisterGpuMemoryBuffer(int32 id) { + gpu_memory_buffer_manager_->UnregisterGpuMemoryBuffer(id); } } // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gpu_control_service.h b/chromium/gpu/command_buffer/service/gpu_control_service.h index 3764ad42136..9a64946384f 100644 --- a/chromium/gpu/command_buffer/service/gpu_control_service.h +++ b/chromium/gpu/command_buffer/service/gpu_control_service.h @@ -5,67 +5,36 @@ #ifndef GPU_COMMAND_BUFFER_SERVICE_GPU_CONTROL_SERVICE_H_ #define GPU_COMMAND_BUFFER_SERVICE_GPU_CONTROL_SERVICE_H_ -#include <map> - -#include "base/memory/linked_ptr.h" -#include "gpu/command_buffer/common/gpu_control.h" +#include "base/callback.h" +#include "gpu/command_buffer/common/capabilities.h" +#include "gpu/gpu_export.h" #include "ui/gfx/gpu_memory_buffer.h" namespace gpu { -class GpuMemoryBufferFactory; class GpuMemoryBufferManagerInterface; namespace gles2 { -class MailboxManager; class QueryManager; } -class GPU_EXPORT GpuControlService : public GpuControl { +class GPU_EXPORT GpuControlService { public: GpuControlService(GpuMemoryBufferManagerInterface* gpu_memory_buffer_manager, - GpuMemoryBufferFactory* gpu_memory_buffer_factory, - gles2::MailboxManager* mailbox_manager, - gles2::QueryManager* query_manager, - const gpu::Capabilities& decoder_capabilities); + gles2::QueryManager* query_manager); virtual ~GpuControlService(); + void SignalQuery(uint32 query, const base::Closure& callback); - // GpuControl implementation. - virtual gpu::Capabilities GetCapabilities() OVERRIDE; - virtual gfx::GpuMemoryBuffer* CreateGpuMemoryBuffer( - size_t width, - size_t height, - unsigned internalformat, - int32* id) OVERRIDE; - virtual void DestroyGpuMemoryBuffer(int32 id) OVERRIDE; - virtual bool GenerateMailboxNames(unsigned num, - std::vector<gpu::Mailbox>* names) OVERRIDE; - virtual uint32 InsertSyncPoint() OVERRIDE; - virtual void SignalSyncPoint(uint32 sync_point, - const base::Closure& callback) OVERRIDE; - virtual void SignalQuery(uint32 query, - const base::Closure& callback) OVERRIDE; - virtual void SetSurfaceVisible(bool visible) OVERRIDE; - virtual void SendManagedMemoryStats(const ManagedMemoryStats& stats) - OVERRIDE; - virtual void Echo(const base::Closure& callback) OVERRIDE; - - // Register an existing gpu memory buffer and get an ID that can be used - // to identify it in the command buffer. - bool RegisterGpuMemoryBuffer(int32 id, + void RegisterGpuMemoryBuffer(int32 id, gfx::GpuMemoryBufferHandle buffer, size_t width, size_t height, unsigned internalformat); + void UnregisterGpuMemoryBuffer(int32 id); private: GpuMemoryBufferManagerInterface* gpu_memory_buffer_manager_; - GpuMemoryBufferFactory* gpu_memory_buffer_factory_; - gles2::MailboxManager* mailbox_manager_; gles2::QueryManager* query_manager_; - typedef std::map<int32, linked_ptr<gfx::GpuMemoryBuffer> > GpuMemoryBufferMap; - GpuMemoryBufferMap gpu_memory_buffers_; - gpu::Capabilities capabilities_; DISALLOW_COPY_AND_ASSIGN(GpuControlService); }; diff --git a/chromium/gpu/command_buffer/service/gpu_memory_buffer_manager.h b/chromium/gpu/command_buffer/service/gpu_memory_buffer_manager.h index fb44ede7ed5..3ddcaad9981 100644 --- a/chromium/gpu/command_buffer/service/gpu_memory_buffer_manager.h +++ b/chromium/gpu/command_buffer/service/gpu_memory_buffer_manager.h @@ -15,12 +15,12 @@ class GPU_EXPORT GpuMemoryBufferManagerInterface { public: virtual ~GpuMemoryBufferManagerInterface() {} - virtual bool RegisterGpuMemoryBuffer(int32 id, + virtual void RegisterGpuMemoryBuffer(int32 id, gfx::GpuMemoryBufferHandle buffer, size_t width, size_t height, unsigned internalformat) = 0; - virtual void DestroyGpuMemoryBuffer(int32 id) = 0; + virtual void UnregisterGpuMemoryBuffer(int32 id) = 0; }; } // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gpu_scheduler.cc b/chromium/gpu/command_buffer/service/gpu_scheduler.cc index a40e9899842..3d159b66768 100644 --- a/chromium/gpu/command_buffer/service/gpu_scheduler.cc +++ b/chromium/gpu/command_buffer/service/gpu_scheduler.cc @@ -28,7 +28,7 @@ const int64 kUnscheduleFenceTimeOutDelay = 10000; const int64 kRescheduleTimeOutDelay = 1000; #endif -GpuScheduler::GpuScheduler(CommandBuffer* command_buffer, +GpuScheduler::GpuScheduler(CommandBufferServiceBase* command_buffer, AsyncAPIInterface* handler, gles2::GLES2Decoder* decoder) : command_buffer_(command_buffer), @@ -47,7 +47,7 @@ void GpuScheduler::PutChanged() { "gpu", "GpuScheduler:PutChanged", "decoder", decoder_ ? decoder_->GetLogger()->GetLogPrefix() : "None"); - CommandBuffer::State state = command_buffer_->GetState(); + CommandBuffer::State state = command_buffer_->GetLastState(); // If there is no parser, exit. if (!parser_.get()) { @@ -69,6 +69,8 @@ void GpuScheduler::PutChanged() { base::TimeTicks begin_time(base::TimeTicks::HighResNow()); error::Error error = error::kNoError; + if (decoder_) + decoder_->BeginDecoding(); while (!parser_->IsEmpty()) { if (IsPreempted()) break; @@ -108,6 +110,7 @@ void GpuScheduler::PutChanged() { command_buffer_->SetContextLostReason(decoder_->GetContextLostReason()); command_buffer_->SetParseError(error::kLostContext); } + decoder_->EndDecoding(); decoder_->AddProcessingCommandsTime( base::TimeTicks::HighResNow() - begin_time); } @@ -178,7 +181,7 @@ void GpuScheduler::SetSchedulingChangedCallback( scheduling_changed_callback_ = callback; } -Buffer GpuScheduler::GetSharedMemoryBuffer(int32 shm_id) { +scoped_refptr<Buffer> GpuScheduler::GetSharedMemoryBuffer(int32 shm_id) { return command_buffer_->GetTransferBuffer(shm_id); } @@ -187,8 +190,9 @@ void GpuScheduler::set_token(int32 token) { } bool GpuScheduler::SetGetBuffer(int32 transfer_buffer_id) { - Buffer ring_buffer = command_buffer_->GetTransferBuffer(transfer_buffer_id); - if (!ring_buffer.ptr) { + scoped_refptr<Buffer> ring_buffer = + command_buffer_->GetTransferBuffer(transfer_buffer_id); + if (!ring_buffer) { return false; } @@ -197,10 +201,7 @@ bool GpuScheduler::SetGetBuffer(int32 transfer_buffer_id) { } parser_->SetBuffer( - ring_buffer.ptr, - ring_buffer.size, - 0, - ring_buffer.size); + ring_buffer->memory(), ring_buffer->size(), 0, ring_buffer->size()); SetGetOffset(0); return true; diff --git a/chromium/gpu/command_buffer/service/gpu_scheduler.h b/chromium/gpu/command_buffer/service/gpu_scheduler.h index 8fb791cd3fd..5e073ca54e5 100644 --- a/chromium/gpu/command_buffer/service/gpu_scheduler.h +++ b/chromium/gpu/command_buffer/service/gpu_scheduler.h @@ -15,9 +15,9 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/shared_memory.h" #include "base/memory/weak_ptr.h" -#include "gpu/command_buffer/common/command_buffer.h" #include "gpu/command_buffer/service/cmd_buffer_engine.h" #include "gpu/command_buffer/service/cmd_parser.h" +#include "gpu/command_buffer/service/command_buffer_service.h" #include "gpu/command_buffer/service/gles2_cmd_decoder.h" #include "gpu/gpu_export.h" @@ -52,7 +52,7 @@ class GPU_EXPORT GpuScheduler : NON_EXPORTED_BASE(public CommandBufferEngine), public base::SupportsWeakPtr<GpuScheduler> { public: - GpuScheduler(CommandBuffer* command_buffer, + GpuScheduler(CommandBufferServiceBase* command_buffer, AsyncAPIInterface* handler, gles2::GLES2Decoder* decoder); @@ -83,7 +83,7 @@ class GPU_EXPORT GpuScheduler void SetSchedulingChangedCallback(const SchedulingChangedCallback& callback); // Implementation of CommandBufferEngine. - virtual Buffer GetSharedMemoryBuffer(int32 shm_id) OVERRIDE; + virtual scoped_refptr<Buffer> GetSharedMemoryBuffer(int32 shm_id) OVERRIDE; virtual void set_token(int32 token) OVERRIDE; virtual bool SetGetBuffer(int32 transfer_buffer_id) OVERRIDE; virtual bool SetGetOffset(int32 offset) OVERRIDE; @@ -114,7 +114,7 @@ class GPU_EXPORT GpuScheduler // The GpuScheduler holds a weak reference to the CommandBuffer. The // CommandBuffer owns the GpuScheduler and holds a strong reference to it // through the ProcessCommands callback. - CommandBuffer* command_buffer_; + CommandBufferServiceBase* command_buffer_; // The parser uses this to execute commands. AsyncAPIInterface* handler_; diff --git a/chromium/gpu/command_buffer/service/gpu_scheduler_unittest.cc b/chromium/gpu/command_buffer/service/gpu_scheduler_unittest.cc index 84e40c7c658..80e177aa489 100644 --- a/chromium/gpu/command_buffer/service/gpu_scheduler_unittest.cc +++ b/chromium/gpu/command_buffer/service/gpu_scheduler_unittest.cc @@ -33,18 +33,18 @@ class GpuSchedulerTest : public testing::Test { static const int32 kTransferBufferId = 123; virtual void SetUp() { - shared_memory_.reset(new ::base::SharedMemory); - shared_memory_->CreateAndMapAnonymous(kRingBufferSize); - buffer_ = static_cast<int32*>(shared_memory_->memory()); - shared_memory_buffer_.ptr = buffer_; - shared_memory_buffer_.size = kRingBufferSize; + scoped_ptr<base::SharedMemory> shared_memory(new ::base::SharedMemory); + shared_memory->CreateAndMapAnonymous(kRingBufferSize); + buffer_ = static_cast<int32*>(shared_memory->memory()); + shared_memory_buffer_ = + MakeBufferFromSharedMemory(shared_memory.Pass(), kRingBufferSize); memset(buffer_, 0, kRingBufferSize); command_buffer_.reset(new MockCommandBuffer); CommandBuffer::State default_state; default_state.num_entries = kRingBufferEntries; - ON_CALL(*command_buffer_.get(), GetState()) + ON_CALL(*command_buffer_.get(), GetLastState()) .WillByDefault(Return(default_state)); decoder_.reset(new gles2::MockGLES2Decoder()); @@ -64,7 +64,7 @@ class GpuSchedulerTest : public testing::Test { } error::Error GetError() { - return command_buffer_->GetState().error; + return command_buffer_->GetLastState().error; } #if defined(OS_MACOSX) @@ -72,8 +72,7 @@ class GpuSchedulerTest : public testing::Test { #endif base::MessageLoop message_loop; scoped_ptr<MockCommandBuffer> command_buffer_; - scoped_ptr<base::SharedMemory> shared_memory_; - Buffer shared_memory_buffer_; + scoped_refptr<Buffer> shared_memory_buffer_; int32* buffer_; scoped_ptr<gles2::MockGLES2Decoder> decoder_; scoped_ptr<GpuScheduler> scheduler_; @@ -83,7 +82,7 @@ TEST_F(GpuSchedulerTest, SchedulerDoesNothingIfRingBufferIsEmpty) { CommandBuffer::State state; state.put_offset = 0; - EXPECT_CALL(*command_buffer_, GetState()) + EXPECT_CALL(*command_buffer_, GetLastState()) .WillRepeatedly(Return(state)); EXPECT_CALL(*command_buffer_, SetParseError(_)) @@ -119,7 +118,7 @@ TEST_F(GpuSchedulerTest, ProcessesOneCommand) { CommandBuffer::State state; state.put_offset = 2; - EXPECT_CALL(*command_buffer_, GetState()) + EXPECT_CALL(*command_buffer_, GetLastState()) .WillRepeatedly(Return(state)); EXPECT_CALL(*command_buffer_, SetGetOffset(2)); @@ -143,7 +142,7 @@ TEST_F(GpuSchedulerTest, ProcessesTwoCommands) { CommandBuffer::State state; state.put_offset = 3; - EXPECT_CALL(*command_buffer_, GetState()) + EXPECT_CALL(*command_buffer_, GetLastState()) .WillRepeatedly(Return(state)); EXPECT_CALL(*decoder_, DoCommand(7, 1, &buffer_[0])) @@ -165,7 +164,7 @@ TEST_F(GpuSchedulerTest, SetsErrorCodeOnCommandBuffer) { CommandBuffer::State state; state.put_offset = 1; - EXPECT_CALL(*command_buffer_, GetState()) + EXPECT_CALL(*command_buffer_, GetLastState()) .WillRepeatedly(Return(state)); EXPECT_CALL(*decoder_, DoCommand(7, 0, &buffer_[0])) @@ -186,7 +185,7 @@ TEST_F(GpuSchedulerTest, ProcessCommandsDoesNothingAfterError) { CommandBuffer::State state; state.error = error::kGenericError; - EXPECT_CALL(*command_buffer_, GetState()) + EXPECT_CALL(*command_buffer_, GetLastState()) .WillRepeatedly(Return(state)); scheduler_->PutChanged(); @@ -196,7 +195,7 @@ TEST_F(GpuSchedulerTest, CanGetAddressOfSharedMemory) { EXPECT_CALL(*command_buffer_.get(), GetTransferBuffer(7)) .WillOnce(Return(shared_memory_buffer_)); - EXPECT_EQ(&buffer_[0], scheduler_->GetSharedMemoryBuffer(7).ptr); + EXPECT_EQ(&buffer_[0], scheduler_->GetSharedMemoryBuffer(7)->memory()); } ACTION_P2(SetPointee, address, value) { @@ -207,7 +206,7 @@ TEST_F(GpuSchedulerTest, CanGetSizeOfSharedMemory) { EXPECT_CALL(*command_buffer_.get(), GetTransferBuffer(7)) .WillOnce(Return(shared_memory_buffer_)); - EXPECT_EQ(kRingBufferSize, scheduler_->GetSharedMemoryBuffer(7).size); + EXPECT_EQ(kRingBufferSize, scheduler_->GetSharedMemoryBuffer(7)->size()); } TEST_F(GpuSchedulerTest, SetTokenForwardsToCommandBuffer) { diff --git a/chromium/gpu/command_buffer/service/gpu_service_test.cc b/chromium/gpu/command_buffer/service/gpu_service_test.cc new file mode 100644 index 00000000000..a51a54c7a48 --- /dev/null +++ b/chromium/gpu/command_buffer/service/gpu_service_test.cc @@ -0,0 +1,50 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/gpu_service_test.h" + +#include "gpu/command_buffer/service/test_helper.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_context_stub_with_extensions.h" +#include "ui/gl/gl_implementation.h" +#include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface.h" + +namespace gpu { +namespace gles2 { + +GpuServiceTest::GpuServiceTest() : ran_setup_(false), ran_teardown_(false) { +} + +GpuServiceTest::~GpuServiceTest() { + DCHECK(ran_teardown_); +} + +void GpuServiceTest::SetUp() { + testing::Test::SetUp(); + + gfx::SetGLGetProcAddressProc(gfx::MockGLInterface::GetGLProcAddress); + gfx::GLSurface::InitializeOneOffWithMockBindingsForTests(); + gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); + ::gfx::MockGLInterface::SetGLInterface(gl_.get()); + + context_ = new gfx::GLContextStubWithExtensions; + context_->AddExtensionsString(NULL); + context_->SetGLVersionString("3.0"); + gfx::GLSurface::InitializeDynamicMockBindingsForTests(context_); + ran_setup_ = true; +} + +void GpuServiceTest::TearDown() { + DCHECK(ran_setup_); + ::gfx::MockGLInterface::SetGLInterface(NULL); + gl_.reset(); + gfx::ClearGLBindings(); + ran_teardown_ = true; + + testing::Test::TearDown(); +} + +} // namespace gles2 +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gpu_service_test.h b/chromium/gpu/command_buffer/service/gpu_service_test.h new file mode 100644 index 00000000000..f37178784b1 --- /dev/null +++ b/chromium/gpu/command_buffer/service/gpu_service_test.h @@ -0,0 +1,42 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GPU_COMMAND_BUFFER_SERVICE_GPU_SERVICE_TEST_H_ +#define GPU_COMMAND_BUFFER_SERVICE_GPU_SERVICE_TEST_H_ + +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_mock.h" + +namespace gfx { +class GLContextStubWithExtensions; +} + +namespace gpu { +namespace gles2 { + +// Base class for tests that need mock GL bindings. +class GpuServiceTest : public testing::Test { + public: + GpuServiceTest(); + virtual ~GpuServiceTest(); + + protected: + virtual void SetUp() OVERRIDE; + virtual void TearDown() OVERRIDE; + + scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; + + private: + bool ran_setup_; + bool ran_teardown_; + scoped_refptr<gfx::GLContextStubWithExtensions> context_; +}; + +} // namespace gles2 +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_MAILBOX_SYNCHRONIZER_H_ diff --git a/chromium/gpu/command_buffer/service/gpu_switches.cc b/chromium/gpu/command_buffer/service/gpu_switches.cc index bff23c31391..0491c413e5e 100644 --- a/chromium/gpu/command_buffer/service/gpu_switches.cc +++ b/chromium/gpu/command_buffer/service/gpu_switches.cc @@ -40,17 +40,9 @@ const char kDisableGpuProgramCache[] = "disable-gpu-program-cache"; // Enforce GL minimums. const char kEnforceGLMinimums[] = "enforce-gl-minimums"; -// Force the use of a workaround for graphics hangs seen on certain -// Mac OS systems. Enabled by default (and can't be disabled) on known -// affected systems. -const char kForceGLFinishWorkaround[] = "force-glfinish-workaround"; - // Sets the total amount of memory that may be allocated for GPU resources const char kForceGpuMemAvailableMb[] = "force-gpu-mem-available-mb"; -// Force the synchronous copy path in compositing_iosurface_mac. -const char kForceSynchronousGLReadPixels[] = "force-synchronous-glreadpixels"; - // Pass a set of GpuDriverBugWorkaroundType ids, seperated by ','. const char kGpuDriverBugWorkarounds[] = "gpu-driver-bug-workarounds"; @@ -75,9 +67,7 @@ const char* kGpuSwitches[] = { kEnableGPUServiceLoggingGPU, kDisableGpuProgramCache, kEnforceGLMinimums, - kForceGLFinishWorkaround, kForceGpuMemAvailableMb, - kForceSynchronousGLReadPixels, kGpuDriverBugWorkarounds, kGpuProgramCacheSizeKb, kDisableGpuShaderDiskCache, diff --git a/chromium/gpu/command_buffer/service/gpu_switches.h b/chromium/gpu/command_buffer/service/gpu_switches.h index 7916d690142..d582b7ae267 100644 --- a/chromium/gpu/command_buffer/service/gpu_switches.h +++ b/chromium/gpu/command_buffer/service/gpu_switches.h @@ -21,9 +21,7 @@ GPU_EXPORT extern const char kEnableGPUDebugging[]; GPU_EXPORT extern const char kEnableGPUServiceLoggingGPU[]; GPU_EXPORT extern const char kDisableGpuProgramCache[]; GPU_EXPORT extern const char kEnforceGLMinimums[]; -GPU_EXPORT extern const char kForceGLFinishWorkaround[]; GPU_EXPORT extern const char kForceGpuMemAvailableMb[]; -GPU_EXPORT extern const char kForceSynchronousGLReadPixels[]; GPU_EXPORT extern const char kGpuDriverBugWorkarounds[]; GPU_EXPORT extern const char kGpuProgramCacheSizeKb[]; GPU_EXPORT extern const char kDisableGpuShaderDiskCache[]; diff --git a/chromium/gpu/command_buffer/service/gpu_tracer.cc b/chromium/gpu/command_buffer/service/gpu_tracer.cc index 413dc68739f..2cd38e79ca4 100644 --- a/chromium/gpu/command_buffer/service/gpu_tracer.cc +++ b/chromium/gpu/command_buffer/service/gpu_tracer.cc @@ -8,111 +8,62 @@ #include "base/bind.h" #include "base/debug/trace_event.h" -#include "base/memory/weak_ptr.h" #include "base/strings/string_util.h" -#include "base/threading/thread.h" #include "base/time/time.h" -#include "ui/gl/gl_bindings.h" +#include "gpu/command_buffer/common/gles2_cmd_utils.h" namespace gpu { namespace gles2 { -namespace { - -class Outputter; static const unsigned int kProcessInterval = 16; -static Outputter* g_outputter_thread = NULL; +static TraceOutputter* g_outputter_thread = NULL; -class Outputter - : private base::Thread, - public base::RefCounted<Outputter> { - public: - static scoped_refptr<Outputter> Create(const std::string& name) { - if (!g_outputter_thread) { - g_outputter_thread = new Outputter(name); - g_outputter_thread->Start(); - g_outputter_thread->Stop(); - } - return g_outputter_thread; +scoped_refptr<TraceOutputter> TraceOutputter::Create(const std::string& name) { + if (!g_outputter_thread) { + g_outputter_thread = new TraceOutputter(name); } + return g_outputter_thread; +} - uint64 Id() { return thread_id(); } - - private: - friend class base::RefCounted<Outputter>; - - explicit Outputter(const std::string& name) : base::Thread(name.c_str()) {} - - virtual ~Outputter() { - g_outputter_thread = NULL; - } - - DISALLOW_COPY_AND_ASSIGN(Outputter); -}; - -class Trace : public base::RefCounted<Trace> { - public: - explicit Trace(const std::string& name) : name_(name) {} - - virtual void Start() = 0; - virtual void End() = 0; - - // True if the the results of this query are available. - virtual bool IsAvailable() = 0; - - virtual bool IsProcessable() { return true; } - virtual void Process() = 0; - - virtual const std::string& name() { - return name_; - } - - protected: - virtual ~Trace() {} - - private: - friend class base::RefCounted<Trace>; - - std::string name_; - - DISALLOW_COPY_AND_ASSIGN(Trace); -}; - -class GLARBTimerTrace : public Trace { - public: - GLARBTimerTrace(scoped_refptr<Outputter> outputter, const std::string& name, - int64 offset); - - // Implementation of Tracer - virtual void Start() OVERRIDE; - virtual void End() OVERRIDE; - virtual bool IsAvailable() OVERRIDE; - virtual void Process() OVERRIDE; - - private: - virtual ~GLARBTimerTrace(); - - void Output(); - - scoped_refptr<Outputter> outputter_; - - int64 offset_; - int64 start_time_; - int64 end_time_; - bool end_requested_; - - GLuint queries_[2]; +TraceOutputter::TraceOutputter(const std::string& name) + : named_thread_(name.c_str()), local_trace_id_(0) { + named_thread_.Start(); + named_thread_.Stop(); +} - DISALLOW_COPY_AND_ASSIGN(GLARBTimerTrace); -}; +TraceOutputter::~TraceOutputter() { g_outputter_thread = NULL; } + +void TraceOutputter::Trace(const std::string& name, + int64 start_time, + int64 end_time) { + TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0( + TRACE_DISABLED_BY_DEFAULT("gpu.device"), + name.c_str(), + local_trace_id_, + named_thread_.thread_id(), + start_time); + TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0( + TRACE_DISABLED_BY_DEFAULT("gpu.device"), + name.c_str(), + local_trace_id_, + named_thread_.thread_id(), + end_time); + ++local_trace_id_; +} class NoopTrace : public Trace { public: explicit NoopTrace(const std::string& name) : Trace(name) {} // Implementation of Tracer - virtual void Start() OVERRIDE {} - virtual void End() OVERRIDE {} + virtual void Start() OVERRIDE { + TRACE_EVENT_COPY_ASYNC_BEGIN0( + TRACE_DISABLED_BY_DEFAULT("gpu.service"), name().c_str(), this); + } + virtual void End() OVERRIDE { + TRACE_EVENT_COPY_ASYNC_END0( + TRACE_DISABLED_BY_DEFAULT("gpu.service"), name().c_str(), this); + } virtual bool IsAvailable() OVERRIDE { return true; } virtual bool IsProcessable() OVERRIDE { return false; } virtual void Process() OVERRIDE {} @@ -123,37 +74,57 @@ class NoopTrace : public Trace { DISALLOW_COPY_AND_ASSIGN(NoopTrace); }; +struct TraceMarker { + TraceMarker(const std::string& name, GpuTracerSource source) + : name_(name), source_(source) {} + + std::string name_; + GpuTracerSource source_; + scoped_refptr<Trace> trace_; +}; + class GPUTracerImpl : public GPUTracer, public base::SupportsWeakPtr<GPUTracerImpl> { public: GPUTracerImpl() - : gpu_category_enabled_( - TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED("gpu")), - process_posted_(false) { - } + : gpu_trace_srv_category(TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED( + TRACE_DISABLED_BY_DEFAULT("gpu.service"))), + gpu_trace_dev_category(TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED( + TRACE_DISABLED_BY_DEFAULT("gpu.device"))), + gpu_executing_(false), + process_posted_(false) {} virtual ~GPUTracerImpl() {} // Implementation of gpu::gles2::GPUTracer - virtual bool Begin(const std::string& name) OVERRIDE; - virtual bool End() OVERRIDE; + virtual bool BeginDecoding() OVERRIDE; + virtual bool EndDecoding() OVERRIDE; + virtual bool Begin(const std::string& name, GpuTracerSource source) OVERRIDE; + virtual bool End(GpuTracerSource source) OVERRIDE; virtual const std::string& CurrentName() const OVERRIDE; + virtual bool IsTracing() OVERRIDE { + return (*gpu_trace_srv_category != 0) || (*gpu_trace_dev_category != 0); + } + virtual void CalculateTimerOffset() {} // Process any completed traces. virtual void Process(); + virtual void ProcessTraces(); protected: // Create a new trace. virtual scoped_refptr<Trace> CreateTrace(const std::string& name); - const unsigned char* gpu_category_enabled_; + const unsigned char* gpu_trace_srv_category; + const unsigned char* gpu_trace_dev_category; - private: + protected: void IssueProcessTask(); - scoped_refptr<Trace> current_trace_; + std::vector<TraceMarker> markers_; std::deque<scoped_refptr<Trace> > traces_; + bool gpu_executing_; bool process_posted_; DISALLOW_COPY_AND_ASSIGN(GPUTracerImpl); @@ -161,28 +132,36 @@ class GPUTracerImpl class GPUTracerARBTimerQuery : public GPUTracerImpl { public: - GPUTracerARBTimerQuery(); + explicit GPUTracerARBTimerQuery(gles2::GLES2Decoder* decoder); virtual ~GPUTracerARBTimerQuery(); // Implementation of GPUTracerImpl - virtual void Process() OVERRIDE; + virtual void ProcessTraces() OVERRIDE; - private: + protected: // Implementation of GPUTracerImpl. + virtual bool BeginDecoding() OVERRIDE; + virtual bool EndDecoding() OVERRIDE; virtual scoped_refptr<Trace> CreateTrace(const std::string& name) OVERRIDE; - - void CalculateTimerOffset(); + virtual void CalculateTimerOffset() OVERRIDE; scoped_refptr<Outputter> outputter_; + bool gpu_timing_synced_; int64 timer_offset_; - int64 last_offset_check_; + + gles2::GLES2Decoder* decoder_; DISALLOW_COPY_AND_ASSIGN(GPUTracerARBTimerQuery); }; +bool Trace::IsProcessable() { return true; } + +const std::string& Trace::name() { return name_; } + GLARBTimerTrace::GLARBTimerTrace(scoped_refptr<Outputter> outputter, - const std::string& name, int64 offset) + const std::string& name, + int64 offset) : Trace(name), outputter_(outputter), offset_(offset), @@ -192,16 +171,19 @@ GLARBTimerTrace::GLARBTimerTrace(scoped_refptr<Outputter> outputter, glGenQueries(2, queries_); } -GLARBTimerTrace::~GLARBTimerTrace() { -} +GLARBTimerTrace::~GLARBTimerTrace() { glDeleteQueries(2, queries_); } void GLARBTimerTrace::Start() { + TRACE_EVENT_COPY_ASYNC_BEGIN0( + TRACE_DISABLED_BY_DEFAULT("gpu.service"), name().c_str(), this); glQueryCounter(queries_[0], GL_TIMESTAMP); } void GLARBTimerTrace::End() { glQueryCounter(queries_[1], GL_TIMESTAMP); end_requested_ = true; + TRACE_EVENT_COPY_ASYNC_END0( + TRACE_DISABLED_BY_DEFAULT("gpu.service"), name().c_str(), this); } bool GLARBTimerTrace::IsAvailable() { @@ -216,63 +198,116 @@ bool GLARBTimerTrace::IsAvailable() { void GLARBTimerTrace::Process() { DCHECK(IsAvailable()); - GLint64 timestamp; + GLuint64 timestamp; // TODO(dsinclair): It's possible for the timer to wrap during the start/end. // We need to detect if the end is less then the start and correct for the // wrapping. - glGetQueryObjecti64v(queries_[0], GL_QUERY_RESULT, ×tamp); + glGetQueryObjectui64v(queries_[0], GL_QUERY_RESULT, ×tamp); start_time_ = (timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_; - glGetQueryObjecti64v(queries_[1], GL_QUERY_RESULT, ×tamp); + glGetQueryObjectui64v(queries_[1], GL_QUERY_RESULT, ×tamp); end_time_ = (timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_; glDeleteQueries(2, queries_); + outputter_->Trace(name(), start_time_, end_time_); +} + +bool GPUTracerImpl::BeginDecoding() { + if (gpu_executing_) + return false; - TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("gpu", name().c_str(), - this, outputter_->Id(), start_time_); - TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0("gpu", name().c_str(), - this, outputter_->Id(), end_time_); + gpu_executing_ = true; + + if (IsTracing()) { + // Begin a Trace for all active markers + for (size_t i = 0; i < markers_.size(); i++) { + markers_[i].trace_ = CreateTrace(markers_[i].name_); + markers_[i].trace_->Start(); + } + } + return true; } -bool GPUTracerImpl::Begin(const std::string& name) { - // Make sure we are not nesting trace commands. - if (current_trace_.get()) +bool GPUTracerImpl::EndDecoding() { + if (!gpu_executing_) return false; - current_trace_ = CreateTrace(name); - current_trace_->Start(); + // End Trace for all active markers + if (IsTracing()) { + for (size_t i = 0; i < markers_.size(); i++) { + if (markers_[i].trace_) { + markers_[i].trace_->End(); + if (markers_[i].trace_->IsProcessable()) + traces_.push_back(markers_[i].trace_); + markers_[i].trace_ = 0; + } + } + IssueProcessTask(); + } + + gpu_executing_ = false; return true; } -bool GPUTracerImpl::End() { - if (!current_trace_.get()) +bool GPUTracerImpl::Begin(const std::string& name, GpuTracerSource source) { + if (!gpu_executing_) return false; - current_trace_->End(); - if (current_trace_->IsProcessable()) - traces_.push_back(current_trace_); - current_trace_ = NULL; + // Push new marker from given 'source' + markers_.push_back(TraceMarker(name, source)); - IssueProcessTask(); + // Create trace + if (IsTracing()) { + scoped_refptr<Trace> trace = CreateTrace(name); + trace->Start(); + markers_.back().trace_ = trace; + } return true; } +bool GPUTracerImpl::End(GpuTracerSource source) { + if (!gpu_executing_) + return false; + + // Pop last marker with matching 'source' + for (int i = markers_.size() - 1; i >= 0; i--) { + if (markers_[i].source_ == source) { + // End trace + if (IsTracing()) { + scoped_refptr<Trace> trace = markers_[i].trace_; + if (trace) { + trace->End(); + if (trace->IsProcessable()) + traces_.push_back(trace); + IssueProcessTask(); + } + } + + markers_.erase(markers_.begin() + i); + return true; + } + } + return false; +} + void GPUTracerImpl::Process() { process_posted_ = false; + ProcessTraces(); + IssueProcessTask(); +} +void GPUTracerImpl::ProcessTraces() { while (!traces_.empty() && traces_.front()->IsAvailable()) { traces_.front()->Process(); traces_.pop_front(); } - - IssueProcessTask(); } const std::string& GPUTracerImpl::CurrentName() const { - if (!current_trace_.get()) + if (markers_.empty()) return base::EmptyString(); - return current_trace_->name(); + return markers_.back().name_; } scoped_refptr<Trace> GPUTracerImpl::CreateTrace(const std::string& name) { @@ -290,12 +325,9 @@ void GPUTracerImpl::IssueProcessTask() { base::TimeDelta::FromMilliseconds(kProcessInterval)); } -GPUTracerARBTimerQuery::GPUTracerARBTimerQuery() - : GPUTracerImpl(), - timer_offset_(0), - last_offset_check_(0) { - CalculateTimerOffset(); - outputter_ = Outputter::Create("GL_ARB_timer_query"); +GPUTracerARBTimerQuery::GPUTracerARBTimerQuery(gles2::GLES2Decoder* decoder) + : timer_offset_(0), decoder_(decoder) { + outputter_ = TraceOutputter::Create("GL_ARB_timer_query"); } GPUTracerARBTimerQuery::~GPUTracerARBTimerQuery() { @@ -303,43 +335,82 @@ GPUTracerARBTimerQuery::~GPUTracerARBTimerQuery() { scoped_refptr<Trace> GPUTracerARBTimerQuery::CreateTrace( const std::string& name) { - if (*gpu_category_enabled_) + if (*gpu_trace_dev_category) return new GLARBTimerTrace(outputter_, name, timer_offset_); return GPUTracerImpl::CreateTrace(name); } -void GPUTracerARBTimerQuery::Process() { - GPUTracerImpl::Process(); +bool GPUTracerARBTimerQuery::BeginDecoding() { + if (*gpu_trace_dev_category) { + // Make sure timing is synced before tracing + if (!gpu_timing_synced_) { + CalculateTimerOffset(); + gpu_timing_synced_ = true; + } + } else { + // If GPU device category is off, invalidate timing sync + gpu_timing_synced_ = false; + } - if (*gpu_category_enabled_ && - (last_offset_check_ + base::Time::kMicrosecondsPerSecond) < - base::TimeTicks::NowFromSystemTraceTime().ToInternalValue()) - CalculateTimerOffset(); + return GPUTracerImpl::BeginDecoding(); +} + +bool GPUTracerARBTimerQuery::EndDecoding() { + bool ret = GPUTracerImpl::EndDecoding(); + + // NOTE(vmiura_: glFlush() here can help give better trace results, + // but it distorts the normal device behavior. + return ret; +} + +void GPUTracerARBTimerQuery::ProcessTraces() { + TRACE_EVENT0("gpu", "GPUTracerARBTimerQuery::ProcessTraces"); + + // Make owning decoder's GL context current + if (!decoder_->MakeCurrent()) { + // Skip subsequent GL calls if MakeCurrent fails + traces_.clear(); + return; + } + + while (!traces_.empty() && traces_.front()->IsAvailable()) { + traces_.front()->Process(); + traces_.pop_front(); + } + + // Clear pending traces if there were are any errors + GLenum err = glGetError(); + if (err != GL_NO_ERROR) + traces_.clear(); } void GPUTracerARBTimerQuery::CalculateTimerOffset() { - TRACE_EVENT0("gpu", "CalculateTimerOffset"); - // TODO(dsinclair): Change to glGetInteger64v. + TRACE_EVENT0("gpu", "GPUTracerARBTimerQuery::CalculateTimerOffset"); + + // NOTE(vmiura): It would be better to use glGetInteger64v, however + // it's not available everywhere. GLuint64 gl_now = 0; GLuint query; + glFinish(); glGenQueries(1, &query); - glQueryCounter(query, GL_TIMESTAMP); + glFinish(); glGetQueryObjectui64v(query, GL_QUERY_RESULT, &gl_now); base::TimeTicks system_now = base::TimeTicks::NowFromSystemTraceTime(); gl_now /= base::Time::kNanosecondsPerMicrosecond; timer_offset_ = system_now.ToInternalValue() - gl_now; glDeleteQueries(1, &query); - - last_offset_check_ = system_now.ToInternalValue(); } -} // namespace +GPUTracer::GPUTracer() {} + +GPUTracer::~GPUTracer() {} -scoped_ptr<GPUTracer> GPUTracer::Create() { - if (gfx::g_driver_gl.ext.b_GL_ARB_timer_query) - return scoped_ptr<GPUTracer>(new GPUTracerARBTimerQuery()); +scoped_ptr<GPUTracer> GPUTracer::Create(gles2::GLES2Decoder* decoder) { + if (gfx::g_driver_gl.ext.b_GL_ARB_timer_query) { + return scoped_ptr<GPUTracer>(new GPUTracerARBTimerQuery(decoder)); + } return scoped_ptr<GPUTracer>(new GPUTracerImpl()); } diff --git a/chromium/gpu/command_buffer/service/gpu_tracer.h b/chromium/gpu/command_buffer/service/gpu_tracer.h index f64455c0671..7daea897db6 100644 --- a/chromium/gpu/command_buffer/service/gpu_tracer.h +++ b/chromium/gpu/command_buffer/service/gpu_tracer.h @@ -10,23 +10,43 @@ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" +#include "base/threading/thread.h" +#include "gpu/command_buffer/service/gles2_cmd_decoder.h" +#include "gpu/gpu_export.h" +#include "ui/gl/gl_bindings.h" namespace gpu { namespace gles2 { +// Id used to keep trace namespaces separate +enum GpuTracerSource { + kTraceGroupMarker = 0, + kTraceCHROMIUM = 1, + kTraceDecoder = 2, +}; + // Traces GPU Commands. class GPUTracer { public: - static scoped_ptr<GPUTracer> Create(); + static scoped_ptr<GPUTracer> Create(gles2::GLES2Decoder* decoder); + + GPUTracer(); + virtual ~GPUTracer(); + + // Scheduled processing in decoder begins. + virtual bool BeginDecoding() = 0; + + // Scheduled processing in decoder ends. + virtual bool EndDecoding() = 0; - GPUTracer() {} - virtual ~GPUTracer() {} + // Begin a trace marker. + virtual bool Begin(const std::string& name, GpuTracerSource source) = 0; - // Begin a trace. - virtual bool Begin(const std::string& name) = 0; + // End the last started trace marker. + virtual bool End(GpuTracerSource source) = 0; - // End the last started trace. - virtual bool End() = 0; + virtual bool IsTracing() = 0; // Retrieve the name of the current open trace. // Returns empty string if no current open trace. @@ -36,6 +56,90 @@ class GPUTracer { DISALLOW_COPY_AND_ASSIGN(GPUTracer); }; +class Outputter : public base::RefCounted<Outputter> { + public: + virtual void Trace(const std::string& name, + int64 start_time, + int64 end_time) = 0; + + protected: + virtual ~Outputter() {} + friend class base::RefCounted<Outputter>; +}; + +class TraceOutputter : public Outputter { + public: + static scoped_refptr<TraceOutputter> Create(const std::string& name); + virtual void Trace(const std::string& name, + int64 start_time, + int64 end_time) OVERRIDE; + + protected: + friend class base::RefCounted<Outputter>; + explicit TraceOutputter(const std::string& name); + virtual ~TraceOutputter(); + + base::Thread named_thread_; + uint64 local_trace_id_; + + DISALLOW_COPY_AND_ASSIGN(TraceOutputter); +}; + +class GPU_EXPORT Trace : public base::RefCounted<Trace> { + public: + explicit Trace(const std::string& name) : name_(name) {} + + virtual void Start() = 0; + virtual void End() = 0; + + // True if the the results of this query are available. + virtual bool IsAvailable() = 0; + + virtual bool IsProcessable(); + virtual void Process() = 0; + + virtual const std::string& name(); + + protected: + virtual ~Trace() {} + + private: + friend class base::RefCounted<Trace>; + + std::string name_; + + DISALLOW_COPY_AND_ASSIGN(Trace); +}; + +class GPU_EXPORT GLARBTimerTrace : public Trace { + public: + GLARBTimerTrace(scoped_refptr<Outputter> outputter, + const std::string& name, + int64 offset); + + // Implementation of Tracer + virtual void Start() OVERRIDE; + virtual void End() OVERRIDE; + virtual bool IsAvailable() OVERRIDE; + virtual void Process() OVERRIDE; + + private: + virtual ~GLARBTimerTrace(); + + void Output(); + + scoped_refptr<Outputter> outputter_; + + int64 offset_; + int64 start_time_; + int64 end_time_; + bool end_requested_; + + GLuint queries_[2]; + + DISALLOW_COPY_AND_ASSIGN(GLARBTimerTrace); +}; + } // namespace gles2 } // namespace gpu diff --git a/chromium/gpu/command_buffer/service/gpu_tracer_unittest.cc b/chromium/gpu/command_buffer/service/gpu_tracer_unittest.cc new file mode 100644 index 00000000000..735498c87e5 --- /dev/null +++ b/chromium/gpu/command_buffer/service/gpu_tracer_unittest.cc @@ -0,0 +1,209 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <map> +#include <set> + +#include "gpu/command_buffer/service/gpu_service_test.h" +#include "gpu/command_buffer/service/gpu_tracer.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_mock.h" + +namespace gpu { +namespace gles2 { + +using ::testing::InvokeWithoutArgs; +using ::testing::Return; +using ::testing::ReturnRef; +using ::testing::ReturnPointee; +using ::testing::NotNull; +using ::testing::ElementsAreArray; +using ::testing::ElementsAre; +using ::testing::SetArrayArgument; +using ::testing::AtLeast; +using ::testing::SetArgPointee; +using ::testing::Pointee; +using ::testing::Unused; +using ::testing::Invoke; +using ::testing::_; + +class MockOutputter : public Outputter { + public: + MockOutputter() {} + MOCK_METHOD3(Trace, + void(const std::string& name, int64 start_time, int64 end_time)); + + protected: + ~MockOutputter() {} +}; + +class GlFakeQueries { + public: + GlFakeQueries() {} + + void Reset() { + current_time_ = 0; + next_query_id_ = 23; + alloced_queries_.clear(); + query_timestamp_.clear(); + } + + void SetCurrentGLTime(GLint64 current_time) { current_time_ = current_time; } + + void GenQueries(GLsizei n, GLuint* ids) { + for (GLsizei i = 0; i < n; i++) { + ids[i] = next_query_id_++; + alloced_queries_.insert(ids[i]); + } + } + + void DeleteQueries(GLsizei n, const GLuint* ids) { + for (GLsizei i = 0; i < n; i++) { + alloced_queries_.erase(ids[i]); + query_timestamp_.erase(ids[i]); + } + } + + void GetQueryObjectiv(GLuint id, GLenum pname, GLint* params) { + switch (pname) { + case GL_QUERY_RESULT_AVAILABLE: { + std::map<GLuint, GLint64>::iterator it = query_timestamp_.find(id); + if (it != query_timestamp_.end() && it->second <= current_time_) + *params = 1; + else + *params = 0; + break; + } + default: + ASSERT_TRUE(false); + } + } + + void QueryCounter(GLuint id, GLenum target) { + switch (target) { + case GL_TIMESTAMP: + ASSERT_TRUE(alloced_queries_.find(id) != alloced_queries_.end()); + query_timestamp_[id] = current_time_; + break; + default: + ASSERT_TRUE(false); + } + } + + void GetQueryObjectui64v(GLuint id, GLenum pname, GLuint64* params) { + switch (pname) { + case GL_QUERY_RESULT: + ASSERT_TRUE(query_timestamp_.find(id) != query_timestamp_.end()); + *params = query_timestamp_.find(id)->second; + break; + default: + ASSERT_TRUE(false); + } + } + + protected: + GLint64 current_time_; + GLuint next_query_id_; + std::set<GLuint> alloced_queries_; + std::map<GLuint, GLint64> query_timestamp_; +}; + +class GpuTracerTest : public GpuServiceTest { + public: + GpuTracerTest() {} + + /////////////////////////////////////////////////////////////////////////// + + protected: + virtual void SetUp() { + GpuServiceTest::SetUp(); + gl_fake_queries_.Reset(); + } + + virtual void TearDown() { + gl_.reset(); + gl_fake_queries_.Reset(); + GpuServiceTest::TearDown(); + } + + void SetupTimerQueryMocks() { + // Delegate query APIs used by GLARBTimerTrace to a GlFakeQueries + EXPECT_CALL(*gl_, GenQueries(_, NotNull())).Times(AtLeast(1)).WillOnce( + Invoke(&gl_fake_queries_, &GlFakeQueries::GenQueries)); + + EXPECT_CALL(*gl_, GetQueryObjectiv(_, GL_QUERY_RESULT_AVAILABLE, NotNull())) + .Times(AtLeast(2)) + .WillRepeatedly( + Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectiv)); + + EXPECT_CALL(*gl_, QueryCounter(_, GL_TIMESTAMP)) + .Times(AtLeast(2)) + .WillRepeatedly( + Invoke(&gl_fake_queries_, &GlFakeQueries::QueryCounter)); + + EXPECT_CALL(*gl_, GetQueryObjectui64v(_, GL_QUERY_RESULT, NotNull())) + .Times(AtLeast(2)) + .WillRepeatedly( + Invoke(&gl_fake_queries_, &GlFakeQueries::GetQueryObjectui64v)); + + EXPECT_CALL(*gl_, DeleteQueries(2, NotNull())) + .Times(AtLeast(1)) + .WillRepeatedly( + Invoke(&gl_fake_queries_, &GlFakeQueries::DeleteQueries)); + } + + GlFakeQueries gl_fake_queries_; +}; + +TEST_F(GpuTracerTest, GLARBTimerTrace) { + // Test basic timer query functionality + { + MockOutputter* outputter = new MockOutputter(); + scoped_refptr<Outputter> outputter_ref = outputter; + + SetupTimerQueryMocks(); + + // Expected results + const std::string trace_name("trace_test"); + const int64 offset_time = 3231; + const GLint64 start_timestamp = 7 * base::Time::kNanosecondsPerMicrosecond; + const GLint64 end_timestamp = 32 * base::Time::kNanosecondsPerMicrosecond; + const int64 expect_start_time = + (start_timestamp / base::Time::kNanosecondsPerMicrosecond) + + offset_time; + const int64 expect_end_time = + (end_timestamp / base::Time::kNanosecondsPerMicrosecond) + offset_time; + + // Expected Outputter::Trace call + EXPECT_CALL(*outputter, + Trace(trace_name, expect_start_time, expect_end_time)); + + scoped_refptr<GLARBTimerTrace> trace = + new GLARBTimerTrace(outputter_ref, trace_name, offset_time); + + gl_fake_queries_.SetCurrentGLTime(start_timestamp); + trace->Start(); + + // Shouldn't be available before End() call + gl_fake_queries_.SetCurrentGLTime(end_timestamp); + EXPECT_FALSE(trace->IsAvailable()); + + trace->End(); + + // Shouldn't be available until the queries complete + gl_fake_queries_.SetCurrentGLTime(end_timestamp - + base::Time::kNanosecondsPerMicrosecond); + EXPECT_FALSE(trace->IsAvailable()); + + // Now it should be available + gl_fake_queries_.SetCurrentGLTime(end_timestamp); + EXPECT_TRUE(trace->IsAvailable()); + + // Proces should output expected Trace results to MockOutputter + trace->Process(); + } +} + +} // namespace gles2 +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/image_manager.cc b/chromium/gpu/command_buffer/service/image_manager.cc index f39eba21c8a..a3ac4350c87 100644 --- a/chromium/gpu/command_buffer/service/image_manager.cc +++ b/chromium/gpu/command_buffer/service/image_manager.cc @@ -15,19 +15,19 @@ ImageManager::ImageManager() : release_after_use_(false) { ImageManager::~ImageManager() { } -bool ImageManager::RegisterGpuMemoryBuffer(int32 id, +void ImageManager::RegisterGpuMemoryBuffer(int32 id, gfx::GpuMemoryBufferHandle buffer, size_t width, size_t height, unsigned internalformat) { if (id <= 0) { DVLOG(0) << "Cannot register GPU memory buffer with non-positive ID."; - return false; + return; } if (LookupImage(id)) { DVLOG(0) << "GPU memory buffer ID already in use."; - return false; + return; } scoped_refptr<gfx::GLImage> gl_image = @@ -35,16 +35,15 @@ bool ImageManager::RegisterGpuMemoryBuffer(int32 id, gfx::Size(width, height), internalformat); if (!gl_image) - return false; + return; if (release_after_use_) gl_image->SetReleaseAfterUse(); AddImage(gl_image.get(), id); - return true; } -void ImageManager::DestroyGpuMemoryBuffer(int32 id) { +void ImageManager::UnregisterGpuMemoryBuffer(int32 id) { RemoveImage(id); } diff --git a/chromium/gpu/command_buffer/service/image_manager.h b/chromium/gpu/command_buffer/service/image_manager.h index 51e006d7836..95d836f232e 100644 --- a/chromium/gpu/command_buffer/service/image_manager.h +++ b/chromium/gpu/command_buffer/service/image_manager.h @@ -26,12 +26,12 @@ class GPU_EXPORT ImageManager ImageManager(); // Overridden from GpuMemoryBufferManagerInterface: - virtual bool RegisterGpuMemoryBuffer(int32 id, + virtual void RegisterGpuMemoryBuffer(int32 id, gfx::GpuMemoryBufferHandle buffer, size_t width, size_t height, unsigned internalformat) OVERRIDE; - virtual void DestroyGpuMemoryBuffer(int32 id) OVERRIDE; + virtual void UnregisterGpuMemoryBuffer(int32 id) OVERRIDE; void AddImage(gfx::GLImage* gl_image, int32 service_id); void RemoveImage(int32 service_id); diff --git a/chromium/gpu/command_buffer/service/in_process_command_buffer.cc b/chromium/gpu/command_buffer/service/in_process_command_buffer.cc index af14778de27..b1e59a85d3f 100644 --- a/chromium/gpu/command_buffer/service/in_process_command_buffer.cc +++ b/chromium/gpu/command_buffer/service/in_process_command_buffer.cc @@ -5,6 +5,7 @@ #include "gpu/command_buffer/service/in_process_command_buffer.h" #include <queue> +#include <set> #include <utility> #include <GLES2/gl2.h> @@ -21,13 +22,16 @@ #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop_proxy.h" #include "base/sequence_checker.h" +#include "base/synchronization/condition_variable.h" #include "base/threading/thread.h" +#include "gpu/command_buffer/client/gpu_memory_buffer_factory.h" #include "gpu/command_buffer/service/command_buffer_service.h" #include "gpu/command_buffer/service/context_group.h" #include "gpu/command_buffer/service/gl_context_virtual.h" #include "gpu/command_buffer/service/gpu_control_service.h" #include "gpu/command_buffer/service/gpu_scheduler.h" #include "gpu/command_buffer/service/image_manager.h" +#include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/transfer_buffer_manager.h" #include "ui/gfx/size.h" #include "ui/gl/gl_context.h" @@ -43,11 +47,6 @@ namespace gpu { namespace { -static base::LazyInstance<std::set<InProcessCommandBuffer*> > - g_all_shared_contexts = LAZY_INSTANCE_INITIALIZER; - -static bool g_use_virtualized_gl_context = false; -static bool g_uses_explicit_scheduling = false; static GpuMemoryBufferFactory* g_gpu_memory_buffer_factory = NULL; template <typename T> @@ -60,14 +59,29 @@ static void RunTaskWithResult(base::Callback<T(void)> task, class GpuInProcessThread : public base::Thread, + public InProcessCommandBuffer::Service, public base::RefCountedThreadSafe<GpuInProcessThread> { public: GpuInProcessThread(); + virtual void AddRef() const OVERRIDE { + base::RefCountedThreadSafe<GpuInProcessThread>::AddRef(); + } + virtual void Release() const OVERRIDE { + base::RefCountedThreadSafe<GpuInProcessThread>::Release(); + } + + virtual void ScheduleTask(const base::Closure& task) OVERRIDE; + virtual void ScheduleIdleWork(const base::Closure& callback) OVERRIDE; + virtual bool UseVirtualizedGLContexts() OVERRIDE { return false; } + virtual scoped_refptr<gles2::ShaderTranslatorCache> shader_translator_cache() + OVERRIDE; + private: - friend class base::RefCountedThreadSafe<GpuInProcessThread>; virtual ~GpuInProcessThread(); + friend class base::RefCountedThreadSafe<GpuInProcessThread>; + scoped_refptr<gpu::gles2::ShaderTranslatorCache> shader_translator_cache_; DISALLOW_COPY_AND_ASSIGN(GpuInProcessThread); }; @@ -79,195 +93,134 @@ GpuInProcessThread::~GpuInProcessThread() { Stop(); } -// Used with explicit scheduling when there is no dedicated GPU thread. -class GpuCommandQueue { - public: - GpuCommandQueue(); - ~GpuCommandQueue(); - - void QueueTask(const base::Closure& task); - void RunTasks(); - void SetScheduleCallback(const base::Closure& callback); - - private: - base::Lock tasks_lock_; - std::queue<base::Closure> tasks_; - base::Closure schedule_callback_; - - DISALLOW_COPY_AND_ASSIGN(GpuCommandQueue); -}; - -GpuCommandQueue::GpuCommandQueue() {} - -GpuCommandQueue::~GpuCommandQueue() { - base::AutoLock lock(tasks_lock_); - DCHECK(tasks_.empty()); +void GpuInProcessThread::ScheduleTask(const base::Closure& task) { + message_loop()->PostTask(FROM_HERE, task); } -void GpuCommandQueue::QueueTask(const base::Closure& task) { - { - base::AutoLock lock(tasks_lock_); - tasks_.push(task); - } - - DCHECK(!schedule_callback_.is_null()); - schedule_callback_.Run(); -} - -void GpuCommandQueue::RunTasks() { - size_t num_tasks; - { - base::AutoLock lock(tasks_lock_); - num_tasks = tasks_.size(); - } - - while (num_tasks) { - base::Closure task; - { - base::AutoLock lock(tasks_lock_); - task = tasks_.front(); - tasks_.pop(); - num_tasks = tasks_.size(); - } - - task.Run(); - } +void GpuInProcessThread::ScheduleIdleWork(const base::Closure& callback) { + message_loop()->PostDelayedTask( + FROM_HERE, callback, base::TimeDelta::FromMilliseconds(5)); } -void GpuCommandQueue::SetScheduleCallback(const base::Closure& callback) { - DCHECK(schedule_callback_.is_null()); - schedule_callback_ = callback; +scoped_refptr<gles2::ShaderTranslatorCache> +GpuInProcessThread::shader_translator_cache() { + if (!shader_translator_cache_.get()) + shader_translator_cache_ = new gpu::gles2::ShaderTranslatorCache; + return shader_translator_cache_; } -static base::LazyInstance<GpuCommandQueue> g_gpu_queue = +base::LazyInstance<std::set<InProcessCommandBuffer*> > default_thread_clients_ = + LAZY_INSTANCE_INITIALIZER; +base::LazyInstance<base::Lock> default_thread_clients_lock_ = LAZY_INSTANCE_INITIALIZER; -class SchedulerClientBase : public InProcessCommandBuffer::SchedulerClient { +class ScopedEvent { public: - explicit SchedulerClientBase(bool need_thread); - virtual ~SchedulerClientBase(); - - static bool HasClients(); - - protected: - scoped_refptr<GpuInProcessThread> thread_; + ScopedEvent(base::WaitableEvent* event) : event_(event) {} + ~ScopedEvent() { event_->Signal(); } private: - static base::LazyInstance<std::set<SchedulerClientBase*> > all_clients_; - static base::LazyInstance<base::Lock> all_clients_lock_; + base::WaitableEvent* event_; }; -base::LazyInstance<std::set<SchedulerClientBase*> > - SchedulerClientBase::all_clients_ = LAZY_INSTANCE_INITIALIZER; -base::LazyInstance<base::Lock> SchedulerClientBase::all_clients_lock_ = - LAZY_INSTANCE_INITIALIZER; - -SchedulerClientBase::SchedulerClientBase(bool need_thread) { - base::AutoLock lock(all_clients_lock_.Get()); - if (need_thread) { - if (!all_clients_.Get().empty()) { - SchedulerClientBase* other = *all_clients_.Get().begin(); - thread_ = other->thread_; - DCHECK(thread_.get()); - } else { - thread_ = new GpuInProcessThread; - } - } - all_clients_.Get().insert(this); -} - -SchedulerClientBase::~SchedulerClientBase() { - base::AutoLock lock(all_clients_lock_.Get()); - all_clients_.Get().erase(this); -} - -bool SchedulerClientBase::HasClients() { - base::AutoLock lock(all_clients_lock_.Get()); - return !all_clients_.Get().empty(); -} - -// A client that talks to the GPU thread -class ThreadClient : public SchedulerClientBase { +class SyncPointManager { public: - ThreadClient(); - virtual void QueueTask(const base::Closure& task) OVERRIDE; - virtual void ScheduleIdleWork(const base::Closure& callback) OVERRIDE; + SyncPointManager(); + ~SyncPointManager(); + + uint32 GenerateSyncPoint(); + void RetireSyncPoint(uint32 sync_point); + + bool IsSyncPointPassed(uint32 sync_point); + void WaitSyncPoint(uint32 sync_point); + +private: + // This lock protects access to pending_sync_points_ and next_sync_point_ and + // is used with the ConditionVariable to signal when a sync point is retired. + base::Lock lock_; + std::set<uint32> pending_sync_points_; + uint32 next_sync_point_; + base::ConditionVariable cond_var_; }; -ThreadClient::ThreadClient() : SchedulerClientBase(true) { - DCHECK(thread_.get()); -} +SyncPointManager::SyncPointManager() : next_sync_point_(1), cond_var_(&lock_) {} -void ThreadClient::QueueTask(const base::Closure& task) { - thread_->message_loop()->PostTask(FROM_HERE, task); +SyncPointManager::~SyncPointManager() { + DCHECK_EQ(pending_sync_points_.size(), 0U); } -void ThreadClient::ScheduleIdleWork(const base::Closure& callback) { - thread_->message_loop()->PostDelayedTask( - FROM_HERE, callback, base::TimeDelta::FromMilliseconds(5)); +uint32 SyncPointManager::GenerateSyncPoint() { + base::AutoLock lock(lock_); + uint32 sync_point = next_sync_point_++; + DCHECK_EQ(pending_sync_points_.count(sync_point), 0U); + pending_sync_points_.insert(sync_point); + return sync_point; } -// A client that talks to the GpuCommandQueue -class QueueClient : public SchedulerClientBase { - public: - QueueClient(); - virtual void QueueTask(const base::Closure& task) OVERRIDE; - virtual void ScheduleIdleWork(const base::Closure& callback) OVERRIDE; -}; - -QueueClient::QueueClient() : SchedulerClientBase(false) { - DCHECK(!thread_.get()); +void SyncPointManager::RetireSyncPoint(uint32 sync_point) { + base::AutoLock lock(lock_); + DCHECK(pending_sync_points_.count(sync_point)); + pending_sync_points_.erase(sync_point); + cond_var_.Broadcast(); } -void QueueClient::QueueTask(const base::Closure& task) { - g_gpu_queue.Get().QueueTask(task); +bool SyncPointManager::IsSyncPointPassed(uint32 sync_point) { + base::AutoLock lock(lock_); + return pending_sync_points_.count(sync_point) == 0; } -void QueueClient::ScheduleIdleWork(const base::Closure& callback) { - // TODO(sievers): Should this do anything? +void SyncPointManager::WaitSyncPoint(uint32 sync_point) { + base::AutoLock lock(lock_); + while (pending_sync_points_.count(sync_point)) { + cond_var_.Wait(); + } } -static scoped_ptr<InProcessCommandBuffer::SchedulerClient> -CreateSchedulerClient() { - scoped_ptr<InProcessCommandBuffer::SchedulerClient> client; - if (g_uses_explicit_scheduling) - client.reset(new QueueClient); - else - client.reset(new ThreadClient); +base::LazyInstance<SyncPointManager> g_sync_point_manager = + LAZY_INSTANCE_INITIALIZER; - return client.Pass(); +bool WaitSyncPoint(uint32 sync_point) { + g_sync_point_manager.Get().WaitSyncPoint(sync_point); + return true; } -class ScopedEvent { - public: - ScopedEvent(base::WaitableEvent* event) : event_(event) {} - ~ScopedEvent() { event_->Signal(); } +} // anonyous namespace - private: - base::WaitableEvent* event_; -}; +InProcessCommandBuffer::Service::Service() {} -} // anonyous namespace +InProcessCommandBuffer::Service::~Service() {} -InProcessCommandBuffer::InProcessCommandBuffer() +scoped_refptr<InProcessCommandBuffer::Service> +InProcessCommandBuffer::GetDefaultService() { + base::AutoLock lock(default_thread_clients_lock_.Get()); + scoped_refptr<Service> service; + if (!default_thread_clients_.Get().empty()) { + InProcessCommandBuffer* other = *default_thread_clients_.Get().begin(); + service = other->service_; + DCHECK(service.get()); + } else { + service = new GpuInProcessThread; + } + return service; +} + +InProcessCommandBuffer::InProcessCommandBuffer( + const scoped_refptr<Service>& service) : context_lost_(false), - share_group_id_(0), last_put_offset_(-1), flush_event_(false, false), - queue_(CreateSchedulerClient()), - gpu_thread_weak_ptr_factory_(this) {} + service_(service.get() ? service : GetDefaultService()), + gpu_thread_weak_ptr_factory_(this) { + if (!service) { + base::AutoLock lock(default_thread_clients_lock_.Get()); + default_thread_clients_.Get().insert(this); + } +} InProcessCommandBuffer::~InProcessCommandBuffer() { Destroy(); -} - -bool InProcessCommandBuffer::IsContextLost() { - CheckSequencedThread(); - if (context_lost_ || !command_buffer_) { - return true; - } - CommandBuffer::State state = GetState(); - return error::IsError(state.error); + base::AutoLock lock(default_thread_clients_lock_.Get()); + default_thread_clients_.Get().erase(this); } void InProcessCommandBuffer::OnResizeView(gfx::Size size, float scale_factor) { @@ -308,17 +261,14 @@ bool InProcessCommandBuffer::GetBufferChanged(int32 transfer_buffer_id) { bool InProcessCommandBuffer::Initialize( scoped_refptr<gfx::GLSurface> surface, bool is_offscreen, - bool share_resources, gfx::AcceleratedWidget window, const gfx::Size& size, const std::vector<int32>& attribs, gfx::GpuPreference gpu_preference, const base::Closure& context_lost_callback, - unsigned int share_group_id) { - - share_resources_ = share_resources; + InProcessCommandBuffer* share_group) { + DCHECK(!share_group || service_ == share_group->service_); context_lost_callback_ = WrapCallback(context_lost_callback); - share_group_id_ = share_group_id; if (surface) { // GPU thread must be the same as client thread due to GLSurface not being @@ -328,8 +278,13 @@ bool InProcessCommandBuffer::Initialize( } gpu::Capabilities capabilities; - InitializeOnGpuThreadParams params( - is_offscreen, window, size, attribs, gpu_preference, &capabilities); + InitializeOnGpuThreadParams params(is_offscreen, + window, + size, + attribs, + gpu_preference, + &capabilities, + share_group); base::Callback<bool(void)> init_task = base::Bind(&InProcessCommandBuffer::InitializeOnGpuThread, @@ -342,8 +297,11 @@ bool InProcessCommandBuffer::Initialize( base::Bind(&RunTaskWithResult<bool>, init_task, &result, &completion)); completion.Wait(); - if (result) + if (result) { capabilities_ = capabilities; + capabilities_.map_image = + capabilities_.map_image && g_gpu_memory_buffer_factory; + } return result; } @@ -351,9 +309,6 @@ bool InProcessCommandBuffer::InitializeOnGpuThread( const InitializeOnGpuThreadParams& params) { CheckSequencedThread(); gpu_thread_weak_ptr_ = gpu_thread_weak_ptr_factory_.GetWeakPtr(); - // Use one share group for all contexts. - CR_DEFINE_STATIC_LOCAL(scoped_refptr<gfx::GLShareGroup>, share_group, - (new gfx::GLShareGroup)); DCHECK(params.size.width() >= 0 && params.size.height() >= 0); @@ -374,41 +329,24 @@ bool InProcessCommandBuffer::InitializeOnGpuThread( return false; } - InProcessCommandBuffer* context_group = NULL; - - if (share_resources_ && !g_all_shared_contexts.Get().empty()) { - DCHECK(share_group_id_); - for (std::set<InProcessCommandBuffer*>::iterator it = - g_all_shared_contexts.Get().begin(); - it != g_all_shared_contexts.Get().end(); - ++it) { - if ((*it)->share_group_id_ == share_group_id_) { - context_group = *it; - DCHECK(context_group->share_resources_); - context_lost_ = context_group->IsContextLost(); - break; - } - } - if (!context_group) - share_group = new gfx::GLShareGroup; - } + gl_share_group_ = params.context_group + ? params.context_group->gl_share_group_.get() + : new gfx::GLShareGroup; - StreamTextureManager* stream_texture_manager = NULL; #if defined(OS_ANDROID) - stream_texture_manager = stream_texture_manager_ = - context_group ? context_group->stream_texture_manager_.get() - : new StreamTextureManagerInProcess; + stream_texture_manager_.reset(new StreamTextureManagerInProcess); #endif bool bind_generates_resource = false; decoder_.reset(gles2::GLES2Decoder::Create( - context_group ? context_group->decoder_->GetContextGroup() - : new gles2::ContextGroup(NULL, - NULL, - NULL, - stream_texture_manager, - NULL, - bind_generates_resource))); + params.context_group + ? params.context_group->decoder_->GetContextGroup() + : new gles2::ContextGroup(NULL, + NULL, + NULL, + service_->shader_translator_cache(), + NULL, + bind_generates_resource))); gpu_scheduler_.reset( new GpuScheduler(command_buffer.get(), decoder_.get(), decoder_.get())); @@ -431,16 +369,16 @@ bool InProcessCommandBuffer::InitializeOnGpuThread( return false; } - if (g_use_virtualized_gl_context) { - context_ = share_group->GetSharedContext(); + if (service_->UseVirtualizedGLContexts()) { + context_ = gl_share_group_->GetSharedContext(); if (!context_.get()) { context_ = gfx::GLContext::CreateGLContext( - share_group.get(), surface_.get(), params.gpu_preference); - share_group->SetSharedContext(context_.get()); + gl_share_group_.get(), surface_.get(), params.gpu_preference); + gl_share_group_->SetSharedContext(context_.get()); } context_ = new GLContextVirtual( - share_group.get(), context_.get(), decoder_->AsWeakPtr()); + gl_share_group_.get(), context_.get(), decoder_->AsWeakPtr()); if (context_->Initialize(surface_.get(), params.gpu_preference)) { VLOG(1) << "Created virtual GL context."; } else { @@ -448,7 +386,7 @@ bool InProcessCommandBuffer::InitializeOnGpuThread( } } else { context_ = gfx::GLContext::CreateGLContext( - share_group.get(), surface_.get(), params.gpu_preference); + gl_share_group_.get(), surface_.get(), params.gpu_preference); } if (!context_.get()) { @@ -475,24 +413,17 @@ bool InProcessCommandBuffer::InitializeOnGpuThread( DestroyOnGpuThread(); return false; } + *params.capabilities = decoder_->GetCapabilities(); gpu_control_.reset( new GpuControlService(decoder_->GetContextGroup()->image_manager(), - g_gpu_memory_buffer_factory, - decoder_->GetContextGroup()->mailbox_manager(), - decoder_->GetQueryManager(), - decoder_->GetCapabilities())); - - *params.capabilities = gpu_control_->GetCapabilities(); + decoder_->GetQueryManager())); if (!params.is_offscreen) { decoder_->SetResizeCallback(base::Bind( &InProcessCommandBuffer::OnResizeView, gpu_thread_weak_ptr_)); } - - if (share_resources_) { - g_all_shared_contexts.Pointer()->insert(this); - } + decoder_->SetWaitSyncPointCallback(base::Bind(&WaitSyncPoint)); return true; } @@ -521,8 +452,11 @@ bool InProcessCommandBuffer::DestroyOnGpuThread() { } context_ = NULL; surface_ = NULL; + gl_share_group_ = NULL; +#if defined(OS_ANDROID) + stream_texture_manager_.reset(); +#endif - g_all_shared_contexts.Pointer()->erase(this); return true; } @@ -539,14 +473,6 @@ void InProcessCommandBuffer::OnContextLost() { } context_lost_ = true; - if (share_resources_) { - for (std::set<InProcessCommandBuffer*>::iterator it = - g_all_shared_contexts.Get().begin(); - it != g_all_shared_contexts.Get().end(); - ++it) { - (*it)->context_lost_ = true; - } - } } CommandBuffer::State InProcessCommandBuffer::GetStateFast() { @@ -557,11 +483,6 @@ CommandBuffer::State InProcessCommandBuffer::GetStateFast() { return last_state_; } -CommandBuffer::State InProcessCommandBuffer::GetState() { - CheckSequencedThread(); - return GetStateFast(); -} - CommandBuffer::State InProcessCommandBuffer::GetLastState() { CheckSequencedThread(); return last_state_; @@ -581,7 +502,7 @@ void InProcessCommandBuffer::FlushOnGpuThread(int32 put_offset) { { // Update state before signaling the flush event. base::AutoLock lock(state_after_last_flush_lock_); - state_after_last_flush_ = command_buffer_->GetState(); + state_after_last_flush_ = command_buffer_->GetLastState(); } DCHECK((!error::IsError(state_after_last_flush_.error) && !context_lost_) || (error::IsError(state_after_last_flush_.error) && context_lost_)); @@ -590,7 +511,7 @@ void InProcessCommandBuffer::FlushOnGpuThread(int32 put_offset) { // pump idle work until the query is passed. if (put_offset == state_after_last_flush_.get_offset && gpu_scheduler_->HasMoreWork()) { - queue_->ScheduleIdleWork( + service_->ScheduleIdleWork( base::Bind(&InProcessCommandBuffer::ScheduleMoreIdleWork, gpu_thread_weak_ptr_)); } @@ -601,7 +522,7 @@ void InProcessCommandBuffer::ScheduleMoreIdleWork() { base::AutoLock lock(command_buffer_lock_); if (gpu_scheduler_->HasMoreWork()) { gpu_scheduler_->PerformIdleWork(); - queue_->ScheduleIdleWork( + service_->ScheduleIdleWork( base::Bind(&InProcessCommandBuffer::ScheduleMoreIdleWork, gpu_thread_weak_ptr_)); } @@ -622,21 +543,22 @@ void InProcessCommandBuffer::Flush(int32 put_offset) { QueueTask(task); } -CommandBuffer::State InProcessCommandBuffer::FlushSync(int32 put_offset, - int32 last_known_get) { +void InProcessCommandBuffer::WaitForTokenInRange(int32 start, int32 end) { + CheckSequencedThread(); + while (!InRange(start, end, GetLastToken()) && + last_state_.error == gpu::error::kNoError) + flush_event_.Wait(); +} + +void InProcessCommandBuffer::WaitForGetOffsetInRange(int32 start, int32 end) { CheckSequencedThread(); - if (put_offset == last_known_get || last_state_.error != gpu::error::kNoError) - return last_state_; - Flush(put_offset); GetStateFast(); - while (last_known_get == last_state_.get_offset && + while (!InRange(start, end, last_state_.get_offset) && last_state_.error == gpu::error::kNoError) { flush_event_.Wait(); GetStateFast(); } - - return last_state_; } void InProcessCommandBuffer::SetGetBuffer(int32 shm_id) { @@ -651,12 +573,12 @@ void InProcessCommandBuffer::SetGetBuffer(int32 shm_id) { } { base::AutoLock lock(state_after_last_flush_lock_); - state_after_last_flush_ = command_buffer_->GetState(); + state_after_last_flush_ = command_buffer_->GetLastState(); } } -gpu::Buffer InProcessCommandBuffer::CreateTransferBuffer(size_t size, - int32* id) { +scoped_refptr<Buffer> InProcessCommandBuffer::CreateTransferBuffer(size_t size, + int32* id) { CheckSequencedThread(); base::AutoLock lock(command_buffer_lock_); return command_buffer_->CreateTransferBuffer(size, id); @@ -664,16 +586,17 @@ gpu::Buffer InProcessCommandBuffer::CreateTransferBuffer(size_t size, void InProcessCommandBuffer::DestroyTransferBuffer(int32 id) { CheckSequencedThread(); - base::Closure task = base::Bind(&CommandBuffer::DestroyTransferBuffer, - base::Unretained(command_buffer_.get()), - id); + base::Closure task = + base::Bind(&InProcessCommandBuffer::DestroyTransferBufferOnGputhread, + base::Unretained(this), + id); QueueTask(task); } -gpu::Buffer InProcessCommandBuffer::GetTransferBuffer(int32 id) { - NOTREACHED(); - return gpu::Buffer(); +void InProcessCommandBuffer::DestroyTransferBufferOnGputhread(int32 id) { + base::AutoLock lock(command_buffer_lock_); + command_buffer_->DestroyTransferBuffer(id); } gpu::Capabilities InProcessCommandBuffer::GetCapabilities() { @@ -684,45 +607,96 @@ gfx::GpuMemoryBuffer* InProcessCommandBuffer::CreateGpuMemoryBuffer( size_t width, size_t height, unsigned internalformat, + unsigned usage, int32* id) { CheckSequencedThread(); - base::AutoLock lock(command_buffer_lock_); - return gpu_control_->CreateGpuMemoryBuffer(width, - height, - internalformat, - id); + + *id = -1; + linked_ptr<gfx::GpuMemoryBuffer> buffer = + make_linked_ptr(g_gpu_memory_buffer_factory->CreateGpuMemoryBuffer( + width, height, internalformat, usage)); + if (!buffer.get()) + return NULL; + + static int32 next_id = 1; + *id = next_id++; + + base::Closure task = base::Bind(&GpuControlService::RegisterGpuMemoryBuffer, + base::Unretained(gpu_control_.get()), + *id, + buffer->GetHandle(), + width, + height, + internalformat); + + QueueTask(task); + + gpu_memory_buffers_[*id] = buffer; + return buffer.get(); } void InProcessCommandBuffer::DestroyGpuMemoryBuffer(int32 id) { CheckSequencedThread(); - base::Closure task = base::Bind(&GpuControl::DestroyGpuMemoryBuffer, + GpuMemoryBufferMap::iterator it = gpu_memory_buffers_.find(id); + if (it != gpu_memory_buffers_.end()) + gpu_memory_buffers_.erase(it); + base::Closure task = base::Bind(&GpuControlService::UnregisterGpuMemoryBuffer, base::Unretained(gpu_control_.get()), id); QueueTask(task); } -bool InProcessCommandBuffer::GenerateMailboxNames( - unsigned num, std::vector<gpu::Mailbox>* names) { - CheckSequencedThread(); - base::AutoLock lock(command_buffer_lock_); - return gpu_control_->GenerateMailboxNames(num, names); -} - uint32 InProcessCommandBuffer::InsertSyncPoint() { - return 0; + uint32 sync_point = g_sync_point_manager.Get().GenerateSyncPoint(); + QueueTask(base::Bind(&InProcessCommandBuffer::RetireSyncPointOnGpuThread, + base::Unretained(this), + sync_point)); + return sync_point; +} + +void InProcessCommandBuffer::RetireSyncPointOnGpuThread(uint32 sync_point) { + gles2::MailboxManager* mailbox_manager = + decoder_->GetContextGroup()->mailbox_manager(); + if (mailbox_manager->UsesSync()) { + bool make_current_success = false; + { + base::AutoLock lock(command_buffer_lock_); + make_current_success = MakeCurrent(); + } + if (make_current_success) + mailbox_manager->PushTextureUpdates(); + } + g_sync_point_manager.Get().RetireSyncPoint(sync_point); } void InProcessCommandBuffer::SignalSyncPoint(unsigned sync_point, const base::Closure& callback) { CheckSequencedThread(); - QueueTask(WrapCallback(callback)); + QueueTask(base::Bind(&InProcessCommandBuffer::SignalSyncPointOnGpuThread, + base::Unretained(this), + sync_point, + WrapCallback(callback))); +} + +void InProcessCommandBuffer::SignalSyncPointOnGpuThread( + unsigned sync_point, + const base::Closure& callback) { + if (g_sync_point_manager.Get().IsSyncPointPassed(sync_point)) { + callback.Run(); + } else { + service_->ScheduleIdleWork( + base::Bind(&InProcessCommandBuffer::SignalSyncPointOnGpuThread, + gpu_thread_weak_ptr_, + sync_point, + callback)); + } } void InProcessCommandBuffer::SignalQuery(unsigned query, const base::Closure& callback) { CheckSequencedThread(); - QueueTask(base::Bind(&GpuControl::SignalQuery, + QueueTask(base::Bind(&GpuControlService::SignalQuery, base::Unretained(gpu_control_.get()), query, WrapCallback(callback))); @@ -730,14 +704,33 @@ void InProcessCommandBuffer::SignalQuery(unsigned query, void InProcessCommandBuffer::SetSurfaceVisible(bool visible) {} -void InProcessCommandBuffer::SendManagedMemoryStats( - const gpu::ManagedMemoryStats& stats) { -} - void InProcessCommandBuffer::Echo(const base::Closure& callback) { QueueTask(WrapCallback(callback)); } +uint32 InProcessCommandBuffer::CreateStreamTexture(uint32 texture_id) { + base::WaitableEvent completion(true, false); + uint32 stream_id = 0; + base::Callback<uint32(void)> task = + base::Bind(&InProcessCommandBuffer::CreateStreamTextureOnGpuThread, + base::Unretained(this), + texture_id); + QueueTask( + base::Bind(&RunTaskWithResult<uint32>, task, &stream_id, &completion)); + completion.Wait(); + return stream_id; +} + +uint32 InProcessCommandBuffer::CreateStreamTextureOnGpuThread( + uint32 client_texture_id) { +#if defined(OS_ANDROID) + return stream_texture_manager_->CreateStreamTexture( + client_texture_id, decoder_->GetContextGroup()->texture_manager()); +#else + return 0; +#endif +} + gpu::error::Error InProcessCommandBuffer::GetLastError() { CheckSequencedThread(); return last_state_.error; @@ -748,19 +741,6 @@ bool InProcessCommandBuffer::Initialize() { return false; } -void InProcessCommandBuffer::SetGetOffset(int32 get_offset) { NOTREACHED(); } - -void InProcessCommandBuffer::SetToken(int32 token) { NOTREACHED(); } - -void InProcessCommandBuffer::SetParseError(gpu::error::Error error) { - NOTREACHED(); -} - -void InProcessCommandBuffer::SetContextLostReason( - gpu::error::ContextLostReason reason) { - NOTREACHED(); -} - namespace { void PostCallback(const scoped_refptr<base::MessageLoopProxy>& loop, @@ -801,25 +781,6 @@ InProcessCommandBuffer::GetSurfaceTexture(uint32 stream_id) { #endif // static -void InProcessCommandBuffer::EnableVirtualizedContext() { - g_use_virtualized_gl_context = true; -} - -// static -void InProcessCommandBuffer::SetScheduleCallback( - const base::Closure& callback) { - DCHECK(!g_uses_explicit_scheduling); - DCHECK(!SchedulerClientBase::HasClients()); - g_uses_explicit_scheduling = true; - g_gpu_queue.Get().SetScheduleCallback(callback); -} - -// static -void InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread() { - g_gpu_queue.Get().RunTasks(); -} - -// static void InProcessCommandBuffer::SetGpuMemoryBufferFactory( GpuMemoryBufferFactory* factory) { g_gpu_memory_buffer_factory = factory; diff --git a/chromium/gpu/command_buffer/service/in_process_command_buffer.h b/chromium/gpu/command_buffer/service/in_process_command_buffer.h index b00f25be97e..f8986d81ab0 100644 --- a/chromium/gpu/command_buffer/service/in_process_command_buffer.h +++ b/chromium/gpu/command_buffer/service/in_process_command_buffer.h @@ -5,17 +5,19 @@ #ifndef GPU_COMMAND_BUFFER_SERVICE_IN_PROCESS_COMMAND_BUFFER_H_ #define GPU_COMMAND_BUFFER_SERVICE_IN_PROCESS_COMMAND_BUFFER_H_ +#include <map> #include <vector> #include "base/callback.h" #include "base/compiler_specific.h" +#include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/synchronization/lock.h" #include "base/synchronization/waitable_event.h" +#include "gpu/command_buffer/client/gpu_control.h" #include "gpu/command_buffer/common/command_buffer.h" -#include "gpu/command_buffer/common/gpu_control.h" #include "gpu/gpu_export.h" #include "ui/gfx/gpu_memory_buffer.h" #include "ui/gfx/native_widget_types.h" @@ -28,6 +30,7 @@ class SequenceChecker; namespace gfx { class GLContext; +class GLShareGroup; class GLSurface; class Size; } @@ -45,8 +48,11 @@ namespace gpu { namespace gles2 { class GLES2Decoder; +class ShaderTranslatorCache; } +class CommandBufferServiceBase; +class GpuControlService; class GpuMemoryBufferFactory; class GpuScheduler; class TransferBufferManagerInterface; @@ -58,21 +64,10 @@ class TransferBufferManagerInterface; class GPU_EXPORT InProcessCommandBuffer : public CommandBuffer, public GpuControl { public: - InProcessCommandBuffer(); + class Service; + explicit InProcessCommandBuffer(const scoped_refptr<Service>& service); virtual ~InProcessCommandBuffer(); - // Used to override the GPU thread with explicit scheduling. - // (By default an internal GPU thread will be spawned to handle all GL work - // and the two functions are unused.) - // The callback will be called from different client threads. After the - // callback is issued, the client is expected to eventually call - // ProcessGpuWorkOnCurrentThread(). The latter cannot be called from different - // threads. - // The callback needs to be set before any context is created. - static void SetScheduleCallback(const base::Closure& callback); - static void ProcessGpuWorkOnCurrentThread(); - - static void EnableVirtualizedContext(); static void SetGpuMemoryBufferFactory(GpuMemoryBufferFactory* factory); // If |surface| is not NULL, use it directly; in this case, the command @@ -80,64 +75,63 @@ class GPU_EXPORT InProcessCommandBuffer : public CommandBuffer, // a new GLSurface. bool Initialize(scoped_refptr<gfx::GLSurface> surface, bool is_offscreen, - bool share_resources, gfx::AcceleratedWidget window, const gfx::Size& size, const std::vector<int32>& attribs, gfx::GpuPreference gpu_preference, const base::Closure& context_lost_callback, - unsigned int share_group_id); + InProcessCommandBuffer* share_group); void Destroy(); // CommandBuffer implementation: virtual bool Initialize() OVERRIDE; - virtual State GetState() OVERRIDE; virtual State GetLastState() OVERRIDE; virtual int32 GetLastToken() OVERRIDE; virtual void Flush(int32 put_offset) OVERRIDE; - virtual State FlushSync(int32 put_offset, int32 last_known_get) OVERRIDE; + virtual void WaitForTokenInRange(int32 start, int32 end) OVERRIDE; + virtual void WaitForGetOffsetInRange(int32 start, int32 end) OVERRIDE; virtual void SetGetBuffer(int32 shm_id) OVERRIDE; - virtual void SetGetOffset(int32 get_offset) OVERRIDE; - virtual gpu::Buffer CreateTransferBuffer(size_t size, int32* id) OVERRIDE; + virtual scoped_refptr<gpu::Buffer> CreateTransferBuffer(size_t size, + int32* id) OVERRIDE; virtual void DestroyTransferBuffer(int32 id) OVERRIDE; - virtual gpu::Buffer GetTransferBuffer(int32 id) OVERRIDE; - virtual void SetToken(int32 token) OVERRIDE; - virtual void SetParseError(gpu::error::Error error) OVERRIDE; - virtual void SetContextLostReason( - gpu::error::ContextLostReason reason) OVERRIDE; virtual gpu::error::Error GetLastError() OVERRIDE; // GpuControl implementation: virtual gpu::Capabilities GetCapabilities() OVERRIDE; - virtual gfx::GpuMemoryBuffer* CreateGpuMemoryBuffer( - size_t width, - size_t height, - unsigned internalformat, - int32* id) OVERRIDE; + virtual gfx::GpuMemoryBuffer* CreateGpuMemoryBuffer(size_t width, + size_t height, + unsigned internalformat, + unsigned usage, + int32* id) OVERRIDE; virtual void DestroyGpuMemoryBuffer(int32 id) OVERRIDE; - virtual bool GenerateMailboxNames(unsigned num, - std::vector<gpu::Mailbox>* names) OVERRIDE; virtual uint32 InsertSyncPoint() OVERRIDE; virtual void SignalSyncPoint(uint32 sync_point, const base::Closure& callback) OVERRIDE; virtual void SignalQuery(uint32 query, const base::Closure& callback) OVERRIDE; virtual void SetSurfaceVisible(bool visible) OVERRIDE; - virtual void SendManagedMemoryStats(const gpu::ManagedMemoryStats& stats) - OVERRIDE; virtual void Echo(const base::Closure& callback) OVERRIDE; + virtual uint32 CreateStreamTexture(uint32 texture_id) OVERRIDE; // The serializer interface to the GPU service (i.e. thread). - class SchedulerClient { + class Service { public: - virtual ~SchedulerClient() {} + Service(); + virtual ~Service(); - // Queues a task to run as soon as possible. - virtual void QueueTask(const base::Closure& task) = 0; + virtual void AddRef() const = 0; + virtual void Release() const = 0; - // Schedules |callback| to run at an appropriate time for performing idle - // work. - virtual void ScheduleIdleWork(const base::Closure& task) = 0; + // Queues a task to run as soon as possible. + virtual void ScheduleTask(const base::Closure& task) = 0; + + // Schedules |callback| to run at an appropriate time for performing idle + // work. + virtual void ScheduleIdleWork(const base::Closure& task) = 0; + + virtual bool UseVirtualizedGLContexts() = 0; + virtual scoped_refptr<gles2::ShaderTranslatorCache> + shader_translator_cache() = 0; }; #if defined(OS_ANDROID) @@ -153,30 +147,37 @@ class GPU_EXPORT InProcessCommandBuffer : public CommandBuffer, const std::vector<int32>& attribs; gfx::GpuPreference gpu_preference; gpu::Capabilities* capabilities; // Ouptut. + InProcessCommandBuffer* context_group; InitializeOnGpuThreadParams(bool is_offscreen, gfx::AcceleratedWidget window, const gfx::Size& size, const std::vector<int32>& attribs, gfx::GpuPreference gpu_preference, - gpu::Capabilities* capabilities) + gpu::Capabilities* capabilities, + InProcessCommandBuffer* share_group) : is_offscreen(is_offscreen), window(window), size(size), attribs(attribs), gpu_preference(gpu_preference), - capabilities(capabilities) {} + capabilities(capabilities), + context_group(share_group) {} }; bool InitializeOnGpuThread(const InitializeOnGpuThreadParams& params); bool DestroyOnGpuThread(); void FlushOnGpuThread(int32 put_offset); + uint32 CreateStreamTextureOnGpuThread(uint32 client_texture_id); bool MakeCurrent(); - bool IsContextLost(); base::Closure WrapCallback(const base::Closure& callback); State GetStateFast(); - void QueueTask(const base::Closure& task) { queue_->QueueTask(task); } + void QueueTask(const base::Closure& task) { service_->ScheduleTask(task); } void CheckSequencedThread(); + void RetireSyncPointOnGpuThread(uint32 sync_point); + void SignalSyncPointOnGpuThread(uint32 sync_point, + const base::Closure& callback); + void DestroyTransferBufferOnGputhread(int32 id); // Callbacks: void OnContextLost(); @@ -185,34 +186,37 @@ class GPU_EXPORT InProcessCommandBuffer : public CommandBuffer, void PumpCommands(); void ScheduleMoreIdleWork(); + static scoped_refptr<Service> GetDefaultService(); + // Members accessed on the gpu thread (possibly with the exception of // creation): bool context_lost_; - bool share_resources_; scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; scoped_ptr<GpuScheduler> gpu_scheduler_; scoped_ptr<gles2::GLES2Decoder> decoder_; scoped_refptr<gfx::GLContext> context_; scoped_refptr<gfx::GLSurface> surface_; base::Closure context_lost_callback_; - unsigned int share_group_id_; // Members accessed on the client thread: State last_state_; int32 last_put_offset_; gpu::Capabilities capabilities_; + typedef std::map<int32, linked_ptr<gfx::GpuMemoryBuffer> > GpuMemoryBufferMap; + GpuMemoryBufferMap gpu_memory_buffers_; // Accessed on both threads: - scoped_ptr<CommandBuffer> command_buffer_; + scoped_ptr<CommandBufferServiceBase> command_buffer_; base::Lock command_buffer_lock_; base::WaitableEvent flush_event_; - scoped_ptr<SchedulerClient> queue_; + scoped_refptr<Service> service_; State state_after_last_flush_; base::Lock state_after_last_flush_lock_; - scoped_ptr<GpuControl> gpu_control_; + scoped_ptr<GpuControlService> gpu_control_; + scoped_refptr<gfx::GLShareGroup> gl_share_group_; #if defined(OS_ANDROID) - scoped_refptr<StreamTextureManagerInProcess> stream_texture_manager_; + scoped_ptr<StreamTextureManagerInProcess> stream_texture_manager_; #endif // Only used with explicit scheduling and the gpu thread is the same as diff --git a/chromium/gpu/command_buffer/service/mailbox_manager.cc b/chromium/gpu/command_buffer/service/mailbox_manager.cc index bb2f7262a2f..12a13fbac4c 100644 --- a/chromium/gpu/command_buffer/service/mailbox_manager.cc +++ b/chromium/gpu/command_buffer/service/mailbox_manager.cc @@ -6,26 +6,16 @@ #include <algorithm> -#include "base/rand_util.h" -#include "crypto/hmac.h" +#include "crypto/random.h" +#include "gpu/command_buffer/service/mailbox_synchronizer.h" #include "gpu/command_buffer/service/texture_manager.h" namespace gpu { namespace gles2 { -MailboxName::MailboxName() { - std::fill(key, key + sizeof(key), 0); - std::fill(signature, signature + sizeof(signature), 0); -} - MailboxManager::MailboxManager() - : hmac_(crypto::HMAC::SHA256), - mailbox_to_textures_(std::ptr_fun(&MailboxManager::TargetNameLess)) { - base::RandBytes(private_key_, sizeof(private_key_)); - bool success = hmac_.Init( - base::StringPiece(private_key_, sizeof(private_key_))); - DCHECK(success); - DCHECK(!IsMailboxNameValid(MailboxName())); + : mailbox_to_textures_(std::ptr_fun(&MailboxManager::TargetNameLess)), + sync_(MailboxSynchronizer::GetInstance()) { } MailboxManager::~MailboxManager() { @@ -33,42 +23,49 @@ MailboxManager::~MailboxManager() { DCHECK(textures_to_mailboxes_.empty()); } -void MailboxManager::GenerateMailboxName(MailboxName* name) { - base::RandBytes(name->key, sizeof(name->key)); - SignMailboxName(name); -} - Texture* MailboxManager::ConsumeTexture(unsigned target, - const MailboxName& name) { + const Mailbox& mailbox) { + TargetName target_name(target, mailbox); MailboxToTextureMap::iterator it = - mailbox_to_textures_.find(TargetName(target, name)); - if (it == mailbox_to_textures_.end()) - return NULL; + mailbox_to_textures_.find(target_name); + if (it != mailbox_to_textures_.end()) + return it->second->first; + + if (sync_) { + // See if it's visible in another mailbox manager, and if so make it visible + // here too. + Texture* texture = sync_->CreateTextureFromMailbox(target, mailbox); + if (texture) { + InsertTexture(target_name, texture); + DCHECK_EQ(0U, texture->refs_.size()); + } + return texture; + } - DCHECK(IsMailboxNameValid(name)); - return it->second->first; + return NULL; } -bool MailboxManager::ProduceTexture(unsigned target, - const MailboxName& name, +void MailboxManager::ProduceTexture(unsigned target, + const Mailbox& mailbox, Texture* texture) { - if (!IsMailboxNameValid(name)) - return false; - - texture->SetMailboxManager(this); - TargetName target_name(target, name); + TargetName target_name(target, mailbox); MailboxToTextureMap::iterator it = mailbox_to_textures_.find(target_name); if (it != mailbox_to_textures_.end()) { + if (it->second->first == texture) + return; TextureToMailboxMap::iterator texture_it = it->second; mailbox_to_textures_.erase(it); textures_to_mailboxes_.erase(texture_it); } + InsertTexture(target_name, texture); +} + +void MailboxManager::InsertTexture(TargetName target_name, Texture* texture) { + texture->SetMailboxManager(this); TextureToMailboxMap::iterator texture_it = textures_to_mailboxes_.insert(std::make_pair(texture, target_name)); mailbox_to_textures_.insert(std::make_pair(target_name, texture_it)); DCHECK_EQ(mailbox_to_textures_.size(), textures_to_mailboxes_.size()); - - return true; } void MailboxManager::TextureDeleted(Texture* texture) { @@ -82,27 +79,24 @@ void MailboxManager::TextureDeleted(Texture* texture) { } textures_to_mailboxes_.erase(range.first, range.second); DCHECK_EQ(mailbox_to_textures_.size(), textures_to_mailboxes_.size()); + + if (sync_) + sync_->TextureDeleted(texture); } -void MailboxManager::SignMailboxName(MailboxName* name) { - bool success = hmac_.Sign( - base::StringPiece(reinterpret_cast<char*>(name->key), sizeof(name->key)), - reinterpret_cast<unsigned char*>(name->signature), - sizeof(name->signature)); - DCHECK(success); +void MailboxManager::PushTextureUpdates() { + if (sync_) + sync_->PushTextureUpdates(this); } -bool MailboxManager::IsMailboxNameValid(const MailboxName& name) { - return hmac_.Verify( - base::StringPiece(reinterpret_cast<const char*>(name.key), - sizeof(name.key)), - base::StringPiece(reinterpret_cast<const char*>(name.signature), - sizeof(name.signature))); +void MailboxManager::PullTextureUpdates() { + if (sync_) + sync_->PullTextureUpdates(this); } -MailboxManager::TargetName::TargetName(unsigned target, const MailboxName& name) +MailboxManager::TargetName::TargetName(unsigned target, const Mailbox& mailbox) : target(target), - name(name) { + mailbox(mailbox) { } bool MailboxManager::TargetNameLess(const MailboxManager::TargetName& lhs, diff --git a/chromium/gpu/command_buffer/service/mailbox_manager.h b/chromium/gpu/command_buffer/service/mailbox_manager.h index c97302813a0..e1b36cb934e 100644 --- a/chromium/gpu/command_buffer/service/mailbox_manager.h +++ b/chromium/gpu/command_buffer/service/mailbox_manager.h @@ -10,68 +10,55 @@ #include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" -#include "crypto/hmac.h" #include "gpu/command_buffer/common/constants.h" +#include "gpu/command_buffer/common/mailbox.h" #include "gpu/gpu_export.h" -// From gl2/gl2ext.h. -#ifndef GL_MAILBOX_SIZE_CHROMIUM -#define GL_MAILBOX_SIZE_CHROMIUM 64 -#endif - typedef signed char GLbyte; namespace gpu { namespace gles2 { +class MailboxSynchronizer; class Texture; class TextureManager; -// Identifies a mailbox where a texture definition can be stored for -// transferring textures between contexts that are not in the same context -// group. It is a random key signed with a hash of a private key. -struct GPU_EXPORT MailboxName { - MailboxName(); - GLbyte key[GL_MAILBOX_SIZE_CHROMIUM / 2]; - GLbyte signature[GL_MAILBOX_SIZE_CHROMIUM / 2]; -}; - // Manages resources scoped beyond the context or context group level. class GPU_EXPORT MailboxManager : public base::RefCounted<MailboxManager> { public: MailboxManager(); - // Generate a unique mailbox name signed with the manager's private key. - void GenerateMailboxName(MailboxName* name); - // Look up the texture definition from the named mailbox. - Texture* ConsumeTexture(unsigned target, const MailboxName& name); + Texture* ConsumeTexture(unsigned target, const Mailbox& mailbox); // Put the texture into the named mailbox. - bool ProduceTexture(unsigned target, - const MailboxName& name, + void ProduceTexture(unsigned target, + const Mailbox& mailbox, Texture* texture); + // Returns whether this manager synchronizes with other instances. + bool UsesSync() { return sync_ != NULL; } + + // Used with the MailboxSynchronizer to push/pull texture state to/from + // other manager instances. + void PushTextureUpdates(); + void PullTextureUpdates(); + // Destroy any mailbox that reference the given texture. void TextureDeleted(Texture* texture); - std::string private_key() { - return std::string(private_key_, sizeof(private_key_)); - } - private: friend class base::RefCounted<MailboxManager>; + friend class MailboxSynchronizer; ~MailboxManager(); - void SignMailboxName(MailboxName* name); - bool IsMailboxNameValid(const MailboxName& name); - struct TargetName { - TargetName(unsigned target, const MailboxName& name); + TargetName(unsigned target, const Mailbox& mailbox); unsigned target; - MailboxName name; + Mailbox mailbox; }; + void InsertTexture(TargetName target_name, Texture* texture); static bool TargetNameLess(const TargetName& lhs, const TargetName& rhs); @@ -80,17 +67,17 @@ class GPU_EXPORT MailboxManager : public base::RefCounted<MailboxManager> { // iterator in the MailboxToTextureMap to be able to manage changes to // the TextureToMailboxMap efficiently. typedef std::multimap<Texture*, TargetName> TextureToMailboxMap; - typedef std::map< - TargetName, - TextureToMailboxMap::iterator, - std::pointer_to_binary_function< - const TargetName&, const TargetName&, bool> > MailboxToTextureMap; - - char private_key_[GL_MAILBOX_SIZE_CHROMIUM / 2]; - crypto::HMAC hmac_; + typedef std::map<TargetName, + TextureToMailboxMap::iterator, + std::pointer_to_binary_function<const TargetName&, + const TargetName&, + bool> > MailboxToTextureMap; + MailboxToTextureMap mailbox_to_textures_; TextureToMailboxMap textures_to_mailboxes_; + MailboxSynchronizer* sync_; + DISALLOW_COPY_AND_ASSIGN(MailboxManager); }; } // namespage gles2 @@ -98,4 +85,3 @@ class GPU_EXPORT MailboxManager : public base::RefCounted<MailboxManager> { #endif // GPU_COMMAND_BUFFER_SERVICE_MAILBOX_MANAGER_H_ - diff --git a/chromium/gpu/command_buffer/service/mailbox_manager_unittest.cc b/chromium/gpu/command_buffer/service/mailbox_manager_unittest.cc index 8864843571d..8e57faa96c0 100644 --- a/chromium/gpu/command_buffer/service/mailbox_manager_unittest.cc +++ b/chromium/gpu/command_buffer/service/mailbox_manager_unittest.cc @@ -4,20 +4,81 @@ #include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/feature_info.h" +#include "gpu/command_buffer/service/gpu_service_test.h" +#include "gpu/command_buffer/service/mailbox_synchronizer.h" #include "gpu/command_buffer/service/texture_manager.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/gl/gl_context_stub.h" +#include "ui/gl/gl_mock.h" +#include "ui/gl/gl_surface_stub.h" namespace gpu { namespace gles2 { -class MailboxManagerTest : public testing::Test { +using namespace ::testing; + +class MailboxManagerTest : public GpuServiceTest { public: - MailboxManagerTest() : manager_(new MailboxManager()) {} + MailboxManagerTest() : initialized_synchronizer_(false) {} virtual ~MailboxManagerTest() {} protected: + virtual void SetUp() { + GpuServiceTest::SetUp(); + feature_info_ = new FeatureInfo; + manager_ = new MailboxManager; + } + + virtual void SetUpWithSynchronizer() { + GpuServiceTest::SetUp(); + MailboxSynchronizer::Initialize(); + initialized_synchronizer_ = true; + feature_info_ = new FeatureInfo; + manager_ = new MailboxManager; + } + + virtual void TearDown() { + if (initialized_synchronizer_) + MailboxSynchronizer::Terminate(); + GpuServiceTest::TearDown(); + } + Texture* CreateTexture() { - return new Texture(0); + return new Texture(1); + } + + void SetTarget(Texture* texture, GLenum target, GLuint max_level) { + texture->SetTarget(NULL, target, max_level); + } + + void SetLevelInfo( + Texture* texture, + GLenum target, + GLint level, + GLenum internal_format, + GLsizei width, + GLsizei height, + GLsizei depth, + GLint border, + GLenum format, + GLenum type, + bool cleared) { + texture->SetLevelInfo(NULL, + target, + level, + internal_format, + width, + height, + depth, + border, + format, + type, + cleared); + } + + GLenum SetParameter(Texture* texture, GLenum pname, GLint param) { + return texture->SetParameteri(feature_info_, pname, param); } void DestroyTexture(Texture* texture) { @@ -27,6 +88,9 @@ class MailboxManagerTest : public testing::Test { scoped_refptr<MailboxManager> manager_; private: + bool initialized_synchronizer_; + scoped_refptr<FeatureInfo> feature_info_; + DISALLOW_COPY_AND_ASSIGN(MailboxManagerTest); }; @@ -34,9 +98,8 @@ class MailboxManagerTest : public testing::Test { TEST_F(MailboxManagerTest, Basic) { Texture* texture = CreateTexture(); - MailboxName name; - manager_->GenerateMailboxName(&name); - EXPECT_TRUE(manager_->ProduceTexture(0, name, texture)); + Mailbox name = Mailbox::Generate(); + manager_->ProduceTexture(0, name, texture); EXPECT_EQ(texture, manager_->ConsumeTexture(0, name)); // We can consume multiple times. @@ -50,34 +113,22 @@ TEST_F(MailboxManagerTest, Basic) { EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name)); } -// Should fail to produce or consume with an invalid mailbox. -TEST_F(MailboxManagerTest, InvalidName) { - Texture* texture = CreateTexture(); - MailboxName name; - memset(&name, 0, sizeof(name)); - EXPECT_FALSE(manager_->ProduceTexture(0, name, texture)); - EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name)); - DestroyTexture(texture); -} - // Tests behavior with multiple produce on the same texture. TEST_F(MailboxManagerTest, ProduceMultipleMailbox) { Texture* texture = CreateTexture(); - MailboxName name1; - manager_->GenerateMailboxName(&name1); + Mailbox name1 = Mailbox::Generate(); - EXPECT_TRUE(manager_->ProduceTexture(0, name1, texture)); + manager_->ProduceTexture(0, name1, texture); EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1)); // Can produce a second time with the same mailbox. - EXPECT_TRUE(manager_->ProduceTexture(0, name1, texture)); + manager_->ProduceTexture(0, name1, texture); EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1)); // Can produce again, with a different mailbox. - MailboxName name2; - manager_->GenerateMailboxName(&name2); - EXPECT_TRUE(manager_->ProduceTexture(0, name2, texture)); + Mailbox name2 = Mailbox::Generate(); + manager_->ProduceTexture(0, name2, texture); // Still available under all mailboxes. EXPECT_EQ(texture, manager_->ConsumeTexture(0, name1)); @@ -95,14 +146,13 @@ TEST_F(MailboxManagerTest, ProduceMultipleTexture) { Texture* texture1 = CreateTexture(); Texture* texture2 = CreateTexture(); - MailboxName name; - manager_->GenerateMailboxName(&name); + Mailbox name = Mailbox::Generate(); - EXPECT_TRUE(manager_->ProduceTexture(0, name, texture1)); + manager_->ProduceTexture(0, name, texture1); EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name)); // Can produce a second time with the same mailbox, but different texture. - EXPECT_TRUE(manager_->ProduceTexture(0, name, texture2)); + manager_->ProduceTexture(0, name, texture2); EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name)); // Destroying the texture that's under no mailbox shouldn't have an effect. @@ -117,19 +167,17 @@ TEST_F(MailboxManagerTest, ProduceMultipleTexture) { TEST_F(MailboxManagerTest, ProduceMultipleTextureMailbox) { Texture* texture1 = CreateTexture(); Texture* texture2 = CreateTexture(); - MailboxName name1; - manager_->GenerateMailboxName(&name1); - MailboxName name2; - manager_->GenerateMailboxName(&name2); + Mailbox name1 = Mailbox::Generate(); + Mailbox name2 = Mailbox::Generate(); // Put texture1 on name1 and name2. - EXPECT_TRUE(manager_->ProduceTexture(0, name1, texture1)); - EXPECT_TRUE(manager_->ProduceTexture(0, name2, texture1)); + manager_->ProduceTexture(0, name1, texture1); + manager_->ProduceTexture(0, name2, texture1); EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name1)); EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name2)); // Put texture2 on name2. - EXPECT_TRUE(manager_->ProduceTexture(0, name2, texture2)); + manager_->ProduceTexture(0, name2, texture2); EXPECT_EQ(texture1, manager_->ConsumeTexture(0, name1)); EXPECT_EQ(texture2, manager_->ConsumeTexture(0, name2)); @@ -142,5 +190,290 @@ TEST_F(MailboxManagerTest, ProduceMultipleTextureMailbox) { EXPECT_EQ(NULL, manager_->ConsumeTexture(0, name2)); } +const GLsizei kMaxTextureWidth = 64; +const GLsizei kMaxTextureHeight = 64; +const GLsizei kMaxTextureDepth = 1; + +class MailboxManagerSyncTest : public MailboxManagerTest { + public: + MailboxManagerSyncTest() {} + virtual ~MailboxManagerSyncTest() {} + + protected: + virtual void SetUp() { + MailboxManagerTest::SetUpWithSynchronizer(); + manager2_ = new MailboxManager; + context_ = new gfx::GLContextStub(); + surface_ = new gfx::GLSurfaceStub(); + context_->MakeCurrent(surface_); + } + + Texture* DefineTexture() { + Texture* texture = CreateTexture(); + const GLsizei levels_needed = TextureManager::ComputeMipMapCount( + GL_TEXTURE_2D, kMaxTextureWidth, kMaxTextureHeight, kMaxTextureDepth); + SetTarget(texture, GL_TEXTURE_2D, levels_needed); + SetLevelInfo(texture, + GL_TEXTURE_2D, + 0, + GL_RGBA, + 1, + 1, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + true); + SetParameter(texture, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + SetParameter(texture, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + return texture; + } + + void SetupUpdateTexParamExpectations(GLuint texture_id, + GLenum min, + GLenum mag, + GLenum wrap_s, + GLenum wrap_t) { + DCHECK(texture_id); + const GLuint kCurrentTexture = 0; + EXPECT_CALL(*gl_, GetIntegerv(GL_TEXTURE_BINDING_2D, _)) + .WillOnce(SetArgPointee<1>(kCurrentTexture)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, texture_id)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, + TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_s)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_t)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, Flush()) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl_, BindTexture(GL_TEXTURE_2D, kCurrentTexture)) + .Times(1) + .RetiresOnSaturation(); + } + + virtual void TearDown() { + context_->ReleaseCurrent(NULL); + MailboxManagerTest::TearDown(); + } + + scoped_refptr<MailboxManager> manager2_; + scoped_refptr<gfx::GLContext> context_; + scoped_refptr<gfx::GLSurface> surface_; + + private: + DISALLOW_COPY_AND_ASSIGN(MailboxManagerSyncTest); +}; + +TEST_F(MailboxManagerSyncTest, ProduceDestroy) { + Texture* texture = DefineTexture(); + Mailbox name = Mailbox::Generate(); + + InSequence sequence; + manager_->ProduceTexture(GL_TEXTURE_2D, name, texture); + EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); + + DestroyTexture(texture); + EXPECT_EQ(NULL, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); + EXPECT_EQ(NULL, manager2_->ConsumeTexture(GL_TEXTURE_2D, name)); +} + +TEST_F(MailboxManagerSyncTest, ProduceSyncDestroy) { + InSequence sequence; + + Texture* texture = DefineTexture(); + Mailbox name = Mailbox::Generate(); + + manager_->ProduceTexture(GL_TEXTURE_2D, name, texture); + EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); + + // Synchronize + manager_->PushTextureUpdates(); + manager2_->PullTextureUpdates(); + + DestroyTexture(texture); + EXPECT_EQ(NULL, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); + EXPECT_EQ(NULL, manager2_->ConsumeTexture(GL_TEXTURE_2D, name)); +} + +// Duplicates a texture into a second manager instance, and then +// makes sure a redefinition becomes visible there too. +TEST_F(MailboxManagerSyncTest, ProduceConsumeResize) { + const GLuint kNewTextureId = 1234; + InSequence sequence; + + Texture* texture = DefineTexture(); + Mailbox name = Mailbox::Generate(); + + manager_->ProduceTexture(GL_TEXTURE_2D, name, texture); + EXPECT_EQ(texture, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); + + // Synchronize + manager_->PushTextureUpdates(); + manager2_->PullTextureUpdates(); + + EXPECT_CALL(*gl_, GenTextures(1, _)) + .WillOnce(SetArgPointee<1>(kNewTextureId)); + SetupUpdateTexParamExpectations( + kNewTextureId, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT); + Texture* new_texture = manager2_->ConsumeTexture(GL_TEXTURE_2D, name); + EXPECT_FALSE(new_texture == NULL); + EXPECT_NE(texture, new_texture); + EXPECT_EQ(kNewTextureId, new_texture->service_id()); + + // Resize original texture + SetLevelInfo(texture, + GL_TEXTURE_2D, + 0, + GL_RGBA, + 16, + 32, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + true); + // Should have been orphaned + EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) == NULL); + + // Synchronize again + manager_->PushTextureUpdates(); + SetupUpdateTexParamExpectations( + kNewTextureId, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT); + manager2_->PullTextureUpdates(); + GLsizei width, height; + new_texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height); + EXPECT_EQ(16, width); + EXPECT_EQ(32, height); + + // Should have gotten a new attachment + EXPECT_TRUE(texture->GetLevelImage(GL_TEXTURE_2D, 0) != NULL); + // Resize original texture again.... + SetLevelInfo(texture, + GL_TEXTURE_2D, + 0, + GL_RGBA, + 64, + 64, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + true); + // ...and immediately delete the texture which should save the changes. + SetupUpdateTexParamExpectations( + kNewTextureId, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT); + DestroyTexture(texture); + + // Should be still around since there is a ref from manager2 + EXPECT_EQ(new_texture, manager2_->ConsumeTexture(GL_TEXTURE_2D, name)); + + // The last change to the texture should be visible without a sync point (i.e. + // push). + manager2_->PullTextureUpdates(); + new_texture->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height); + EXPECT_EQ(64, width); + EXPECT_EQ(64, height); + + DestroyTexture(new_texture); + EXPECT_EQ(NULL, manager_->ConsumeTexture(GL_TEXTURE_2D, name)); + EXPECT_EQ(NULL, manager2_->ConsumeTexture(GL_TEXTURE_2D, name)); +} + +// Makes sure changes are correctly published even when updates are +// pushed in both directions, i.e. makes sure we don't clobber a shared +// texture definition with an older version. +TEST_F(MailboxManagerSyncTest, ProduceConsumeBidirectional) { + const GLuint kNewTextureId1 = 1234; + const GLuint kNewTextureId2 = 4321; + + Texture* texture1 = DefineTexture(); + Mailbox name1 = Mailbox::Generate(); + Texture* texture2 = DefineTexture(); + Mailbox name2 = Mailbox::Generate(); + Texture* new_texture1 = NULL; + Texture* new_texture2 = NULL; + + manager_->ProduceTexture(GL_TEXTURE_2D, name1, texture1); + manager2_->ProduceTexture(GL_TEXTURE_2D, name2, texture2); + + // Make visible. + manager_->PushTextureUpdates(); + manager2_->PushTextureUpdates(); + + // Create textures in the other manager instances for texture1 and texture2, + // respectively to create a real sharing scenario. Otherwise, there would + // never be conflicting updates/pushes. + { + InSequence sequence; + EXPECT_CALL(*gl_, GenTextures(1, _)) + .WillOnce(SetArgPointee<1>(kNewTextureId1)); + SetupUpdateTexParamExpectations( + kNewTextureId1, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT); + new_texture1 = manager2_->ConsumeTexture(GL_TEXTURE_2D, name1); + EXPECT_CALL(*gl_, GenTextures(1, _)) + .WillOnce(SetArgPointee<1>(kNewTextureId2)); + SetupUpdateTexParamExpectations( + kNewTextureId2, GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT); + new_texture2 = manager_->ConsumeTexture(GL_TEXTURE_2D, name2); + } + EXPECT_EQ(kNewTextureId1, new_texture1->service_id()); + EXPECT_EQ(kNewTextureId2, new_texture2->service_id()); + + // Make a change to texture1 + DCHECK_EQ(static_cast<GLuint>(GL_LINEAR), texture1->min_filter()); + EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), + SetParameter(texture1, GL_TEXTURE_MIN_FILTER, GL_NEAREST)); + + // Make sure this does not clobber it with the previous version we pushed. + manager_->PullTextureUpdates(); + + // Make a change to texture2 + DCHECK_EQ(static_cast<GLuint>(GL_LINEAR), texture2->mag_filter()); + EXPECT_EQ(static_cast<GLenum>(GL_NO_ERROR), + SetParameter(texture2, GL_TEXTURE_MAG_FILTER, GL_NEAREST)); + + Mock::VerifyAndClearExpectations(gl_.get()); + + // Synchronize in both directions + manager_->PushTextureUpdates(); + manager2_->PushTextureUpdates(); + // manager1 should see the change to texture2 mag_filter being applied. + SetupUpdateTexParamExpectations( + new_texture2->service_id(), GL_LINEAR, GL_NEAREST, GL_REPEAT, GL_REPEAT); + manager_->PullTextureUpdates(); + // manager2 should see the change to texture1 min_filter being applied. + SetupUpdateTexParamExpectations( + new_texture1->service_id(), GL_NEAREST, GL_LINEAR, GL_REPEAT, GL_REPEAT); + manager2_->PullTextureUpdates(); + + DestroyTexture(texture1); + DestroyTexture(texture2); + DestroyTexture(new_texture1); + DestroyTexture(new_texture2); +} + +// TODO: different texture into same mailbox + +// TODO: same texture, multiple mailboxes + +// TODO: Produce incomplete texture + +// TODO: Texture::level_infos_[][].size() + +// TODO: unsupported targets and formats + } // namespace gles2 } // namespace gpu diff --git a/chromium/gpu/command_buffer/service/mailbox_synchronizer.cc b/chromium/gpu/command_buffer/service/mailbox_synchronizer.cc new file mode 100644 index 00000000000..d25368ab096 --- /dev/null +++ b/chromium/gpu/command_buffer/service/mailbox_synchronizer.cc @@ -0,0 +1,226 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/mailbox_synchronizer.h" + +#include "base/bind.h" +#include "gpu/command_buffer/service/mailbox_manager.h" +#include "gpu/command_buffer/service/texture_manager.h" +#include "ui/gl/gl_implementation.h" + +namespace gpu { +namespace gles2 { + +namespace { + +MailboxSynchronizer* g_instance = NULL; + +} // anonymous namespace + +// static +bool MailboxSynchronizer::Initialize() { + DCHECK(!g_instance); + DCHECK(gfx::GetGLImplementation() != gfx::kGLImplementationNone) + << "GL bindings not initialized"; + switch (gfx::GetGLImplementation()) { + case gfx::kGLImplementationMockGL: + break; + case gfx::kGLImplementationEGLGLES2: +#if !defined(OS_MACOSX) + { + if (!gfx::g_driver_egl.ext.b_EGL_KHR_image_base || + !gfx::g_driver_egl.ext.b_EGL_KHR_gl_texture_2D_image || + !gfx::g_driver_gl.ext.b_GL_OES_EGL_image || + !gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync) { + LOG(WARNING) << "MailboxSync not supported due to missing EGL " + "image/fence support"; + return false; + } + } + break; +#endif + default: + NOTREACHED(); + return false; + } + g_instance = new MailboxSynchronizer; + return true; +} + +// static +void MailboxSynchronizer::Terminate() { + DCHECK(g_instance); + delete g_instance; + g_instance = NULL; +} + +// static +MailboxSynchronizer* MailboxSynchronizer::GetInstance() { + return g_instance; +} + +MailboxSynchronizer::TargetName::TargetName(unsigned target, + const Mailbox& mailbox) + : target(target), mailbox(mailbox) {} + +MailboxSynchronizer::TextureGroup::TextureGroup( + const TextureDefinition& definition) + : definition(definition) {} + +MailboxSynchronizer::TextureGroup::~TextureGroup() {} + +MailboxSynchronizer::TextureVersion::TextureVersion( + linked_ptr<TextureGroup> group) + : version(group->definition.version()), group(group) {} + +MailboxSynchronizer::TextureVersion::~TextureVersion() {} + +MailboxSynchronizer::MailboxSynchronizer() {} + +MailboxSynchronizer::~MailboxSynchronizer() { + DCHECK_EQ(0U, textures_.size()); +} + +void MailboxSynchronizer::ReassociateMailboxLocked( + const TargetName& target_name, + TextureGroup* group) { + lock_.AssertAcquired(); + for (TextureMap::iterator it = textures_.begin(); it != textures_.end(); + it++) { + std::set<TargetName>::iterator mb_it = + it->second.group->mailboxes.find(target_name); + if (it->second.group != group && + mb_it != it->second.group->mailboxes.end()) { + it->second.group->mailboxes.erase(mb_it); + } + } + group->mailboxes.insert(target_name); +} + +linked_ptr<MailboxSynchronizer::TextureGroup> +MailboxSynchronizer::GetGroupForMailboxLocked(const TargetName& target_name) { + lock_.AssertAcquired(); + for (TextureMap::iterator it = textures_.begin(); it != textures_.end(); + it++) { + std::set<TargetName>::const_iterator mb_it = + it->second.group->mailboxes.find(target_name); + if (mb_it != it->second.group->mailboxes.end()) + return it->second.group; + } + return make_linked_ptr<MailboxSynchronizer::TextureGroup>(NULL); +} + +Texture* MailboxSynchronizer::CreateTextureFromMailbox(unsigned target, + const Mailbox& mailbox) { + base::AutoLock lock(lock_); + TargetName target_name(target, mailbox); + linked_ptr<TextureGroup> group = GetGroupForMailboxLocked(target_name); + if (group.get()) { + Texture* new_texture = group->definition.CreateTexture(); + if (new_texture) + textures_.insert(std::make_pair(new_texture, TextureVersion(group))); + return new_texture; + } + + return NULL; +} + +void MailboxSynchronizer::TextureDeleted(Texture* texture) { + base::AutoLock lock(lock_); + TextureMap::iterator it = textures_.find(texture); + if (it != textures_.end()) { + // TODO: We could avoid the update if this was the last ref. + UpdateTextureLocked(it->first, it->second); + textures_.erase(it); + } +} + +void MailboxSynchronizer::PushTextureUpdates(MailboxManager* manager) { + base::AutoLock lock(lock_); + for (MailboxManager::MailboxToTextureMap::const_iterator texture_it = + manager->mailbox_to_textures_.begin(); + texture_it != manager->mailbox_to_textures_.end(); + texture_it++) { + TargetName target_name(texture_it->first.target, texture_it->first.mailbox); + Texture* texture = texture_it->second->first; + // TODO(sievers): crbug.com/352274 + // Should probably only fail if it already *has* mipmaps, while allowing + // incomplete textures here. Also reconsider how to fail otherwise. + bool needs_mips = texture->min_filter() != GL_NEAREST && + texture->min_filter() != GL_LINEAR; + if (target_name.target != GL_TEXTURE_2D || needs_mips) + continue; + + TextureMap::iterator it = textures_.find(texture); + if (it != textures_.end()) { + TextureVersion& texture_version = it->second; + TextureGroup* group = texture_version.group.get(); + std::set<TargetName>::const_iterator mb_it = + group->mailboxes.find(target_name); + if (mb_it == group->mailboxes.end()) { + // We previously did not associate this texture with the given mailbox. + // Unlink other texture groups from the mailbox. + ReassociateMailboxLocked(target_name, group); + } + UpdateTextureLocked(texture, texture_version); + + } else { + linked_ptr<TextureGroup> group = make_linked_ptr(new TextureGroup( + TextureDefinition(target_name.target, texture, 1, NULL))); + + // Unlink other textures from this mailbox in case the name is not new. + ReassociateMailboxLocked(target_name, group.get()); + textures_.insert(std::make_pair(texture, TextureVersion(group))); + } + } +} + +void MailboxSynchronizer::UpdateTextureLocked(Texture* texture, + TextureVersion& texture_version) { + lock_.AssertAcquired(); + gfx::GLImage* gl_image = texture->GetLevelImage(texture->target(), 0); + TextureGroup* group = texture_version.group.get(); + scoped_refptr<NativeImageBuffer> image_buffer = group->definition.image(); + + // Make sure we don't clobber with an older version + if (!group->definition.IsOlderThan(texture_version.version)) + return; + + // Also don't push redundant updates. Note that it would break the + // versioning. + if (group->definition.Matches(texture)) + return; + + if (gl_image && !image_buffer->IsClient(gl_image)) { + LOG(ERROR) << "MailboxSync: Incompatible attachment"; + return; + } + + group->definition = TextureDefinition(texture->target(), + texture, + ++texture_version.version, + gl_image ? image_buffer : NULL); +} + +void MailboxSynchronizer::PullTextureUpdates(MailboxManager* manager) { + base::AutoLock lock(lock_); + for (MailboxManager::MailboxToTextureMap::const_iterator texture_it = + manager->mailbox_to_textures_.begin(); + texture_it != manager->mailbox_to_textures_.end(); + texture_it++) { + Texture* texture = texture_it->second->first; + TextureMap::iterator it = textures_.find(texture); + if (it != textures_.end()) { + TextureDefinition& definition = it->second.group->definition; + if (it->second.version == definition.version() || + definition.IsOlderThan(it->second.version)) + continue; + it->second.version = definition.version(); + definition.UpdateTexture(texture); + } + } +} + +} // namespace gles2 +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/mailbox_synchronizer.h b/chromium/gpu/command_buffer/service/mailbox_synchronizer.h new file mode 100644 index 00000000000..a845963bbbf --- /dev/null +++ b/chromium/gpu/command_buffer/service/mailbox_synchronizer.h @@ -0,0 +1,96 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GPU_COMMAND_BUFFER_SERVICE_MAILBOX_SYNCHRONIZER_H_ +#define GPU_COMMAND_BUFFER_SERVICE_MAILBOX_SYNCHRONIZER_H_ + +#include "gpu/command_buffer/common/mailbox.h" + +#include <map> +#include <set> + +#include "base/memory/linked_ptr.h" +#include "base/synchronization/lock.h" +#include "gpu/command_buffer/service/texture_definition.h" +#include "gpu/gpu_export.h" + +namespace gpu { +namespace gles2 { + +class MailboxManager; +class Texture; + +// A thread-safe proxy that can be used to emulate texture sharing across +// share-groups. +class MailboxSynchronizer { + public: + ~MailboxSynchronizer(); + + GPU_EXPORT static bool Initialize(); + GPU_EXPORT static void Terminate(); + static MailboxSynchronizer* GetInstance(); + + // Create a texture from a globally visible mailbox. + Texture* CreateTextureFromMailbox(unsigned target, const Mailbox& mailbox); + + void PushTextureUpdates(MailboxManager* manager); + void PullTextureUpdates(MailboxManager* manager); + + void TextureDeleted(Texture* texture); + + private: + MailboxSynchronizer(); + + struct TargetName { + TargetName(unsigned target, const Mailbox& mailbox); + bool operator<(const TargetName& rhs) const { + return memcmp(this, &rhs, sizeof(rhs)) < 0; + } + bool operator!=(const TargetName& rhs) const { + return memcmp(this, &rhs, sizeof(rhs)) != 0; + } + bool operator==(const TargetName& rhs) const { + return !operator!=(rhs); + } + unsigned target; + Mailbox mailbox; + }; + + base::Lock lock_; + + struct TextureGroup { + explicit TextureGroup(const TextureDefinition& definition); + ~TextureGroup(); + + TextureDefinition definition; + std::set<TargetName> mailboxes; + private: + DISALLOW_COPY_AND_ASSIGN(TextureGroup); + }; + + struct TextureVersion { + explicit TextureVersion(linked_ptr<TextureGroup> group); + ~TextureVersion(); + + unsigned int version; + linked_ptr<TextureGroup> group; + }; + typedef std::map<Texture*, TextureVersion> TextureMap; + TextureMap textures_; + + linked_ptr<TextureGroup> GetGroupForMailboxLocked( + const TargetName& target_name); + void ReassociateMailboxLocked( + const TargetName& target_name, + TextureGroup* group); + void UpdateTextureLocked(Texture* texture, TextureVersion& texture_version); + + DISALLOW_COPY_AND_ASSIGN(MailboxSynchronizer); +}; + +} // namespage gles2 +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_MAILBOX_SYNCHRONIZER_H_ + diff --git a/chromium/gpu/command_buffer/service/memory_program_cache_unittest.cc b/chromium/gpu/command_buffer/service/memory_program_cache_unittest.cc index 6c6b099a20e..6973e67afe4 100644 --- a/chromium/gpu/command_buffer/service/memory_program_cache_unittest.cc +++ b/chromium/gpu/command_buffer/service/memory_program_cache_unittest.cc @@ -7,6 +7,7 @@ #include "base/bind.h" #include "gpu/command_buffer/common/gles2_cmd_format.h" #include "gpu/command_buffer/service/gl_utils.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/shader_manager.h" #include "gpu/command_buffer/service/shader_translator.h" #include "testing/gtest/include/gtest/gtest.h" @@ -65,7 +66,7 @@ class ProgramBinaryEmulator { const char* binary_; }; -class MemoryProgramCacheTest : public testing::Test { +class MemoryProgramCacheTest : public GpuServiceTest { public: static const size_t kCacheSizeBytes = 1024; static const GLuint kVertexShaderClientId = 90; @@ -92,8 +93,7 @@ class MemoryProgramCacheTest : public testing::Test { protected: virtual void SetUp() { - gl_.reset(new ::testing::StrictMock<gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); + GpuServiceTest::SetUp(); vertex_shader_ = shader_manager_.CreateShader(kVertexShaderClientId, kVertexShaderServiceId, @@ -137,11 +137,6 @@ class MemoryProgramCacheTest : public testing::Test { fragment_shader_->SetStatus(true, NULL, NULL); } - virtual void TearDown() { - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); - } - void SetExpectationsForSaveLinkedProgram( const GLint program_id, ProgramBinaryEmulator* emulator) const { @@ -181,8 +176,6 @@ class MemoryProgramCacheTest : public testing::Test { .WillOnce(SetArgPointee<2>(GL_FALSE)); } - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock<gfx::MockGLInterface> > gl_; scoped_ptr<MemoryProgramCache> cache_; ShaderManager shader_manager_; Shader* vertex_shader_; @@ -481,7 +474,6 @@ TEST_F(MemoryProgramCacheTest, LoadFailOnDifferentMap) { } TEST_F(MemoryProgramCacheTest, MemoryProgramCacheEviction) { - typedef ShaderTranslator::VariableMap VariableMap; const GLenum kFormat = 1; const int kProgramId = 10; const int kBinaryLength = 20; diff --git a/chromium/gpu/command_buffer/service/mocks.h b/chromium/gpu/command_buffer/service/mocks.h index 2a95db5f3c8..b64305149e7 100644 --- a/chromium/gpu/command_buffer/service/mocks.h +++ b/chromium/gpu/command_buffer/service/mocks.h @@ -93,7 +93,7 @@ class MockShaderTranslator : public ShaderTranslatorInterface { MOCK_CONST_METHOD0(varying_map, const VariableMap&()); MOCK_CONST_METHOD0(name_map, const NameMap&()); MOCK_CONST_METHOD0( - GetStringForOptionsThatWouldEffectCompilation, std::string()); + GetStringForOptionsThatWouldAffectCompilation, std::string()); }; class MockProgramCache : public ProgramCache { diff --git a/chromium/gpu/command_buffer/service/program_cache.cc b/chromium/gpu/command_buffer/service/program_cache.cc index 6599d4ad3d9..ad395c7f476 100644 --- a/chromium/gpu/command_buffer/service/program_cache.cc +++ b/chromium/gpu/command_buffer/service/program_cache.cc @@ -74,7 +74,7 @@ void ProgramCache::ComputeShaderHash( const ShaderTranslatorInterface* translator, char* result) const { std::string s(( - translator ? translator->GetStringForOptionsThatWouldEffectCompilation() : + translator ? translator->GetStringForOptionsThatWouldAffectCompilation() : std::string()) + str); base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(s.c_str()), s.length(), reinterpret_cast<unsigned char*>(result)); diff --git a/chromium/gpu/command_buffer/service/program_manager.cc b/chromium/gpu/command_buffer/service/program_manager.cc index d6e121a5da6..44169b8e197 100644 --- a/chromium/gpu/command_buffer/service/program_manager.cc +++ b/chromium/gpu/command_buffer/service/program_manager.cc @@ -125,16 +125,77 @@ Program::UniformInfo::UniformInfo() is_array(false) { } -Program::UniformInfo::UniformInfo( - GLsizei _size, - GLenum _type, - int _fake_location_base, - const std::string& _name) +Program::UniformInfo::UniformInfo(GLsizei _size, + GLenum _type, + int _fake_location_base, + const std::string& _name) : size(_size), type(_type), + accepts_api_type(0), fake_location_base(_fake_location_base), is_array(false), name(_name) { + switch (type) { + case GL_INT: + accepts_api_type = kUniform1i; + break; + case GL_INT_VEC2: + accepts_api_type = kUniform2i; + break; + case GL_INT_VEC3: + accepts_api_type = kUniform3i; + break; + case GL_INT_VEC4: + accepts_api_type = kUniform4i; + break; + + case GL_BOOL: + accepts_api_type = kUniform1i | kUniform1f; + break; + case GL_BOOL_VEC2: + accepts_api_type = kUniform2i | kUniform2f; + break; + case GL_BOOL_VEC3: + accepts_api_type = kUniform3i | kUniform3f; + break; + case GL_BOOL_VEC4: + accepts_api_type = kUniform4i | kUniform4f; + break; + + case GL_FLOAT: + accepts_api_type = kUniform1f; + break; + case GL_FLOAT_VEC2: + accepts_api_type = kUniform2f; + break; + case GL_FLOAT_VEC3: + accepts_api_type = kUniform3f; + break; + case GL_FLOAT_VEC4: + accepts_api_type = kUniform4f; + break; + + case GL_FLOAT_MAT2: + accepts_api_type = kUniformMatrix2f; + break; + case GL_FLOAT_MAT3: + accepts_api_type = kUniformMatrix3f; + break; + case GL_FLOAT_MAT4: + accepts_api_type = kUniformMatrix4f; + break; + + case GL_SAMPLER_2D: + case GL_SAMPLER_2D_RECT_ARB: + case GL_SAMPLER_CUBE: + case GL_SAMPLER_3D_OES: + case GL_SAMPLER_EXTERNAL_OES: + accepts_api_type = kUniform1i; + break; + default: + NOTREACHED() << "Unhandled UniformInfo type " << type; + break; + } } Program::UniformInfo::~UniformInfo() {} @@ -179,7 +240,7 @@ std::string Program::ProcessLogInfo( std::string prior_log; std::string hashed_name; while (RE2::Consume(&input, - "(.*)(webgl_[0123456789abcdefABCDEF]+)", + "(.*?)(webgl_[0123456789abcdefABCDEF]+)", &prior_log, &hashed_name)) { output += prior_log; @@ -357,13 +418,13 @@ void Program::Update() { #if !defined(NDEBUG) if (CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableGPUServiceLoggingGPU)) { - DLOG(INFO) << "----: attribs for service_id: " << service_id(); + DVLOG(1) << "----: attribs for service_id: " << service_id(); for (size_t ii = 0; ii < attrib_infos_.size(); ++ii) { const VertexAttrib& info = attrib_infos_[ii]; - DLOG(INFO) << ii << ": loc = " << info.location - << ", size = " << info.size - << ", type = " << GLES2Util::GetStringEnum(info.type) - << ", name = " << info.name; + DVLOG(1) << ii << ": loc = " << info.location + << ", size = " << info.size + << ", type = " << GLES2Util::GetStringEnum(info.type) + << ", name = " << info.name; } } #endif @@ -435,14 +496,14 @@ void Program::Update() { #if !defined(NDEBUG) if (CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableGPUServiceLoggingGPU)) { - DLOG(INFO) << "----: uniforms for service_id: " << service_id(); + DVLOG(1) << "----: uniforms for service_id: " << service_id(); for (size_t ii = 0; ii < uniform_infos_.size(); ++ii) { const UniformInfo& info = uniform_infos_[ii]; if (info.IsValid()) { - DLOG(INFO) << ii << ": loc = " << info.element_locations[0] - << ", size = " << info.size - << ", type = " << GLES2Util::GetStringEnum(info.type) - << ", name = " << info.name; + DVLOG(1) << ii << ": loc = " << info.element_locations[0] + << ", size = " << info.size + << ", type = " << GLES2Util::GetStringEnum(info.type) + << ", name = " << info.name; } } } @@ -533,18 +594,24 @@ bool Program::Link(ShaderManager* manager, set_log_info("glBindAttribLocation() conflicts"); return false; } - if (DetectUniformsMismatch()) { - set_log_info("Uniforms with the same name but different type/precision"); + std::string conflicting_name; + if (DetectUniformsMismatch(&conflicting_name)) { + std::string info_log = "Uniforms with the same name but different " + "type/precision: " + conflicting_name; + set_log_info(ProcessLogInfo(info_log).c_str()); return false; } - if (DetectVaryingsMismatch()) { - set_log_info("Varyings with the same name but different type, " - "or statically used varyings in fragment shader are not " - "declared in vertex shader"); + if (DetectVaryingsMismatch(&conflicting_name)) { + std::string info_log = "Varyings with the same name but different type, " + "or statically used varyings in fragment shader are " + "not declared in vertex shader: " + conflicting_name; + set_log_info(ProcessLogInfo(info_log).c_str()); return false; } - if (DetectGlobalNameConflicts()) { - set_log_info("Name conflicts between an uniform and an attribute"); + if (DetectGlobalNameConflicts(&conflicting_name)) { + std::string info_log = "Name conflicts between an uniform and an " + "attribute: " + conflicting_name; + set_log_info(ProcessLogInfo(info_log).c_str()); return false; } if (!CheckVaryingsPacking(varyings_packing_option)) { @@ -1005,7 +1072,7 @@ bool Program::DetectAttribLocationBindingConflicts() const { return false; } -bool Program::DetectUniformsMismatch() const { +bool Program::DetectUniformsMismatch(std::string* conflicting_name) const { typedef std::map<std::string, UniformType> UniformMap; UniformMap uniform_map; for (int ii = 0; ii < kMaxAttachedShaders; ++ii) { @@ -1024,6 +1091,7 @@ bool Program::DetectUniformsMismatch() const { // declared by other shader, then the type and precision must match. if (map_entry->second == type) continue; + *conflicting_name = name; return true; } } @@ -1031,7 +1099,7 @@ bool Program::DetectUniformsMismatch() const { return false; } -bool Program::DetectVaryingsMismatch() const { +bool Program::DetectVaryingsMismatch(std::string* conflicting_name) const { DCHECK(attached_shaders_[0] && attached_shaders_[0]->shader_type() == GL_VERTEX_SHADER && attached_shaders_[1] && @@ -1051,20 +1119,24 @@ bool Program::DetectVaryingsMismatch() const { ShaderTranslator::VariableMap::const_iterator hit = vertex_varyings->find(name); if (hit == vertex_varyings->end()) { - if (iter->second.static_use) + if (iter->second.static_use) { + *conflicting_name = name; return true; + } continue; } if (hit->second.type != iter->second.type || - hit->second.size != iter->second.size) + hit->second.size != iter->second.size) { + *conflicting_name = name; return true; + } } return false; } -bool Program::DetectGlobalNameConflicts() const { +bool Program::DetectGlobalNameConflicts(std::string* conflicting_name) const { DCHECK(attached_shaders_[0] && attached_shaders_[0]->shader_type() == GL_VERTEX_SHADER && attached_shaders_[1] && @@ -1078,8 +1150,10 @@ bool Program::DetectGlobalNameConflicts() const { for (ShaderTranslator::VariableMap::const_iterator iter = attribs->begin(); iter != attribs->end(); ++iter) { for (int ii = 0; ii < 2; ++ii) { - if (uniforms[ii]->find(iter->first) != uniforms[ii]->end()) + if (uniforms[ii]->find(iter->first) != uniforms[ii]->end()) { + *conflicting_name = iter->first; return true; + } } } return false; diff --git a/chromium/gpu/command_buffer/service/program_manager.h b/chromium/gpu/command_buffer/service/program_manager.h index 50dd0ff1b80..c1bf3a44d4e 100644 --- a/chromium/gpu/command_buffer/service/program_manager.h +++ b/chromium/gpu/command_buffer/service/program_manager.h @@ -38,6 +38,20 @@ class GPU_EXPORT Program : public base::RefCounted<Program> { kCountAll }; + enum UniformApiType { + kUniform1i = 1 << 0, + kUniform2i = 1 << 1, + kUniform3i = 1 << 2, + kUniform4i = 1 << 3, + kUniform1f = 1 << 4, + kUniform2f = 1 << 5, + kUniform3f = 1 << 6, + kUniform4f = 1 << 7, + kUniformMatrix2f = 1 << 8, + kUniformMatrix3f = 1 << 9, + kUniformMatrix4f = 1 << 10, + }; + struct UniformInfo { UniformInfo(); UniformInfo( @@ -56,6 +70,7 @@ class GPU_EXPORT Program : public base::RefCounted<Program> { GLsizei size; GLenum type; + uint32 accepts_api_type; GLint fake_location_base; bool is_array; std::string name; @@ -192,15 +207,16 @@ class GPU_EXPORT Program : public base::RefCounted<Program> { // Detects if there are uniforms of the same name but different type // or precision in vertex/fragment shaders. - // Return true if such cases are detected. - bool DetectUniformsMismatch() const; + // Return true and set the first found conflicting hashed name to + // conflicting_name if such cases are detected. + bool DetectUniformsMismatch(std::string* conflicting_name) const; // Return true if a varying is statically used in fragment shader, but it // is not declared in vertex shader. - bool DetectVaryingsMismatch() const; + bool DetectVaryingsMismatch(std::string* conflicting_name) const; // Return true if an uniform and an attribute share the same name. - bool DetectGlobalNameConflicts() const; + bool DetectGlobalNameConflicts(std::string* conflicting_name) const; // Return false if varyings can't be packed into the max available // varying registers. diff --git a/chromium/gpu/command_buffer/service/program_manager_unittest.cc b/chromium/gpu/command_buffer/service/program_manager_unittest.cc index 0823d096452..326486108b1 100644 --- a/chromium/gpu/command_buffer/service/program_manager_unittest.cc +++ b/chromium/gpu/command_buffer/service/program_manager_unittest.cc @@ -13,13 +13,13 @@ #include "gpu/command_buffer/common/gles2_cmd_utils.h" #include "gpu/command_buffer/service/common_decoder.h" #include "gpu/command_buffer/service/feature_info.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/mocks.h" #include "gpu/command_buffer/service/shader_manager.h" #include "gpu/command_buffer/service/test_helper.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_mock.h" -using ::gfx::MockGLInterface; using ::testing::_; using ::testing::DoAll; using ::testing::InSequence; @@ -30,7 +30,6 @@ using ::testing::ReturnRef; using ::testing::SetArrayArgument; using ::testing::SetArgumentPointee; using ::testing::StrEq; -using ::testing::StrictMock; namespace gpu { namespace gles2 { @@ -41,7 +40,7 @@ const uint32 kMaxVaryingVectors = 8; void ShaderCacheCb(const std::string& key, const std::string& shader) {} } // namespace anonymous -class ProgramManagerTest : public testing::Test { +class ProgramManagerTest : public GpuServiceTest { public: ProgramManagerTest() : manager_(NULL, kMaxVaryingVectors) { } virtual ~ProgramManagerTest() { @@ -49,18 +48,6 @@ class ProgramManagerTest : public testing::Test { } protected: - virtual void SetUp() { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); - } - - virtual void TearDown() { - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); - } - - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; ProgramManager manager_; }; @@ -138,7 +125,7 @@ TEST_F(ProgramManagerTest, Program) { EXPECT_TRUE(program1->log_info() == NULL); } -class ProgramManagerWithShaderTest : public testing::Test { +class ProgramManagerWithShaderTest : public GpuServiceTest { public: ProgramManagerWithShaderTest() : manager_(NULL, kMaxVaryingVectors), program_(NULL) { @@ -228,8 +215,7 @@ class ProgramManagerWithShaderTest : public testing::Test { } VarInfo; virtual void SetUp() { - gl_.reset(new StrictMock<gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); + GpuServiceTest::SetUp(); SetupDefaultShaderExpectations(); @@ -272,10 +258,6 @@ class ProgramManagerWithShaderTest : public testing::Test { gl_.get(), uniforms, num_uniforms); } - virtual void TearDown() { - ::gfx::GLInterface::SetGLInterface(NULL); - } - // Return true if link status matches expected_link_status bool LinkAsExpected(Program* program, bool expected_link_status) { @@ -398,8 +380,6 @@ class ProgramManagerWithShaderTest : public testing::Test { static AttribInfo kAttribs[]; static UniformInfo kUniforms[]; - scoped_ptr<StrictMock<gfx::MockGLInterface> > gl_; - ProgramManager manager_; Program* program_; ShaderManager shader_manager_; @@ -1260,7 +1240,10 @@ TEST_F(ProgramManagerWithShaderTest, UniformsPrecisionMismatch) { EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader)); EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader)); - EXPECT_TRUE(program->DetectUniformsMismatch()); + std::string conflicting_name; + + EXPECT_TRUE(program->DetectUniformsMismatch(&conflicting_name)); + EXPECT_EQ("a", conflicting_name); EXPECT_TRUE(LinkAsExpected(program, false)); } @@ -1274,7 +1257,10 @@ TEST_F(ProgramManagerWithShaderTest, VaryingTypeMismatch) { Program* program = SetupShaderVariableTest( &kVertexVarying, 1, &kFragmentVarying, 1); - EXPECT_TRUE(program->DetectVaryingsMismatch()); + std::string conflicting_name; + + EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); + EXPECT_EQ("a", conflicting_name); EXPECT_TRUE(LinkAsExpected(program, false)); } @@ -1288,7 +1274,10 @@ TEST_F(ProgramManagerWithShaderTest, VaryingArraySizeMismatch) { Program* program = SetupShaderVariableTest( &kVertexVarying, 1, &kFragmentVarying, 1); - EXPECT_TRUE(program->DetectVaryingsMismatch()); + std::string conflicting_name; + + EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); + EXPECT_EQ("a", conflicting_name); EXPECT_TRUE(LinkAsExpected(program, false)); } @@ -1302,7 +1291,10 @@ TEST_F(ProgramManagerWithShaderTest, VaryingPrecisionMismatch) { Program* program = SetupShaderVariableTest( &kVertexVarying, 1, &kFragmentVarying, 1); - EXPECT_FALSE(program->DetectVaryingsMismatch()); + std::string conflicting_name; + + EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); + EXPECT_TRUE(conflicting_name.empty()); EXPECT_TRUE(LinkAsExpected(program, true)); } @@ -1314,7 +1306,10 @@ TEST_F(ProgramManagerWithShaderTest, VaryingMissing) { Program* program = SetupShaderVariableTest( NULL, 0, &kFragmentVarying, 1); - EXPECT_TRUE(program->DetectVaryingsMismatch()); + std::string conflicting_name; + + EXPECT_TRUE(program->DetectVaryingsMismatch(&conflicting_name)); + EXPECT_EQ("a", conflicting_name); EXPECT_TRUE(LinkAsExpected(program, false)); } @@ -1327,7 +1322,10 @@ TEST_F(ProgramManagerWithShaderTest, InactiveVarying) { Program* program = SetupShaderVariableTest( NULL, 0, &kFragmentVarying, 1); - EXPECT_FALSE(program->DetectVaryingsMismatch()); + std::string conflicting_name; + + EXPECT_FALSE(program->DetectVaryingsMismatch(&conflicting_name)); + EXPECT_TRUE(conflicting_name.empty()); EXPECT_TRUE(LinkAsExpected(program, true)); } @@ -1342,7 +1340,10 @@ TEST_F(ProgramManagerWithShaderTest, AttribUniformNameConflict) { Program* program = SetupShaderVariableTest( &kVertexAttribute, 1, &kFragmentUniform, 1); - EXPECT_TRUE(program->DetectGlobalNameConflicts()); + std::string conflicting_name; + + EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); + EXPECT_EQ("a", conflicting_name); EXPECT_TRUE(LinkAsExpected(program, false)); } @@ -1548,7 +1549,7 @@ TEST_F(ProgramManagerWithShaderTest, BindUniformLocation) { program->GetUniformFakeLocation(kUniform3GoodName)); } -class ProgramManagerWithCacheTest : public testing::Test { +class ProgramManagerWithCacheTest : public GpuServiceTest { public: static const GLuint kClientProgramId = 1; static const GLuint kServiceProgramId = 10; @@ -1571,8 +1572,7 @@ class ProgramManagerWithCacheTest : public testing::Test { protected: virtual void SetUp() { - gl_.reset(new StrictMock<gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); + GpuServiceTest::SetUp(); vertex_shader_ = shader_manager_.CreateShader( kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); @@ -1591,10 +1591,6 @@ class ProgramManagerWithCacheTest : public testing::Test { program_->AttachShader(&shader_manager_, fragment_shader_); } - virtual void TearDown() { - ::gfx::GLInterface::SetGLInterface(NULL); - } - void SetShadersCompiled() { vertex_shader_->SetStatus(true, NULL, NULL); fragment_shader_->SetStatus(true, NULL, NULL); @@ -1736,8 +1732,6 @@ class ProgramManagerWithCacheTest : public testing::Test { .Times(1); } - scoped_ptr<StrictMock<gfx::MockGLInterface> > gl_; - scoped_ptr<MockProgramCache> cache_; ProgramManager manager_; diff --git a/chromium/gpu/command_buffer/service/query_manager.cc b/chromium/gpu/command_buffer/service/query_manager.cc index db508e0a7f7..ffb54cca514 100644 --- a/chromium/gpu/command_buffer/service/query_manager.cc +++ b/chromium/gpu/command_buffer/service/query_manager.cc @@ -8,6 +8,7 @@ #include "base/bind.h" #include "base/logging.h" #include "base/memory/shared_memory.h" +#include "base/numerics/safe_math.h" #include "base/synchronization/lock.h" #include "base/time/time.h" #include "gpu/command_buffer/common/gles2_cmd_format.h" @@ -15,6 +16,7 @@ #include "gpu/command_buffer/service/error_state.h" #include "gpu/command_buffer/service/feature_info.h" #include "gpu/command_buffer/service/gles2_cmd_decoder.h" +#include "ui/gl/gl_fence.h" namespace gpu { namespace gles2 { @@ -24,9 +26,8 @@ namespace { class AsyncPixelTransferCompletionObserverImpl : public AsyncPixelTransferCompletionObserver { public: - AsyncPixelTransferCompletionObserverImpl(uint32 submit_count) - : submit_count_(submit_count), - cancelled_(false) {} + AsyncPixelTransferCompletionObserverImpl(base::subtle::Atomic32 submit_count) + : submit_count_(submit_count), cancelled_(false) {} void Cancel() { base::AutoLock locked(lock_); @@ -36,23 +37,17 @@ class AsyncPixelTransferCompletionObserverImpl virtual void DidComplete(const AsyncMemoryParams& mem_params) OVERRIDE { base::AutoLock locked(lock_); if (!cancelled_) { - DCHECK(mem_params.shared_memory); - DCHECK(mem_params.shared_memory->memory()); - void* data = static_cast<int8*>(mem_params.shared_memory->memory()) + - mem_params.shm_data_offset; + DCHECK(mem_params.buffer()); + void* data = mem_params.GetDataAddress(); QuerySync* sync = static_cast<QuerySync*>(data); - - // Need a MemoryBarrier here to ensure that upload completed before - // submit_count was written to sync->process_count. - base::subtle::MemoryBarrier(); - sync->process_count = submit_count_; + base::subtle::Release_Store(&sync->process_count, submit_count_); } } private: virtual ~AsyncPixelTransferCompletionObserverImpl() {} - uint32 submit_count_; + base::subtle::Atomic32 submit_count_; base::Lock lock_; bool cancelled_; @@ -68,7 +63,7 @@ class AsyncPixelTransfersCompletedQuery QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); virtual bool Begin() OVERRIDE; - virtual bool End(uint32 submit_count) OVERRIDE; + virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; virtual bool Process() OVERRIDE; virtual void Destroy(bool have_context) OVERRIDE; @@ -87,19 +82,16 @@ bool AsyncPixelTransfersCompletedQuery::Begin() { return true; } -bool AsyncPixelTransfersCompletedQuery::End(uint32 submit_count) { - AsyncMemoryParams mem_params; +bool AsyncPixelTransfersCompletedQuery::End( + base::subtle::Atomic32 submit_count) { // Get the real shared memory since it might need to be duped to prevent // use-after-free of the memory. - Buffer buffer = manager()->decoder()->GetSharedMemoryBuffer(shm_id()); - if (!buffer.shared_memory) + scoped_refptr<Buffer> buffer = + manager()->decoder()->GetSharedMemoryBuffer(shm_id()); + if (!buffer) return false; - mem_params.shared_memory = buffer.shared_memory; - mem_params.shm_size = buffer.size; - mem_params.shm_data_offset = shm_offset(); - mem_params.shm_data_size = sizeof(QuerySync); - uint32 end = mem_params.shm_data_offset + mem_params.shm_data_size; - if (end > mem_params.shm_size || end < mem_params.shm_data_offset) + AsyncMemoryParams mem_params(buffer, shm_offset(), sizeof(QuerySync)); + if (!mem_params.GetDataAddress()) return false; observer_ = new AsyncPixelTransferCompletionObserverImpl(submit_count); @@ -122,7 +114,7 @@ bool AsyncPixelTransfersCompletedQuery::Process() { // Check if completion callback has been run. sync->process_count atomicity // is guaranteed as this is already used to notify client of a completed // query. - if (sync->process_count != submit_count()) + if (base::subtle::Acquire_Load(&sync->process_count) != submit_count()) return true; UnmarkAsPending(); @@ -148,7 +140,7 @@ class AllSamplesPassedQuery : public QueryManager::Query { QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset, GLuint service_id); virtual bool Begin() OVERRIDE; - virtual bool End(uint32 submit_count) OVERRIDE; + virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; virtual bool Process() OVERRIDE; virtual void Destroy(bool have_context) OVERRIDE; @@ -172,7 +164,7 @@ bool AllSamplesPassedQuery::Begin() { return true; } -bool AllSamplesPassedQuery::End(uint32 submit_count) { +bool AllSamplesPassedQuery::End(base::subtle::Atomic32 submit_count) { EndQueryHelper(target()); return AddToPendingQueue(submit_count); } @@ -207,7 +199,7 @@ class CommandsIssuedQuery : public QueryManager::Query { QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); virtual bool Begin() OVERRIDE; - virtual bool End(uint32 submit_count) OVERRIDE; + virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; virtual bool Process() OVERRIDE; virtual void Destroy(bool have_context) OVERRIDE; @@ -228,7 +220,7 @@ bool CommandsIssuedQuery::Begin() { return true; } -bool CommandsIssuedQuery::End(uint32 submit_count) { +bool CommandsIssuedQuery::End(base::subtle::Atomic32 submit_count) { base::TimeDelta elapsed = base::TimeTicks::HighResNow() - begin_time_; MarkAsPending(submit_count); return MarkAsCompleted(elapsed.InMicroseconds()); @@ -254,7 +246,7 @@ class CommandLatencyQuery : public QueryManager::Query { QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); virtual bool Begin() OVERRIDE; - virtual bool End(uint32 submit_count) OVERRIDE; + virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; virtual bool Process() OVERRIDE; virtual void Destroy(bool have_context) OVERRIDE; @@ -271,7 +263,7 @@ bool CommandLatencyQuery::Begin() { return true; } -bool CommandLatencyQuery::End(uint32 submit_count) { +bool CommandLatencyQuery::End(base::subtle::Atomic32 submit_count) { base::TimeDelta now = base::TimeTicks::HighResNow() - base::TimeTicks(); MarkAsPending(submit_count); return MarkAsCompleted(now.InMicroseconds()); @@ -300,25 +292,31 @@ class AsyncReadPixelsCompletedQuery QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); virtual bool Begin() OVERRIDE; - virtual bool End(uint32 submit_count) OVERRIDE; + virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; virtual bool Process() OVERRIDE; virtual void Destroy(bool have_context) OVERRIDE; protected: void Complete(); virtual ~AsyncReadPixelsCompletedQuery(); + + private: + bool completed_; + bool complete_result_; }; AsyncReadPixelsCompletedQuery::AsyncReadPixelsCompletedQuery( QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) - : Query(manager, target, shm_id, shm_offset) { + : Query(manager, target, shm_id, shm_offset), + completed_(false), + complete_result_(false) { } bool AsyncReadPixelsCompletedQuery::Begin() { return true; } -bool AsyncReadPixelsCompletedQuery::End(uint32 submit_count) { +bool AsyncReadPixelsCompletedQuery::End(base::subtle::Atomic32 submit_count) { if (!AddToPendingQueue(submit_count)) { return false; } @@ -326,15 +324,16 @@ bool AsyncReadPixelsCompletedQuery::End(uint32 submit_count) { base::Bind(&AsyncReadPixelsCompletedQuery::Complete, AsWeakPtr())); - return true; + return Process(); } void AsyncReadPixelsCompletedQuery::Complete() { - MarkAsCompleted(1); + completed_ = true; + complete_result_ = MarkAsCompleted(1); } bool AsyncReadPixelsCompletedQuery::Process() { - return true; + return !completed_ || complete_result_; } void AsyncReadPixelsCompletedQuery::Destroy(bool /* have_context */) { @@ -353,7 +352,7 @@ class GetErrorQuery : public QueryManager::Query { QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset); virtual bool Begin() OVERRIDE; - virtual bool End(uint32 submit_count) OVERRIDE; + virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; virtual bool Process() OVERRIDE; virtual void Destroy(bool have_context) OVERRIDE; @@ -372,7 +371,7 @@ bool GetErrorQuery::Begin() { return true; } -bool GetErrorQuery::End(uint32 submit_count) { +bool GetErrorQuery::End(base::subtle::Atomic32 submit_count) { MarkAsPending(submit_count); return MarkAsCompleted(manager()->decoder()->GetErrorState()->GetGLError()); } @@ -391,6 +390,55 @@ void GetErrorQuery::Destroy(bool /* have_context */) { GetErrorQuery::~GetErrorQuery() { } +class CommandsCompletedQuery : public QueryManager::Query { + public: + CommandsCompletedQuery(QueryManager* manager, + GLenum target, + int32 shm_id, + uint32 shm_offset); + + // Overridden from QueryManager::Query: + virtual bool Begin() OVERRIDE; + virtual bool End(base::subtle::Atomic32 submit_count) OVERRIDE; + virtual bool Process() OVERRIDE; + virtual void Destroy(bool have_context) OVERRIDE; + + protected: + virtual ~CommandsCompletedQuery(); + + private: + scoped_ptr<gfx::GLFence> fence_; +}; + +CommandsCompletedQuery::CommandsCompletedQuery(QueryManager* manager, + GLenum target, + int32 shm_id, + uint32 shm_offset) + : Query(manager, target, shm_id, shm_offset) {} + +bool CommandsCompletedQuery::Begin() { return true; } + +bool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) { + fence_.reset(gfx::GLFence::Create()); + DCHECK(fence_); + return AddToPendingQueue(submit_count); +} + +bool CommandsCompletedQuery::Process() { + if (fence_ && !fence_->HasCompleted()) + return true; + return MarkAsCompleted(0); +} + +void CommandsCompletedQuery::Destroy(bool have_context) { + if (have_context && !IsDeleted()) { + fence_.reset(); + MarkAsDeleted(); + } +} + +CommandsCompletedQuery::~CommandsCompletedQuery() {} + QueryManager::QueryManager( GLES2Decoder* decoder, FeatureInfo* feature_info) @@ -446,6 +494,9 @@ QueryManager::Query* QueryManager::CreateQuery( case GL_GET_ERROR_QUERY_CHROMIUM: query = new GetErrorQuery(this, target, shm_id, shm_offset); break; + case GL_COMMANDS_COMPLETED_CHROMIUM: + query = new CommandsCompletedQuery(this, target, shm_id, shm_offset); + break; default: { GLuint service_id = 0; glGenQueriesARB(1, &service_id); @@ -461,6 +512,18 @@ QueryManager::Query* QueryManager::CreateQuery( return query.get(); } +void QueryManager::GenQueries(GLsizei n, const GLuint* queries) { + DCHECK_GE(n, 0); + for (GLsizei i = 0; i < n; ++i) { + generated_query_ids_.insert(queries[i]); + } +} + +bool QueryManager::IsValidQuery(GLuint id) { + GeneratedQueryIds::iterator it = generated_query_ids_.find(id); + return it != generated_query_ids_.end(); +} + QueryManager::Query* QueryManager::GetQuery( GLuint client_id) { QueryMap::iterator it = queries_.find(client_id); @@ -475,6 +538,7 @@ void QueryManager::RemoveQuery(GLuint client_id) { query->MarkAsDeleted(); queries_.erase(it); } + generated_query_ids_.erase(client_id); } void QueryManager::StartTracking(QueryManager::Query* /* query */) { @@ -566,10 +630,7 @@ bool QueryManager::Query::MarkAsCompleted(uint64 result) { pending_ = false; sync->result = result; - // Need a MemoryBarrier here so that sync->result is written before - // sync->process_count. - base::subtle::MemoryBarrier(); - sync->process_count = submit_count_; + base::subtle::Release_Store(&sync->process_count, submit_count_); return true; } @@ -614,7 +675,8 @@ bool QueryManager::HavePendingTransferQueries() { return !pending_transfer_queries_.empty(); } -bool QueryManager::AddPendingQuery(Query* query, uint32 submit_count) { +bool QueryManager::AddPendingQuery(Query* query, + base::subtle::Atomic32 submit_count) { DCHECK(query); DCHECK(!query->IsDeleted()); if (!RemovePendingQuery(query)) { @@ -625,7 +687,9 @@ bool QueryManager::AddPendingQuery(Query* query, uint32 submit_count) { return true; } -bool QueryManager::AddPendingTransferQuery(Query* query, uint32 submit_count) { +bool QueryManager::AddPendingTransferQuery( + Query* query, + base::subtle::Atomic32 submit_count) { DCHECK(query); DCHECK(!query->IsDeleted()); if (!RemovePendingQuery(query)) { @@ -671,7 +735,7 @@ bool QueryManager::BeginQuery(Query* query) { return query->Begin(); } -bool QueryManager::EndQuery(Query* query, uint32 submit_count) { +bool QueryManager::EndQuery(Query* query, base::subtle::Atomic32 submit_count) { DCHECK(query); if (!RemovePendingQuery(query)) { return false; diff --git a/chromium/gpu/command_buffer/service/query_manager.h b/chromium/gpu/command_buffer/service/query_manager.h index d77982b897f..36d424cefb3 100644 --- a/chromium/gpu/command_buffer/service/query_manager.h +++ b/chromium/gpu/command_buffer/service/query_manager.h @@ -7,6 +7,7 @@ #include <deque> #include <vector> +#include "base/atomicops.h" #include "base/basictypes.h" #include "base/containers/hash_tables.h" #include "base/logging.h" @@ -61,7 +62,7 @@ class GPU_EXPORT QueryManager { virtual bool Begin() = 0; // Returns false if shared memory for sync is invalid. - virtual bool End(uint32 submit_count) = 0; + virtual bool End(base::subtle::Atomic32 submit_count) = 0; // Returns false if shared memory for sync is invalid. virtual bool Process() = 0; @@ -84,7 +85,7 @@ class GPU_EXPORT QueryManager { // Returns false if shared memory for sync is invalid. bool MarkAsCompleted(uint64 result); - void MarkAsPending(uint32 submit_count) { + void MarkAsPending(base::subtle::Atomic32 submit_count) { DCHECK(!pending_); pending_ = true; submit_count_ = submit_count; @@ -96,12 +97,12 @@ class GPU_EXPORT QueryManager { } // Returns false if shared memory for sync is invalid. - bool AddToPendingQueue(uint32 submit_count) { + bool AddToPendingQueue(base::subtle::Atomic32 submit_count) { return manager_->AddPendingQuery(this, submit_count); } // Returns false if shared memory for sync is invalid. - bool AddToPendingTransferQueue(uint32 submit_count) { + bool AddToPendingTransferQueue(base::subtle::Atomic32 submit_count) { return manager_->AddPendingTransferQuery(this, submit_count); } @@ -113,9 +114,7 @@ class GPU_EXPORT QueryManager { manager_->EndQueryHelper(target); } - uint32 submit_count() const { - return submit_count_; - } + base::subtle::Atomic32 submit_count() const { return submit_count_; } private: friend class QueryManager; @@ -135,7 +134,7 @@ class GPU_EXPORT QueryManager { uint32 shm_offset_; // Count to set process count do when completed. - uint32 submit_count_; + base::subtle::Atomic32 submit_count_; // True if in the queue. bool pending_; @@ -169,7 +168,7 @@ class GPU_EXPORT QueryManager { bool BeginQuery(Query* query); // Returns false if any query is pointing to invalid shared memory. - bool EndQuery(Query* query, uint32 submit_count); + bool EndQuery(Query* query, base::subtle::Atomic32 submit_count); // Processes pending queries. Returns false if any queries are pointing // to invalid shared memory. @@ -189,6 +188,9 @@ class GPU_EXPORT QueryManager { return decoder_; } + void GenQueries(GLsizei n, const GLuint* queries); + bool IsValidQuery(GLuint id); + private: void StartTracking(Query* query); void StopTracking(Query* query); @@ -200,11 +202,12 @@ class GPU_EXPORT QueryManager { // Adds to queue of queries waiting for completion. // Returns false if any query is pointing to invalid shared memory. - bool AddPendingQuery(Query* query, uint32 submit_count); + bool AddPendingQuery(Query* query, base::subtle::Atomic32 submit_count); // Adds to queue of transfer queries waiting for completion. // Returns false if any query is pointing to invalid shared memory. - bool AddPendingTransferQuery(Query* query, uint32 submit_count); + bool AddPendingTransferQuery(Query* query, + base::subtle::Atomic32 submit_count); // Removes a query from the queue of pending queries. // Returns false if any query is pointing to invalid shared memory. @@ -228,6 +231,9 @@ class GPU_EXPORT QueryManager { typedef base::hash_map<GLuint, scoped_refptr<Query> > QueryMap; QueryMap queries_; + typedef base::hash_set<GLuint> GeneratedQueryIds; + GeneratedQueryIds generated_query_ids_; + // Queries waiting for completion. typedef std::deque<scoped_refptr<Query> > QueryQueue; QueryQueue pending_queries_; diff --git a/chromium/gpu/command_buffer/service/query_manager_unittest.cc b/chromium/gpu/command_buffer/service/query_manager_unittest.cc index 0c0829346a6..9f0156f791a 100644 --- a/chromium/gpu/command_buffer/service/query_manager_unittest.cc +++ b/chromium/gpu/command_buffer/service/query_manager_unittest.cc @@ -6,9 +6,10 @@ #include "gpu/command_buffer/common/gles2_cmd_format.h" #include "gpu/command_buffer/service/cmd_buffer_engine.h" #include "gpu/command_buffer/service/error_state_mock.h" +#include "gpu/command_buffer/service/feature_info.h" #include "gpu/command_buffer/service/gles2_cmd_decoder.h" #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" -#include "gpu/command_buffer/service/feature_info.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/test_helper.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_mock.h" @@ -21,7 +22,7 @@ using ::testing::SetArgumentPointee; namespace gpu { namespace gles2 { -class QueryManagerTest : public testing::Test { +class QueryManagerTest : public GpuServiceTest { public: static const int32 kSharedMemoryId = 401; static const size_t kSharedBufferSize = 2048; @@ -38,8 +39,7 @@ class QueryManagerTest : public testing::Test { protected: virtual void SetUp() { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); + GpuServiceTest::SetUp(); engine_.reset(new MockCommandBufferEngine()); decoder_.reset(new MockGLES2Decoder()); decoder_->set_engine(engine_.get()); @@ -56,8 +56,7 @@ class QueryManagerTest : public testing::Test { manager_->Destroy(false); manager_.reset(); engine_.reset(); - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); + GpuServiceTest::TearDown(); } QueryManager::Query* CreateQuery( @@ -69,8 +68,9 @@ class QueryManagerTest : public testing::Test { return manager_->CreateQuery(target, client_id, shm_id, shm_offset); } - void QueueQuery( - QueryManager::Query* query, GLuint service_id, uint32 submit_count) { + void QueueQuery(QueryManager::Query* query, + GLuint service_id, + base::subtle::Atomic32 submit_count) { EXPECT_CALL(*gl_, BeginQueryARB(query->target(), service_id)) .Times(1) .RetiresOnSaturation(); @@ -81,8 +81,6 @@ class QueryManagerTest : public testing::Test { EXPECT_TRUE(manager_->EndQuery(query, submit_count)); } - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; scoped_ptr<MockGLES2Decoder> decoder_; scoped_ptr<QueryManager> manager_; @@ -90,21 +88,24 @@ class QueryManagerTest : public testing::Test { class MockCommandBufferEngine : public CommandBufferEngine { public: MockCommandBufferEngine() { - data_.reset(new int8[kSharedBufferSize]); + scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); + shared_memory->CreateAndMapAnonymous(kSharedBufferSize); + valid_buffer_ = + MakeBufferFromSharedMemory(shared_memory.Pass(), kSharedBufferSize); + data_ = static_cast<uint8*>(valid_buffer_->memory()); ClearSharedMemory(); - valid_buffer_.ptr = data_.get(); - valid_buffer_.size = kSharedBufferSize; } virtual ~MockCommandBufferEngine() { } - virtual gpu::Buffer GetSharedMemoryBuffer(int32 shm_id) OVERRIDE { + virtual scoped_refptr<gpu::Buffer> GetSharedMemoryBuffer(int32 shm_id) + OVERRIDE { return shm_id == kSharedMemoryId ? valid_buffer_ : invalid_buffer_; } void ClearSharedMemory() { - memset(data_.get(), kInitialMemoryValue, kSharedBufferSize); + memset(data_, kInitialMemoryValue, kSharedBufferSize); } virtual void set_token(int32 token) OVERRIDE { @@ -129,9 +130,9 @@ class QueryManagerTest : public testing::Test { } private: - scoped_ptr<int8[]> data_; - gpu::Buffer valid_buffer_; - gpu::Buffer invalid_buffer_; + uint8* data_; + scoped_refptr<gpu::Buffer> valid_buffer_; + scoped_refptr<gpu::Buffer> invalid_buffer_; }; scoped_ptr<MockCommandBufferEngine> engine_; @@ -214,7 +215,7 @@ TEST_F(QueryManagerTest, ProcessPendingQuery) { const GLuint kClient1Id = 1; const GLuint kService1Id = 11; const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; - const uint32 kSubmitCount = 123; + const base::subtle::Atomic32 kSubmitCount = 123; const GLuint kResult = 1; // Check nothing happens if there are no pending queries. @@ -245,7 +246,7 @@ TEST_F(QueryManagerTest, ProcessPendingQuery) { .RetiresOnSaturation(); EXPECT_TRUE(manager_->ProcessPendingQueries()); EXPECT_TRUE(query->pending()); - EXPECT_EQ(0u, sync->process_count); + EXPECT_EQ(0, sync->process_count); EXPECT_EQ(0u, sync->result); // Process with return available. @@ -277,9 +278,9 @@ TEST_F(QueryManagerTest, ProcessPendingQueries) { const GLuint kClient3Id = 3; const GLuint kService3Id = 13; const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; - const uint32 kSubmitCount1 = 123; - const uint32 kSubmitCount2 = 123; - const uint32 kSubmitCount3 = 123; + const base::subtle::Atomic32 kSubmitCount1 = 123; + const base::subtle::Atomic32 kSubmitCount2 = 123; + const base::subtle::Atomic32 kSubmitCount3 = 123; const GLuint kResult1 = 1; const GLuint kResult2 = 1; const GLuint kResult3 = 1; @@ -355,7 +356,7 @@ TEST_F(QueryManagerTest, ProcessPendingQueries) { EXPECT_EQ(kSubmitCount2, sync2->process_count); EXPECT_EQ(kResult1, sync1->result); EXPECT_EQ(kResult2, sync2->result); - EXPECT_EQ(0u, sync3->process_count); + EXPECT_EQ(0, sync3->process_count); EXPECT_EQ(0u, sync3->result); EXPECT_TRUE(manager_->HavePendingQueries()); @@ -367,7 +368,7 @@ TEST_F(QueryManagerTest, ProcessPendingQueries) { .RetiresOnSaturation(); EXPECT_TRUE(manager_->ProcessPendingQueries()); EXPECT_TRUE(query3->pending()); - EXPECT_EQ(0u, sync3->process_count); + EXPECT_EQ(0, sync3->process_count); EXPECT_EQ(0u, sync3->result); EXPECT_TRUE(manager_->HavePendingQueries()); @@ -392,7 +393,7 @@ TEST_F(QueryManagerTest, ProcessPendingBadSharedMemoryId) { const GLuint kClient1Id = 1; const GLuint kService1Id = 11; const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; - const uint32 kSubmitCount = 123; + const base::subtle::Atomic32 kSubmitCount = 123; const GLuint kResult = 1; // Create Query. @@ -421,7 +422,7 @@ TEST_F(QueryManagerTest, ProcessPendingBadSharedMemoryOffset) { const GLuint kClient1Id = 1; const GLuint kService1Id = 11; const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; - const uint32 kSubmitCount = 123; + const base::subtle::Atomic32 kSubmitCount = 123; const GLuint kResult = 1; // Create Query. @@ -450,7 +451,7 @@ TEST_F(QueryManagerTest, ExitWithPendingQuery) { const GLuint kClient1Id = 1; const GLuint kService1Id = 11; const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; - const uint32 kSubmitCount = 123; + const base::subtle::Atomic32 kSubmitCount = 123; // Create Query. scoped_refptr<QueryManager::Query> query( @@ -468,7 +469,7 @@ TEST_F(QueryManagerTest, ARBOcclusionQuery2) { const GLuint kClient1Id = 1; const GLuint kService1Id = 11; const GLenum kTarget = GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT; - const uint32 kSubmitCount = 123; + const base::subtle::Atomic32 kSubmitCount = 123; TestHelper::SetupFeatureInfoInitExpectations( gl_.get(), @@ -502,7 +503,7 @@ TEST_F(QueryManagerTest, ARBOcclusionQuery) { const GLuint kClient1Id = 1; const GLuint kService1Id = 11; const GLenum kTarget = GL_ANY_SAMPLES_PASSED_EXT; - const uint32 kSubmitCount = 123; + const base::subtle::Atomic32 kSubmitCount = 123; TestHelper::SetupFeatureInfoInitExpectations( gl_.get(), @@ -533,7 +534,7 @@ TEST_F(QueryManagerTest, ARBOcclusionQuery) { TEST_F(QueryManagerTest, GetErrorQuery) { const GLuint kClient1Id = 1; const GLenum kTarget = GL_GET_ERROR_QUERY_CHROMIUM; - const uint32 kSubmitCount = 123; + const base::subtle::Atomic32 kSubmitCount = 123; TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), ""); scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); diff --git a/chromium/gpu/command_buffer/service/renderbuffer_manager_unittest.cc b/chromium/gpu/command_buffer/service/renderbuffer_manager_unittest.cc index 87fde79bf09..ba0ebea8700 100644 --- a/chromium/gpu/command_buffer/service/renderbuffer_manager_unittest.cc +++ b/chromium/gpu/command_buffer/service/renderbuffer_manager_unittest.cc @@ -6,6 +6,7 @@ #include <set> #include "gpu/command_buffer/common/gles2_cmd_utils.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/mocks.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_implementation.h" @@ -16,15 +17,14 @@ using ::testing::StrictMock; namespace gpu { namespace gles2 { -class RenderbufferManagerTestBase : public testing::Test { +class RenderbufferManagerTestBase : public GpuServiceTest { public: static const GLint kMaxSize = 128; static const GLint kMaxSamples = 4; protected: void SetUpBase(MemoryTracker* memory_tracker, bool depth24_supported) { - gl_.reset(new ::testing::StrictMock<gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); + GpuServiceTest::SetUp(); manager_.reset(new RenderbufferManager( memory_tracker, kMaxSize, kMaxSamples, depth24_supported)); } @@ -32,12 +32,9 @@ class RenderbufferManagerTestBase : public testing::Test { virtual void TearDown() { manager_->Destroy(true); manager_.reset(); - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); + GpuServiceTest::TearDown(); } - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; scoped_ptr<RenderbufferManager> manager_; }; diff --git a/chromium/gpu/command_buffer/service/safe_shared_memory_pool.cc b/chromium/gpu/command_buffer/service/safe_shared_memory_pool.cc deleted file mode 100644 index 9ba5390d200..00000000000 --- a/chromium/gpu/command_buffer/service/safe_shared_memory_pool.cc +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "gpu/command_buffer/service/safe_shared_memory_pool.h" - -#include "base/logging.h" -#include "base/memory/scoped_ptr.h" -#include "base/process/process_handle.h" -#include "build/build_config.h" - -using base::SharedMemory; -using base::SharedMemoryHandle; - -namespace gpu { - -ScopedSafeSharedMemory::ScopedSafeSharedMemory(SafeSharedMemoryPool* pool, - base::SharedMemory* memory, - size_t shm_size) { - DCHECK(pool); - DCHECK(memory); - DCHECK(memory->memory()); - pool_ = pool; - original_handle_ = memory->handle(); - safe_shared_memory_ = pool->AcquireSafeSharedMemory(memory, shm_size); - CHECK(safe_shared_memory_); -} - -ScopedSafeSharedMemory::~ScopedSafeSharedMemory() { - // Release the handle. The pool will delete the SharedMemory - // object when it is no longer referenced. - pool_->ReleaseSafeSharedMemory(original_handle_); -} - -base::SharedMemory* ScopedSafeSharedMemory::shared_memory() { - return safe_shared_memory_; -} - -SafeSharedMemoryPool::SafeSharedMemoryPool() - : handles_acquired_(0), - handles_consumed_(0), - address_space_consumed_(0), - max_handles_acquired_(0), - max_handles_consumed_(0), - max_address_space_consumed_(0) { -} - -SafeSharedMemoryPool::~SafeSharedMemoryPool() { -} - -base::SharedMemory* SafeSharedMemoryPool:: - AcquireSafeSharedMemory(base::SharedMemory* shared_memory, - size_t shm_size) { - DCHECK(shared_memory); - DCHECK(shared_memory->memory()); - base::AutoLock scoped_lock(lock_); - - // Adjust stats. - handles_acquired_++; - max_handles_acquired_ = std::max(max_handles_acquired_, - handles_acquired_); - - MemoryMap::iterator it = memory_.find(shared_memory->handle()); - // If we don't already have it, duplicated it. - if (it == memory_.end()) { - // Duplicate a new shared memory and track it. - TrackedMemory tracker; - tracker.safe_shared_memory = DuplicateSharedMemory(shared_memory, shm_size); - tracker.reference_count = 1; - tracker.shm_size = shm_size; - memory_[shared_memory->handle()] = tracker; - - // Adjust stats. - handles_consumed_++; - address_space_consumed_ += shm_size; - max_handles_consumed_ = std::max(max_handles_consumed_, - handles_consumed_); - max_address_space_consumed_ = std::max(max_address_space_consumed_, - address_space_consumed_); - return tracker.safe_shared_memory; - } - - // Otherwise, add a reference and return the existing one. - DCHECK(it->second.reference_count); - DCHECK(it->second.safe_shared_memory); - DCHECK(it->second.safe_shared_memory->memory()); - it->second.reference_count++; - return it->second.safe_shared_memory; -} - -void SafeSharedMemoryPool:: - ReleaseSafeSharedMemory(const base::SharedMemoryHandle& handle) { - base::AutoLock scoped_lock(lock_); - - // Adjust stats. - DCHECK_GT(handles_acquired_, 0); - handles_acquired_--; - - MemoryMap::iterator it = memory_.find(handle); - CHECK(it != memory_.end()); - CHECK(it->second.reference_count); - CHECK(it->second.safe_shared_memory); - if (--it->second.reference_count == 0) { - // Adjust stats. - DCHECK_GT(handles_consumed_, 0); - handles_consumed_--; - DCHECK_LE(it->second.shm_size, address_space_consumed_); - address_space_consumed_ -= it->second.shm_size; - // Delete the safe memory and remove it. - delete it->second.safe_shared_memory; - memory_.erase(it); - } -} - -SharedMemory* SafeSharedMemoryPool::DuplicateSharedMemory( - SharedMemory* shared_memory, size_t size) { - // Duplicate the handle. - SharedMemoryHandle duped_shared_memory_handle; - if (!shared_memory->ShareToProcess( - base::GetCurrentProcessHandle(), - &duped_shared_memory_handle)) { - PLOG(ERROR) << "Failed SharedMemory::ShareToProcess"; - LOG(ERROR) << "Total handles acquired " << handles_acquired_; - LOG(ERROR) << "Total handles open " << handles_consumed_; - LOG(ERROR) << "Total address space " << address_space_consumed_; - LOG(ERROR) << "Max handles acquired " << max_handles_acquired_; - LOG(ERROR) << "Max handles open " << max_handles_consumed_; - LOG(ERROR) << "Max address space " << max_address_space_consumed_; - CHECK(false); // Diagnosing a crash. - return NULL; - } - scoped_ptr<SharedMemory> duped_shared_memory( - new SharedMemory(duped_shared_memory_handle, false)); - // Map the shared memory into this process. This validates the size. - if (!duped_shared_memory->Map(size)) { - PLOG(ERROR) << "Failed SharedMemory::Map(" << size << ")"; - LOG(ERROR) << "Total handles acquired " << handles_acquired_; - LOG(ERROR) << "Total handles open " << handles_consumed_; - LOG(ERROR) << "Total address space " << address_space_consumed_; - LOG(ERROR) << "Max handles acquired " << max_handles_acquired_; - LOG(ERROR) << "Max handles open " << max_handles_consumed_; - LOG(ERROR) << "Max address space " << max_address_space_consumed_; - CHECK(false); // Diagnosing a crash. - return NULL; - } - return duped_shared_memory.release(); -} - -} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/safe_shared_memory_pool.h b/chromium/gpu/command_buffer/service/safe_shared_memory_pool.h deleted file mode 100644 index fed17ff3726..00000000000 --- a/chromium/gpu/command_buffer/service/safe_shared_memory_pool.h +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef GPU_COMMAND_BUFFER_SERVICE_SAFE_SHARED_MEMORY_POOL_H_ -#define GPU_COMMAND_BUFFER_SERVICE_SAFE_SHARED_MEMORY_POOL_H_ - -#include <map> - -#include "base/basictypes.h" -#include "base/memory/shared_memory.h" -#include "base/synchronization/lock.h" -#include "build/build_config.h" - -namespace gpu { -class SafeSharedMemoryPool; - -// These classes exist to help protect against deletion of shared -// memory that is being used on a worker thread. It's mainly a -// security measure to prevent use-after-free in the browser, due -// to a misbehaving client. That said, this should be removed -// in favor of higher-level reference counting of an appropriate -// opaque 'memory blob' data-structure. - -class ScopedSafeSharedMemory { - public: - base::SharedMemory* shared_memory(); - ScopedSafeSharedMemory(SafeSharedMemoryPool* pool, - base::SharedMemory* memory, - size_t shm_size); - ~ScopedSafeSharedMemory(); - private: - base::SharedMemory* safe_shared_memory_; - base::SharedMemoryHandle original_handle_; - SafeSharedMemoryPool* pool_; - - DISALLOW_COPY_AND_ASSIGN(ScopedSafeSharedMemory); -}; - -class SafeSharedMemoryPool { - public: - SafeSharedMemoryPool(); - virtual ~SafeSharedMemoryPool(); - - private: - friend class ScopedSafeSharedMemory; - - // Acquires and release shared memory. The acquired shared memory - // is guaranteed to live until it is released. - base::SharedMemory* AcquireSafeSharedMemory(base::SharedMemory*, size_t size); - void ReleaseSafeSharedMemory(const base::SharedMemoryHandle&); - - // Utility function to duplicate shared memory. - base::SharedMemory* DuplicateSharedMemory(base::SharedMemory*, size_t size); - - // Track all SharedMemory's that we have already duplicated. - struct TrackedMemory { - base::SharedMemory* safe_shared_memory; - size_t shm_size; - int reference_count; - }; - - typedef std::map<base::SharedMemoryHandle, TrackedMemory> MemoryMap; - MemoryMap memory_; - - // Track usage to diagnose crashes. - int handles_acquired_; - int handles_consumed_; - size_t address_space_consumed_; - int max_handles_acquired_; - int max_handles_consumed_; - size_t max_address_space_consumed_; - - base::Lock lock_; - - DISALLOW_COPY_AND_ASSIGN(SafeSharedMemoryPool); -}; - -} // namespace gfx - -#endif // GPU_COMMAND_BUFFER_SERVICE_SAFE_SHARED_MEMORY_POOL_H_ - diff --git a/chromium/gpu/command_buffer/service/shader_manager_unittest.cc b/chromium/gpu/command_buffer/service/shader_manager_unittest.cc index d86aca48bcf..b5b7b383984 100644 --- a/chromium/gpu/command_buffer/service/shader_manager_unittest.cc +++ b/chromium/gpu/command_buffer/service/shader_manager_unittest.cc @@ -5,6 +5,7 @@ #include "gpu/command_buffer/service/shader_manager.h" #include "base/memory/scoped_ptr.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/mocks.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_mock.h" @@ -15,7 +16,7 @@ using ::testing::ReturnRef; namespace gpu { namespace gles2 { -class ShaderManagerTest : public testing::Test { +class ShaderManagerTest : public GpuServiceTest { public: ShaderManagerTest() { } @@ -25,18 +26,6 @@ class ShaderManagerTest : public testing::Test { } protected: - virtual void SetUp() { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); - } - - virtual void TearDown() { - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); - } - - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; ShaderManager manager_; }; diff --git a/chromium/gpu/command_buffer/service/shader_translator.cc b/chromium/gpu/command_buffer/service/shader_translator.cc index 37e2dc64d33..3964c2db16b 100644 --- a/chromium/gpu/command_buffer/service/shader_translator.cc +++ b/chromium/gpu/command_buffer/service/shader_translator.cc @@ -9,6 +9,7 @@ #include "base/at_exit.h" #include "base/debug/trace_event.h" +#include "base/lazy_instance.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" @@ -16,21 +17,21 @@ namespace { using gpu::gles2::ShaderTranslator; -void FinalizeShaderTranslator(void* /* dummy */) { - TRACE_EVENT0("gpu", "ShFinalize"); - ShFinalize(); -} - -bool InitializeShaderTranslator() { - static bool initialized = false; - if (!initialized) { +class ShaderTranslatorInitializer { + public: + ShaderTranslatorInitializer() { TRACE_EVENT0("gpu", "ShInitialize"); CHECK(ShInitialize()); - base::AtExitManager::RegisterCallback(&FinalizeShaderTranslator, NULL); - initialized = true; } - return initialized; -} + + ~ShaderTranslatorInitializer() { + TRACE_EVENT0("gpu", "ShFinalize"); + ShFinalize(); + } +}; + +base::LazyInstance<ShaderTranslatorInitializer> g_translator_initializer = + LAZY_INSTANCE_INITIALIZER; #if !defined(ANGLE_SH_VERSION) || ANGLE_SH_VERSION < 108 typedef int ANGLEGetInfoType; @@ -133,8 +134,7 @@ bool ShaderTranslator::Init( DCHECK(shader_spec == SH_GLES2_SPEC || shader_spec == SH_WEBGL_SPEC); DCHECK(resources != NULL); - if (!InitializeShaderTranslator()) - return false; + g_translator_initializer.Get(); ShShaderOutput shader_output = (glsl_implementation_type == kGlslES ? SH_ESSL_OUTPUT : SH_GLSL_OUTPUT); @@ -152,11 +152,9 @@ bool ShaderTranslator::Init( int ShaderTranslator::GetCompileOptions() const { int compile_options = - SH_OBJECT_CODE | SH_VARIABLES | - SH_MAP_LONG_VARIABLE_NAMES | SH_ENFORCE_PACKING_RESTRICTIONS | - SH_LIMIT_EXPRESSION_COMPLEXITY | SH_LIMIT_CALL_STACK_DEPTH; - - compile_options |= SH_CLAMP_INDIRECT_ARRAY_BOUNDS; + SH_OBJECT_CODE | SH_VARIABLES | SH_ENFORCE_PACKING_RESTRICTIONS | + SH_LIMIT_EXPRESSION_COMPLEXITY | SH_LIMIT_CALL_STACK_DEPTH | + SH_CLAMP_INDIRECT_ARRAY_BOUNDS; compile_options |= driver_bug_workarounds_; @@ -203,9 +201,29 @@ bool ShaderTranslator::Translate(const char* shader) { return success; } -std::string ShaderTranslator::GetStringForOptionsThatWouldEffectCompilation() +std::string ShaderTranslator::GetStringForOptionsThatWouldAffectCompilation() const { +#if ANGLE_SH_VERSION >= 124 + DCHECK(compiler_ != NULL); + + ANGLEGetInfoType resource_len = 0; + ShGetInfo(compiler_, SH_RESOURCES_STRING_LENGTH, &resource_len); + DCHECK(resource_len > 1); + scoped_ptr<char[]> resource_str(new char[resource_len]); + + ShGetBuiltInResourcesString(compiler_, resource_len, resource_str.get()); + + return std::string(":CompileOptions:" + + base::IntToString(GetCompileOptions())) + + std::string(resource_str.get()); +#else +#if ANGLE_SH_VERSION >= 123 + const size_t kNumIntFields = 21; +#elif ANGLE_SH_VERSION >= 122 + const size_t kNumIntFields = 20; +#else const size_t kNumIntFields = 16; +#endif const size_t kNumEnumFields = 1; const size_t kNumFunctionPointerFields = 1; struct MustMatchShBuiltInResource { @@ -256,7 +274,24 @@ std::string ShaderTranslator::GetStringForOptionsThatWouldEffectCompilation() ":MaxCallStackDepth:" + base::IntToString(compiler_options_.MaxCallStackDepth) + ":EXT_frag_depth:" + +#if ANGLE_SH_VERSION >= 122 + base::IntToString(compiler_options_.EXT_frag_depth) + +#if ANGLE_SH_VERSION >= 123 + ":EXT_shader_texture_lod:" + + base::IntToString(compiler_options_.EXT_shader_texture_lod) + +#endif + ":MaxVertexOutputVectors:" + + base::IntToString(compiler_options_.MaxVertexOutputVectors) + + ":MaxFragmentInputVectors:" + + base::IntToString(compiler_options_.MaxFragmentInputVectors) + + ":MinProgramTexelOffset:" + + base::IntToString(compiler_options_.MinProgramTexelOffset) + + ":MaxProgramTexelOffset:" + + base::IntToString(compiler_options_.MaxProgramTexelOffset)); +#else // ANGLE_SH_VERSION < 122 base::IntToString(compiler_options_.EXT_frag_depth)); +#endif +#endif } const char* ShaderTranslator::translated_shader() const { diff --git a/chromium/gpu/command_buffer/service/shader_translator.h b/chromium/gpu/command_buffer/service/shader_translator.h index b9bacf155e6..d993967da9b 100644 --- a/chromium/gpu/command_buffer/service/shader_translator.h +++ b/chromium/gpu/command_buffer/service/shader_translator.h @@ -89,8 +89,8 @@ class ShaderTranslatorInterface { virtual const NameMap& name_map() const = 0; // Return a string that is unique for a specfic set of options that would - // possibly effect compilation. - virtual std::string GetStringForOptionsThatWouldEffectCompilation() const = 0; + // possibly affect compilation. + virtual std::string GetStringForOptionsThatWouldAffectCompilation() const = 0; protected: virtual ~ShaderTranslatorInterface() {} @@ -135,7 +135,7 @@ class GPU_EXPORT ShaderTranslator virtual const VariableMap& varying_map() const OVERRIDE; virtual const NameMap& name_map() const OVERRIDE; - virtual std::string GetStringForOptionsThatWouldEffectCompilation() const + virtual std::string GetStringForOptionsThatWouldAffectCompilation() const OVERRIDE; void AddDestructionObserver(DestructionObserver* observer); diff --git a/chromium/gpu/command_buffer/service/shader_translator_cache.cc b/chromium/gpu/command_buffer/service/shader_translator_cache.cc index 9626a0e25ef..f204186c7e7 100644 --- a/chromium/gpu/command_buffer/service/shader_translator_cache.cc +++ b/chromium/gpu/command_buffer/service/shader_translator_cache.cc @@ -7,14 +7,11 @@ namespace gpu { namespace gles2 { -ShaderTranslatorCache* ShaderTranslatorCache::GetInstance() { - return Singleton<ShaderTranslatorCache>::get(); -} - ShaderTranslatorCache::ShaderTranslatorCache() { } ShaderTranslatorCache::~ShaderTranslatorCache() { + DCHECK(cache_.empty()); } void ShaderTranslatorCache::OnDestruct(ShaderTranslator* translator) { diff --git a/chromium/gpu/command_buffer/service/shader_translator_cache.h b/chromium/gpu/command_buffer/service/shader_translator_cache.h index 8439d533987..32b7f5f84a1 100644 --- a/chromium/gpu/command_buffer/service/shader_translator_cache.h +++ b/chromium/gpu/command_buffer/service/shader_translator_cache.h @@ -10,22 +10,23 @@ #include <map> #include "base/memory/ref_counted.h" -#include "base/memory/singleton.h" #include "gpu/command_buffer/service/shader_translator.h" #include "third_party/angle/include/GLSLANG/ShaderLang.h" namespace gpu { namespace gles2 { -// This singleton and the cache that it implements is NOT thread safe. -// We're relying on the fact that the all GLES2DecoderImpl's are used -// on one thread. +// This class is not thread safe and can only be created and destroyed +// on a single thread. But it is safe to use two independent instances on two +// threads without synchronization. // // TODO(backer): Investigate using glReleaseShaderCompiler as an alternative to // to this cache. -class ShaderTranslatorCache : public ShaderTranslator::DestructionObserver { +class GPU_EXPORT ShaderTranslatorCache + : public base::RefCounted<ShaderTranslatorCache>, + public NON_EXPORTED_BASE(ShaderTranslator::DestructionObserver) { public: - static ShaderTranslatorCache* GetInstance(); + ShaderTranslatorCache(); // ShaderTranslator::DestructionObserver implementation virtual void OnDestruct(ShaderTranslator* translator) OVERRIDE; @@ -39,11 +40,9 @@ class ShaderTranslatorCache : public ShaderTranslator::DestructionObserver { ShCompileOptions driver_bug_workarounds); private: - ShaderTranslatorCache(); + friend class base::RefCounted<ShaderTranslatorCache>; virtual ~ShaderTranslatorCache(); - friend struct DefaultSingletonTraits<ShaderTranslatorCache>; - // Parameters passed into ShaderTranslator::Init struct ShaderTranslatorInitParams { ShShaderType shader_type; diff --git a/chromium/gpu/command_buffer/service/shader_translator_unittest.cc b/chromium/gpu/command_buffer/service/shader_translator_unittest.cc index 1b53c2b768b..233b412024c 100644 --- a/chromium/gpu/command_buffer/service/shader_translator_unittest.cc +++ b/chromium/gpu/command_buffer/service/shader_translator_unittest.cc @@ -19,9 +19,10 @@ class ShaderTranslatorTest : public testing::Test { protected: virtual void SetUp() { ShBuiltInResources resources; + ShInitBuiltInResources(&resources); resources.MaxExpressionComplexity = 32; resources.MaxCallStackDepth = 32; - ShInitBuiltInResources(&resources); + vertex_translator_ = new ShaderTranslator(); fragment_translator_ = new ShaderTranslator(); @@ -244,13 +245,13 @@ TEST_F(ShaderTranslatorTest, OptionsString) { SH_EMULATE_BUILT_IN_FUNCTIONS)); std::string options_1( - translator_1->GetStringForOptionsThatWouldEffectCompilation()); + translator_1->GetStringForOptionsThatWouldAffectCompilation()); std::string options_2( - translator_1->GetStringForOptionsThatWouldEffectCompilation()); + translator_1->GetStringForOptionsThatWouldAffectCompilation()); std::string options_3( - translator_2->GetStringForOptionsThatWouldEffectCompilation()); + translator_2->GetStringForOptionsThatWouldAffectCompilation()); std::string options_4( - translator_3->GetStringForOptionsThatWouldEffectCompilation()); + translator_3->GetStringForOptionsThatWouldAffectCompilation()); EXPECT_EQ(options_1, options_2); EXPECT_NE(options_1, options_3); diff --git a/chromium/gpu/command_buffer/service/stream_texture.h b/chromium/gpu/command_buffer/service/stream_texture.h deleted file mode 100644 index bcddc82dd82..00000000000 --- a/chromium/gpu/command_buffer/service/stream_texture.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_H_ -#define GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_H_ - -#include "base/basictypes.h" -#include "ui/gfx/size.h" - -namespace gpu { - -class StreamTexture { - public: - StreamTexture() { - } - - virtual ~StreamTexture() { - } - - virtual void Update() = 0; - - // Get the size of the StreamTexture. - virtual gfx::Size GetSize() = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(StreamTexture); -}; - -} // namespace gpu - -#endif // GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_H_ diff --git a/chromium/gpu/command_buffer/service/stream_texture_manager.h b/chromium/gpu/command_buffer/service/stream_texture_manager.h deleted file mode 100644 index 51119fad528..00000000000 --- a/chromium/gpu/command_buffer/service/stream_texture_manager.h +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_MANAGER_H_ -#define GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_MANAGER_H_ - -#include "base/basictypes.h" - -namespace gpu { - -class StreamTexture; - -// Interface used by the cmd decoder to create and lookup stream textures. -class StreamTextureManager { - public: - StreamTextureManager() { - } - - virtual ~StreamTextureManager() { - } - - // Returns an identifier for the object, or NULL if not successful. - virtual uint32 CreateStreamTexture(uint32 service_id, uint32 client_id) = 0; - - virtual void DestroyStreamTexture(uint32 service_id) = 0; - - virtual StreamTexture* LookupStreamTexture(uint32 service_id) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(StreamTextureManager); -}; - -} // namespace gpu - -#endif // GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_MANAGER_H_ diff --git a/chromium/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc b/chromium/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc index 2fd55358b4a..a8ece57ebcd 100644 --- a/chromium/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc +++ b/chromium/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc @@ -5,41 +5,76 @@ #include "gpu/command_buffer/service/stream_texture_manager_in_process_android.h" #include "base/bind.h" +#include "base/callback.h" +#include "gpu/command_buffer/service/texture_manager.h" #include "ui/gfx/size.h" #include "ui/gl/android/surface_texture.h" #include "ui/gl/gl_bindings.h" +#include "ui/gl/gl_image.h" namespace gpu { -StreamTextureManagerInProcess::StreamTextureImpl::StreamTextureImpl( - uint32 service_id, - uint32 stream_id) - : surface_texture_(new gfx::SurfaceTexture(service_id)), - stream_id_(stream_id) {} +namespace { -StreamTextureManagerInProcess::StreamTextureImpl::~StreamTextureImpl() {} +// Simply wraps a SurfaceTexture reference as a GLImage. +class GLImageImpl : public gfx::GLImage { + public: + GLImageImpl(const scoped_refptr<gfx::SurfaceTexture>& surface_texture, + const base::Closure& release_callback); -void StreamTextureManagerInProcess::StreamTextureImpl::Update() { - GLint texture_id = 0; - glGetIntegerv(GL_TEXTURE_BINDING_EXTERNAL_OES, &texture_id); + // implement gfx::GLImage + virtual void Destroy() OVERRIDE; + virtual gfx::Size GetSize() OVERRIDE; + virtual bool BindTexImage(unsigned target) OVERRIDE; + virtual void ReleaseTexImage(unsigned target) OVERRIDE; + virtual void WillUseTexImage() OVERRIDE; + virtual void DidUseTexImage() OVERRIDE {} + virtual void WillModifyTexImage() OVERRIDE {} + virtual void DidModifyTexImage() OVERRIDE {} + + private: + virtual ~GLImageImpl(); + + scoped_refptr<gfx::SurfaceTexture> surface_texture_; + base::Closure release_callback_; + + DISALLOW_COPY_AND_ASSIGN(GLImageImpl); +}; + +GLImageImpl::GLImageImpl( + const scoped_refptr<gfx::SurfaceTexture>& surface_texture, + const base::Closure& release_callback) + : surface_texture_(surface_texture), release_callback_(release_callback) {} + +GLImageImpl::~GLImageImpl() { + release_callback_.Run(); +} + +void GLImageImpl::Destroy() { + NOTREACHED(); +} + +void GLImageImpl::WillUseTexImage() { surface_texture_->UpdateTexImage(); - glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_id); } -gfx::Size StreamTextureManagerInProcess::StreamTextureImpl::GetSize() { - return size_; +bool GLImageImpl::BindTexImage(unsigned target) { + NOTREACHED(); + return false; } -void StreamTextureManagerInProcess::StreamTextureImpl::SetSize(gfx::Size size) { - size_ = size; +void GLImageImpl::ReleaseTexImage(unsigned target) { + NOTREACHED(); } -scoped_refptr<gfx::SurfaceTexture> -StreamTextureManagerInProcess::StreamTextureImpl::GetSurfaceTexture() { - return surface_texture_; +gfx::Size GLImageImpl::GetSize() { + return gfx::Size(); } -StreamTextureManagerInProcess::StreamTextureManagerInProcess() : next_id_(1) {} +} // anonymous namespace + +StreamTextureManagerInProcess::StreamTextureManagerInProcess() + : next_id_(1), weak_factory_(this) {} StreamTextureManagerInProcess::~StreamTextureManagerInProcess() { if (!textures_.empty()) { @@ -48,13 +83,47 @@ StreamTextureManagerInProcess::~StreamTextureManagerInProcess() { } } -GLuint StreamTextureManagerInProcess::CreateStreamTexture(uint32 service_id, - uint32 client_id) { - base::AutoLock lock(map_lock_); +GLuint StreamTextureManagerInProcess::CreateStreamTexture( + uint32 client_texture_id, + gles2::TextureManager* texture_manager) { + CalledOnValidThread(); + + gles2::TextureRef* texture = texture_manager->GetTexture(client_texture_id); + + if (!texture || (texture->texture()->target() && + texture->texture()->target() != GL_TEXTURE_EXTERNAL_OES)) { + return 0; + } + + scoped_refptr<gfx::SurfaceTexture> surface_texture( + gfx::SurfaceTexture::Create(texture->service_id())); + uint32 stream_id = next_id_++; - linked_ptr<StreamTextureImpl> texture( - new StreamTextureImpl(service_id, stream_id)); - textures_[service_id] = texture; + base::Closure release_callback = + base::Bind(&StreamTextureManagerInProcess::OnReleaseStreamTexture, + weak_factory_.GetWeakPtr(), stream_id); + scoped_refptr<gfx::GLImage> gl_image(new GLImageImpl(surface_texture, + release_callback)); + + gfx::Size size = gl_image->GetSize(); + texture_manager->SetTarget(texture, GL_TEXTURE_EXTERNAL_OES); + texture_manager->SetLevelInfo(texture, + GL_TEXTURE_EXTERNAL_OES, + 0, + GL_RGBA, + size.width(), + size.height(), + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + true); + texture_manager->SetLevelImage(texture, GL_TEXTURE_EXTERNAL_OES, 0, gl_image); + + { + base::AutoLock lock(map_lock_); + textures_[stream_id] = surface_texture; + } if (next_id_ == 0) next_id_++; @@ -62,29 +131,19 @@ GLuint StreamTextureManagerInProcess::CreateStreamTexture(uint32 service_id, return stream_id; } -void StreamTextureManagerInProcess::DestroyStreamTexture(uint32 service_id) { +void StreamTextureManagerInProcess::OnReleaseStreamTexture(uint32 stream_id) { + CalledOnValidThread(); base::AutoLock lock(map_lock_); - textures_.erase(service_id); -} - -gpu::StreamTexture* StreamTextureManagerInProcess::LookupStreamTexture( - uint32 service_id) { - base::AutoLock lock(map_lock_); - TextureMap::const_iterator it = textures_.find(service_id); - if (it != textures_.end()) - return it->second.get(); - - return NULL; + textures_.erase(stream_id); } +// This can get called from any thread. scoped_refptr<gfx::SurfaceTexture> StreamTextureManagerInProcess::GetSurfaceTexture(uint32 stream_id) { base::AutoLock lock(map_lock_); - for (TextureMap::iterator it = textures_.begin(); it != textures_.end(); - it++) { - if (it->second->stream_id() == stream_id) - return it->second->GetSurfaceTexture(); - } + TextureMap::const_iterator it = textures_.find(stream_id); + if (it != textures_.end()) + return it->second; return NULL; } diff --git a/chromium/gpu/command_buffer/service/stream_texture_manager_in_process_android.h b/chromium/gpu/command_buffer/service/stream_texture_manager_in_process_android.h index 6753c139989..8b507b058fc 100644 --- a/chromium/gpu/command_buffer/service/stream_texture_manager_in_process_android.h +++ b/chromium/gpu/command_buffer/service/stream_texture_manager_in_process_android.h @@ -7,66 +7,41 @@ #include <map> -#include "base/memory/linked_ptr.h" #include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" #include "base/synchronization/lock.h" -#include "gpu/command_buffer/service/stream_texture.h" -#include "gpu/command_buffer/service/stream_texture_manager.h" +#include "base/threading/non_thread_safe.h" namespace gfx { -class Size; class SurfaceTexture; } namespace gpu { -class StreamTextureManagerInProcess - : public gpu::StreamTextureManager, - public base::RefCountedThreadSafe<StreamTextureManagerInProcess> { +namespace gles2 { +class TextureManager; +} + +class StreamTextureManagerInProcess : public base::NonThreadSafe { public: StreamTextureManagerInProcess(); + ~StreamTextureManagerInProcess(); - // implement gpu::StreamTextureManager: - virtual uint32 CreateStreamTexture(uint32 service_id, - uint32 client_id) OVERRIDE; - virtual void DestroyStreamTexture(uint32 service_id) OVERRIDE; - virtual gpu::StreamTexture* LookupStreamTexture(uint32 service_id) OVERRIDE; + uint32 CreateStreamTexture(uint32 client_texture_id, + gles2::TextureManager* texture_manager); + // This method can be called from any thread. scoped_refptr<gfx::SurfaceTexture> GetSurfaceTexture(uint32 stream_id); private: - class StreamTextureImpl : public gpu::StreamTexture { - public: - StreamTextureImpl(uint32 service_id, uint32 stream_id); - virtual ~StreamTextureImpl(); - - // implement gpu::StreamTexture - virtual void Update() OVERRIDE; - virtual gfx::Size GetSize() OVERRIDE; - - void SetSize(gfx::Size size); - - scoped_refptr<gfx::SurfaceTexture> GetSurfaceTexture(); - uint32 stream_id() { return stream_id_; } - - private: - scoped_refptr<gfx::SurfaceTexture> surface_texture_; - uint32 stream_id_; - gfx::Size size_; + void OnReleaseStreamTexture(uint32 stream_id); - DISALLOW_COPY_AND_ASSIGN(StreamTextureImpl); - }; - - friend class base::RefCountedThreadSafe<StreamTextureManagerInProcess>; - virtual ~StreamTextureManagerInProcess(); - - typedef std::map<uint32, linked_ptr<StreamTextureImpl> > TextureMap; + typedef std::map<uint32, scoped_refptr<gfx::SurfaceTexture> > TextureMap; TextureMap textures_; - - uint32 next_id_; - base::Lock map_lock_; + uint32 next_id_; + base::WeakPtrFactory<StreamTextureManagerInProcess> weak_factory_; DISALLOW_COPY_AND_ASSIGN(StreamTextureManagerInProcess); }; diff --git a/chromium/gpu/command_buffer/service/stream_texture_manager_mock.cc b/chromium/gpu/command_buffer/service/stream_texture_manager_mock.cc deleted file mode 100644 index 75268b86205..00000000000 --- a/chromium/gpu/command_buffer/service/stream_texture_manager_mock.cc +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "gpu/command_buffer/service/stream_texture_manager_mock.h" - -namespace gpu { - -MockStreamTextureManager::MockStreamTextureManager() { -} - -MockStreamTextureManager::~MockStreamTextureManager() { -} - -} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/stream_texture_manager_mock.h b/chromium/gpu/command_buffer/service/stream_texture_manager_mock.h deleted file mode 100644 index 4b744f21b1e..00000000000 --- a/chromium/gpu/command_buffer/service/stream_texture_manager_mock.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_MANAGER_MOCK_H_ -#define GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_MANAGER_MOCK_H_ - -#include "base/basictypes.h" -#include "gpu/command_buffer/service/stream_texture_manager.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace gpu { - -class StreamTexture; - -class MockStreamTextureManager : public StreamTextureManager { - public: - MockStreamTextureManager(); - virtual ~MockStreamTextureManager(); - - MOCK_METHOD2(CreateStreamTexture, - uint32(uint32 service_id, uint32 client_id)); - MOCK_METHOD1(DestroyStreamTexture, void(uint32 service_id)); - MOCK_METHOD1(LookupStreamTexture, StreamTexture*(uint32 service_id)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockStreamTextureManager); -}; - -} // namespace gpu - -#endif // GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_MANAGER_MOCK_H_ diff --git a/chromium/gpu/command_buffer/service/stream_texture_mock.cc b/chromium/gpu/command_buffer/service/stream_texture_mock.cc deleted file mode 100644 index 742a4f71ec0..00000000000 --- a/chromium/gpu/command_buffer/service/stream_texture_mock.cc +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "gpu/command_buffer/service/stream_texture_mock.h" - -namespace gpu { - -MockStreamTexture::MockStreamTexture() { -} - -MockStreamTexture::~MockStreamTexture() { -} - -} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/stream_texture_mock.h b/chromium/gpu/command_buffer/service/stream_texture_mock.h deleted file mode 100644 index cd951d22618..00000000000 --- a/chromium/gpu/command_buffer/service/stream_texture_mock.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_MOCK_H_ -#define GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_MOCK_H_ - -#include "base/memory/ref_counted.h" -#include "gpu/command_buffer/service/stream_texture.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace gpu { - -class MockStreamTexture : public StreamTexture { - public: - MockStreamTexture(); - virtual ~MockStreamTexture(); - - MOCK_METHOD0(Update, void()); - MOCK_METHOD0(GetSize, gfx::Size(void)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockStreamTexture); -}; - -} // namespace gpu - -#endif // GPU_COMMAND_BUFFER_SERVICE_STREAM_TEXTURE_MOCK_H_ diff --git a/chromium/gpu/command_buffer/service/test_helper.cc b/chromium/gpu/command_buffer/service/test_helper.cc index 92c5ec456ef..c589be4326a 100644 --- a/chromium/gpu/command_buffer/service/test_helper.cc +++ b/chromium/gpu/command_buffer/service/test_helper.cc @@ -9,7 +9,6 @@ #include "base/strings/string_number_conversions.h" #include "base/strings/string_tokenizer.h" -#include "gpu/command_buffer/common/types.h" #include "gpu/command_buffer/service/buffer_manager.h" #include "gpu/command_buffer/service/error_state_mock.h" #include "gpu/command_buffer/service/gl_utils.h" @@ -61,7 +60,9 @@ const GLint TestHelper::kMaxVertexUniformComponents; #endif void TestHelper::SetupTextureInitializationExpectations( - ::gfx::MockGLInterface* gl, GLenum target) { + ::gfx::MockGLInterface* gl, + GLenum target, + bool use_default_textures) { InSequence sequence; bool needs_initialization = (target != GL_TEXTURE_EXTERNAL_OES); @@ -98,7 +99,7 @@ void TestHelper::SetupTextureInitializationExpectations( NOTREACHED(); } - int array_size = 2; + int array_size = use_default_textures ? 2 : 1; EXPECT_CALL(*gl, GenTextures(array_size, _)) .WillOnce(SetArrayArgument<1>(texture_ids, @@ -139,11 +140,14 @@ void TestHelper::SetupTextureInitializationExpectations( void TestHelper::SetupTextureManagerInitExpectations( ::gfx::MockGLInterface* gl, - const char* extensions) { + const char* extensions, + bool use_default_textures) { InSequence sequence; - SetupTextureInitializationExpectations(gl, GL_TEXTURE_2D); - SetupTextureInitializationExpectations(gl, GL_TEXTURE_CUBE_MAP); + SetupTextureInitializationExpectations( + gl, GL_TEXTURE_2D, use_default_textures); + SetupTextureInitializationExpectations( + gl, GL_TEXTURE_CUBE_MAP, use_default_textures); bool ext_image_external = false; bool arb_texture_rectangle = false; @@ -160,15 +164,22 @@ void TestHelper::SetupTextureManagerInitExpectations( } if (ext_image_external) { - SetupTextureInitializationExpectations(gl, GL_TEXTURE_EXTERNAL_OES); + SetupTextureInitializationExpectations( + gl, GL_TEXTURE_EXTERNAL_OES, use_default_textures); } if (arb_texture_rectangle) { - SetupTextureInitializationExpectations(gl, GL_TEXTURE_RECTANGLE_ARB); + SetupTextureInitializationExpectations( + gl, GL_TEXTURE_RECTANGLE_ARB, use_default_textures); } } void TestHelper::SetupTextureDestructionExpectations( - ::gfx::MockGLInterface* gl, GLenum target) { + ::gfx::MockGLInterface* gl, + GLenum target, + bool use_default_textures) { + if (!use_default_textures) + return; + GLuint texture_id = 0; switch (target) { case GL_TEXTURE_2D: @@ -194,9 +205,11 @@ void TestHelper::SetupTextureDestructionExpectations( void TestHelper::SetupTextureManagerDestructionExpectations( ::gfx::MockGLInterface* gl, - const char* extensions) { - SetupTextureDestructionExpectations(gl, GL_TEXTURE_2D); - SetupTextureDestructionExpectations(gl, GL_TEXTURE_CUBE_MAP); + const char* extensions, + bool use_default_textures) { + SetupTextureDestructionExpectations(gl, GL_TEXTURE_2D, use_default_textures); + SetupTextureDestructionExpectations( + gl, GL_TEXTURE_CUBE_MAP, use_default_textures); bool ext_image_external = false; bool arb_texture_rectangle = false; @@ -213,10 +226,12 @@ void TestHelper::SetupTextureManagerDestructionExpectations( } if (ext_image_external) { - SetupTextureDestructionExpectations(gl, GL_TEXTURE_EXTERNAL_OES); + SetupTextureDestructionExpectations( + gl, GL_TEXTURE_EXTERNAL_OES, use_default_textures); } if (arb_texture_rectangle) { - SetupTextureDestructionExpectations(gl, GL_TEXTURE_RECTANGLE_ARB); + SetupTextureDestructionExpectations( + gl, GL_TEXTURE_RECTANGLE_ARB, use_default_textures); } EXPECT_CALL(*gl, DeleteTextures(4, _)) @@ -225,18 +240,23 @@ void TestHelper::SetupTextureManagerDestructionExpectations( } void TestHelper::SetupContextGroupInitExpectations( - ::gfx::MockGLInterface* gl, - const DisallowedFeatures& disallowed_features, - const char* extensions) { + ::gfx::MockGLInterface* gl, + const DisallowedFeatures& disallowed_features, + const char* extensions, + const char* gl_version, + bool bind_generates_resource) { InSequence sequence; - SetupFeatureInfoInitExpectations(gl, extensions); + SetupFeatureInfoInitExpectationsWithGLVersion(gl, extensions, "", gl_version); + + std::string l_version(StringToLowerASCII(std::string(gl_version))); + bool is_es3 = (l_version.substr(0, 12) == "opengl es 3."); EXPECT_CALL(*gl, GetIntegerv(GL_MAX_RENDERBUFFER_SIZE, _)) .WillOnce(SetArgumentPointee<1>(kMaxRenderbufferSize)) .RetiresOnSaturation(); if (strstr(extensions, "GL_EXT_framebuffer_multisample") || - strstr(extensions, "GL_EXT_multisampled_render_to_texture")) { + strstr(extensions, "GL_EXT_multisampled_render_to_texture") || is_es3) { EXPECT_CALL(*gl, GetIntegerv(GL_MAX_SAMPLES, _)) .WillOnce(SetArgumentPointee<1>(kMaxSamples)) .RetiresOnSaturation(); @@ -273,7 +293,8 @@ void TestHelper::SetupContextGroupInitExpectations( .WillOnce(SetArgumentPointee<1>(kMaxVertexUniformComponents)) .RetiresOnSaturation(); - SetupTextureManagerInitExpectations(gl, extensions); + bool use_default_textures = bind_generates_resource; + SetupTextureManagerInitExpectations(gl, extensions, use_default_textures); } void TestHelper::SetupFeatureInfoInitExpectations( @@ -297,6 +318,78 @@ void TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( EXPECT_CALL(*gl, GetString(GL_VERSION)) .WillOnce(Return(reinterpret_cast<const uint8*>(gl_version))) .RetiresOnSaturation(); + + std::string l_version(StringToLowerASCII(std::string(gl_version))); + bool is_es3 = (l_version.substr(0, 12) == "opengl es 3."); + + if (strstr(extensions, "GL_ARB_texture_float") || + (is_es3 && strstr(extensions, "GL_EXT_color_buffer_float"))) { + static const GLuint gl_ids[] = {101, 102}; + const GLsizei width = 16; + EXPECT_CALL(*gl, GetIntegerv(GL_FRAMEBUFFER_BINDING, _)) + .WillOnce(SetArgumentPointee<1>(gl_ids[0])) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, GetIntegerv(GL_TEXTURE_BINDING_2D, _)) + .WillOnce(SetArgumentPointee<1>(gl_ids[0])) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, GenTextures(1, _)) + .WillOnce(SetArrayArgument<1>(gl_ids + 1, gl_ids + 2)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, GenFramebuffersEXT(1, _)) + .WillOnce(SetArrayArgument<1>(gl_ids + 1, gl_ids + 2)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, gl_ids[1])) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_NEAREST)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, width, 0, + GL_RGBA, GL_FLOAT, _)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, gl_ids[1])) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, FramebufferTexture2DEXT(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl_ids[1], 0)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) + .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, TexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, width, width, 0, + GL_RGB, GL_FLOAT, _)) + .Times(1) + .RetiresOnSaturation(); + if (is_es3) { + EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) + .WillOnce(Return(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)) + .RetiresOnSaturation(); + } else { + EXPECT_CALL(*gl, CheckFramebufferStatusEXT(GL_FRAMEBUFFER)) + .WillOnce(Return(GL_FRAMEBUFFER_COMPLETE)) + .RetiresOnSaturation(); + } + EXPECT_CALL(*gl, DeleteFramebuffersEXT(1, _)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, DeleteTextures(1, _)) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, BindFramebufferEXT(GL_FRAMEBUFFER, gl_ids[0])) + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, gl_ids[0])) + .Times(1) + .RetiresOnSaturation(); +#if DCHECK_IS_ON + EXPECT_CALL(*gl, GetError()) + .WillOnce(Return(GL_NO_ERROR)) + .RetiresOnSaturation(); +#endif + } } void TestHelper::SetupExpectationsForClearingUniforms( @@ -524,7 +617,7 @@ void TestHelper::DoBufferData( manager->DoBufferData(error_state, buffer, size, usage, data); } -void TestHelper::SetTexParameterWithExpectations( +void TestHelper::SetTexParameteriWithExpectations( ::gfx::MockGLInterface* gl, MockErrorState* error_state, TextureManager* manager, TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) { @@ -540,11 +633,11 @@ void TestHelper::SetTexParameterWithExpectations( .Times(1) .RetiresOnSaturation(); } else { - EXPECT_CALL(*error_state, SetGLErrorInvalidParam(_, _, error, _, _, _)) + EXPECT_CALL(*error_state, SetGLErrorInvalidParami(_, _, error, _, _, _)) .Times(1) .RetiresOnSaturation(); } - manager->SetParameter("", error_state, texture_ref, pname, value); + manager->SetParameteri("", error_state, texture_ref, pname, value); } ScopedGLImplementationSetter::ScopedGLImplementationSetter( diff --git a/chromium/gpu/command_buffer/service/test_helper.h b/chromium/gpu/command_buffer/service/test_helper.h index a619073878f..d0ae758aae7 100644 --- a/chromium/gpu/command_buffer/service/test_helper.h +++ b/chromium/gpu/command_buffer/service/test_helper.h @@ -65,7 +65,9 @@ class TestHelper { static void SetupContextGroupInitExpectations( ::gfx::MockGLInterface* gl, const DisallowedFeatures& disallowed_features, - const char* extensions); + const char* extensions, + const char* gl_version, + bool bind_generates_resource); static void SetupFeatureInfoInitExpectations( ::gfx::MockGLInterface* gl, const char* extensions); static void SetupFeatureInfoInitExpectationsWithGLVersion( @@ -73,10 +75,13 @@ class TestHelper { const char* extensions, const char* gl_renderer, const char* gl_version); - static void SetupTextureManagerInitExpectations( - ::gfx::MockGLInterface* gl, const char* extensions); + static void SetupTextureManagerInitExpectations(::gfx::MockGLInterface* gl, + const char* extensions, + bool use_default_textures); static void SetupTextureManagerDestructionExpectations( - ::gfx::MockGLInterface* gl, const char* extensions); + ::gfx::MockGLInterface* gl, + const char* extensions, + bool use_default_textures); static void SetupExpectationsForClearingUniforms( ::gfx::MockGLInterface* gl, UniformInfo* uniforms, size_t num_uniforms); @@ -97,16 +102,18 @@ class TestHelper { BufferManager* manager, Buffer* buffer, GLsizeiptr size, GLenum usage, const GLvoid* data, GLenum error); - static void SetTexParameterWithExpectations( + static void SetTexParameteriWithExpectations( ::gfx::MockGLInterface* gl, MockErrorState* error_state, TextureManager* manager, TextureRef* texture_ref, GLenum pname, GLint value, GLenum error); private: - static void SetupTextureInitializationExpectations( - ::gfx::MockGLInterface* gl, GLenum target); - static void SetupTextureDestructionExpectations( - ::gfx::MockGLInterface* gl, GLenum target); + static void SetupTextureInitializationExpectations(::gfx::MockGLInterface* gl, + GLenum target, + bool use_default_textures); + static void SetupTextureDestructionExpectations(::gfx::MockGLInterface* gl, + GLenum target, + bool use_default_textures); }; // This object temporaritly Sets what gfx::GetGLImplementation returns. During diff --git a/chromium/gpu/command_buffer/service/texture_definition.cc b/chromium/gpu/command_buffer/service/texture_definition.cc new file mode 100644 index 00000000000..3703f14b511 --- /dev/null +++ b/chromium/gpu/command_buffer/service/texture_definition.cc @@ -0,0 +1,456 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/texture_definition.h" + +#include "gpu/command_buffer/service/texture_manager.h" +#include "ui/gl/gl_image.h" +#include "ui/gl/gl_implementation.h" +#include "ui/gl/scoped_binders.h" + +#if !defined(OS_MACOSX) +#include "ui/gl/gl_surface_egl.h" +#endif + +namespace gpu { +namespace gles2 { + +namespace { + +class GLImageSync : public gfx::GLImage { + public: + explicit GLImageSync(const scoped_refptr<NativeImageBuffer>& buffer, + const gfx::Size& size); + + // Implement GLImage. + virtual void Destroy() OVERRIDE; + virtual gfx::Size GetSize() OVERRIDE; + virtual bool BindTexImage(unsigned target) OVERRIDE; + virtual void ReleaseTexImage(unsigned target) OVERRIDE; + virtual void WillUseTexImage() OVERRIDE; + virtual void WillModifyTexImage() OVERRIDE; + virtual void DidModifyTexImage() OVERRIDE; + + virtual void DidUseTexImage() OVERRIDE; + virtual void SetReleaseAfterUse() OVERRIDE; + + protected: + virtual ~GLImageSync(); + + private: + scoped_refptr<NativeImageBuffer> buffer_; + gfx::Size size_; + + DISALLOW_COPY_AND_ASSIGN(GLImageSync); +}; + +GLImageSync::GLImageSync(const scoped_refptr<NativeImageBuffer>& buffer, + const gfx::Size& size) + : buffer_(buffer), size_(size) { + if (buffer) + buffer->AddClient(this); +} + +GLImageSync::~GLImageSync() { + if (buffer_) + buffer_->RemoveClient(this); +} + +void GLImageSync::Destroy() {} + +gfx::Size GLImageSync::GetSize() { + return size_; +} + +bool GLImageSync::BindTexImage(unsigned target) { + NOTREACHED(); + return false; +} + +void GLImageSync::ReleaseTexImage(unsigned target) { + NOTREACHED(); +} + +void GLImageSync::WillUseTexImage() { + if (buffer_) + buffer_->WillRead(this); +} + +void GLImageSync::DidUseTexImage() { + if (buffer_) + buffer_->DidRead(this); +} + +void GLImageSync::WillModifyTexImage() { + if (buffer_) + buffer_->WillWrite(this); +} + +void GLImageSync::DidModifyTexImage() { + if (buffer_) + buffer_->DidWrite(this); +} + +void GLImageSync::SetReleaseAfterUse() { + NOTREACHED(); +} + +#if !defined(OS_MACOSX) +class NativeImageBufferEGL : public NativeImageBuffer { + public: + static scoped_refptr<NativeImageBufferEGL> Create(GLuint texture_id); + + private: + NativeImageBufferEGL(scoped_ptr<gfx::GLFence> write_fence, + EGLDisplay display, + EGLImageKHR image); + virtual ~NativeImageBufferEGL(); + virtual void BindToTexture(GLenum target) OVERRIDE; + + EGLDisplay egl_display_; + EGLImageKHR egl_image_; + + DISALLOW_COPY_AND_ASSIGN(NativeImageBufferEGL); +}; + +scoped_refptr<NativeImageBufferEGL> NativeImageBufferEGL::Create( + GLuint texture_id) { + EGLDisplay egl_display = gfx::GLSurfaceEGL::GetHardwareDisplay(); + EGLContext egl_context = eglGetCurrentContext(); + + DCHECK_NE(EGL_NO_CONTEXT, egl_context); + DCHECK_NE(EGL_NO_DISPLAY, egl_display); + DCHECK(glIsTexture(texture_id)); + + DCHECK(gfx::g_driver_egl.ext.b_EGL_KHR_image_base && + gfx::g_driver_egl.ext.b_EGL_KHR_gl_texture_2D_image && + gfx::g_driver_gl.ext.b_GL_OES_EGL_image && + gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync); + + const EGLint egl_attrib_list[] = { + EGL_GL_TEXTURE_LEVEL_KHR, 0, EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; + EGLClientBuffer egl_buffer = reinterpret_cast<EGLClientBuffer>(texture_id); + EGLenum egl_target = EGL_GL_TEXTURE_2D_KHR; // TODO + + EGLImageKHR egl_image = eglCreateImageKHR( + egl_display, egl_context, egl_target, egl_buffer, egl_attrib_list); + + if (egl_image == EGL_NO_IMAGE_KHR) + return NULL; + + return new NativeImageBufferEGL( + make_scoped_ptr(gfx::GLFence::Create()), egl_display, egl_image); +} + +NativeImageBufferEGL::NativeImageBufferEGL(scoped_ptr<gfx::GLFence> write_fence, + EGLDisplay display, + EGLImageKHR image) + : NativeImageBuffer(write_fence.Pass()), + egl_display_(display), + egl_image_(image) { + DCHECK(egl_display_ != EGL_NO_DISPLAY); + DCHECK(egl_image_ != EGL_NO_IMAGE_KHR); +} + +NativeImageBufferEGL::~NativeImageBufferEGL() { + if (egl_image_ != EGL_NO_IMAGE_KHR) + eglDestroyImageKHR(egl_display_, egl_image_); +} + +void NativeImageBufferEGL::BindToTexture(GLenum target) { + DCHECK(egl_image_ != EGL_NO_IMAGE_KHR); + glEGLImageTargetTexture2DOES(target, egl_image_); + DCHECK_EQ(static_cast<EGLint>(EGL_SUCCESS), eglGetError()); + DCHECK_EQ(static_cast<GLenum>(GL_NO_ERROR), glGetError()); +} +#endif + +class NativeImageBufferStub : public NativeImageBuffer { + public: + NativeImageBufferStub() : NativeImageBuffer(scoped_ptr<gfx::GLFence>()) {} + + private: + virtual ~NativeImageBufferStub() {} + virtual void BindToTexture(GLenum target) OVERRIDE {} + + DISALLOW_COPY_AND_ASSIGN(NativeImageBufferStub); +}; + +} // anonymous namespace + +// static +scoped_refptr<NativeImageBuffer> NativeImageBuffer::Create(GLuint texture_id) { + switch (gfx::GetGLImplementation()) { +#if !defined(OS_MACOSX) + case gfx::kGLImplementationEGLGLES2: + return NativeImageBufferEGL::Create(texture_id); +#endif + case gfx::kGLImplementationMockGL: + return new NativeImageBufferStub; + default: + NOTREACHED(); + return NULL; + } +} + +NativeImageBuffer::ClientInfo::ClientInfo(gfx::GLImage* client) + : client(client), needs_wait_before_read(true) {} + +NativeImageBuffer::ClientInfo::~ClientInfo() {} + +NativeImageBuffer::NativeImageBuffer(scoped_ptr<gfx::GLFence> write_fence) + : write_fence_(write_fence.Pass()), write_client_(NULL) { +} + +NativeImageBuffer::~NativeImageBuffer() { + DCHECK(client_infos_.empty()); +} + +void NativeImageBuffer::AddClient(gfx::GLImage* client) { + base::AutoLock lock(lock_); + client_infos_.push_back(ClientInfo(client)); +} + +void NativeImageBuffer::RemoveClient(gfx::GLImage* client) { + base::AutoLock lock(lock_); + if (write_client_ == client) + write_client_ = NULL; + for (std::list<ClientInfo>::iterator it = client_infos_.begin(); + it != client_infos_.end(); + it++) { + if (it->client == client) { + client_infos_.erase(it); + return; + } + } + NOTREACHED(); +} + +bool NativeImageBuffer::IsClient(gfx::GLImage* client) { + base::AutoLock lock(lock_); + for (std::list<ClientInfo>::iterator it = client_infos_.begin(); + it != client_infos_.end(); + it++) { + if (it->client == client) + return true; + } + return false; +} + +void NativeImageBuffer::WillRead(gfx::GLImage* client) { + base::AutoLock lock(lock_); + if (!write_fence_.get() || write_client_ == client) + return; + + for (std::list<ClientInfo>::iterator it = client_infos_.begin(); + it != client_infos_.end(); + it++) { + if (it->client == client) { + if (it->needs_wait_before_read) { + it->needs_wait_before_read = false; + write_fence_->ServerWait(); + } + return; + } + } + NOTREACHED(); +} + +void NativeImageBuffer::WillWrite(gfx::GLImage* client) { + base::AutoLock lock(lock_); + if (write_client_ != client) + write_fence_->ServerWait(); + + for (std::list<ClientInfo>::iterator it = client_infos_.begin(); + it != client_infos_.end(); + it++) { + if (it->read_fence.get() && it->client != client) + it->read_fence->ServerWait(); + } +} + +void NativeImageBuffer::DidRead(gfx::GLImage* client) { + base::AutoLock lock(lock_); + for (std::list<ClientInfo>::iterator it = client_infos_.begin(); + it != client_infos_.end(); + it++) { + if (it->client == client) { + it->read_fence = make_linked_ptr(gfx::GLFence::Create()); + return; + } + } + NOTREACHED(); +} + +void NativeImageBuffer::DidWrite(gfx::GLImage* client) { + base::AutoLock lock(lock_); + // Sharing semantics require the client to flush in order to make changes + // visible to other clients. + write_fence_.reset(gfx::GLFence::CreateWithoutFlush()); + write_client_ = client; + for (std::list<ClientInfo>::iterator it = client_infos_.begin(); + it != client_infos_.end(); + it++) { + it->needs_wait_before_read = true; + } +} + +TextureDefinition::LevelInfo::LevelInfo(GLenum target, + GLenum internal_format, + GLsizei width, + GLsizei height, + GLsizei depth, + GLint border, + GLenum format, + GLenum type, + bool cleared) + : target(target), + internal_format(internal_format), + width(width), + height(height), + depth(depth), + border(border), + format(format), + type(type), + cleared(cleared) {} + +TextureDefinition::LevelInfo::~LevelInfo() {} + +TextureDefinition::TextureDefinition( + GLenum target, + Texture* texture, + unsigned int version, + const scoped_refptr<NativeImageBuffer>& image_buffer) + : version_(version), + target_(target), + image_buffer_(image_buffer ? image_buffer : NativeImageBuffer::Create( + texture->service_id())), + min_filter_(texture->min_filter()), + mag_filter_(texture->mag_filter()), + wrap_s_(texture->wrap_s()), + wrap_t_(texture->wrap_t()), + usage_(texture->usage()), + immutable_(texture->IsImmutable()) { + + // TODO + DCHECK(!texture->level_infos_.empty()); + DCHECK(!texture->level_infos_[0].empty()); + DCHECK(!texture->NeedsMips()); + DCHECK(texture->level_infos_[0][0].width); + DCHECK(texture->level_infos_[0][0].height); + + scoped_refptr<gfx::GLImage> gl_image( + new GLImageSync(image_buffer_, + gfx::Size(texture->level_infos_[0][0].width, + texture->level_infos_[0][0].height))); + texture->SetLevelImage(NULL, target, 0, gl_image); + + // TODO: all levels + level_infos_.clear(); + const Texture::LevelInfo& level = texture->level_infos_[0][0]; + LevelInfo info(level.target, + level.internal_format, + level.width, + level.height, + level.depth, + level.border, + level.format, + level.type, + level.cleared); + std::vector<LevelInfo> infos; + infos.push_back(info); + level_infos_.push_back(infos); +} + +TextureDefinition::~TextureDefinition() { +} + +Texture* TextureDefinition::CreateTexture() const { + if (!image_buffer_) + return NULL; + + GLuint texture_id; + glGenTextures(1, &texture_id); + + Texture* texture(new Texture(texture_id)); + UpdateTexture(texture); + + return texture; +} + +void TextureDefinition::UpdateTexture(Texture* texture) const { + gfx::ScopedTextureBinder texture_binder(target_, texture->service_id()); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter_); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter_); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap_s_); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap_t_); + if (image_buffer_) + image_buffer_->BindToTexture(target_); + // We have to make sure the changes are visible to other clients in this share + // group. As far as the clients are concerned, the mailbox semantics only + // demand a single flush from the client after changes are first made, + // and it is not visible to them when another share group boundary is crossed. + // We could probably track this and be a bit smarter about when to flush + // though. + glFlush(); + + texture->level_infos_.resize(1); + for (size_t i = 0; i < level_infos_.size(); i++) { + const LevelInfo& base_info = level_infos_[i][0]; + const size_t levels_needed = TextureManager::ComputeMipMapCount( + base_info.target, base_info.width, base_info.height, base_info.depth); + DCHECK(level_infos_.size() <= levels_needed); + texture->level_infos_[0].resize(levels_needed); + for (size_t n = 0; n < level_infos_.size(); n++) { + const LevelInfo& info = level_infos_[i][n]; + texture->SetLevelInfo(NULL, + info.target, + i, + info.internal_format, + info.width, + info.height, + info.depth, + info.border, + info.format, + info.type, + info.cleared); + } + } + if (image_buffer_) { + texture->SetLevelImage( + NULL, + target_, + 0, + new GLImageSync( + image_buffer_, + gfx::Size(level_infos_[0][0].width, level_infos_[0][0].height))); + } + + texture->target_ = target_; + texture->SetImmutable(immutable_); + texture->min_filter_ = min_filter_; + texture->mag_filter_ = mag_filter_; + texture->wrap_s_ = wrap_s_; + texture->wrap_t_ = wrap_t_; + texture->usage_ = usage_; +} + +bool TextureDefinition::Matches(const Texture* texture) const { + DCHECK(target_ == texture->target()); + if (texture->min_filter_ != min_filter_ || + texture->mag_filter_ != mag_filter_ || + texture->wrap_s_ != wrap_s_ || + texture->wrap_t_ != wrap_t_) { + return false; + } + + // All structural changes should have orphaned the texture. + if (image_buffer_ && !texture->GetLevelImage(texture->target(), 0)) + return false; + + return true; +} + +} // namespace gles2 +} // namespace gpu diff --git a/chromium/gpu/command_buffer/service/texture_definition.h b/chromium/gpu/command_buffer/service/texture_definition.h new file mode 100644 index 00000000000..7708902fab4 --- /dev/null +++ b/chromium/gpu/command_buffer/service/texture_definition.h @@ -0,0 +1,127 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GPU_COMMAND_BUFFER_SERVICE_TEXTURE_DEFINITION_H_ +#define GPU_COMMAND_BUFFER_SERVICE_TEXTURE_DEFINITION_H_ + +#include <list> +#include <vector> + +#include "base/callback.h" +#include "base/memory/linked_ptr.h" +#include "base/memory/ref_counted.h" +#include "base/memory/scoped_ptr.h" +#include "base/synchronization/lock.h" +#include "gpu/command_buffer/service/gl_utils.h" +#include "ui/gl/gl_fence.h" + +namespace gfx { +class GLFence; +class GLImage; +} + +namespace gpu { +namespace gles2 { + +class Texture; + +class NativeImageBuffer : public base::RefCountedThreadSafe<NativeImageBuffer> { + public: + static scoped_refptr<NativeImageBuffer> Create(GLuint texture_id); + virtual void BindToTexture(GLenum target) = 0; + + void AddClient(gfx::GLImage* client); + void RemoveClient(gfx::GLImage* client); + bool IsClient(gfx::GLImage* client); + + void WillRead(gfx::GLImage* client); + void WillWrite(gfx::GLImage* client); + void DidRead(gfx::GLImage* client); + void DidWrite(gfx::GLImage* client); + + protected: + friend class base::RefCountedThreadSafe<NativeImageBuffer>; + explicit NativeImageBuffer(scoped_ptr<gfx::GLFence> write_fence); + virtual ~NativeImageBuffer(); + + base::Lock lock_; + + struct ClientInfo { + ClientInfo(gfx::GLImage* client); + ~ClientInfo(); + + gfx::GLImage* client; + bool needs_wait_before_read; + linked_ptr<gfx::GLFence> read_fence; + }; + std::list<ClientInfo> client_infos_; + scoped_ptr<gfx::GLFence> write_fence_; + gfx::GLImage* write_client_; + + DISALLOW_COPY_AND_ASSIGN(NativeImageBuffer); +}; + +// An immutable description that can be used to create a texture that shares +// the underlying image buffer(s). +class TextureDefinition { + public: + TextureDefinition(GLenum target, + Texture* texture, + unsigned int version, + const scoped_refptr<NativeImageBuffer>& image); + virtual ~TextureDefinition(); + + Texture* CreateTexture() const; + void UpdateTexture(Texture* texture) const; + + unsigned int version() const { return version_; } + bool IsOlderThan(unsigned int version) const { + return (version - version_) < 0x80000000; + } + bool Matches(const Texture* texture) const; + + scoped_refptr<NativeImageBuffer> image() { return image_buffer_; } + + private: + struct LevelInfo { + LevelInfo(GLenum target, + GLenum internal_format, + GLsizei width, + GLsizei height, + GLsizei depth, + GLint border, + GLenum format, + GLenum type, + bool cleared); + ~LevelInfo(); + + GLenum target; + GLenum internal_format; + GLsizei width; + GLsizei height; + GLsizei depth; + GLint border; + GLenum format; + GLenum type; + bool cleared; + }; + + typedef std::vector<std::vector<LevelInfo> > LevelInfos; + + unsigned int version_; + GLenum target_; + scoped_refptr<NativeImageBuffer> image_buffer_; + GLenum min_filter_; + GLenum mag_filter_; + GLenum wrap_s_; + GLenum wrap_t_; + GLenum usage_; + bool immutable_; + LevelInfos level_infos_; +}; + +} // namespage gles2 +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_TEXTURE_DEFINITION_H_ diff --git a/chromium/gpu/command_buffer/service/texture_manager.cc b/chromium/gpu/command_buffer/service/texture_manager.cc index 64ead827edd..76863c62a5e 100644 --- a/chromium/gpu/command_buffer/service/texture_manager.cc +++ b/chromium/gpu/command_buffer/service/texture_manager.cc @@ -13,7 +13,6 @@ #include "gpu/command_buffer/service/gles2_cmd_decoder.h" #include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/memory_tracking.h" -#include "gpu/command_buffer/service/stream_texture_manager.h" namespace gpu { namespace gles2 { @@ -67,9 +66,8 @@ TextureManager::DestructionObserver::DestructionObserver() {} TextureManager::DestructionObserver::~DestructionObserver() {} TextureManager::~TextureManager() { - FOR_EACH_OBSERVER(DestructionObserver, - destruction_observers_, - OnTextureManagerDestroying(this)); + for (unsigned int i = 0; i < destruction_observers_.size(); i++) + destruction_observers_[i]->OnTextureManagerDestroying(this); DCHECK(textures_.empty()); @@ -117,11 +115,11 @@ Texture::Texture(GLuint service_id) npot_(false), has_been_bound_(false), framebuffer_attachment_count_(0), - stream_texture_(false), immutable_(false), has_images_(false), estimated_size_(0), - can_render_condition_(CAN_RENDER_ALWAYS) { + can_render_condition_(CAN_RENDER_ALWAYS), + texture_max_anisotropy_initialized_(false) { } Texture::~Texture() { @@ -401,6 +399,13 @@ void Texture::UpdateCleared() { } } } + + // If texture is uncleared and is attached to a framebuffer, + // that framebuffer must be marked possibly incomplete. + if (!cleared && IsAttachedToFramebuffer()) { + IncAllFramebufferStateChangeCount(); + } + UpdateSafeToRenderFrom(cleared); } @@ -519,7 +524,6 @@ bool Texture::ValidForTexture( GLint yoffset, GLsizei width, GLsizei height, - GLenum format, GLenum type) const { size_t face_index = GLTargetToFaceIndex(target); if (level >= 0 && face_index < level_infos_.size() && @@ -533,7 +537,6 @@ bool Texture::ValidForTexture( yoffset >= 0 && right <= info.width && top <= info.height && - format == info.internal_format && type == info.type; } return false; @@ -573,7 +576,7 @@ bool Texture::GetLevelType( return false; } -GLenum Texture::SetParameter( +GLenum Texture::SetParameteri( const FeatureInfo* feature_info, GLenum pname, GLint param) { DCHECK(feature_info); @@ -641,6 +644,31 @@ GLenum Texture::SetParameter( return GL_NO_ERROR; } +GLenum Texture::SetParameterf( + const FeatureInfo* feature_info, GLenum pname, GLfloat param) { + switch (pname) { + case GL_TEXTURE_MIN_FILTER: + case GL_TEXTURE_MAG_FILTER: + case GL_TEXTURE_POOL_CHROMIUM: + case GL_TEXTURE_WRAP_S: + case GL_TEXTURE_WRAP_T: + case GL_TEXTURE_USAGE_ANGLE: + { + GLint iparam = static_cast<GLint>(param); + return SetParameteri(feature_info, pname, iparam); + } + case GL_TEXTURE_MAX_ANISOTROPY_EXT: + if (param < 1.f) { + return GL_INVALID_VALUE; + } + break; + default: + NOTREACHED(); + return GL_INVALID_ENUM; + } + return GL_NO_ERROR; +} + void Texture::Update(const FeatureInfo* feature_info) { // Update npot status. // Assume GL_TEXTURE_EXTERNAL_OES textures are npot, all others @@ -759,6 +787,14 @@ bool Texture::IsLevelCleared(GLenum target, GLint level) const { return info.cleared; } +void Texture::InitTextureMaxAnisotropyIfNeeded(GLenum target) { + if (texture_max_anisotropy_initialized_) + return; + texture_max_anisotropy_initialized_ = true; + GLfloat params[] = { 1.0f }; + glTexParameterfv(target, GL_TEXTURE_MAX_ANISOTROPY_EXT, params); +} + bool Texture::ClearLevel( GLES2Decoder* decoder, GLenum target, GLint level) { DCHECK(decoder); @@ -784,8 +820,8 @@ bool Texture::ClearLevel( // but only the decoder knows all the state (like unpack_alignment_) that's // needed to be able to call GL correctly. bool cleared = decoder->ClearLevel( - service_id_, target_, info.target, info.level, info.format, info.type, - info.width, info.height, immutable_); + service_id_, target_, info.target, info.level, info.internal_format, + info.format, info.type, info.width, info.height, immutable_); UpdateMipCleared(&info, cleared); return info.cleared; } @@ -810,6 +846,11 @@ void Texture::SetLevelImage( } gfx::GLImage* Texture::GetLevelImage(GLint target, GLint level) const { + if (target != GL_TEXTURE_2D && target != GL_TEXTURE_EXTERNAL_OES && + target != GL_TEXTURE_RECTANGLE_ARB) { + return NULL; + } + size_t face_index = GLTargetToFaceIndex(target); if (level >= 0 && face_index < level_infos_.size() && static_cast<size_t>(level) < level_infos_[face_index].size()) { @@ -821,6 +862,17 @@ gfx::GLImage* Texture::GetLevelImage(GLint target, GLint level) const { return 0; } +void Texture::OnWillModifyPixels() { + gfx::GLImage* image = GetLevelImage(target(), 0); + if (image) + image->WillModifyTexImage(); +} + +void Texture::OnDidModifyPixels() { + gfx::GLImage* image = GetLevelImage(target(), 0); + if (image) + image->DidModifyTexImage(); +} TextureRef::TextureRef(TextureManager* manager, GLuint client_id, @@ -828,7 +880,7 @@ TextureRef::TextureRef(TextureManager* manager, : manager_(manager), texture_(texture), client_id_(client_id), - is_stream_texture_owner_(false) { + num_observers_(0) { DCHECK(manager_); DCHECK(texture_); texture_->AddTextureRef(this); @@ -850,14 +902,14 @@ TextureRef::~TextureRef() { TextureManager::TextureManager(MemoryTracker* memory_tracker, FeatureInfo* feature_info, GLint max_texture_size, - GLint max_cube_map_texture_size) - : memory_tracker_managed_(new MemoryTypeTracker(memory_tracker, - MemoryTracker::kManaged)), + GLint max_cube_map_texture_size, + bool use_default_textures) + : memory_tracker_managed_( + new MemoryTypeTracker(memory_tracker, MemoryTracker::kManaged)), memory_tracker_unmanaged_( new MemoryTypeTracker(memory_tracker, MemoryTracker::kUnmanaged)), feature_info_(feature_info), framebuffer_manager_(NULL), - stream_texture_manager_(NULL), max_texture_size_(max_texture_size), max_cube_map_texture_size_(max_cube_map_texture_size), max_levels_(ComputeMipMapCount(GL_TEXTURE_2D, @@ -868,6 +920,7 @@ TextureManager::TextureManager(MemoryTracker* memory_tracker, max_cube_map_texture_size, max_cube_map_texture_size, max_cube_map_texture_size)), + use_default_textures_(use_default_textures), num_unrenderable_textures_(0), num_unsafe_textures_(0), num_uncleared_mips_(0), @@ -915,8 +968,9 @@ scoped_refptr<TextureRef> // Make default textures and texture for replacing non-renderable textures. GLuint ids[2]; - glGenTextures(arraysize(ids), ids); - for (unsigned long ii = 0; ii < arraysize(ids); ++ii) { + const unsigned long num_ids = use_default_textures_ ? 2 : 1; + glGenTextures(num_ids, ids); + for (unsigned long ii = 0; ii < num_ids; ++ii) { glBindTexture(target, ids[ii]); if (needs_initialization) { if (needs_faces) { @@ -932,48 +986,50 @@ scoped_refptr<TextureRef> } glBindTexture(target, 0); - scoped_refptr<TextureRef> default_texture( - TextureRef::Create(this, 0, ids[1])); - SetTarget(default_texture.get(), target); - if (needs_faces) { - for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) { - SetLevelInfo(default_texture.get(), - GLES2Util::IndexToGLFaceTarget(ii), - 0, - GL_RGBA, - 1, - 1, - 1, - 0, - GL_RGBA, - GL_UNSIGNED_BYTE, - true); - } - } else { - if (needs_initialization) { - SetLevelInfo(default_texture.get(), - GL_TEXTURE_2D, - 0, - GL_RGBA, - 1, - 1, - 1, - 0, - GL_RGBA, - GL_UNSIGNED_BYTE, - true); + scoped_refptr<TextureRef> default_texture; + if (use_default_textures_) { + default_texture = TextureRef::Create(this, 0, ids[1]); + SetTarget(default_texture.get(), target); + if (needs_faces) { + for (int ii = 0; ii < GLES2Util::kNumFaces; ++ii) { + SetLevelInfo(default_texture.get(), + GLES2Util::IndexToGLFaceTarget(ii), + 0, + GL_RGBA, + 1, + 1, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + true); + } } else { - SetLevelInfo(default_texture.get(), - GL_TEXTURE_EXTERNAL_OES, - 0, - GL_RGBA, - 1, - 1, - 1, - 0, - GL_RGBA, - GL_UNSIGNED_BYTE, - true); + if (needs_initialization) { + SetLevelInfo(default_texture.get(), + GL_TEXTURE_2D, + 0, + GL_RGBA, + 1, + 1, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + true); + } else { + SetLevelInfo(default_texture.get(), + GL_TEXTURE_EXTERNAL_OES, + 0, + GL_RGBA, + 1, + 1, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + true); + } } } @@ -1006,19 +1062,6 @@ void TextureManager::SetTarget(TextureRef* ref, GLenum target) { ->SetTarget(feature_info_.get(), target, MaxLevelsForTarget(target)); } -void TextureManager::SetStreamTexture(TextureRef* ref, bool stream_texture) { - DCHECK(ref); - // Only the owner can mark as non-stream texture. - DCHECK_EQ(stream_texture, !ref->is_stream_texture_owner_); - ref->texture()->SetStreamTexture(stream_texture); - ref->set_is_stream_texture_owner(stream_texture); -} - -bool TextureManager::IsStreamTextureOwner(TextureRef* ref) { - DCHECK(ref); - return ref->is_stream_texture_owner(); -} - void TextureManager::SetLevelCleared(TextureRef* ref, GLenum target, GLint level, @@ -1091,20 +1134,20 @@ TextureRef* TextureManager::Consume( return ref.get(); } -void TextureManager::SetParameter( +void TextureManager::SetParameteri( const char* function_name, ErrorState* error_state, TextureRef* ref, GLenum pname, GLint param) { DCHECK(error_state); DCHECK(ref); Texture* texture = ref->texture(); - GLenum result = texture->SetParameter(feature_info_.get(), pname, param); + GLenum result = texture->SetParameteri(feature_info_.get(), pname, param); if (result != GL_NO_ERROR) { if (result == GL_INVALID_ENUM) { ERRORSTATE_SET_GL_ERROR_INVALID_ENUM( error_state, function_name, param, "param"); } else { - ERRORSTATE_SET_GL_ERROR_INVALID_PARAM( - error_state, result, function_name, pname, static_cast<GLint>(param)); + ERRORSTATE_SET_GL_ERROR_INVALID_PARAMI( + error_state, result, function_name, pname, param); } } else { // Texture tracking pools exist only for the command decoder, so @@ -1115,6 +1158,30 @@ void TextureManager::SetParameter( } } +void TextureManager::SetParameterf( + const char* function_name, ErrorState* error_state, + TextureRef* ref, GLenum pname, GLfloat param) { + DCHECK(error_state); + DCHECK(ref); + Texture* texture = ref->texture(); + GLenum result = texture->SetParameterf(feature_info_.get(), pname, param); + if (result != GL_NO_ERROR) { + if (result == GL_INVALID_ENUM) { + ERRORSTATE_SET_GL_ERROR_INVALID_ENUM( + error_state, function_name, param, "param"); + } else { + ERRORSTATE_SET_GL_ERROR_INVALID_PARAMF( + error_state, result, function_name, pname, param); + } + } else { + // Texture tracking pools exist only for the command decoder, so + // do not pass them on to the native GL implementation. + if (pname != GL_TEXTURE_POOL_CHROMIUM) { + glTexParameterf(texture->target(), pname, param); + } + } +} + bool TextureManager::MarkMipmapsGenerated(TextureRef* ref) { DCHECK(ref); Texture* texture = ref->texture(); @@ -1162,15 +1229,14 @@ void TextureManager::StartTracking(TextureRef* ref) { } void TextureManager::StopTracking(TextureRef* ref) { - FOR_EACH_OBSERVER(DestructionObserver, - destruction_observers_, - OnTextureRefDestroying(ref)); + if (ref->num_observers()) { + for (unsigned int i = 0; i < destruction_observers_.size(); i++) { + destruction_observers_[i]->OnTextureRefDestroying(ref); + } + DCHECK_EQ(ref->num_observers(), 0); + } Texture* texture = ref->texture(); - if (ref->is_stream_texture_owner_ && stream_texture_manager_) { - DCHECK(texture->IsStreamTexture()); - stream_texture_manager_->DestroyStreamTexture(texture->service_id()); - } --texture_count_; if (texture->HasImages()) { @@ -1280,20 +1346,10 @@ void TextureManager::IncFramebufferStateChangeCount() { framebuffer_manager_->IncFramebufferStateChangeCount(); } -bool TextureManager::ValidateTextureParameters( - ErrorState* error_state, const char* function_name, - GLenum target, GLenum format, GLenum type, GLint level) { +bool TextureManager::ValidateFormatAndTypeCombination( + ErrorState* error_state, const char* function_name, GLenum format, + GLenum type) { if (!feature_info_->GetTextureFormatValidator(format).IsValid(type)) { - ERRORSTATE_SET_GL_ERROR( - error_state, GL_INVALID_OPERATION, function_name, - (std::string("invalid type ") + - GLES2Util::GetStringEnum(type) + " for format " + - GLES2Util::GetStringEnum(format)).c_str()); - return false; - } - - uint32 channels = GLES2Util::GetChannelsForFormat(format); - if ((channels & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && level) { ERRORSTATE_SET_GL_ERROR( error_state, GL_INVALID_OPERATION, function_name, (std::string("invalid type ") + @@ -1304,6 +1360,40 @@ bool TextureManager::ValidateTextureParameters( return true; } +bool TextureManager::ValidateTextureParameters( + ErrorState* error_state, const char* function_name, + GLenum format, GLenum type, GLenum internal_format, GLint level) { + const Validators* validators = feature_info_->validators(); + if (!validators->texture_format.IsValid(format)) { + ERRORSTATE_SET_GL_ERROR_INVALID_ENUM( + error_state, function_name, format, "format"); + return false; + } + if (!validators->pixel_type.IsValid(type)) { + ERRORSTATE_SET_GL_ERROR_INVALID_ENUM( + error_state, function_name, type, "type"); + return false; + } + if (format != internal_format && + !((internal_format == GL_RGBA32F && format == GL_RGBA) || + (internal_format == GL_RGB32F && format == GL_RGB))) { + ERRORSTATE_SET_GL_ERROR( + error_state, GL_INVALID_OPERATION, function_name, + "format != internalformat"); + return false; + } + uint32 channels = GLES2Util::GetChannelsForFormat(format); + if ((channels & (GLES2Util::kDepth | GLES2Util::kStencil)) != 0 && level) { + ERRORSTATE_SET_GL_ERROR( + error_state, GL_INVALID_OPERATION, function_name, + (std::string("invalid format ") + GLES2Util::GetStringEnum(format) + + " for level != 0").c_str()); + return false; + } + return ValidateFormatAndTypeCombination(error_state, function_name, + format, type); +} + // Gets the texture id for a given target. TextureRef* TextureManager::GetTextureInfoForTarget( ContextState* state, GLenum target) { @@ -1357,31 +1447,15 @@ bool TextureManager::ValidateTexImage2D( error_state, function_name, args.target, "target"); return false; } - if (!validators->texture_format.IsValid(args.internal_format)) { + if (!validators->texture_internal_format.IsValid(args.internal_format)) { ERRORSTATE_SET_GL_ERROR_INVALID_ENUM( error_state, function_name, args.internal_format, - "internal_format"); - return false; - } - if (!validators->texture_format.IsValid(args.format)) { - ERRORSTATE_SET_GL_ERROR_INVALID_ENUM( - error_state, function_name, args.format, "format"); - return false; - } - if (!validators->pixel_type.IsValid(args.type)) { - ERRORSTATE_SET_GL_ERROR_INVALID_ENUM( - error_state, function_name, args.type, "type"); - return false; - } - if (args.format != args.internal_format) { - ERRORSTATE_SET_GL_ERROR( - error_state, GL_INVALID_OPERATION, function_name, - "format != internalFormat"); + "internalformat"); return false; } if (!ValidateTextureParameters( - error_state, function_name, args.target, args.format, args.type, - args.level)) { + error_state, function_name, args.format, args.type, + args.internal_format, args.level)) { return false; } if (!ValidForTarget(args.target, args.level, args.width, args.height, 1) || @@ -1417,7 +1491,7 @@ bool TextureManager::ValidateTexImage2D( // They both use the same MemoryTracker, and this call just re-routes // to it. if (!memory_tracker_managed_->EnsureGPUMemoryAvailable(args.pixels_size)) { - ERRORSTATE_SET_GL_ERROR(error_state, GL_OUT_OF_MEMORY, "glTexImage2D", + ERRORSTATE_SET_GL_ERROR(error_state, GL_OUT_OF_MEMORY, function_name, "out of memory"); return false; } diff --git a/chromium/gpu/command_buffer/service/texture_manager.h b/chromium/gpu/command_buffer/service/texture_manager.h index bd9e3dab410..6b3a32ebf39 100644 --- a/chromium/gpu/command_buffer/service/texture_manager.h +++ b/chromium/gpu/command_buffer/service/texture_manager.h @@ -13,7 +13,6 @@ #include "base/containers/hash_tables.h" #include "base/logging.h" #include "base/memory/ref_counted.h" -#include "base/observer_list.h" #include "gpu/command_buffer/service/async_pixel_transfer_delegate.h" #include "gpu/command_buffer/service/gl_utils.h" #include "gpu/command_buffer/service/memory_tracking.h" @@ -21,9 +20,6 @@ #include "ui/gl/gl_image.h" namespace gpu { - -class StreamTextureManager; - namespace gles2 { class GLES2Decoder; @@ -77,7 +73,7 @@ class GPU_EXPORT Texture { } bool CanRenderTo() const { - return !stream_texture_ && target_ != GL_TEXTURE_EXTERNAL_OES; + return target_ != GL_TEXTURE_EXTERNAL_OES; } // The service side OpenGL id of the texture. @@ -119,7 +115,7 @@ class GPU_EXPORT Texture { } // Returns true of the given dimensions are inside the dimensions of the - // level and if the format and type match the level. + // level and if the type matches the level. bool ValidForTexture( GLint target, GLint level, @@ -127,7 +123,6 @@ class GPU_EXPORT Texture { GLint yoffset, GLsizei width, GLsizei height, - GLenum format, GLenum type) const; bool IsValid() const { @@ -147,10 +142,6 @@ class GPU_EXPORT Texture { --framebuffer_attachment_count_; } - bool IsStreamTexture() const { - return stream_texture_; - } - void SetImmutable(bool immutable) { immutable_ = immutable; } @@ -167,9 +158,16 @@ class GPU_EXPORT Texture { return estimated_size() > 0; } + // Initialize TEXTURE_MAX_ANISOTROPY to 1 if we haven't done so yet. + void InitTextureMaxAnisotropyIfNeeded(GLenum target); + + void OnWillModifyPixels(); + void OnDidModifyPixels(); + private: friend class MailboxManager; friend class MailboxManagerTest; + friend class TextureDefinition; friend class TextureManager; friend class TextureRef; friend class TextureTestHelper; @@ -242,11 +240,6 @@ class GPU_EXPORT Texture { return npot_; } - void SetStreamTexture(bool stream_texture) { - stream_texture_ = stream_texture; - UpdateCanRenderCondition(); - } - // Marks a particular level as cleared or uncleared. void SetLevelCleared(GLenum target, GLint level, bool cleared); @@ -262,10 +255,12 @@ class GPU_EXPORT Texture { bool ClearLevel(GLES2Decoder* decoder, GLenum target, GLint level); // Sets a texture parameter. - // TODO(gman): Expand to SetParameteri,f,iv,fv + // TODO(gman): Expand to SetParameteriv,fv // Returns GL_NO_ERROR on success. Otherwise the error to generate. - GLenum SetParameter( + GLenum SetParameteri( const FeatureInfo* feature_info, GLenum pname, GLint param); + GLenum SetParameterf( + const FeatureInfo* feature_info, GLenum pname, GLfloat param); // Makes each of the mip levels as though they were generated. bool MarkMipmapsGenerated(const FeatureInfo* feature_info); @@ -379,9 +374,6 @@ class GPU_EXPORT Texture { // The number of framebuffers this texture is attached to. int framebuffer_attachment_count_; - // Whether this is a special streaming texture. - bool stream_texture_; - // Whether the texture is immutable and no further changes to the format // or dimensions of the texture object can be made. bool immutable_; @@ -395,6 +387,9 @@ class GPU_EXPORT Texture { // Cache of the computed CanRenderCondition flag. CanRenderCondition can_render_condition_; + // Whether we have initialized TEXTURE_MAX_ANISOTROPY to 1. + bool texture_max_anisotropy_initialized_; + DISALLOW_COPY_AND_ASSIGN(Texture); }; @@ -402,23 +397,21 @@ class GPU_EXPORT Texture { // with a client id, though it can outlive the client id if it's still bound to // a FBO or another context when destroyed. // Multiple TextureRef can point to the same texture with cross-context sharing. -// -// Note: for stream textures, the TextureRef that created the stream texture is -// set as the "owner" of the stream texture, i.e. it will call -// DestroyStreamTexture on destruction. This is because the StreamTextureManager -// isn't generally shared between ContextGroups, so ownership can't be at the -// Texture level. We also can't have multiple StreamTexture on the same service -// id, so there can be only one owner. class GPU_EXPORT TextureRef : public base::RefCounted<TextureRef> { public: TextureRef(TextureManager* manager, GLuint client_id, Texture* texture); static scoped_refptr<TextureRef> Create(TextureManager* manager, GLuint client_id, GLuint service_id); + + void AddObserver() { num_observers_++; } + void RemoveObserver() { num_observers_--; } + const Texture* texture() const { return texture_; } Texture* texture() { return texture_; } GLuint client_id() const { return client_id_; } GLuint service_id() const { return texture_->service_id(); } + GLint num_observers() const { return num_observers_; } private: friend class base::RefCounted<TextureRef>; @@ -429,15 +422,11 @@ class GPU_EXPORT TextureRef : public base::RefCounted<TextureRef> { const TextureManager* manager() const { return manager_; } TextureManager* manager() { return manager_; } void reset_client_id() { client_id_ = 0; } - void set_is_stream_texture_owner(bool owner) { - is_stream_texture_owner_ = owner; - } - bool is_stream_texture_owner() const { return is_stream_texture_owner_; } TextureManager* manager_; Texture* texture_; GLuint client_id_; - bool is_stream_texture_owner_; + GLint num_observers_; DISALLOW_COPY_AND_ASSIGN(TextureRef); }; @@ -497,17 +486,14 @@ class GPU_EXPORT TextureManager { TextureManager(MemoryTracker* memory_tracker, FeatureInfo* feature_info, GLsizei max_texture_size, - GLsizei max_cube_map_texture_size); + GLsizei max_cube_map_texture_size, + bool use_default_textures); ~TextureManager(); void set_framebuffer_manager(FramebufferManager* manager) { framebuffer_manager_ = manager; } - void set_stream_texture_manager(StreamTextureManager* manager) { - stream_texture_manager_ = manager; - } - // Init the texture manager. bool Initialize(); @@ -567,13 +553,6 @@ class GPU_EXPORT TextureManager { TextureRef* ref, GLenum target); - // Marks a texture as a stream texture, and the ref as the stream texture - // owner. - void SetStreamTexture(TextureRef* ref, bool stream_texture); - - // Whether the TextureRef is the stream texture owner. - bool IsStreamTextureOwner(TextureRef* ref); - // Set the info for a particular level in a TexureInfo. void SetLevelInfo( TextureRef* ref, @@ -609,10 +588,13 @@ class GPU_EXPORT TextureManager { // Sets a texture parameter of a Texture // Returns GL_NO_ERROR on success. Otherwise the error to generate. - // TODO(gman): Expand to SetParameteri,f,iv,fv - void SetParameter( + // TODO(gman): Expand to SetParameteriv,fv + void SetParameteri( const char* function_name, ErrorState* error_state, TextureRef* ref, GLenum pname, GLint param); + void SetParameterf( + const char* function_name, ErrorState* error_state, + TextureRef* ref, GLenum pname, GLfloat param); // Makes each of the mip levels as though they were generated. // Returns false if that's not allowed for the given texture. @@ -705,11 +687,18 @@ class GPU_EXPORT TextureManager { std::string* signature) const; void AddObserver(DestructionObserver* observer) { - destruction_observers_.AddObserver(observer); + destruction_observers_.push_back(observer); } void RemoveObserver(DestructionObserver* observer) { - destruction_observers_.RemoveObserver(observer); + for (unsigned int i = 0; i < destruction_observers_.size(); i++) { + if (destruction_observers_[i] == observer) { + std::swap(destruction_observers_[i], destruction_observers_.back()); + destruction_observers_.pop_back(); + return; + } + } + NOTREACHED(); } struct DoTextImage2DArguments { @@ -745,9 +734,15 @@ class GPU_EXPORT TextureManager { TextureRef* GetTextureInfoForTargetUnlessDefault( ContextState* state, GLenum target); + bool ValidateFormatAndTypeCombination( + ErrorState* error_state, const char* function_name, + GLenum format, GLenum type); + + // Note that internal_format is only checked in relation to the format + // parameter, so that this function may be used to validate texSubImage2D. bool ValidateTextureParameters( ErrorState* error_state, const char* function_name, - GLenum target, GLenum format, GLenum type, GLint level); + GLenum format, GLenum type, GLenum internal_format, GLint level); private: friend class Texture; @@ -782,7 +777,6 @@ class GPU_EXPORT TextureManager { scoped_refptr<FeatureInfo> feature_info_; FramebufferManager* framebuffer_manager_; - StreamTextureManager* stream_texture_manager_; // Info for each texture in the system. typedef base::hash_map<GLuint, scoped_refptr<TextureRef> > TextureMap; @@ -793,6 +787,8 @@ class GPU_EXPORT TextureManager { GLint max_levels_; GLint max_cube_map_levels_; + const bool use_default_textures_; + int num_unrenderable_textures_; int num_unsafe_textures_; int num_uncleared_mips_; @@ -812,7 +808,7 @@ class GPU_EXPORT TextureManager { // The default textures for each target (texture name = 0) scoped_refptr<TextureRef> default_textures_[kNumDefaultTextures]; - ObserverList<DestructionObserver> destruction_observers_; + std::vector<DestructionObserver*> destruction_observers_; DISALLOW_COPY_AND_ASSIGN(TextureManager); }; diff --git a/chromium/gpu/command_buffer/service/texture_manager_unittest.cc b/chromium/gpu/command_buffer/service/texture_manager_unittest.cc index 312adfddbf3..2335191a0e9 100644 --- a/chromium/gpu/command_buffer/service/texture_manager_unittest.cc +++ b/chromium/gpu/command_buffer/service/texture_manager_unittest.cc @@ -9,6 +9,7 @@ #include "gpu/command_buffer/service/feature_info.h" #include "gpu/command_buffer/service/framebuffer_manager.h" #include "gpu/command_buffer/service/gles2_cmd_decoder_mock.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/memory_tracking.h" #include "gpu/command_buffer/service/mocks.h" @@ -39,7 +40,7 @@ class TextureTestHelper { } }; -class TextureManagerTest : public testing::Test { +class TextureManagerTest : public GpuServiceTest { public: static const GLint kMaxTextureSize = 16; static const GLint kMaxCubeMapTextureSize = 8; @@ -47,23 +48,23 @@ class TextureManagerTest : public testing::Test { static const GLint kMax2dLevels = 5; static const GLint kMaxCubeMapLevels = 4; static const GLint kMaxExternalLevels = 1; + static const bool kUseDefaultTextures = false; - TextureManagerTest() - : feature_info_(new FeatureInfo()) { - } + TextureManagerTest() : feature_info_(new FeatureInfo()) {} virtual ~TextureManagerTest() { } protected: virtual void SetUp() { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); - - manager_.reset(new TextureManager( - NULL, feature_info_.get(), - kMaxTextureSize, kMaxCubeMapTextureSize)); - TestHelper::SetupTextureManagerInitExpectations(gl_.get(), ""); + GpuServiceTest::SetUp(); + manager_.reset(new TextureManager(NULL, + feature_info_.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures)); + TestHelper::SetupTextureManagerInitExpectations( + gl_.get(), "", kUseDefaultTextures); manager_->Initialize(); error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>()); } @@ -71,19 +72,16 @@ class TextureManagerTest : public testing::Test { virtual void TearDown() { manager_->Destroy(false); manager_.reset(); - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); + GpuServiceTest::TearDown(); } void SetParameter( TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) { - TestHelper::SetTexParameterWithExpectations( + TestHelper::SetTexParameteriWithExpectations( gl_.get(), error_state_.get(), manager_.get(), texture_ref, pname, value, error); } - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; scoped_refptr<FeatureInfo> feature_info_; scoped_ptr<TextureManager> manager_; scoped_ptr<MockErrorState> error_state_; @@ -162,11 +160,54 @@ TEST_F(TextureManagerTest, SetParameter) { SetParameter(texture_ref, GL_TEXTURE_MAX_ANISOTROPY_EXT, 0, GL_INVALID_VALUE); } +TEST_F(TextureManagerTest, UseDefaultTexturesTrue) { + bool use_default_textures = true; + scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); + + TestHelper::SetupTextureManagerInitExpectations( + gl_.get(), "GL_ANGLE_texture_usage", use_default_textures); + TextureManager manager(NULL, + feature_info_.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + use_default_textures); + manager.Initialize(); + + EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_2D) != NULL); + EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP) != NULL); + + // TODO(vmiura): Test GL_TEXTURE_EXTERNAL_OES & GL_TEXTURE_RECTANGLE_ARB. + + manager.Destroy(false); +} + +TEST_F(TextureManagerTest, UseDefaultTexturesFalse) { + bool use_default_textures = false; + TestHelper::SetupTextureManagerInitExpectations( + gl_.get(), "GL_ANGLE_texture_usage", use_default_textures); + TextureManager manager(NULL, + feature_info_.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + use_default_textures); + manager.Initialize(); + + EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_2D) == NULL); + EXPECT_TRUE(manager.GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP) == NULL); + + // TODO(vmiura): Test GL_TEXTURE_EXTERNAL_OES & GL_TEXTURE_RECTANGLE_ARB. + + manager.Destroy(false); +} + TEST_F(TextureManagerTest, TextureUsageExt) { - TestHelper::SetupTextureManagerInitExpectations(gl_.get(), - "GL_ANGLE_texture_usage"); - TextureManager manager( - NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize); + TestHelper::SetupTextureManagerInitExpectations( + gl_.get(), "GL_ANGLE_texture_usage", kUseDefaultTextures); + TextureManager manager(NULL, + feature_info_.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures); manager.Initialize(); const GLuint kClient1Id = 1; const GLuint kService1Id = 11; @@ -175,7 +216,7 @@ TEST_F(TextureManagerTest, TextureUsageExt) { // Check texture got created. TextureRef* texture_ref = manager.GetTexture(kClient1Id); ASSERT_TRUE(texture_ref != NULL); - TestHelper::SetTexParameterWithExpectations( + TestHelper::SetTexParameteriWithExpectations( gl_.get(), error_state_.get(), &manager, texture_ref, GL_TEXTURE_USAGE_ANGLE, GL_FRAMEBUFFER_ATTACHMENT_ANGLE,GL_NO_ERROR); EXPECT_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_ATTACHMENT_ANGLE), @@ -186,9 +227,13 @@ TEST_F(TextureManagerTest, TextureUsageExt) { TEST_F(TextureManagerTest, Destroy) { const GLuint kClient1Id = 1; const GLuint kService1Id = 11; - TestHelper::SetupTextureManagerInitExpectations(gl_.get(), ""); - TextureManager manager( - NULL, feature_info_.get(), kMaxTextureSize, kMaxCubeMapTextureSize); + TestHelper::SetupTextureManagerInitExpectations( + gl_.get(), "", kUseDefaultTextures); + TextureManager manager(NULL, + feature_info_.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures); manager.Initialize(); // Check we can create texture. manager.CreateTexture(kClient1Id, kService1Id); @@ -198,7 +243,8 @@ TEST_F(TextureManagerTest, Destroy) { EXPECT_CALL(*gl_, DeleteTextures(1, ::testing::Pointee(kService1Id))) .Times(1) .RetiresOnSaturation(); - TestHelper::SetupTextureManagerDestructionExpectations(gl_.get(), ""); + TestHelper::SetupTextureManagerDestructionExpectations( + gl_.get(), "", kUseDefaultTextures); manager.Destroy(true); // Check that resources got freed. texture = manager.GetTexture(kClient1Id); @@ -319,8 +365,11 @@ TEST_F(TextureManagerTest, ValidForTargetNPOT) { gl_.get(), "GL_OES_texture_npot"); scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); feature_info->Initialize(); - TextureManager manager( - NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); + TextureManager manager(NULL, + feature_info.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures); // Check NPOT width on level 0 EXPECT_TRUE(manager.ValidForTarget(GL_TEXTURE_2D, 0, 5, 2, 1)); // Check NPOT height on level 0 @@ -332,7 +381,7 @@ TEST_F(TextureManagerTest, ValidForTargetNPOT) { manager.Destroy(false); } -class TextureTestBase : public testing::Test { +class TextureTestBase : public GpuServiceTest { public: static const GLint kMaxTextureSize = 16; static const GLint kMaxCubeMapTextureSize = 8; @@ -340,6 +389,7 @@ class TextureTestBase : public testing::Test { static const GLint kMaxCubeMapLevels = 4; static const GLuint kClient1Id = 1; static const GLuint kService1Id = 11; + static const bool kUseDefaultTextures = false; TextureTestBase() : feature_info_(new FeatureInfo()) { @@ -350,18 +400,18 @@ class TextureTestBase : public testing::Test { protected: void SetUpBase(MemoryTracker* memory_tracker, std::string extensions) { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); - + GpuServiceTest::SetUp(); if (!extensions.empty()) { TestHelper::SetupFeatureInfoInitExpectations(gl_.get(), extensions.c_str()); feature_info_->Initialize(); } - manager_.reset(new TextureManager( - memory_tracker, feature_info_.get(), - kMaxTextureSize, kMaxCubeMapTextureSize)); + manager_.reset(new TextureManager(memory_tracker, + feature_info_.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures)); decoder_.reset(new ::testing::StrictMock<gles2::MockGLES2Decoder>()); error_state_.reset(new ::testing::StrictMock<gles2::MockErrorState>()); manager_->CreateTexture(kClient1Id, kService1Id); @@ -384,21 +434,18 @@ class TextureTestBase : public testing::Test { } manager_->Destroy(false); manager_.reset(); - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); + GpuServiceTest::TearDown(); } void SetParameter( TextureRef* texture_ref, GLenum pname, GLint value, GLenum error) { - TestHelper::SetTexParameterWithExpectations( + TestHelper::SetTexParameteriWithExpectations( gl_.get(), error_state_.get(), manager_.get(), texture_ref, pname, value, error); } scoped_ptr<MockGLES2Decoder> decoder_; scoped_ptr<MockErrorState> error_state_; - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; scoped_refptr<FeatureInfo> feature_info_; scoped_ptr<TextureManager> manager_; scoped_refptr<TextureRef> texture_ref_; @@ -795,8 +842,11 @@ TEST_F(TextureTest, NPOT2DNPOTOK) { gl_.get(), "GL_OES_texture_npot"); scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); feature_info->Initialize(); - TextureManager manager( - NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); + TextureManager manager(NULL, + feature_info.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures); manager.CreateTexture(kClient1Id, kService1Id); TextureRef* texture_ref = manager.GetTexture(kClient1Id); ASSERT_TRUE(texture_ref != NULL); @@ -1042,43 +1092,40 @@ TEST_F(TextureTest, ValidForTexture) { Texture* texture = texture_ref_->texture(); EXPECT_FALSE(texture->ValidForTexture( GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, - 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); + 1, 0, 0, 4, 5, GL_UNSIGNED_BYTE)); // Check bad level. EXPECT_FALSE(texture->ValidForTexture( - GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); + GL_TEXTURE_2D, 0, 0, 0, 4, 5, GL_UNSIGNED_BYTE)); // Check bad xoffset. EXPECT_FALSE(texture->ValidForTexture( - GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); + GL_TEXTURE_2D, 1, -1, 0, 4, 5, GL_UNSIGNED_BYTE)); // Check bad xoffset + width > width. EXPECT_FALSE(texture->ValidForTexture( - GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); + GL_TEXTURE_2D, 1, 1, 0, 4, 5, GL_UNSIGNED_BYTE)); // Check bad yoffset. EXPECT_FALSE(texture->ValidForTexture( - GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); + GL_TEXTURE_2D, 1, 0, -1, 4, 5, GL_UNSIGNED_BYTE)); // Check bad yoffset + height > height. EXPECT_FALSE(texture->ValidForTexture( - GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); + GL_TEXTURE_2D, 1, 0, 1, 4, 5, GL_UNSIGNED_BYTE)); // Check bad width. EXPECT_FALSE(texture->ValidForTexture( - GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_RGBA, GL_UNSIGNED_BYTE)); + GL_TEXTURE_2D, 1, 0, 0, 5, 5, GL_UNSIGNED_BYTE)); // Check bad height. EXPECT_FALSE(texture->ValidForTexture( - GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_RGBA, GL_UNSIGNED_BYTE)); - // Check bad format. - EXPECT_FALSE(texture->ValidForTexture( - GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGB, GL_UNSIGNED_BYTE)); + GL_TEXTURE_2D, 1, 0, 0, 4, 6, GL_UNSIGNED_BYTE)); // Check bad type. EXPECT_FALSE(texture->ValidForTexture( - GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4)); + GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_UNSIGNED_SHORT_4_4_4_4)); // Check valid full size EXPECT_TRUE(texture->ValidForTexture( - GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); + GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_UNSIGNED_BYTE)); // Check valid particial size. EXPECT_TRUE(texture->ValidForTexture( - GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_RGBA, GL_UNSIGNED_BYTE)); + GL_TEXTURE_2D, 1, 1, 1, 2, 3, GL_UNSIGNED_BYTE)); manager_->RemoveTexture(kClient1Id); EXPECT_TRUE(texture->ValidForTexture( - GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_RGBA, GL_UNSIGNED_BYTE)); + GL_TEXTURE_2D, 1, 0, 0, 4, 5, GL_UNSIGNED_BYTE)); } TEST_F(TextureTest, FloatNotLinear) { @@ -1086,8 +1133,11 @@ TEST_F(TextureTest, FloatNotLinear) { gl_.get(), "GL_OES_texture_float"); scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); feature_info->Initialize(); - TextureManager manager( - NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); + TextureManager manager(NULL, + feature_info.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures); manager.CreateTexture(kClient1Id, kService1Id); TextureRef* texture_ref = manager.GetTexture(kClient1Id); ASSERT_TRUE(texture_ref != NULL); @@ -1097,11 +1147,11 @@ TEST_F(TextureTest, FloatNotLinear) { manager.SetLevelInfo(texture_ref, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_FLOAT, true); EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); - TestHelper::SetTexParameterWithExpectations( + TestHelper::SetTexParameteriWithExpectations( gl_.get(), error_state_.get(), &manager, texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); - TestHelper::SetTexParameterWithExpectations( + TestHelper::SetTexParameteriWithExpectations( gl_.get(), error_state_.get(), &manager, texture_ref, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR); EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); @@ -1113,8 +1163,11 @@ TEST_F(TextureTest, FloatLinear) { gl_.get(), "GL_OES_texture_float GL_OES_texture_float_linear"); scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); feature_info->Initialize(); - TextureManager manager( - NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); + TextureManager manager(NULL, + feature_info.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures); manager.CreateTexture(kClient1Id, kService1Id); TextureRef* texture_ref = manager.GetTexture(kClient1Id); ASSERT_TRUE(texture_ref != NULL); @@ -1132,8 +1185,11 @@ TEST_F(TextureTest, HalfFloatNotLinear) { gl_.get(), "GL_OES_texture_half_float"); scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); feature_info->Initialize(); - TextureManager manager( - NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); + TextureManager manager(NULL, + feature_info.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures); manager.CreateTexture(kClient1Id, kService1Id); TextureRef* texture_ref = manager.GetTexture(kClient1Id); ASSERT_TRUE(texture_ref != NULL); @@ -1143,11 +1199,11 @@ TEST_F(TextureTest, HalfFloatNotLinear) { manager.SetLevelInfo(texture_ref, GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_HALF_FLOAT_OES, true); EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); - TestHelper::SetTexParameterWithExpectations( + TestHelper::SetTexParameteriWithExpectations( gl_.get(), error_state_.get(), &manager, texture_ref, GL_TEXTURE_MAG_FILTER, GL_NEAREST, GL_NO_ERROR); EXPECT_FALSE(TextureTestHelper::IsTextureComplete(texture)); - TestHelper::SetTexParameterWithExpectations( + TestHelper::SetTexParameteriWithExpectations( gl_.get(), error_state_.get(), &manager, texture_ref, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST, GL_NO_ERROR); EXPECT_TRUE(TextureTestHelper::IsTextureComplete(texture)); @@ -1159,8 +1215,11 @@ TEST_F(TextureTest, HalfFloatLinear) { gl_.get(), "GL_OES_texture_half_float GL_OES_texture_half_float_linear"); scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); feature_info->Initialize(); - TextureManager manager( - NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); + TextureManager manager(NULL, + feature_info.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures); manager.CreateTexture(kClient1Id, kService1Id); TextureRef* texture_ref = manager.GetTexture(kClient1Id); ASSERT_TRUE(texture_ref != NULL); @@ -1178,8 +1237,11 @@ TEST_F(TextureTest, EGLImageExternal) { gl_.get(), "GL_OES_EGL_image_external"); scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); feature_info->Initialize(); - TextureManager manager( - NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); + TextureManager manager(NULL, + feature_info.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures); manager.CreateTexture(kClient1Id, kService1Id); TextureRef* texture_ref = manager.GetTexture(kClient1Id); ASSERT_TRUE(texture_ref != NULL); @@ -1195,8 +1257,11 @@ TEST_F(TextureTest, DepthTexture) { gl_.get(), "GL_ANGLE_depth_texture"); scoped_refptr<FeatureInfo> feature_info(new FeatureInfo()); feature_info->Initialize(); - TextureManager manager( - NULL, feature_info.get(), kMaxTextureSize, kMaxCubeMapTextureSize); + TextureManager manager(NULL, + feature_info.get(), + kMaxTextureSize, + kMaxCubeMapTextureSize, + kUseDefaultTextures); manager.CreateTexture(kClient1Id, kService1Id); TextureRef* texture_ref = manager.GetTexture(kClient1Id); ASSERT_TRUE(texture_ref != NULL); @@ -1428,7 +1493,7 @@ TEST_F(TextureTest, SafeUnsafe) { } TEST_F(TextureTest, ClearTexture) { - EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) + EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _, _)) .WillRepeatedly(Return(true)); manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_2D); manager_->SetLevelInfo(texture_ref_.get(), @@ -1805,7 +1870,8 @@ TEST_F(TextureTest, AddToSignature) { EXPECT_EQ(11u, string_set.size()); } -class ProduceConsumeTextureTest : public TextureTest { +class ProduceConsumeTextureTest : public TextureTest, + public ::testing::WithParamInterface<GLenum> { public: virtual void SetUp() { TextureTest::SetUpBase(NULL, "GL_OES_EGL_image_external"); @@ -1994,7 +2060,7 @@ TEST_F(ProduceConsumeTextureTest, ProduceConsumeClearRectangle) { // See if we can clear the previously uncleared level now. EXPECT_EQ(level0, GetLevelInfo(restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0)); - EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _)) + EXPECT_CALL(*decoder_, ClearLevel(_, _, _, _, _, _, _, _, _, _)) .WillRepeatedly(Return(true)); EXPECT_TRUE(manager_->ClearTextureLevel( decoder_.get(), restored_texture.get(), GL_TEXTURE_RECTANGLE_ARB, 0)); @@ -2020,25 +2086,43 @@ TEST_F(ProduceConsumeTextureTest, ProduceConsumeExternal) { GetLevelInfo(restored_texture.get(), GL_TEXTURE_EXTERNAL_OES, 0)); } -TEST_F(ProduceConsumeTextureTest, ProduceConsumeStreamTexture) { - manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_EXTERNAL_OES); +TEST_P(ProduceConsumeTextureTest, ProduceConsumeTextureWithImage) { + GLenum target = GetParam(); + manager_->SetTarget(texture_ref_.get(), target); Texture* texture = texture_ref_->texture(); - EXPECT_EQ(static_cast<GLenum>(GL_TEXTURE_EXTERNAL_OES), texture->target()); - manager_->SetStreamTexture(texture_ref_.get(), true); + EXPECT_EQ(static_cast<GLenum>(target), texture->target()); + scoped_refptr<gfx::GLImage> image(gfx::GLImage::CreateGLImage(0)); + manager_->SetLevelInfo(texture_ref_.get(), + target, + 0, + GL_RGBA, + 0, + 0, + 1, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + true); + manager_->SetLevelImage(texture_ref_.get(), target, 0, image); GLuint service_id = texture->service_id(); Texture* produced_texture = Produce(texture_ref_.get()); - EXPECT_TRUE(texture->IsStreamTexture()); GLuint client_id = texture2_->client_id(); manager_->RemoveTexture(client_id); Consume(client_id, produced_texture); scoped_refptr<TextureRef> restored_texture = manager_->GetTexture(client_id); EXPECT_EQ(produced_texture, restored_texture->texture()); - EXPECT_TRUE(restored_texture->texture()->IsStreamTexture()); - EXPECT_TRUE(restored_texture->texture()->IsImmutable()); EXPECT_EQ(service_id, restored_texture->service_id()); + EXPECT_EQ(image.get(), restored_texture->texture()->GetLevelImage(target, 0)); } +static const GLenum kTextureTargets[] = {GL_TEXTURE_2D, GL_TEXTURE_EXTERNAL_OES, + GL_TEXTURE_RECTANGLE_ARB, }; + +INSTANTIATE_TEST_CASE_P(Target, + ProduceConsumeTextureTest, + ::testing::ValuesIn(kTextureTargets)); + TEST_F(ProduceConsumeTextureTest, ProduceConsumeCube) { manager_->SetTarget(texture_ref_.get(), GL_TEXTURE_CUBE_MAP); Texture* texture = texture_ref_->texture(); @@ -2108,34 +2192,36 @@ class CountingMemoryTracker : public MemoryTracker { DISALLOW_COPY_AND_ASSIGN(CountingMemoryTracker); }; -class SharedTextureTest : public testing::Test { +class SharedTextureTest : public GpuServiceTest { public: - SharedTextureTest() - : feature_info_(new FeatureInfo()) { - } + static const bool kUseDefaultTextures = false; + + SharedTextureTest() : feature_info_(new FeatureInfo()) {} virtual ~SharedTextureTest() { } virtual void SetUp() { - gl_.reset(new ::gfx::MockGLInterface()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); - + GpuServiceTest::SetUp(); memory_tracker1_ = new CountingMemoryTracker; texture_manager1_.reset( new TextureManager(memory_tracker1_.get(), feature_info_.get(), TextureManagerTest::kMaxTextureSize, - TextureManagerTest::kMaxCubeMapTextureSize)); + TextureManagerTest::kMaxCubeMapTextureSize, + kUseDefaultTextures)); memory_tracker2_ = new CountingMemoryTracker; texture_manager2_.reset( new TextureManager(memory_tracker2_.get(), feature_info_.get(), TextureManagerTest::kMaxTextureSize, - TextureManagerTest::kMaxCubeMapTextureSize)); - TestHelper::SetupTextureManagerInitExpectations(gl_.get(), ""); + TextureManagerTest::kMaxCubeMapTextureSize, + kUseDefaultTextures)); + TestHelper::SetupTextureManagerInitExpectations( + gl_.get(), "", kUseDefaultTextures); texture_manager1_->Initialize(); - TestHelper::SetupTextureManagerInitExpectations(gl_.get(), ""); + TestHelper::SetupTextureManagerInitExpectations( + gl_.get(), "", kUseDefaultTextures); texture_manager2_->Initialize(); } @@ -2144,12 +2230,10 @@ class SharedTextureTest : public testing::Test { texture_manager2_.reset(); texture_manager1_->Destroy(false); texture_manager1_.reset(); - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); + GpuServiceTest::TearDown(); } protected: - scoped_ptr< ::gfx::MockGLInterface > gl_; scoped_refptr<FeatureInfo> feature_info_; scoped_refptr<CountingMemoryTracker> memory_tracker1_; scoped_ptr<TextureManager> texture_manager1_; diff --git a/chromium/gpu/command_buffer/service/transfer_buffer_manager.cc b/chromium/gpu/command_buffer/service/transfer_buffer_manager.cc index 76443a1f250..4404a9eb6c4 100644 --- a/chromium/gpu/command_buffer/service/transfer_buffer_manager.cc +++ b/chromium/gpu/command_buffer/service/transfer_buffer_manager.cc @@ -10,6 +10,7 @@ #include "base/memory/scoped_ptr.h" #include "base/debug/trace_event.h" #include "base/process/process_handle.h" +#include "gpu/command_buffer/common/cmd_buffer_common.h" #include "gpu/command_buffer/common/gles2_cmd_utils.h" using ::base::SharedMemory; @@ -26,9 +27,8 @@ TransferBufferManager::TransferBufferManager() TransferBufferManager::~TransferBufferManager() { while (!registered_buffers_.empty()) { BufferMap::iterator it = registered_buffers_.begin(); - DCHECK(shared_memory_bytes_allocated_ >= it->second.size); - shared_memory_bytes_allocated_ -= it->second.size; - delete it->second.shared_memory; + DCHECK(shared_memory_bytes_allocated_ >= it->second->size()); + shared_memory_bytes_allocated_ -= it->second->size(); registered_buffers_.erase(it); } DCHECK(!shared_memory_bytes_allocated_); @@ -40,8 +40,7 @@ bool TransferBufferManager::Initialize() { bool TransferBufferManager::RegisterTransferBuffer( int32 id, - base::SharedMemory* shared_memory, - size_t size) { + scoped_ptr<BufferBacking> buffer_backing) { if (id <= 0) { DVLOG(0) << "Cannot register transfer buffer with non-positive ID."; return false; @@ -53,29 +52,14 @@ bool TransferBufferManager::RegisterTransferBuffer( return false; } - // Duplicate the handle. - base::SharedMemoryHandle duped_shared_memory_handle; - if (!shared_memory->ShareToProcess(base::GetCurrentProcessHandle(), - &duped_shared_memory_handle)) { - DVLOG(0) << "Failed to duplicate shared memory handle."; - return false; - } - scoped_ptr<SharedMemory> duped_shared_memory( - new SharedMemory(duped_shared_memory_handle, false)); - - // Map the shared memory into this process. This validates the size. - if (!duped_shared_memory->Map(size)) { - DVLOG(0) << "Failed to map shared memory."; - return false; - } + // Register the shared memory with the ID. + scoped_refptr<Buffer> buffer(new gpu::Buffer(buffer_backing.Pass())); - // If it could be mapped register the shared memory with the ID. - Buffer buffer; - buffer.ptr = duped_shared_memory->memory(); - buffer.size = size; - buffer.shared_memory = duped_shared_memory.release(); + // Check buffer alignment is sane. + DCHECK(!(reinterpret_cast<uintptr_t>(buffer->memory()) & + (kCommandBufferEntrySize - 1))); - shared_memory_bytes_allocated_ += size; + shared_memory_bytes_allocated_ += buffer->size(); TRACE_COUNTER_ID1( "gpu", "GpuTransferBufferMemory", this, shared_memory_bytes_allocated_); @@ -91,22 +75,21 @@ void TransferBufferManager::DestroyTransferBuffer(int32 id) { return; } - DCHECK(shared_memory_bytes_allocated_ >= it->second.size); - shared_memory_bytes_allocated_ -= it->second.size; + DCHECK(shared_memory_bytes_allocated_ >= it->second->size()); + shared_memory_bytes_allocated_ -= it->second->size(); TRACE_COUNTER_ID1( "gpu", "GpuTransferBufferMemory", this, shared_memory_bytes_allocated_); - delete it->second.shared_memory; registered_buffers_.erase(it); } -Buffer TransferBufferManager::GetTransferBuffer(int32 id) { +scoped_refptr<Buffer> TransferBufferManager::GetTransferBuffer(int32 id) { if (id == 0) - return Buffer(); + return NULL; BufferMap::iterator it = registered_buffers_.find(id); if (it == registered_buffers_.end()) - return Buffer(); + return NULL; return it->second; } diff --git a/chromium/gpu/command_buffer/service/transfer_buffer_manager.h b/chromium/gpu/command_buffer/service/transfer_buffer_manager.h index 5e1a7464824..d8bb3bb4fd4 100644 --- a/chromium/gpu/command_buffer/service/transfer_buffer_manager.h +++ b/chromium/gpu/command_buffer/service/transfer_buffer_manager.h @@ -21,11 +21,9 @@ class GPU_EXPORT TransferBufferManagerInterface { virtual ~TransferBufferManagerInterface(); virtual bool RegisterTransferBuffer(int32 id, - base::SharedMemory* shared_memory, - size_t size) = 0; + scoped_ptr<BufferBacking> buffer) = 0; virtual void DestroyTransferBuffer(int32 id) = 0; - virtual Buffer GetTransferBuffer(int32 id) = 0; - + virtual scoped_refptr<Buffer> GetTransferBuffer(int32 id) = 0; }; class GPU_EXPORT TransferBufferManager @@ -35,15 +33,15 @@ class GPU_EXPORT TransferBufferManager bool Initialize(); virtual bool RegisterTransferBuffer(int32 id, - base::SharedMemory* shared_memory, - size_t size) OVERRIDE; + scoped_ptr<BufferBacking> buffer_backing) + OVERRIDE; virtual void DestroyTransferBuffer(int32 id) OVERRIDE; - virtual Buffer GetTransferBuffer(int32 id) OVERRIDE; + virtual scoped_refptr<Buffer> GetTransferBuffer(int32 id) OVERRIDE; private: virtual ~TransferBufferManager(); - typedef base::hash_map<int32, Buffer> BufferMap; + typedef base::hash_map<int32, scoped_refptr<Buffer> > BufferMap; BufferMap registered_buffers_; size_t shared_memory_bytes_allocated_; diff --git a/chromium/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc b/chromium/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc index 68c5c2ec21c..4af09368cb0 100644 --- a/chromium/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc +++ b/chromium/gpu/command_buffer/service/transfer_buffer_manager_unittest.cc @@ -17,83 +17,81 @@ const static size_t kBufferSize = 1024; class TransferBufferManagerTest : public testing::Test { protected: virtual void SetUp() { - for (size_t i = 0; i < arraysize(buffers_); ++i) { - buffers_[i].CreateAnonymous(kBufferSize); - buffers_[i].Map(kBufferSize); - } - TransferBufferManager* manager = new TransferBufferManager(); transfer_buffer_manager_.reset(manager); ASSERT_TRUE(manager->Initialize()); } - base::SharedMemory buffers_[3]; scoped_ptr<TransferBufferManagerInterface> transfer_buffer_manager_; }; TEST_F(TransferBufferManagerTest, ZeroHandleMapsToNull) { - EXPECT_TRUE(NULL == transfer_buffer_manager_->GetTransferBuffer(0).ptr); + EXPECT_TRUE(NULL == transfer_buffer_manager_->GetTransferBuffer(0)); } TEST_F(TransferBufferManagerTest, NegativeHandleMapsToNull) { - EXPECT_TRUE(NULL == transfer_buffer_manager_->GetTransferBuffer(-1).ptr); + EXPECT_TRUE(NULL == transfer_buffer_manager_->GetTransferBuffer(-1)); } TEST_F(TransferBufferManagerTest, OutOfRangeHandleMapsToNull) { - EXPECT_TRUE(NULL == transfer_buffer_manager_->GetTransferBuffer(1).ptr); + EXPECT_TRUE(NULL == transfer_buffer_manager_->GetTransferBuffer(1)); } TEST_F(TransferBufferManagerTest, CanRegisterTransferBuffer) { - EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer(1, - &buffers_[0], - kBufferSize)); - Buffer registered = transfer_buffer_manager_->GetTransferBuffer(1); - - // Distinct memory range and shared memory handle from that originally - // registered. - EXPECT_NE(static_cast<void*>(NULL), registered.ptr); - EXPECT_NE(buffers_[0].memory(), registered.ptr); - EXPECT_EQ(kBufferSize, registered.size); - EXPECT_NE(&buffers_[0], registered.shared_memory); - - // But maps to the same physical memory. - *static_cast<int*>(registered.ptr) = 7; - *static_cast<int*>(buffers_[0].memory()) = 8; - EXPECT_EQ(8, *static_cast<int*>(registered.ptr)); + scoped_ptr<base::SharedMemory> shm(new base::SharedMemory()); + shm->CreateAndMapAnonymous(kBufferSize); + base::SharedMemory* shm_raw_pointer = shm.get(); + scoped_ptr<SharedMemoryBufferBacking> backing( + new SharedMemoryBufferBacking(shm.Pass(), kBufferSize)); + SharedMemoryBufferBacking* backing_raw_ptr = backing.get(); + + EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer( + 1, backing.PassAs<BufferBacking>())); + scoped_refptr<Buffer> registered = + transfer_buffer_manager_->GetTransferBuffer(1); + + // Shared-memory ownership is transfered. It should be the same memory. + EXPECT_EQ(backing_raw_ptr, registered->backing()); + EXPECT_EQ(shm_raw_pointer, backing_raw_ptr->shared_memory()); } +class FakeBufferBacking : public BufferBacking { + public: + virtual void* GetMemory() const OVERRIDE { + return reinterpret_cast<void*>(0xBADF00D0); + } + virtual size_t GetSize() const OVERRIDE { return 42; } + static scoped_ptr<BufferBacking> Make() { + return scoped_ptr<BufferBacking>(new FakeBufferBacking); + } +}; + TEST_F(TransferBufferManagerTest, CanDestroyTransferBuffer) { - EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer(1, - &buffers_[0], - kBufferSize)); + EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer( + 1, scoped_ptr<BufferBacking>(new FakeBufferBacking))); transfer_buffer_manager_->DestroyTransferBuffer(1); - Buffer registered = transfer_buffer_manager_->GetTransferBuffer(1); + scoped_refptr<Buffer> registered = + transfer_buffer_manager_->GetTransferBuffer(1); - EXPECT_EQ(static_cast<void*>(NULL), registered.ptr); - EXPECT_EQ(0U, registered.size); - EXPECT_EQ(static_cast<base::SharedMemory*>(NULL), registered.shared_memory); + scoped_refptr<Buffer> null_buffer; + EXPECT_EQ(null_buffer, registered); } TEST_F(TransferBufferManagerTest, CannotRegregisterTransferBufferId) { - EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer(1, - &buffers_[0], - kBufferSize)); - EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer(1, - &buffers_[0], - kBufferSize)); - EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer(1, - &buffers_[1], - kBufferSize)); + EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer( + 1, FakeBufferBacking::Make())); + EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer( + 1, FakeBufferBacking::Make())); + EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer( + 1, FakeBufferBacking::Make())); } TEST_F(TransferBufferManagerTest, CanReuseTransferBufferIdAfterDestroying) { - EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer(1, - &buffers_[0], - kBufferSize)); + EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer( + 1, FakeBufferBacking::Make())); transfer_buffer_manager_->DestroyTransferBuffer(1); - EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer(1, - &buffers_[1], - kBufferSize)); + EXPECT_TRUE(transfer_buffer_manager_->RegisterTransferBuffer( + 1, FakeBufferBacking::Make())); } TEST_F(TransferBufferManagerTest, DestroyUnusedTransferBufferIdDoesNotCrash) { @@ -101,15 +99,15 @@ TEST_F(TransferBufferManagerTest, DestroyUnusedTransferBufferIdDoesNotCrash) { } TEST_F(TransferBufferManagerTest, CannotRegisterNullTransferBuffer) { - EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer(0, - &buffers_[0], - kBufferSize)); + EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer( + 0, FakeBufferBacking::Make())); } TEST_F(TransferBufferManagerTest, CannotRegisterNegativeTransferBufferId) { - EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer(-1, - &buffers_[0], - kBufferSize)); + scoped_ptr<base::SharedMemory> shm(new base::SharedMemory()); + shm->CreateAndMapAnonymous(kBufferSize); + EXPECT_FALSE(transfer_buffer_manager_->RegisterTransferBuffer( + -1, FakeBufferBacking::Make())); } } // namespace gpu diff --git a/chromium/gpu/command_buffer/service/vertex_array_manager.cc b/chromium/gpu/command_buffer/service/vertex_array_manager.cc index 974751941ce..1560c043c25 100644 --- a/chromium/gpu/command_buffer/service/vertex_array_manager.cc +++ b/chromium/gpu/command_buffer/service/vertex_array_manager.cc @@ -28,14 +28,22 @@ void VertexArrayManager::Destroy(bool have_context) { vertex_attrib_managers_.clear(); } -void VertexArrayManager::CreateVertexAttribManager( - GLuint client_id, GLuint service_id, uint32 num_vertex_attribs) { +scoped_refptr<VertexAttribManager> +VertexArrayManager::CreateVertexAttribManager(GLuint client_id, + GLuint service_id, + uint32 num_vertex_attribs, + bool client_visible) { scoped_refptr<VertexAttribManager> vertex_attrib_manager( new VertexAttribManager(this, service_id, num_vertex_attribs)); - std::pair<VertexAttribManagerMap::iterator, bool> result = - vertex_attrib_managers_.insert( - std::make_pair(client_id, vertex_attrib_manager)); - DCHECK(result.second); + + if (client_visible) { + std::pair<VertexAttribManagerMap::iterator, bool> result = + vertex_attrib_managers_.insert( + std::make_pair(client_id, vertex_attrib_manager)); + DCHECK(result.second); + } + + return vertex_attrib_manager; } VertexAttribManager* VertexArrayManager::GetVertexAttribManager( diff --git a/chromium/gpu/command_buffer/service/vertex_array_manager.h b/chromium/gpu/command_buffer/service/vertex_array_manager.h index 4fc567c7b79..97ecc1a5353 100644 --- a/chromium/gpu/command_buffer/service/vertex_array_manager.h +++ b/chromium/gpu/command_buffer/service/vertex_array_manager.h @@ -28,9 +28,13 @@ class GPU_EXPORT VertexArrayManager { // Must call before destruction. void Destroy(bool have_context); - // Creates a VertexArrayInfo for the given vertex array. - void CreateVertexAttribManager(GLuint client_id, GLuint service_id, - uint32 num_vertex_attribs); + // Creates a VertexAttribManager and if client_visible, + // maps it to the client_id. + scoped_refptr<VertexAttribManager> CreateVertexAttribManager( + GLuint client_id, + GLuint service_id, + uint32 num_vertex_attribs, + bool client_visible); // Gets the vertex attrib manager for the given vertex array. VertexAttribManager* GetVertexAttribManager(GLuint client_id); diff --git a/chromium/gpu/command_buffer/service/vertex_array_manager_unittest.cc b/chromium/gpu/command_buffer/service/vertex_array_manager_unittest.cc index 50ce07752a4..aa2df355f70 100644 --- a/chromium/gpu/command_buffer/service/vertex_array_manager_unittest.cc +++ b/chromium/gpu/command_buffer/service/vertex_array_manager_unittest.cc @@ -7,6 +7,7 @@ #include "base/memory/scoped_ptr.h" #include "gpu/command_buffer/service/feature_info.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/test_helper.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_mock.h" @@ -17,7 +18,7 @@ using ::testing::_; namespace gpu { namespace gles2 { -class VertexArrayManagerTest : public testing::Test { +class VertexArrayManagerTest : public GpuServiceTest { public: static const uint32 kNumVertexAttribs = 8; @@ -29,21 +30,16 @@ class VertexArrayManagerTest : public testing::Test { protected: virtual void SetUp() { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); - - manager_ = new VertexArrayManager(); + GpuServiceTest::SetUp(); + manager_.reset(new VertexArrayManager()); } virtual void TearDown() { - delete manager_; - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); + manager_.reset(); + GpuServiceTest::TearDown(); } - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; - VertexArrayManager* manager_; + scoped_ptr<VertexArrayManager> manager_; }; // GCC requires these declarations, but MSVC requires they not be present @@ -58,7 +54,7 @@ TEST_F(VertexArrayManagerTest, Basic) { // Check we can create manager_->CreateVertexAttribManager( - kClient1Id, kService1Id, kNumVertexAttribs); + kClient1Id, kService1Id, kNumVertexAttribs, true); // Check creation success VertexAttribManager* info1 = manager_->GetVertexAttribManager(kClient1Id); ASSERT_TRUE(info1 != NULL); @@ -84,7 +80,8 @@ TEST_F(VertexArrayManagerTest, Destroy) { const GLuint kService1Id = 11; VertexArrayManager manager; // Check we can create - manager.CreateVertexAttribManager(kClient1Id, kService1Id, kNumVertexAttribs); + manager.CreateVertexAttribManager( + kClient1Id, kService1Id, kNumVertexAttribs, true); // Check creation success VertexAttribManager* info1 = manager.GetVertexAttribManager(kClient1Id); ASSERT_TRUE(info1 != NULL); diff --git a/chromium/gpu/command_buffer/service/vertex_attrib_manager.cc b/chromium/gpu/command_buffer/service/vertex_attrib_manager.cc index 23e592cf5f5..5bf40403756 100644 --- a/chromium/gpu/command_buffer/service/vertex_attrib_manager.cc +++ b/chromium/gpu/command_buffer/service/vertex_attrib_manager.cc @@ -6,7 +6,6 @@ #include <list> -#include "base/command_line.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" #include "base/strings/string_number_conversions.h" @@ -122,14 +121,12 @@ VertexAttribManager::~VertexAttribManager() { void VertexAttribManager::Initialize( uint32 max_vertex_attribs, bool init_attribs) { vertex_attribs_.resize(max_vertex_attribs); - bool disable_workarounds = CommandLine::ForCurrentProcess()->HasSwitch( - switches::kDisableGpuDriverBugWorkarounds); for (uint32 vv = 0; vv < vertex_attribs_.size(); ++vv) { vertex_attribs_[vv].set_index(vv); vertex_attribs_[vv].SetList(&disabled_vertex_attribs_); - if (!disable_workarounds && init_attribs) { + if (init_attribs) { glVertexAttrib4f(vv, 0.0f, 0.0f, 0.0f, 1.0f); } } diff --git a/chromium/gpu/command_buffer/service/vertex_attrib_manager.h b/chromium/gpu/command_buffer/service/vertex_attrib_manager.h index 2eff3ccfe30..8ee858738a3 100644 --- a/chromium/gpu/command_buffer/service/vertex_attrib_manager.h +++ b/chromium/gpu/command_buffer/service/vertex_attrib_manager.h @@ -171,7 +171,7 @@ class GPU_EXPORT VertexAttribManager : VertexAttribManager(); - void Initialize(uint32 num_vertex_attribs, bool init_attribs = true); + void Initialize(uint32 num_vertex_attribs, bool init_attribs); bool Enable(GLuint index, bool enable); diff --git a/chromium/gpu/command_buffer/service/vertex_attrib_manager_unittest.cc b/chromium/gpu/command_buffer/service/vertex_attrib_manager_unittest.cc index 28a051c97b2..e7fd6905474 100644 --- a/chromium/gpu/command_buffer/service/vertex_attrib_manager_unittest.cc +++ b/chromium/gpu/command_buffer/service/vertex_attrib_manager_unittest.cc @@ -8,6 +8,7 @@ #include "gpu/command_buffer/service/buffer_manager.h" #include "gpu/command_buffer/service/error_state_mock.h" #include "gpu/command_buffer/service/feature_info.h" +#include "gpu/command_buffer/service/gpu_service_test.h" #include "gpu/command_buffer/service/test_helper.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gl/gl_mock.h" @@ -18,7 +19,7 @@ using ::testing::_; namespace gpu { namespace gles2 { -class VertexAttribManagerTest : public testing::Test { +class VertexAttribManagerTest : public GpuServiceTest { public: static const uint32 kNumVertexAttribs = 8; @@ -30,8 +31,7 @@ class VertexAttribManagerTest : public testing::Test { protected: virtual void SetUp() { - gl_.reset(new ::testing::StrictMock< ::gfx::MockGLInterface>()); - ::gfx::GLInterface::SetGLInterface(gl_.get()); + GpuServiceTest::SetUp(); for (uint32 ii = 0; ii < kNumVertexAttribs; ++ii) { EXPECT_CALL(*gl_, VertexAttrib4f(ii, 0.0f, 0.0f, 0.0f, 1.0f)) @@ -40,17 +40,9 @@ class VertexAttribManagerTest : public testing::Test { } manager_ = new VertexAttribManager(); - manager_->Initialize(kNumVertexAttribs); + manager_->Initialize(kNumVertexAttribs, true); } - virtual void TearDown() { - manager_ = NULL; - ::gfx::GLInterface::SetGLInterface(NULL); - gl_.reset(); - } - - // Use StrictMock to make 100% sure we know how GL will be called. - scoped_ptr< ::testing::StrictMock< ::gfx::MockGLInterface> > gl_; scoped_refptr<VertexAttribManager> manager_; }; |