15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""code generator for GLES2 command buffers."""
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import itertools
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os.path
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import re
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from optparse import OptionParser
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from subprocess import call
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_SIZE_OF_UINT32 = 4
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_SIZE_OF_COMMAND_HEADER = 4
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_FIRST_SPECIFIC_COMMAND_ID = 256
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch_LICENSE = """// Copyright 2014 The Chromium Authors. All rights reserved.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_DO_NOT_EDIT_WARNING = """// This file is auto-generated from
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gpu/command_buffer/build_gles2_cmd_buffer.py
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// It's formatted by clang-format using chromium coding style:
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)//    clang-format -i -style=chromium filename
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DO NOT EDIT!
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This string is copied directly out of the gl2.h file from GLES2.0
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Edits:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# *) Any argument that is a resourceID has been changed to GLid<Type>.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    (not pointer arguments) and if it's allowed to be zero it's GLidZero<Type>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    If it's allowed to not exist it's GLidBind<Type>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# *) All GLenums have been changed to GLenumTypeOfEnum
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_GL_TYPES = {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLenum': 'unsigned int',
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLboolean': 'unsigned char',
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLbitfield': 'unsigned int',
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLbyte': 'signed char',
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLshort': 'short',
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLint': 'int',
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLsizei': 'int',
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLubyte': 'unsigned char',
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLushort': 'unsigned short',
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLuint': 'unsigned int',
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLfloat': 'float',
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLclampf': 'float',
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLvoid': 'void',
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLfixed': 'int',
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  'GLclampx': 'int'
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)_GL_TYPES_32 = {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLintptr': 'long int',
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  'GLsizeiptr': 'long int'
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)_GL_TYPES_64 = {
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  'GLintptr': 'long long int',
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  'GLsizeiptr': 'long long int'
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Capabilites selected with glEnable
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_CAPABILITY_FLAGS = [
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'blend'},
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'cull_face'},
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  {'name': 'depth_test', 'state_flag': 'framebuffer_state_.clear_state_dirty'},
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'dither', 'default': True},
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'polygon_offset_fill'},
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'sample_alpha_to_coverage'},
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'sample_coverage'},
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {'name': 'scissor_test'},
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  {'name': 'stencil_test',
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)   'state_flag': 'framebuffer_state_.clear_state_dirty'},
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)]
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_STATES = {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ClearColor': {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'ClearColor',
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_COLOR_CLEAR_VALUE',
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'color_clear_red', 'type': 'GLfloat', 'default': '0.0f'},
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'color_clear_green', 'type': 'GLfloat', 'default': '0.0f'},
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'color_clear_blue', 'type': 'GLfloat', 'default': '0.0f'},
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'color_clear_alpha', 'type': 'GLfloat', 'default': '0.0f'},
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ClearDepthf': {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'ClearDepth',
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_DEPTH_CLEAR_VALUE',
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'depth_clear', 'type': 'GLclampf', 'default': '1.0f'},
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ColorMask': {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'ColorMask',
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_COLOR_WRITEMASK',
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'name': 'color_mask_red',
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'type': 'GLboolean',
114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'default': 'true',
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'cached': True
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'name': 'color_mask_green',
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'type': 'GLboolean',
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'default': 'true',
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'cached': True
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'name': 'color_mask_blue',
125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'type': 'GLboolean',
126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'default': 'true',
127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'cached': True
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'name': 'color_mask_alpha',
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'type': 'GLboolean',
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'default': 'true',
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'cached': True
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'state_flag': 'framebuffer_state_.clear_state_dirty',
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ClearStencil': {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'ClearStencil',
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_STENCIL_CLEAR_VALUE',
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'stencil_clear', 'type': 'GLint', 'default': '0'},
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BlendColor': {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'BlendColor',
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_BLEND_COLOR',
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'blend_color_red', 'type': 'GLfloat', 'default': '0.0f'},
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'blend_color_green', 'type': 'GLfloat', 'default': '0.0f'},
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'blend_color_blue', 'type': 'GLfloat', 'default': '0.0f'},
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'blend_color_alpha', 'type': 'GLfloat', 'default': '0.0f'},
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BlendEquation': {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'SrcDst',
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'BlendEquationSeparate',
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'blend_equation_rgb',
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_BLEND_EQUATION_RGB',
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_FUNC_ADD',
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'blend_equation_alpha',
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_BLEND_EQUATION_ALPHA',
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_FUNC_ADD',
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BlendFunc': {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'SrcDst',
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'BlendFuncSeparate',
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'blend_source_rgb',
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_BLEND_SRC_RGB',
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_ONE',
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'blend_dest_rgb',
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_BLEND_DST_RGB',
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_ZERO',
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'blend_source_alpha',
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_BLEND_SRC_ALPHA',
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_ONE',
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'blend_dest_alpha',
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_BLEND_DST_ALPHA',
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_ZERO',
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'PolygonOffset': {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'PolygonOffset',
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'polygon_offset_factor',
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLfloat',
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_POLYGON_OFFSET_FACTOR',
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0.0f',
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'polygon_offset_units',
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLfloat',
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_POLYGON_OFFSET_UNITS',
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0.0f',
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CullFace':  {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'CullFace',
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_CULL_FACE_MODE',
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'cull_mode',
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_BACK',
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'FrontFace': {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'FrontFace',
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_FRONT_FACE',
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [{'name': 'front_face', 'type': 'GLenum', 'default': 'GL_CCW'}],
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DepthFunc': {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'DepthFunc',
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_DEPTH_FUNC',
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [{'name': 'depth_func', 'type': 'GLenum', 'default': 'GL_LESS'}],
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DepthRange': {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'DepthRange',
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_DEPTH_RANGE',
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'z_near', 'type': 'GLclampf', 'default': '0.0f'},
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {'name': 'z_far', 'type': 'GLclampf', 'default': '1.0f'},
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'SampleCoverage': {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'SampleCoverage',
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'sample_coverage_value',
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLclampf',
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_SAMPLE_COVERAGE_VALUE',
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '1.0f',
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'sample_coverage_invert',
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLboolean',
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_SAMPLE_COVERAGE_INVERT',
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'false',
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'StencilMask': {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'FrontBack',
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'StencilMaskSeparate',
2773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'state_flag': 'framebuffer_state_.clear_state_dirty',
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_front_writemask',
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLuint',
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_WRITEMASK',
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0xFFFFFFFFU',
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'cached': True,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_back_writemask',
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLuint',
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_BACK_WRITEMASK',
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0xFFFFFFFFU',
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'cached': True,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'StencilOp': {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'FrontBack',
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'StencilOpSeparate',
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_front_fail_op',
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_FAIL',
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_KEEP',
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_front_z_fail_op',
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_PASS_DEPTH_FAIL',
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_KEEP',
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_front_z_pass_op',
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_PASS_DEPTH_PASS',
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_KEEP',
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_back_fail_op',
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_BACK_FAIL',
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_KEEP',
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_back_z_fail_op',
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_BACK_PASS_DEPTH_FAIL',
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_KEEP',
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_back_z_pass_op',
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_BACK_PASS_DEPTH_PASS',
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_KEEP',
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'StencilFunc': {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'FrontBack',
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'StencilFuncSeparate',
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_front_func',
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_FUNC',
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_ALWAYS',
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_front_ref',
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLint',
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_REF',
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0',
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_front_mask',
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLuint',
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_VALUE_MASK',
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0xFFFFFFFFU',
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_back_func',
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLenum',
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_BACK_FUNC',
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': 'GL_ALWAYS',
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_back_ref',
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLint',
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_BACK_REF',
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0',
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'stencil_back_mask',
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLuint',
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'enum': 'GL_STENCIL_BACK_VALUE_MASK',
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0xFFFFFFFFU',
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  'Hint': {
380868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    'type': 'NamedParameter',
381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    'func': 'Hint',
382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    'states': [
383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {
384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'name': 'hint_generate_mipmap',
385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'type': 'GLenum',
386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'enum': 'GL_GENERATE_MIPMAP_HINT',
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'default': 'GL_DONT_CARE'
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      },
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {
390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'name': 'hint_fragment_shader_derivative',
391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'type': 'GLenum',
392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'enum': 'GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES',
393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'default': 'GL_DONT_CARE',
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'extension_flag': 'oes_standard_derivatives'
395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ],
397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  },
398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  'PixelStore': {
399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    'type': 'NamedParameter',
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    'func': 'PixelStorei',
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    'states': [
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'name': 'pack_alignment',
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'type': 'GLint',
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'enum': 'GL_PACK_ALIGNMENT',
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'default': '4'
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      },
408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      {
409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'name': 'unpack_alignment',
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'type': 'GLint',
411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'enum': 'GL_UNPACK_ALIGNMENT',
412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        'default': '4'
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ],
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  },
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # TODO: Consider implemenenting these states
417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  # GL_ACTIVE_TEXTURE
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'LineWidth': {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'LineWidth',
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_LINE_WIDTH',
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'states': [
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      {
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        'name': 'line_width',
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        'type': 'GLfloat',
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        'default': '1.0f',
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        'range_checks': [{'check': "<= 0.0f", 'test_value': "0.0f"}],
4286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        'nan_check': True,
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }],
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DepthMask': {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'DepthMask',
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_DEPTH_WRITEMASK',
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      {
437010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'name': 'depth_mask',
438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'type': 'GLboolean',
439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'default': 'true',
440010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'cached': True
441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      },
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
4433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    'state_flag': 'framebuffer_state_.clear_state_dirty',
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Scissor': {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'Scissor',
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_SCISSOR_BOX',
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # NOTE: These defaults reset at GLES2DecoderImpl::Initialization.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'scissor_x',
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLint',
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0',
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'expected': 'kViewportX',
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'scissor_y',
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLint',
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0',
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'expected': 'kViewportY',
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'scissor_width',
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLsizei',
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '1',
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'expected': 'kViewportWidth',
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'scissor_height',
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLsizei',
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '1',
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'expected': 'kViewportHeight',
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Viewport': {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Normal',
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'func': 'Viewport',
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'enum': 'GL_VIEWPORT',
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'states': [
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # NOTE: These defaults reset at GLES2DecoderImpl::Initialization.
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'viewport_x',
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLint',
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0',
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'expected': 'kViewportX',
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'viewport_y',
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLint',
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '0',
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'expected': 'kViewportY',
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'viewport_width',
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLsizei',
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '1',
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'expected': 'kViewportWidth',
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': 'viewport_height',
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'type': 'GLsizei',
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'default': '1',
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'expected': 'kViewportHeight',
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      },
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  'MatrixValuesCHROMIUM': {
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'type': 'NamedParameter',
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'func': 'MatrixLoadfEXT',
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'states': [
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      { 'enum': 'GL_PATH_MODELVIEW_MATRIX_CHROMIUM',
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'enum_set': 'GL_PATH_MODELVIEW_CHROMIUM',
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'name': 'modelview_matrix',
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'type': 'GLfloat',
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'default': [
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          '1.0f', '0.0f','0.0f','0.0f',
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          '0.0f', '1.0f','0.0f','0.0f',
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          '0.0f', '0.0f','1.0f','0.0f',
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          '0.0f', '0.0f','0.0f','1.0f',
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ],
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'extension_flag': 'chromium_path_rendering',
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      },
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      { 'enum': 'GL_PATH_PROJECTION_MATRIX_CHROMIUM',
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'enum_set': 'GL_PATH_PROJECTION_CHROMIUM',
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'name': 'projection_matrix',
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'type': 'GLfloat',
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'default': [
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          '1.0f', '0.0f','0.0f','0.0f',
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          '0.0f', '1.0f','0.0f','0.0f',
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          '0.0f', '0.0f','1.0f','0.0f',
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          '0.0f', '0.0f','0.0f','1.0f',
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ],
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'extension_flag': 'chromium_path_rendering',
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      },
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ],
5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# Named type info object represents a named type that is used in OpenGL call
542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# arguments.  Each named type defines a set of valid OpenGL call arguments.  The
543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# named types are used in 'cmd_buffer_functions.txt'.
544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# type: The actual GL type of the named type.
545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# valid: The list of values that are valid for both the client and the service.
546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# invalid: Examples of invalid values for the type. At least these values
547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#          should be tested to be invalid.
548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# is_complete: The list of valid values of type are final and will not be
549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#              modified during runtime.
550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)_NAMED_TYPE_INFO = {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BlitFilter': {
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_NEAREST',
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LINEAR',
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LINEAR_MIPMAP_LINEAR',
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'FrameBufferTarget': {
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FRAMEBUFFER',
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DRAW_FRAMEBUFFER' ,
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_READ_FRAMEBUFFER' ,
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'RenderBufferTarget': {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER',
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FRAMEBUFFER',
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BufferTarget': {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ARRAY_BUFFER',
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ELEMENT_ARRAY_BUFFER',
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER',
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BufferUsage': {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_STREAM_DRAW',
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_STATIC_DRAW',
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DYNAMIC_DRAW',
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_STATIC_READ',
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CompressedTextureFormat': {
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GLState': {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # NOTE: State an Capability entries added later.
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ACTIVE_TEXTURE',
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ALIASED_LINE_WIDTH_RANGE',
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ALIASED_POINT_SIZE_RANGE',
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ALPHA_BITS',
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ARRAY_BUFFER_BINDING',
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_BLUE_BITS',
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_COMPRESSED_TEXTURE_FORMATS',
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_CURRENT_PROGRAM',
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DEPTH_BITS',
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DEPTH_RANGE',
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ELEMENT_ARRAY_BUFFER_BINDING',
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FRAMEBUFFER_BINDING',
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_GENERATE_MIPMAP_HINT',
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_GREEN_BITS',
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_IMPLEMENTATION_COLOR_READ_FORMAT',
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_IMPLEMENTATION_COLOR_READ_TYPE',
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS',
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX_CUBE_MAP_TEXTURE_SIZE',
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX_FRAGMENT_UNIFORM_VECTORS',
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX_RENDERBUFFER_SIZE',
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX_TEXTURE_IMAGE_UNITS',
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX_TEXTURE_SIZE',
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX_VARYING_VECTORS',
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX_VERTEX_ATTRIBS',
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS',
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX_VERTEX_UNIFORM_VECTORS',
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX_VIEWPORT_DIMS',
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_NUM_COMPRESSED_TEXTURE_FORMATS',
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_NUM_SHADER_BINARY_FORMATS',
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_PACK_ALIGNMENT',
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RED_BITS',
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER_BINDING',
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SAMPLE_BUFFERS',
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SAMPLE_COVERAGE_INVERT',
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SAMPLE_COVERAGE_VALUE',
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SAMPLES',
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SCISSOR_BOX',
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SHADER_BINARY_FORMATS',
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SHADER_COMPILER',
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SUBPIXEL_BITS',
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_STENCIL_BITS',
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_BINDING_2D',
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_BINDING_CUBE_MAP',
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNPACK_ALIGNMENT',
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNPACK_FLIP_Y_CHROMIUM',
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM',
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM',
657c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      'GL_BIND_GENERATES_RESOURCE_CHROMIUM',
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # we can add this because we emulate it if the driver does not support it.
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'GL_VERTEX_ARRAY_BINDING_OES',
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VIEWPORT',
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FOG_HINT',
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetTexParamTarget': {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_2D',
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_CUBE_MAP',
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_PROXY_TEXTURE_CUBE_MAP',
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TextureTarget': {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_2D',
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_CUBE_MAP_POSITIVE_X',
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_CUBE_MAP_NEGATIVE_X',
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_CUBE_MAP_POSITIVE_Y',
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_CUBE_MAP_NEGATIVE_Y',
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_CUBE_MAP_POSITIVE_Z',
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_CUBE_MAP_NEGATIVE_Z',
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_PROXY_TEXTURE_CUBE_MAP',
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ]
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TextureBindTarget': {
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_2D',
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_CUBE_MAP',
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_1D',
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_3D',
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ShaderType': {
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VERTEX_SHADER',
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FRAGMENT_SHADER',
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_GEOMETRY_SHADER',
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'FaceType': {
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FRONT',
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_BACK',
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FRONT_AND_BACK',
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'FaceMode': {
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_CW',
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_CCW',
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CmpFunction': {
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_NEVER',
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LESS',
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_EQUAL',
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LEQUAL',
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_GREATER',
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_NOTEQUAL',
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_GEQUAL',
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ALWAYS',
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Equation': {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FUNC_ADD',
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FUNC_SUBTRACT',
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FUNC_REVERSE_SUBTRACT',
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MIN',
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MAX',
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'SrcBlendFactor': {
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ZERO',
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE',
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SRC_COLOR',
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_SRC_COLOR',
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DST_COLOR',
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_DST_COLOR',
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SRC_ALPHA',
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_SRC_ALPHA',
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DST_ALPHA',
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_DST_ALPHA',
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_CONSTANT_COLOR',
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_CONSTANT_COLOR',
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_CONSTANT_ALPHA',
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_CONSTANT_ALPHA',
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SRC_ALPHA_SATURATE',
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DstBlendFactor': {
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ZERO',
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE',
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SRC_COLOR',
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_SRC_COLOR',
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DST_COLOR',
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_DST_COLOR',
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SRC_ALPHA',
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_SRC_ALPHA',
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DST_ALPHA',
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_DST_ALPHA',
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_CONSTANT_COLOR',
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_CONSTANT_COLOR',
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_CONSTANT_ALPHA',
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ONE_MINUS_CONSTANT_ALPHA',
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Capability': {
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': ["GL_%s" % cap['name'].upper() for cap in _CAPABILITY_FLAGS],
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_CLIP_PLANE0',
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_POINT_SPRITE',
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DrawMode': {
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_POINTS',
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LINE_STRIP',
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LINE_LOOP',
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LINES',
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TRIANGLE_STRIP',
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TRIANGLE_FAN',
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TRIANGLES',
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_QUADS',
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_POLYGON',
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'IndexType': {
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_BYTE',
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_SHORT',
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_INT',
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_INT',
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetMaxIndexType': {
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_BYTE',
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_SHORT',
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_INT',
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_INT',
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Attachment': {
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_COLOR_ATTACHMENT0',
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DEPTH_ATTACHMENT',
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_STENCIL_ATTACHMENT',
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'BackbufferAttachment': {
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'GLenum',
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'valid': [
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'GL_COLOR_EXT',
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'GL_DEPTH_EXT',
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'GL_STENCIL_EXT',
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ],
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BufferParameter': {
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_BUFFER_SIZE',
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_BUFFER_USAGE',
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_PIXEL_PACK_BUFFER',
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'FrameBufferParameter': {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE',
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME',
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL',
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE',
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  'MatrixMode': {
8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'type': 'GLenum',
8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'valid': [
8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'GL_PATH_PROJECTION_CHROMIUM',
8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'GL_PATH_MODELVIEW_CHROMIUM',
8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ],
8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ProgramParameter': {
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DELETE_STATUS',
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LINK_STATUS',
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VALIDATE_STATUS',
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_INFO_LOG_LENGTH',
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ATTACHED_SHADERS',
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ACTIVE_ATTRIBUTES',
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ACTIVE_ATTRIBUTE_MAX_LENGTH',
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ACTIVE_UNIFORMS',
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ACTIVE_UNIFORM_MAX_LENGTH',
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'QueryObjectParameter': {
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_QUERY_RESULT_EXT',
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_QUERY_RESULT_AVAILABLE_EXT',
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'QueryParameter': {
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_CURRENT_QUERY_EXT',
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'QueryTarget': {
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ANY_SAMPLES_PASSED_EXT',
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT',
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_COMMANDS_ISSUED_CHROMIUM',
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LATENCY_QUERY_CHROMIUM',
913424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      'GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM',
914424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      'GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM',
9150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      'GL_COMMANDS_COMPLETED_CHROMIUM',
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'RenderBufferParameter': {
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER_RED_SIZE',
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER_GREEN_SIZE',
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER_BLUE_SIZE',
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER_ALPHA_SIZE',
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER_DEPTH_SIZE',
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER_STENCIL_SIZE',
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER_WIDTH',
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER_HEIGHT',
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERBUFFER_INTERNAL_FORMAT',
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ShaderParameter': {
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SHADER_TYPE',
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DELETE_STATUS',
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_COMPILE_STATUS',
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_INFO_LOG_LENGTH',
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SHADER_SOURCE_LENGTH',
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE',
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ShaderPrecision': {
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LOW_FLOAT',
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MEDIUM_FLOAT',
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_HIGH_FLOAT',
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LOW_INT',
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MEDIUM_INT',
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_HIGH_INT',
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'StringType': {
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VENDOR',
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RENDERER',
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VERSION',
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SHADING_LANGUAGE_VERSION',
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_EXTENSIONS',
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TextureParameter': {
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_MAG_FILTER',
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_MIN_FILTER',
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'GL_TEXTURE_POOL_CHROMIUM',
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_WRAP_S',
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_TEXTURE_WRAP_T',
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_GENERATE_MIPMAP',
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'TexturePool': {
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'GLenum',
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'valid': [
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'GL_TEXTURE_POOL_MANAGED_CHROMIUM',
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'GL_TEXTURE_POOL_UNMANAGED_CHROMIUM',
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ],
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TextureWrapMode': {
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_CLAMP_TO_EDGE',
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_MIRRORED_REPEAT',
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_REPEAT',
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TextureMinFilterMode': {
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_NEAREST',
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LINEAR',
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_NEAREST_MIPMAP_NEAREST',
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LINEAR_MIPMAP_NEAREST',
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_NEAREST_MIPMAP_LINEAR',
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LINEAR_MIPMAP_LINEAR',
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TextureMagFilterMode': {
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_NEAREST',
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LINEAR',
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TextureUsage': {
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_NONE',
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FRAMEBUFFER_ATTACHMENT_ANGLE',
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttribute': {
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # some enum that the decoder actually passes through to GL needs
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # to be the first listed here since it's used in unit tests.
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VERTEX_ATTRIB_ARRAY_NORMALIZED',
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING',
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VERTEX_ATTRIB_ARRAY_ENABLED',
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VERTEX_ATTRIB_ARRAY_SIZE',
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VERTEX_ATTRIB_ARRAY_STRIDE',
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VERTEX_ATTRIB_ARRAY_TYPE',
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_CURRENT_VERTEX_ATTRIB',
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexPointer': {
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_VERTEX_ATTRIB_ARRAY_POINTER',
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'HintTarget': {
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_GENERATE_MIPMAP_HINT',
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_PERSPECTIVE_CORRECTION_HINT',
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'HintMode': {
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FASTEST',
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_NICEST',
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DONT_CARE',
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'PixelStore': {
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_PACK_ALIGNMENT',
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNPACK_ALIGNMENT',
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNPACK_FLIP_Y_CHROMIUM',
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM',
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM',
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_PACK_SWAP_BYTES',
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNPACK_SWAP_BYTES',
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'PixelStoreAlignment': {
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLint',
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '1',
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '2',
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '4',
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '8',
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '3',
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '9',
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ReadPixelFormat': {
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ALPHA',
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGB',
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGBA',
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'PixelType': {
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_BYTE',
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_SHORT_5_6_5',
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_SHORT_4_4_4_4',
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_SHORT_5_5_5_1',
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SHORT',
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_INT',
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ReadPixelType': {
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_BYTE',
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_SHORT_5_6_5',
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_SHORT_4_4_4_4',
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_SHORT_5_5_5_1',
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SHORT',
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_INT',
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'RenderBufferFormat': {
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGBA4',
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGB565',
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGB5_A1',
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DEPTH_COMPONENT16',
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_STENCIL_INDEX8',
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ShaderBinaryFormat': {
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'StencilOp': {
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_KEEP',
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ZERO',
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_REPLACE',
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_INCR',
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_INCR_WRAP',
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DECR',
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DECR_WRAP',
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_INVERT',
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TextureFormat': {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ALPHA',
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LUMINANCE',
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LUMINANCE_ALPHA',
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGB',
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGBA',
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_BGRA',
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_BGR',
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TextureInternalFormat': {
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ALPHA',
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LUMINANCE',
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LUMINANCE_ALPHA',
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGB',
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGBA',
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_BGRA',
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_BGR',
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TextureInternalFormatStorage': {
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGB565',
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGBA4',
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGB5_A1',
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_ALPHA8_EXT',
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LUMINANCE8_EXT',
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_LUMINANCE8_ALPHA8_EXT',
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGB8_OES',
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_RGBA8_OES',
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttribType': {
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLenum',
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_BYTE',
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_BYTE',
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_SHORT',
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_UNSIGNED_SHORT',
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    #  'GL_FIXED',  // This is not available on Desktop GL.
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_FLOAT',
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GL_DOUBLE',
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TextureBorder': {
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLint',
1200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'is_complete': True,
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '0',
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '1',
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttribSize': {
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLint',
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '1',
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '2',
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '3',
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '4',
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '0',
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '5',
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ZeroOnly': {
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLint',
1223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'is_complete': True,
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '0',
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '1',
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'FalseOnly': {
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLboolean',
1233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'is_complete': True,
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid': [
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'false',
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'invalid': [
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'true',
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'ResetStatus': {
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'GLenum',
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'valid': [
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'GL_GUILTY_CONTEXT_RESET_ARB',
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'GL_INNOCENT_CONTEXT_RESET_ARB',
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'GL_UNKNOWN_CONTEXT_RESET_ARB',
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ],
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This table specifies the different pepper interfaces that are supported for
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# GL commands. 'dev' is true if it's a dev interface.
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_PEPPER_INTERFACES = [
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': '', 'dev': False},
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'InstancedArrays', 'dev': False},
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'FramebufferBlit', 'dev': False},
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'FramebufferMultisample', 'dev': False},
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'ChromiumEnableFeature', 'dev': False},
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'ChromiumMapSub', 'dev': False},
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {'name': 'Query', 'dev': False},
1261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {'name': 'VertexArrayObject', 'dev': False},
1262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  {'name': 'DrawBuffers', 'dev': True},
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)]
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# A function info object specifies the type and other special data for the
1266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# command that will be generated. A base function info object is generated by
1267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# parsing the "cmd_buffer_functions.txt", one for each function in the
1268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# file. These function info objects can be augmented and their values can be
1269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# overridden by adding an object to the table below.
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Must match function names specified in "cmd_buffer_functions.txt".
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# cmd_comment:  A comment added to the cmd format.
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# type:         defines which handler will be used to generate code.
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# decoder_func: defines which function to call in the decoder to execute the
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#               corresponding GL command. If not specified the GL command will
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#               be called directly.
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# gl_test_func: GL function that is expected to be called when testing.
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# cmd_args:     The arguments to use for the command. This overrides generating
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#               them based on the GL function arguments.
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# gen_cmd:      Whether or not this function geneates a command. Default = True.
1282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)# data_transfer_methods: Array of methods that are used for transfering the
1283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#               pointer data.  Possible values: 'immediate', 'shm', 'bucket'.
1284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#               The default is 'immediate' if the command has one pointer
1285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#               argument, otherwise 'shm'. One command is generated for each
1286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#               transfer method. Affects only commands which are not of type
1287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#               'HandWritten', 'GETn' or 'GLcharN'.
1288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#               Note: the command arguments that affect this are the final args,
1289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#               taking cmd_args override into consideration.
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# impl_func:    Whether or not to generate the GLES2Implementation part of this
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#               command.
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# impl_decl:    Whether or not to generate the GLES2Implementation declaration
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#               for this command.
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# needs_size:   If true a data_size field is added to the command.
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# count:        The number of units per element. For PUTn or PUT types.
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# unit_test:    If False no service side unit test will be generated.
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# client_test:  If False no client side unit test will be generated.
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# expectation:  If False the unit test will have no expected calls.
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# gen_func:     Name of function that generates GL resource for corresponding
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#               bind function.
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# states:       array of states that get set by this function corresponding to
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#               the given arguments
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# state_flag:   name of flag that is set to true when function is called.
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# no_gl:        no GL function is called.
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# valid_args:   A dictionary of argument indices to args to use in unit tests
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#               when they can not be automatically determined.
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# pepper_interface: The pepper interface that is used for this extension
13085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# pepper_name:  The name of the function as exposed to pepper.
13094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)# pepper_args:  A string representing the argument list (what would appear in
13104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#               C/C++ between the parentheses for the function declaration)
13114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#               that the Pepper API expects for this function. Use this only if
13124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#               the stable Pepper API differs from the GLES2 argument list.
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# invalid_test: False if no invalid test needed.
13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# shadowed:     True = the value is shadowed so no glGetXXX call will be made.
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# first_element_only: For PUT types, True if only the first element of an
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#               array is used and we end up calling the single value
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#               corresponding function. eg. TexParameteriv -> TexParameteri
1318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# extension:    Function is an extension to GL and should not be exposed to
1319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#               pepper unless pepper_interface is defined.
1320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# extension_flag: Function is an extension and should be enabled only when
1321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#               the corresponding feature info flag is enabled. Implies
1322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#               'extension': True.
1323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# not_shared:   For GENn types, True if objects can't be shared between contexts
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_FUNCTION_INFO = {
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ActiveTexture': {
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoActiveTexture',
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'AttachShader': {'decoder_func': 'DoAttachShader'},
13338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  'BindAttribLocation': {
13348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    'type': 'GLchar',
1335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['bucket'],
13368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    'needs_size': True,
13378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  },
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BindBuffer': {
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Bind',
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoBindBuffer',
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_func': 'GenBuffersARB',
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BindFramebuffer': {
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Bind',
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoBindFramebuffer',
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glBindFramebufferEXT',
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_func': 'GenFramebuffersEXT',
13485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 1,
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BindRenderbuffer': {
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Bind',
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoBindRenderbuffer',
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glBindRenderbufferEXT',
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_func': 'GenRenderbuffersEXT',
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BindTexture': {
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Bind',
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoBindTexture',
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_func': 'GenTextures',
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    # TODO(gman): remove this once client side caching works.
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
13625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 1,
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  'BlitFramebufferCHROMIUM': {
1365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    'decoder_func': 'DoBlitFramebufferCHROMIUM',
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
1367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'extension_flag': 'chromium_framebuffer_multisample',
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'FramebufferBlit',
13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'pepper_name': 'BlitFramebufferEXT',
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'defer_reads': True,
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'defer_draws': True,
13725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 1,
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BufferData': {
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
1376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BufferSubData': {
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Data',
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoBufferSubData',
1383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CheckFramebufferStatus': {
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Is',
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoCheckFramebufferStatus',
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glCheckFramebufferStatusEXT',
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'error_value': 'GL_FRAMEBUFFER_UNSUPPORTED',
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['GLenum'],
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Clear': {
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'decoder_func': 'DoClear',
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'defer_draws': True,
13955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 1,
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ClearColor': {
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSet',
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'ClearColor',
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ClearDepthf': {
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSet',
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'ClearDepthf',
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'glClearDepth',
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glClearDepth',
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'valid_args': {
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '0': '0.5f'
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ColorMask': {
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSet',
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'ColorMask',
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'no_gl': True,
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ConsumeTextureCHROMIUM': {
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoConsumeTextureCHROMIUM',
14185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'impl_func': False,
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUT',
14205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'count': 64,  # GL_MAILBOX_SIZE_CHROMIUM
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
14225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'client_test': False,
14236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    'extension': "CHROMIUM_texture_mailbox",
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
14255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 1,
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1427f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  'CreateAndConsumeTextureCHROMIUM': {
1428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'decoder_func': 'DoCreateAndConsumeTextureCHROMIUM',
1429f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'impl_func': False,
1430f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'type': 'HandWritten',
1431f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['immediate'],
1432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'unit_test': False,
1433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'client_test': False,
14346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    'extension': "CHROMIUM_texture_mailbox",
1435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'chromium': True,
1436f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  },
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ClearStencil': {
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSet',
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'ClearStencil',
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'EnableFeatureCHROMIUM': {
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
1443f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoEnableFeatureCHROMIUM',
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args': 'GLuint bucket_id, GLint* result',
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['GLint'],
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'ChromiumEnableFeature',
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CompileShader': {'decoder_func': 'DoCompileShader', 'unit_test': False},
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CompressedTexImage2D': {
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
1455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['bucket', 'shm'],
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CompressedTexSubImage2D': {
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Data',
1459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['bucket', 'shm'],
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoCompressedTexSubImage2D',
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CopyTexImage2D': {
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoCopyTexImage2D',
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'defer_reads': True,
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CopyTexSubImage2D': {
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoCopyTexSubImage2D',
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'defer_reads': True,
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
147190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  'CreateImageCHROMIUM': {
147290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'type': 'Manual',
1473010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'cmd_args':
1474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'GLsizei width, GLsizei height, GLenum internalformat, GLenum usage',
147590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'result': ['GLuint'],
147690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'client_test': False,
147790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'gen_cmd': False,
147890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'expectation': False,
147990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'extension': True,
148090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'chromium': True,
148190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  },
148290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  'DestroyImageCHROMIUM': {
148390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'type': 'Manual',
148490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'client_test': False,
148590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'gen_cmd': False,
148690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'extension': True,
148790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'chromium': True,
148890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  },
148990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  'GetImageParameterivCHROMIUM': {
149090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'type': 'Manual',
149190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'client_test': False,
149290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'gen_cmd': False,
149390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'expectation': False,
149490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'extension': True,
149590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'chromium': True,
149690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  },
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CreateProgram': {
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Create',
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CreateShader': {
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Create',
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BlendColor': {
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSet',
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'BlendColor',
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BlendEquation': {
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSetRGBAlpha',
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'BlendEquation',
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'valid_args': {
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '0': 'GL_FUNC_SUBTRACT'
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BlendEquationSeparate': {
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSet',
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'BlendEquation',
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'valid_args': {
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '0': 'GL_FUNC_SUBTRACT'
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BlendFunc': {
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSetRGBAlpha',
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'BlendFunc',
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BlendFuncSeparate': {
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSet',
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'BlendFunc',
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'SampleCoverage': {'decoder_func': 'DoSampleCoverage'},
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'StencilFunc': {
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'StateSetFrontBack',
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'StencilFunc',
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'StencilFuncSeparate': {
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'StateSetFrontBackSeparate',
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'StencilFunc',
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'StencilOp': {
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSetFrontBack',
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'StencilOp',
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'valid_args': {
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '1': 'GL_INCR'
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'StencilOpSeparate': {
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSetFrontBackSeparate',
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'StencilOp',
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'valid_args': {
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '1': 'GL_INCR'
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
1554868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  'Hint': {
1555868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    'type': 'StateSetNamedParameter',
1556868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    'state': 'Hint',
1557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  },
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CullFace': {'type': 'StateSet', 'state': 'CullFace'},
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'FrontFace': {'type': 'StateSet', 'state': 'FrontFace'},
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DepthFunc': {'type': 'StateSet', 'state': 'DepthFunc'},
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'LineWidth': {
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'StateSet',
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'state': 'LineWidth',
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'valid_args': {
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      '0': '0.5f'
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    },
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'PolygonOffset': {
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSet',
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'PolygonOffset',
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DeleteBuffers': {
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'DELn',
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glDeleteBuffersARB',
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'Buffer',
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'Buffers',
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DeleteFramebuffers': {
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'DELn',
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glDeleteFramebuffersEXT',
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'Framebuffer',
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'Framebuffers',
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DeleteProgram': {'type': 'Delete', 'decoder_func': 'DoDeleteProgram'},
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DeleteRenderbuffers': {
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'DELn',
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glDeleteRenderbuffersEXT',
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'Renderbuffer',
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'Renderbuffers',
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DeleteShader': {'type': 'Delete', 'decoder_func': 'DoDeleteShader'},
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DeleteSharedIdsCHROMIUM': {
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoDeleteSharedIdsCHROMIUM',
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
1597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DeleteTextures': {
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'DELn',
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'Texture',
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'Textures',
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DepthRangef': {
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoDepthRangef',
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glDepthRange',
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DepthMask': {
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSet',
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'DepthMask',
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'no_gl': True,
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DetachShader': {'decoder_func': 'DoDetachShader'},
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Disable': {
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoDisable',
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DisableVertexAttribArray': {
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoDisableVertexAttribArray',
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_decl': False,
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DrawArrays': {
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args': 'GLenumDrawMode mode, GLint first, GLsizei count',
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'defer_draws': True,
16305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 2,
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DrawElements': {
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args': 'GLenumDrawMode mode, GLsizei count, '
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                'GLenumIndexType type, GLuint index_offset',
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'defer_draws': True,
16385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 2,
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Enable': {
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoEnable',
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'EnableVertexAttribArray': {
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoEnableVertexAttribArray',
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_decl': False,
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Finish': {
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoFinish',
1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    'defer_reads': True,
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Flush': {
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoFlush',
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'FramebufferRenderbuffer': {
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoFramebufferRenderbuffer',
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glFramebufferRenderbufferEXT',
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'FramebufferTexture2D': {
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoFramebufferTexture2D',
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glFramebufferTexture2DEXT',
16665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 1,
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  'FramebufferTexture2DMultisampleEXT': {
16697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    'decoder_func': 'DoFramebufferTexture2DMultisample',
16707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    'gl_test_func': 'glFramebufferTexture2DMultisampleEXT',
16717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    'expectation': False,
16727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    'unit_test': False,
1673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'extension_flag': 'multisampled_render_to_texture',
16745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 1,
16757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  },
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GenerateMipmap': {
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGenerateMipmap',
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGenerateMipmapEXT',
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GenBuffers': {
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GENn',
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGenBuffersARB',
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'Buffer',
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'Buffers',
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GenMailboxCHROMIUM': {
16874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'type': 'HandWritten',
16884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'impl_func': False,
16896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    'extension': "CHROMIUM_texture_mailbox",
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GenFramebuffers': {
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GENn',
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGenFramebuffersEXT',
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'Framebuffer',
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'Framebuffers',
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GenRenderbuffers': {
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GENn', 'gl_test_func': 'glGenRenderbuffersEXT',
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'Renderbuffer',
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'Renderbuffers',
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GenTextures': {
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GENn',
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGenTextures',
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'Texture',
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'Textures',
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GenSharedIdsCHROMIUM': {
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGenSharedIdsCHROMIUM',
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
1714f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetActiveAttrib': {
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
1720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args':
1722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'GLidProgram program, GLuint index, uint32_t name_bucket_id, '
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'void* result',
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': [
1725010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'int32_t success',
1726010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'int32_t size',
1727010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'uint32_t type',
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetActiveUniform': {
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
1732f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args':
1734010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'GLidProgram program, GLuint index, uint32_t name_bucket_id, '
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'void* result',
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': [
1737010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'int32_t success',
1738010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'int32_t size',
1739010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'uint32_t type',
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetAttachedShaders': {
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
1744f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
1745010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'cmd_args': 'GLidProgram program, void* result, uint32_t result_size',
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLuint>'],
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetAttribLocation': {
1749116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    'type': 'Custom',
1750116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    'data_transfer_methods': ['shm'],
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args':
1752116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'GLidProgram program, uint32_t name_bucket_id, GLint* location',
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['GLint'],
17544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'error_return': -1, # http://www.opengl.org/sdk/docs/man/xhtml/glGetAttribLocation.xml
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetBooleanv': {
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GETn',
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLboolean>'],
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGetBooleanv',
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGetBooleanv',
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'GetBufferParameteriv': {
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'GETn',
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'result': ['SizedResult<GLint>'],
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'decoder_func': 'DoGetBufferParameteriv',
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'expectation': False,
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'shadowed': True,
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetError': {
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Is',
1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    'decoder_func': 'GetErrorState()->GetGLError',
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['GLenum'],
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetFloatv': {
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GETn',
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLfloat>'],
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGetFloatv',
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGetFloatv',
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetFramebufferAttachmentParameteriv': {
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GETn',
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGetFramebufferAttachmentParameteriv',
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGetFramebufferAttachmentParameterivEXT',
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLint>'],
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetIntegerv': {
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GETn',
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLint>'],
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGetIntegerv',
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetMaxValueInBufferCHROMIUM': {
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Is',
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGetMaxValueInBufferCHROMIUM',
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['GLuint'],
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetMultipleIntegervCHROMIUM': {
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
1806f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetProgramiv': {
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GETn',
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGetProgramiv',
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLint>'],
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetProgramInfoCHROMIUM': {
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
1825010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'cmd_args': 'GLidProgram program, uint32_t bucket_id',
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': [
1827010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'uint32_t link_status',
1828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'uint32_t num_attribs',
1829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'uint32_t num_uniforms',
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetProgramInfoLog': {
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'STRn',
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetRenderbufferParameteriv': {
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GETn',
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGetRenderbufferParameteriv',
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGetRenderbufferParameterivEXT',
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLint>'],
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetShaderiv': {
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GETn',
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGetShaderiv',
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLint>'],
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetShaderInfoLog': {
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'STRn',
18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'get_len_func': 'glGetShaderiv',
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'get_len_enum': 'GL_INFO_LOG_LENGTH',
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetShaderPrecisionFormat': {
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
1855f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args':
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'GLenumShaderType shadertype, GLenumShaderPrecision precisiontype, '
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'void* result',
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': [
1860010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'int32_t success',
1861010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'int32_t min_range',
1862010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'int32_t max_range',
1863010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      'int32_t precision',
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ],
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetShaderSource': {
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'STRn',
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'get_len_func': 'DoGetShaderiv',
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'get_len_enum': 'GL_SHADER_SOURCE_LENGTH',
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetString': {
1874a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    'type': 'Custom',
1875a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    'client_test': False,
1876010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'cmd_args': 'GLenumStringType name, uint32_t bucket_id',
1877a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  },
1878a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  'GetTexParameterfv': {
1879a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    'type': 'GETn',
1880a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    'decoder_func': 'DoGetTexParameterfv',
1881a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    'result': ['SizedResult<GLfloat>']
1882a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  },
1883a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  'GetTexParameteriv': {
1884a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    'type': 'GETn',
1885a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    'decoder_func': 'DoGetTexParameteriv',
1886a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    'result': ['SizedResult<GLint>']
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetTranslatedShaderSourceANGLE': {
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'STRn',
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'get_len_func': 'DoGetShaderiv',
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'get_len_enum': 'GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE',
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetUniformfv': {
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
1897f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLfloat>'],
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetUniformiv': {
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
1902f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLint>'],
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetUniformLocation': {
1906116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    'type': 'Custom',
1907116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    'data_transfer_methods': ['shm'],
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args':
1909116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'GLidProgram program, uint32_t name_bucket_id, GLint* location',
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['GLint'],
19114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'error_return': -1, # http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformLocation.xml
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetVertexAttribfv': {
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GETn',
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLfloat>'],
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_decl': False,
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGetVertexAttribfv',
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetVertexAttribiv': {
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GETn',
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLint>'],
19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_decl': False,
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoGetVertexAttribiv',
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetVertexAttribPointerv': {
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
1931f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'result': ['SizedResult<GLuint>'],
19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'IsBuffer': {
19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Is',
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoIsBuffer',
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'IsEnabled': {
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Is',
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoIsEnabled',
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'IsFramebuffer': {
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Is',
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoIsFramebuffer',
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'IsProgram': {
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Is',
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoIsProgram',
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'IsRenderbuffer': {
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Is',
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoIsRenderbuffer',
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'IsShader': {
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Is',
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoIsShader',
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'IsTexture': {
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Is',
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoIsTexture',
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'LinkProgram': {
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoLinkProgram',
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func':  False,
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'MapBufferCHROMIUM': {
19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'gen_cmd': False,
19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'extension': True,
19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'chromium': True,
19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'MapBufferSubDataCHROMIUM': {
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_cmd': False,
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'ChromiumMapSub',
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
198890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  'MapImageCHROMIUM': {
198990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'gen_cmd': False,
199090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'extension': True,
199190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'chromium': True,
199290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'client_test': False,
199390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  },
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'MapTexSubImage2DCHROMIUM': {
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_cmd': False,
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'ChromiumMapSub',
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'PixelStorei': {'type': 'Manual'},
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'PostSubBufferCHROMIUM': {
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'type': 'Custom',
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'impl_func': False,
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'unit_test': False,
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'client_test': False,
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'extension': True,
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'chromium': True,
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ProduceTextureCHROMIUM': {
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoProduceTextureCHROMIUM',
20125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'impl_func': False,
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUT',
20145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'count': 64,  # GL_MAILBOX_SIZE_CHROMIUM
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
20165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'client_test': False,
20176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    'extension': "CHROMIUM_texture_mailbox",
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
20195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 1,
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2021f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  'ProduceTextureDirectCHROMIUM': {
2022f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'decoder_func': 'DoProduceTextureDirectCHROMIUM',
2023f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'impl_func': False,
2024f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'type': 'PUT',
2025f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'count': 64,  # GL_MAILBOX_SIZE_CHROMIUM
2026f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'unit_test': False,
2027f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'client_test': False,
20286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    'extension': "CHROMIUM_texture_mailbox",
2029f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'chromium': True,
2030f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'trace_level': 1,
2031f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  },
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'RenderbufferStorage': {
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoRenderbufferStorage',
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glRenderbufferStorageEXT',
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2037f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  'RenderbufferStorageMultisampleCHROMIUM': {
2038f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    'cmd_comment':
2039f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        '// GL_CHROMIUM_framebuffer_multisample\n',
2040f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    'decoder_func': 'DoRenderbufferStorageMultisampleCHROMIUM',
2041f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    'gl_test_func': 'glRenderbufferStorageMultisampleCHROMIUM',
2042f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    'expectation': False,
2043f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    'unit_test': False,
2044cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'extension_flag': 'chromium_framebuffer_multisample',
2045f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    'pepper_interface': 'FramebufferMultisample',
20465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'pepper_name': 'RenderbufferStorageMultisampleEXT',
2047f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  },
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'RenderbufferStorageMultisampleEXT': {
2049f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    'cmd_comment':
2050f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        '// GL_EXT_multisampled_render_to_texture\n',
2051f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    'decoder_func': 'DoRenderbufferStorageMultisampleEXT',
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glRenderbufferStorageMultisampleEXT',
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
2055cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'extension_flag': 'multisampled_render_to_texture',
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ReadPixels': {
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_comment':
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '// ReadPixels has the result separated from the pixel buffer so that\n'
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '// it is easier to specify the result going to some specific place\n'
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '// that exactly fits the rectangle of pixels.\n',
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
2063f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args':
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'GLint x, GLint y, GLsizei width, GLsizei height, '
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'GLenumReadPixelFormat format, GLenumReadPixelType type, '
2069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'uint32_t pixels_shm_id, uint32_t pixels_shm_offset, '
2070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'uint32_t result_shm_id, uint32_t result_shm_offset, '
2071a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch        'GLboolean async',
2072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'result': ['uint32_t'],
20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'defer_reads': True,
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'RegisterSharedIdsCHROMIUM': {
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoRegisterSharedIdsCHROMIUM',
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
2080f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ReleaseShaderCompiler': {
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoReleaseShaderCompiler',
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ShaderBinary': {
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ShaderSource': {
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
2094f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['bucket'],
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'needs_size': True,
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args':
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'GLuint shader, const char* data',
20994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'pepper_args':
21004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        'GLuint shader, GLsizei count, const char** str, const GLint* length',
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'StencilMask': {
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSetFrontBack',
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'StencilMask',
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'no_gl': True,
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'StencilMaskSeparate': {
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSetFrontBackSeparate',
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'StencilMask',
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'no_gl': True,
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'SwapBuffers': {
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
2116a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    'decoder_func': 'DoSwapBuffers',
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
21205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 1,
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TexImage2D': {
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
2124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TexParameterf': {
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoTexParameterf',
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid_args': {
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '2': 'GL_NEAREST'
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TexParameteri': {
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoTexParameteri',
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'valid_args': {
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      '2': 'GL_NEAREST'
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TexParameterfv': {
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUT',
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'data_value': 'GL_NEAREST',
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 1,
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoTexParameterfv',
2144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    'gl_test_func': 'glTexParameterf',
21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'first_element_only': True,
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TexParameteriv': {
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUT',
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'data_value': 'GL_NEAREST',
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 1,
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoTexParameteriv',
21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'gl_test_func': 'glTexParameteri',
21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'first_element_only': True,
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TexSubImage2D': {
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
2157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args': 'GLenumTextureTarget target, GLint level, '
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                'GLint xoffset, GLint yoffset, '
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                'GLsizei width, GLsizei height, '
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                'GLenumTextureFormat format, GLenumPixelType type, '
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                'const void* pixels, GLboolean internal'
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  'Uniform1f': {'type': 'PUTXn', 'count': 1},
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Uniform1fv': {
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUTn',
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 1,
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoUniform1fv',
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Uniform1i': {'decoder_func': 'DoUniform1i', 'unit_test': False},
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Uniform1iv': {
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUTn',
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 1,
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoUniform1iv',
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  'Uniform2i': {'type': 'PUTXn', 'count': 2},
2179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  'Uniform2f': {'type': 'PUTXn', 'count': 2},
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Uniform2fv': {
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUTn',
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 2,
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoUniform2fv',
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Uniform2iv': {
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUTn',
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 2,
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoUniform2iv',
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  'Uniform3i': {'type': 'PUTXn', 'count': 3},
2191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  'Uniform3f': {'type': 'PUTXn', 'count': 3},
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Uniform3fv': {
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUTn',
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 3,
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoUniform3fv',
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Uniform3iv': {
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUTn',
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 3,
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoUniform3iv',
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  'Uniform4i': {'type': 'PUTXn', 'count': 4},
2203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  'Uniform4f': {'type': 'PUTXn', 'count': 4},
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Uniform4fv': {
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUTn',
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 4,
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoUniform4fv',
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Uniform4iv': {
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUTn',
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 4,
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoUniform4iv',
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'UniformMatrix2fv': {
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUTn',
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 4,
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoUniformMatrix2fv',
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'UniformMatrix3fv': {
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUTn',
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 9,
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoUniformMatrix3fv',
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'UniformMatrix4fv': {
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUTn',
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 16,
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoUniformMatrix4fv',
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'UnmapBufferCHROMIUM': {
22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'gen_cmd': False,
22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'extension': True,
22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'chromium': True,
22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'UnmapBufferSubDataCHROMIUM': {
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_cmd': False,
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'ChromiumMapSub',
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
224290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  'UnmapImageCHROMIUM': {
224390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'gen_cmd': False,
224490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'extension': True,
224590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'chromium': True,
224690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    'client_test': False,
224790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  },
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'UnmapTexSubImage2DCHROMIUM': {
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_cmd': False,
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'ChromiumMapSub',
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'UseProgram': {
2256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    'type': 'Bind',
22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'decoder_func': 'DoUseProgram',
22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ValidateProgram': {'decoder_func': 'DoValidateProgram'},
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttrib1f': {'decoder_func': 'DoVertexAttrib1f'},
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttrib1fv': {
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUT',
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 1,
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoVertexAttrib1fv',
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttrib2f': {'decoder_func': 'DoVertexAttrib2f'},
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttrib2fv': {
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUT',
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 2,
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoVertexAttrib2fv',
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttrib3f': {'decoder_func': 'DoVertexAttrib3f'},
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttrib3fv': {
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUT',
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 3,
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoVertexAttrib3fv',
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttrib4f': {'decoder_func': 'DoVertexAttrib4f'},
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttrib4fv': {
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'PUT',
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'count': 4,
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoVertexAttrib4fv',
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttribPointer': {
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'type': 'Manual',
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'cmd_args': 'GLuint indx, GLintVertexAttribSize size, '
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  'GLenumVertexAttribType type, GLboolean normalized, '
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  'GLsizei stride, GLuint offset',
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'client_test': False,
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Scissor': {
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'StateSet',
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'state': 'Scissor',
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'Viewport': {
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoViewport',
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ResizeCHROMIUM': {
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'type': 'Custom',
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'impl_func': False,
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'unit_test': False,
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'extension': True,
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'chromium': True,
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetRequestableExtensionsCHROMIUM': {
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
2308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'cmd_args': 'uint32_t bucket_id',
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'RequestExtensionCHROMIUM': {
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Custom',
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
2316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'cmd_args': 'uint32_t bucket_id',
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'RateLimitOffscreenContextCHROMIUM': {
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_cmd': False,
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CreateStreamTextureCHROMIUM':  {
23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'type': 'HandWritten',
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
23295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'gen_cmd': False,
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
23325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TexImageIOSurface2DCHROMIUM': {
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoTexImageIOSurface2DCHROMIUM',
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'CopyTextureCHROMIUM': {
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoCopyTextureCHROMIUM',
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'TexStorage2DEXT': {
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoTexStorage2DEXT',
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DrawArraysInstancedANGLE': {
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args': 'GLenumDrawMode mode, GLint first, GLsizei count, '
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                'GLsizei primcount',
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'InstancedArrays',
23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'defer_draws': True,
23582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
23592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'DrawBuffersEXT': {
23602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'PUTn',
23612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'decoder_func': 'DoDrawBuffersEXT',
23622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'count': 1,
23632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
23642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'unit_test': False,
2365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # could use 'extension_flag': 'ext_draw_buffers' but currently expected to
2366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # work without.
23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'extension': True,
2368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    'pepper_interface': 'DrawBuffers',
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DrawElementsInstancedANGLE': {
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args': 'GLenumDrawMode mode, GLsizei count, '
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                'GLenumIndexType type, GLuint index_offset, GLsizei primcount',
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'InstancedArrays',
23782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'defer_draws': True,
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'VertexAttribDivisorANGLE': {
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args': 'GLuint index, GLuint divisor',
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'InstancedArrays',
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GenQueriesEXT': {
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GENn',
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGenQueriesARB',
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'Query',
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'Queries',
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'Query',
2394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    'not_shared': 'True',
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DeleteQueriesEXT': {
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'DELn',
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glDeleteQueriesARB',
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'Query',
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'Queries',
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'Query',
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'IsQueryEXT': {
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_cmd': False,
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'Query',
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BeginQueryEXT': {
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args': 'GLenumQueryTarget target, GLidQuery id, void* sync_data',
2412f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glBeginQuery',
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'Query',
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'EndQueryEXT': {
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Manual',
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'cmd_args': 'GLenumQueryTarget target, GLuint submit_count',
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glEndnQuery',
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'Query',
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetQueryivEXT': {
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_cmd': False,
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGetQueryiv',
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'Query',
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GetQueryObjectuivEXT': {
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_cmd': False,
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'client_test': False,
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGetQueryObjectuiv',
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'pepper_interface': 'Query',
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BindUniformLocationCHROMIUM': {
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLchar',
24374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'extension': True,
2438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['bucket'],
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'needs_size': True,
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'DoBindUniformLocationCHROMIUM',
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'InsertEventMarkerEXT': {
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLcharN',
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoInsertEventMarkerEXT',
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
24464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'extension': True,
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'PushGroupMarkerEXT': {
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GLcharN',
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoPushGroupMarkerEXT',
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
24524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'extension': True,
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'PopGroupMarkerEXT': {
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoPopGroupMarkerEXT',
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
24574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'extension': True,
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'impl_func': False,
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'GenVertexArraysOES': {
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'GENn',
24634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'extension': True,
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glGenVertexArraysOES',
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'VertexArray',
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'VertexArrays',
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
2468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    'pepper_interface': 'VertexArrayObject',
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BindVertexArrayOES': {
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Bind',
24724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'extension': True,
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glBindVertexArrayOES',
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoBindVertexArrayOES',
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gen_func': 'GenVertexArraysOES',
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
24772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
2478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    'pepper_interface': 'VertexArrayObject',
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'DeleteVertexArraysOES': {
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'DELn',
24824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'extension': True,
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glDeleteVertexArraysOES',
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_type': 'VertexArray',
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'resource_types': 'VertexArrays',
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
2487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    'pepper_interface': 'VertexArrayObject',
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'IsVertexArrayOES': {
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'type': 'Is',
24914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    'extension': True,
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_test_func': 'glIsVertexArrayOES',
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoIsVertexArrayOES',
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'expectation': False,
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
2496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    'pepper_interface': 'VertexArrayObject',
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'BindTexImage2DCHROMIUM': {
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoBindTexImage2DCHROMIUM',
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  'ReleaseTexImage2DCHROMIUM': {
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'decoder_func': 'DoReleaseTexImage2DCHROMIUM',
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'unit_test': False,
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'extension': True,
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'chromium': True,
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  },
2510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  'ShallowFinishCHROMIUM': {
2511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'impl_func': False,
2512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'gen_cmd': False,
2513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'extension': True,
2514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'chromium': True,
2515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'client_test': False,
2516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  },
2517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  'ShallowFlushCHROMIUM': {
2518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'impl_func': False,
2519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'gen_cmd': False,
2520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'extension': True,
2521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'chromium': True,
2522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    'client_test': False,
2523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  },
25242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'TraceBeginCHROMIUM': {
25252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'Custom',
25262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'impl_func': False,
25272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'cmd_args': 'GLuint bucket_id',
25292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'extension': True,
25302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'chromium': True,
25312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
25322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'TraceEndCHROMIUM': {
25332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'impl_func': False,
25342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
25352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'decoder_func': 'DoTraceEndCHROMIUM',
25362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'unit_test': False,
25372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'extension': True,
25382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'chromium': True,
25392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
25402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'AsyncTexImage2DCHROMIUM': {
25412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'Manual',
2542f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
25432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
25444ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    'cmd_args': 'GLenumTextureTarget target, GLint level, '
25454ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        'GLintTextureInternalFormat internalformat, '
25464ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        'GLsizei width, GLsizei height, '
25474ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        'GLintTextureBorder border, '
25484ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        'GLenumTextureFormat format, GLenumPixelType type, '
25494ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        'const void* pixels, '
2550010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'uint32_t async_upload_token, '
25514ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        'void* sync_data',
25522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'extension': True,
25532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'chromium': True,
25542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'AsyncTexSubImage2DCHROMIUM': {
25562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'Manual',
2557f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    'data_transfer_methods': ['shm'],
25582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
25594ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    'cmd_args': 'GLenumTextureTarget target, GLint level, '
25604ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        'GLint xoffset, GLint yoffset, '
25614ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        'GLsizei width, GLsizei height, '
25624ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        'GLenumTextureFormat format, GLenumPixelType type, '
25634ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        'const void* data, '
2564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        'uint32_t async_upload_token, '
25654ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch        'void* sync_data',
25662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'extension': True,
25672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'chromium': True,
25682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
25692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'WaitAsyncTexImage2DCHROMIUM': {
25702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'Manual',
25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
25722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'extension': True,
25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'chromium': True,
25742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
25754ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  'WaitAllAsyncTexImage2DCHROMIUM': {
25764ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    'type': 'Manual',
25774ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    'client_test': False,
25784ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    'extension': True,
25794ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch    'chromium': True,
25804ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch  },
25812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'DiscardFramebufferEXT': {
25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'PUTn',
25832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'count': 1,
25842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'cmd_args': 'GLenum target, GLsizei count, '
25852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        'const GLenum* attachments',
25862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'decoder_func': 'DoDiscardFramebufferEXT',
25872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'unit_test': False,
25882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'client_test': False,
2589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'extension_flag': 'ext_discard_framebuffer',
25902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
25912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'LoseContextCHROMIUM': {
2592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'decoder_func': 'DoLoseContextCHROMIUM',
2593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'unit_test': False,
25942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'extension': True,
25952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'chromium': True,
25962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
25972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'InsertSyncPointCHROMIUM': {
25982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'HandWritten',
25992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'impl_func': False,
26006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    'extension': "CHROMIUM_sync_point",
26012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'chromium': True,
26022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
26032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  'WaitSyncPointCHROMIUM': {
26042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'type': 'Custom',
26052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'impl_func': True,
26066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    'extension': "CHROMIUM_sync_point",
26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    'chromium': True,
26085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'trace_level': 1,
26095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  },
26105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  'DiscardBackbufferCHROMIUM': {
26115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'type': 'Custom',
26125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'impl_func': True,
26135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'extension': True,
26145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    'chromium': True,
26152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  },
2616c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  'ScheduleOverlayPlaneCHROMIUM': {
2617c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      'type': 'Custom',
2618c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      'impl_func': True,
2619c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      'unit_test': False,
2620c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      'client_test': False,
2621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      'extension': True,
2622c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      'chromium': True,
2623c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  },
26241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  'MatrixLoadfCHROMIUM': {
26251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'type': 'PUT',
26261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'count': 16,
26271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'data_type': 'GLfloat',
26281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'decoder_func': 'DoMatrixLoadfCHROMIUM',
26291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'gl_test_func': 'glMatrixLoadfEXT',
26301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'chromium': True,
26311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'extension': True,
26321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'extension_flag': 'chromium_path_rendering',
26331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
26341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  'MatrixLoadIdentityCHROMIUM': {
26351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'decoder_func': 'DoMatrixLoadIdentityCHROMIUM',
26361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'gl_test_func': 'glMatrixLoadIdentityEXT',
26371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'chromium': True,
26381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'extension': True,
26391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    'extension_flag': 'chromium_path_rendering',
26401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def Grouper(n, iterable, fillvalue=None):
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Collect data into fixed-length chunks or blocks"""
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args = [iter(iterable)] * n
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return itertools.izip_longest(fillvalue=fillvalue, *args)
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def SplitWords(input_string):
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Transforms a input_string into a list of lower-case components.
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Args:
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input_string: the input string.
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Returns:
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a list of lower-case words.
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if input_string.find('_') > -1:
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # 'some_TEXT_' -> 'some text'
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return input_string.replace('_', ' ').strip().lower().split()
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if re.search('[A-Z]', input_string) and re.search('[a-z]', input_string):
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # mixed case.
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # look for capitalization to cut input_strings
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # 'SomeText' -> 'Some Text'
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      input_string = re.sub('([A-Z])', r' \1', input_string).strip()
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # 'Vector3' -> 'Vector 3'
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      input_string = re.sub('([^0-9])([0-9])', r'\1 \2', input_string)
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return input_string.lower().split()
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def Lower(words):
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Makes a lower-case identifier from words.
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Args:
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    words: a list of lower-case words.
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Returns:
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    the lower-case identifier.
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return '_'.join(words)
26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def ToUnderscore(input_string):
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """converts CamelCase to camel_case."""
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  words = SplitWords(input_string)
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Lower(words)
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2690010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)def CachedStateName(item):
2691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if item.get('cached', False):
2692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return 'cached_' + item['name']
2693010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return item['name']
2694010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
269503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)def ToGLExtensionString(extension_flag):
269603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  """Returns GL-type extension string of a extension flag."""
269703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if extension_flag == "oes_compressed_etc1_rgb8_texture":
269803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return "OES_compressed_ETC1_RGB8_texture" # Fixup inconsitency with rgb8,
269903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                              # unfortunate.
270003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  uppercase_words = [ 'img', 'ext', 'arb', 'chromium', 'oes', 'amd', 'bgra8888',
270103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      'egl', 'atc', 'etc1', 'angle']
270203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  parts = extension_flag.split('_')
270303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return "_".join(
270403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    [part.upper() if part in uppercase_words else part for part in parts])
270503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
270603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)def ToCamelCase(input_string):
270703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  """converts ABC_underscore_case to ABCUnderscoreCase."""
270803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return ''.join(w[0].upper() + w[1:] for w in input_string.split('_'))
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccidef GetGLGetTypeConversion(result_type, value_type, value):
27111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Makes a gl compatible type conversion string for accessing state variables.
27121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   Useful when accessing state variables through glGetXXX calls.
27141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   glGet documetation (for example, the manual pages):
27151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   [...] If glGetIntegerv is called, [...] most floating-point values are
27161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   rounded to the nearest integer value. [...]
27171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Args:
27191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   result_type: the gl type to be obtained
27201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   value_type: the GL type of the state variable
27211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   value: the name of the state variable
27221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Returns:
27241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   String that converts the state variable to desired GL type according to GL
27251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   rules.
27261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
27271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if result_type == 'GLint':
27291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if value_type == 'GLfloat':
27301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return 'static_cast<GLint>(round(%s))' % value
27311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 'static_cast<%s>(%s)' % (result_type, value)
27321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CWriter(object):
27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Writes to a file formatting it for Google's style guidelines."""
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, filename):
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.filename = filename
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.content = []
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Write(self, string):
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes a string to a file spliting if it's > 80 characters."""
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lines = string.splitlines()
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_lines = len(lines)
27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for ii in range(0, num_lines):
2745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      self.content.append(lines[ii])
2746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if ii < (num_lines - 1) or string[-1] == '\n':
2747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        self.content.append('\n')
27485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Close(self):
27505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Close the file."""
27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content = "".join(self.content)
27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    write_file = True
27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if os.path.exists(self.filename):
27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_file = open(self.filename, "rb");
27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_content = old_file.read()
27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      old_file.close();
27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if content == old_content:
27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        write_file = False
27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if write_file:
27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file = open(self.filename, "wb")
27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.write(content)
27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.close()
27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CHeaderWriter(CWriter):
27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Writes a C Header file."""
27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _non_alnum_re = re.compile(r'[^a-zA-Z0-9]')
27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def __init__(self, filename, file_comment = None):
27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CWriter.__init__(self, filename)
27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base = os.path.abspath(filename)
27742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    while os.path.basename(base) != 'src':
27752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_base = os.path.dirname(base)
27762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      assert new_base != base  # Prevent infinite loop.
27772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base = new_base
27785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    hpath = os.path.relpath(filename, base)
27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.guard = self._non_alnum_re.sub('_', hpath).upper() + '_'
27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.Write(_LICENSE)
27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.Write(_DO_NOT_EDIT_WARNING)
27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not file_comment == None:
27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.Write(file_comment)
27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.Write("#ifndef %s\n" % self.guard)
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.Write("#define %s\n\n" % self.guard)
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Close(self):
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.Write("#endif  // %s\n\n" % self.guard)
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CWriter.Close(self)
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TypeHandler(object):
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """This class emits code for a particular type of function."""
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _remove_expected_call_re = re.compile(r'  EXPECT_CALL.*?;\n', re.S)
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InitFunction(self, func):
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Add or adjust anything type specific for this function."""
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if func.GetInfo('needs_size') and not func.name.endswith('Bucket'):
28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.AddCmdArg(DataSizeArgument('data_size'))
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2806f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def NeedsDataTransferFunction(self, func):
2807f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    """Overriden from TypeHandler."""
2808f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return func.num_pointer_args >= 1
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteStruct(self, func, file):
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes a structure that matches the arguments to a function."""
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    comment = func.GetInfo('cmd_comment')
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not comment == None:
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(comment)
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("struct %s {\n" % func.name)
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  typedef %s ValueType;\n" % func.name)
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  static const CommandId kCmdId = k%s;\n" % func.name)
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteCmdArgFlag(file)
28195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    func.WriteCmdFlag(file)
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result = func.GetInfo('result')
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not result == None:
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if len(result) == 1:
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("  typedef %s Result;\n\n" % result[0])
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("  struct Result {\n")
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for line in result:
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          file.Write("    %s;\n" % line)
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("  };\n\n")
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteCmdComputeSize(file)
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteCmdSetHeader(file)
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteCmdInit(file)
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteCmdSet(file)
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  gpu::CommandHeader header;\n")
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetCmdArgs()
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in args:
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  %s %s;\n" % (arg.cmd_type, arg.name))
2840cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2841cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    consts = func.GetCmdConstants()
2842cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for const in consts:
2843cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      file.Write("  static const %s %s = %s;\n" %
2844cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 (const.cmd_type, const.name, const.GetConstantValue()))
2845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("};\n")
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size = len(args) * _SIZE_OF_UINT32 + _SIZE_OF_COMMAND_HEADER
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("COMPILE_ASSERT(sizeof(%s) == %d,\n" % (func.name, size))
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("               Sizeof_%s_is_not_%d);\n" % (func.name, size))
28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("COMPILE_ASSERT(offsetof(%s, header) == 0,\n" % func.name)
28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("               OffsetOf_%s_header_not_0);\n" % func.name)
28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    offset = _SIZE_OF_COMMAND_HEADER
28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in args:
28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("COMPILE_ASSERT(offsetof(%s, %s) == %d,\n" %
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.name, arg.name, offset))
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("               OffsetOf_%s_%s_not_%d);\n" %
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.name, arg.name, offset))
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset += _SIZE_OF_UINT32
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not result == None and len(result) > 1:
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset = 0;
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for line in result:
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        parts = line.split()
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name = parts[-1]
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        check = """
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               OffsetOf_%(cmd_name)s_Result_%(field_name)s_not_%(offset)d);
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write((check.strip() + "\n") % {
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              'cmd_name': func.name,
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              'field_name': name,
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              'offset': offset,
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            })
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        offset += _SIZE_OF_UINT32
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation(self, func, file):
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the handler implementation for this command."""
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  %s(%s);\n" %
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdSizeTest(self, func, file):
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the size test for a command."""
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);\n")
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteFormatTest(self, func, file):
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes a format test for a command."""
28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
28902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
28912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               (func.name, func.name))
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* next_cmd = cmd.Set(\n")
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      &cmd")
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetCmdArgs()
28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for value, arg in enumerate(args):
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(",\n      static_cast<%s>(%d)" % (arg.type, value + 11))
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(");\n")
2898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" %
28992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               func.name)
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("            cmd.header.command);\n")
29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.type_handler.WriteCmdSizeTest(func, file)
29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for value, arg in enumerate(args):
29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (arg.type, value + 11, arg.name))
29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  CheckBytesWrittenMatchesExpectedSize(\n")
29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      next_cmd, sizeof(cmd));\n")
29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateFormatTest(self, func, file):
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes a format test for an immediate version of a command."""
29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteBucketFormatTest(self, func, file):
29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes a format test for a bucket version of a command."""
29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetDataSizeCode(self, func, file):
29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the code to set data_size used in validation"""
29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSizeTest(self, func, file):
29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes a size test for an immediate version of a command."""
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  // TODO(gman): Compute correct size.\n")
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);\n")
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateHandlerImplementation (self, func, file):
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the handler impl for the immediate version of a command."""
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  %s(%s);\n" %
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteBucketHandlerImplementation (self, func, file):
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the handler impl for the bucket version of a command."""
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  %s(%s);\n" %
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def WriteServiceHandlerFunctionHeader(self, func, file):
29381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Writes function header for service implementation handlers."""
29391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    file.Write("""error::Error GLES2DecoderImpl::Handle%(name)s(
29401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        uint32_t immediate_data_size, const void* cmd_data) {
29411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const gles2::cmds::%(name)s& c =
29421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          *static_cast<const gles2::cmds::%(name)s*>(cmd_data);
29431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      (void)c;
29441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      """ % {'name': func.name})
29451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, func, file):
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service implementation for a command."""
29481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.WriteServiceHandlerFunctionHeader(func, file)
2949cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.WriteHandlerExtensionCheck(func, file)
29502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.WriteHandlerDeferReadWrite(func, file);
29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if len(func.GetOriginalArgs()) > 0:
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_arg = func.GetLastOriginalArg()
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      all_but_last_arg = func.GetOriginalArgs()[:-1]
29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for arg in all_but_last_arg:
29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg.WriteGetCode(file)
29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.WriteGetDataSizeCode(func, file)
29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_arg.WriteGetCode(file)
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteHandlerValidation(file)
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteHandlerImplementation(file)
29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  return error::kNoError;\n")
29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateServiceImplementation(self, func, file):
29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service implementation for an immediate version of command."""
29661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.WriteServiceHandlerFunctionHeader(func, file)
2967cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.WriteHandlerExtensionCheck(func, file)
29682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.WriteHandlerDeferReadWrite(func, file);
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_but_last_arg = func.GetOriginalArgs()[:-1]
29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in all_but_last_arg:
29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg.WriteGetCode(file)
29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteGetDataSizeCode(func, file)
29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg.WriteGetCode(file)
29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteHandlerValidation(file)
29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteHandlerImplementation(file)
29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  return error::kNoError;\n")
29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteBucketServiceImplementation(self, func, file):
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service implementation for a bucket version of command."""
29831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.WriteServiceHandlerFunctionHeader(func, file)
2984cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.WriteHandlerExtensionCheck(func, file)
29852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.WriteHandlerDeferReadWrite(func, file);
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_but_last_arg = func.GetOriginalArgs()[:-1]
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in all_but_last_arg:
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg.WriteGetCode(file)
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteGetDataSizeCode(func, file)
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg.WriteGetCode(file)
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteHandlerValidation(file)
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteHandlerImplementation(file)
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  return error::kNoError;\n")
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2998cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def WriteHandlerExtensionCheck(self, func, file):
2999cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if func.GetInfo('extension_flag'):
3000cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      file.Write("  if (!features().%s) {\n" % func.GetInfo('extension_flag'))
3001cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      file.Write("    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, \"gl%s\","
3002cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 " \"function not available\");\n" % func.original_name)
3003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      file.Write("    return error::kNoError;")
3004cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      file.Write("  }\n\n")
3005cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
30062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteHandlerDeferReadWrite(self, func, file):
30072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the code to handle deferring reads or writes."""
30082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    defer_draws = func.GetInfo('defer_draws')
30095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    defer_reads = func.GetInfo('defer_reads')
30105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if defer_draws or defer_reads:
30115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("  error::Error error;\n")
30122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if defer_draws:
30135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("  error = WillAccessBoundFramebufferForDraw();\n")
30145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("  if (error != error::kNoError)\n")
30155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("    return error;\n")
30162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if defer_reads:
30175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("  error = WillAccessBoundFramebufferForRead();\n")
30185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("  if (error != error::kNoError)\n")
30195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("    return error;\n")
30202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteValidUnitTest(self, func, file, test, *extras):
3022cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Writes a valid unit test for the service implementation."""
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if func.GetInfo('expectation') == False:
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test = self._remove_expected_call_re.sub('', test)
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name = func.name
3026cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    arg_strings = [
3027cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg.GetValidArg(func) \
3028cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      for arg in func.GetOriginalArgs() if not arg.IsConstant()
3029cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ]
3030cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gl_arg_strings = [
3031cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg.GetValidGLArg(func) \
3032cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      for arg in func.GetOriginalArgs()
3033cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ]
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_func_name = func.GetGLTestFunctionName()
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vars = {
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'name':name,
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'gl_func_name': gl_func_name,
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'args': ", ".join(arg_strings),
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'gl_args': ", ".join(gl_arg_strings),
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
304103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    for extra in extras:
304203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      vars.update(extra)
30432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    old_test = ""
30442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    while (old_test != test):
30452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      old_test = test
30462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      test = test % vars
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(test % vars)
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
304903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteInvalidUnitTest(self, func, file, test, *extras):
3050cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Writes an invalid unit test for the service implementation."""
3051cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for invalid_arg_index, invalid_arg in enumerate(func.GetOriginalArgs()):
3052cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      # Service implementation does not test constants, as they are not part of
3053cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      # the call in the service side.
3054cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if invalid_arg.IsConstant():
3055cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        continue
3056cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3057cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      num_invalid_values = invalid_arg.GetNumInvalidValues(func)
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for value_index in range(0, num_invalid_values):
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg_strings = []
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        parse_result = "kNoError"
30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_error = None
3062cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        for arg in func.GetOriginalArgs():
3063cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          if arg.IsConstant():
3064cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            continue
3065cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          if invalid_arg is arg:
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (arg_string, parse_result, gl_error) = arg.GetInvalidArg(
3067cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                value_index)
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          else:
3069cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            arg_string = arg.GetValidArg(func)
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          arg_strings.append(arg_string)
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_arg_strings = []
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for arg in func.GetOriginalArgs():
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gl_arg_strings.append("_")
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_func_name = func.GetGLTestFunctionName()
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_error_test = ''
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if not gl_error == None:
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gl_error_test = '\n  EXPECT_EQ(%s, GetGLError());' % gl_error
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        vars = {
30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'name': func.name,
3081cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          'arg_index': invalid_arg_index,
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'value_index': value_index,
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'gl_func_name': gl_func_name,
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'args': ", ".join(arg_strings),
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'all_but_last_args': ", ".join(arg_strings[:-1]),
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'gl_args': ", ".join(gl_arg_strings),
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'parse_result': parse_result,
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'gl_error_test': gl_error_test,
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
309003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        for extra in extras:
309103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          vars.update(extra)
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write(test % vars)
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
309403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service unit test for a command."""
3096010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3097010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if func.name == 'Enable':
3098010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      valid_test = """
3099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
3100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForEnableDisable(%(gl_args)s, true);
3101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
3102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmds::%(name)s cmd;
3103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(%(args)s);
3104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
3106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
3107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)"""
3108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    elif func.name == 'Disable':
3109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      valid_test = """
3110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
3111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SetupExpectationsForEnableDisable(%(gl_args)s, false);
3112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
3113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmds::%(name)s cmd;
3114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  cmd.Init(%(args)s);
3115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
3116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
3117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
3118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)"""
3119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    else:
3120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      valid_test = """
3121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
31232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
31242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
313003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, *extras)
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
3133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
31352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
31362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
31405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
314103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
314303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteImmediateServiceUnitTest(self, func, file, *extras):
31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service unit test for an immediate command."""
31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n" % func.name)
31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateValidationCode(self, func, file):
31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the validation code for an immediate version of a command."""
31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
31505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteBucketServiceUnitTest(self, func, file, *extras):
31525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service unit test for a bucket command."""
31535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n" % func.name)
31545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteBucketValidationCode(self, func, file):
31565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the validation code for a bucket version of a command."""
31575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n" % func.name)
31585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationDeclaration(self, func, file):
31605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implemention declaration."""
31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    impl_decl = func.GetInfo('impl_decl')
31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if impl_decl == None or impl_decl == True:
31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("virtual %s %s(%s) OVERRIDE;\n" %
31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.return_type, func.original_name,
31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  func.MakeTypedOriginalArgString("")))
31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("\n")
31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2CLibImplementation(self, func, file):
31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("%s GLES2%s(%s) {\n" %
31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.return_type, func.name,
31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                func.MakeTypedOriginalArgString("")))
31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result_string = "return "
31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if func.return_type == "void":
31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_string = ""
31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  %sgles2::GetGLContext()->%s(%s);\n" %
31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (result_string, func.original_name,
31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                func.MakeOriginalArgString("")))
31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
31795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteGLES2Header(self, func, file):
31812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes a re-write macro for GLES"""
31822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("#define gl%s GLES2_GET_FUN(%s)\n" %(func.name, func.name))
31832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteClientGLCallLog(self, func, file):
31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes a logging macro for the client side code."""
31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    comma = ""
31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if len(func.GetOriginalArgs()):
31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      comma = " << "
31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        '  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] gl%s("%s%s << ")");\n' %
31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (func.original_name, comma, func.MakeLogArgString()))
31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteClientGLReturnLog(self, func, file):
31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the return value logging code."""
31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if func.return_type != "void":
31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write('  GPU_CLIENT_LOG("return:" << result)\n')
31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationHeader(self, func, file):
31995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implemention."""
32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteGLES2ImplementationDeclaration(func, file)
32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteGLES2TraceImplementationHeader(self, func, file):
32032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the GLES2 Trace Implemention header."""
32042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("virtual %s %s(%s) OVERRIDE;\n" %
32052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               (func.return_type, func.original_name,
32062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                func.MakeTypedOriginalArgString("")))
32072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteGLES2TraceImplementation(self, func, file):
32092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the GLES2 Trace Implemention."""
32102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("%s GLES2TraceImplementation::%s(%s) {\n" %
32112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               (func.return_type, func.original_name,
32122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                func.MakeTypedOriginalArgString("")))
32132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result_string = "return "
32142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if func.return_type == "void":
32152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      result_string = ""
32162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write('  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::%s");\n' %
32172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               func.name)
32182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  %sgl_->%s(%s);\n" %
32192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               (result_string, func.name, func.MakeOriginalArgString("")))
32202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("}\n")
32212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("\n")
32222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implemention."""
32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    impl_func = func.GetInfo('impl_func')
32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    impl_decl = func.GetInfo('impl_decl')
32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gen_cmd = func.GetInfo('gen_cmd')
32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (func.can_auto_generate and
32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (impl_func == None or impl_func == True) and
32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (impl_decl == None or impl_decl == True) and
32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (gen_cmd == None or gen_cmd == True)):
32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("%s GLES2Implementation::%s(%s) {\n" %
32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.return_type, func.original_name,
32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  func.MakeTypedOriginalArgString("")))
32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.WriteClientGLCallLog(func, file)
32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteDestinationInitalizationValidation(file)
32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for arg in func.GetOriginalArgs():
32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg.WriteClientSideValidationCode(file, func)
32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  helper_->%s(%s);\n" %
3241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 (func.name, func.MakeHelperArgString("")))
32422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("  CheckGLError();\n")
32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.WriteClientGLReturnLog(func, file)
32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("}\n")
32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("\n")
32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2InterfaceHeader(self, func, file):
32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Interface."""
32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("virtual %s %s(%s) = 0;\n" %
32505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.return_type, func.original_name,
32515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                func.MakeTypedOriginalArgString("")))
32525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2InterfaceStub(self, func, file):
32545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Interface stub declaration."""
32555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("virtual %s %s(%s) OVERRIDE;\n" %
32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.return_type, func.original_name,
32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                func.MakeTypedOriginalArgString("")))
32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2InterfaceStubImpl(self, func, file):
32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Interface stub declaration."""
32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetOriginalArgs()
32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg_string = ", ".join(
32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ["%s /* %s */" % (arg.type, arg.name) for arg in args])
32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("%s GLES2InterfaceStub::%s(%s) {\n" %
32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.return_type, func.original_name, arg_string))
32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if func.return_type != "void":
32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  return 0;\n")
32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationUnitTest(self, func, file):
32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implemention unit test."""
32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client_test = func.GetInfo('client_test')
32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (func.can_auto_generate and
32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (client_test == None or client_test == True)):
32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      code = """
32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, %(name)s) {
32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
32782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::%(name)s cmd;
32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.cmd.Init(%(cmd_args)s);
32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->%(name)s(%(args)s);
32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
3287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      cmd_arg_strings = [
3288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        arg.GetValidClientSideCmdArg(func) for arg in func.GetCmdArgs()
3289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ]
3290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gl_arg_strings = [
3292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        arg.GetValidClientSideArg(func) for arg in func.GetOriginalArgs()
3293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ]
3294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(code % {
32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'name': func.name,
32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'args': ", ".join(gl_arg_strings),
32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'cmd_args': ", ".join(cmd_arg_strings),
32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          })
3300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      # Test constants for invalid values, as they are not tested by the
3302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      # service.
3303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      constants = [arg for arg in func.GetOriginalArgs() if arg.IsConstant()]
3304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if constants:
3305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        code = """
3306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GLES2ImplementationTest, %(name)sInvalidConstantArg%(invalid_index)d) {
3307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gl_->%(name)s(%(args)s);
3308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
3309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(%(gl_error)s, CheckError());
3310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
3311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)"""
3312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        for invalid_arg in constants:
3313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          gl_arg_strings = []
3314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          invalid = invalid_arg.GetInvalidArg(func)
3315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          for arg in func.GetOriginalArgs():
3316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            if arg is invalid_arg:
3317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              gl_arg_strings.append(invalid[0])
3318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            else:
3319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              gl_arg_strings.append(arg.GetValidClientSideArg(func))
3320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          file.Write(code % {
3322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            'name': func.name,
3323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            'invalid_index': func.GetOriginalArgs().index(invalid_arg),
3324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            'args': ", ".join(gl_arg_strings),
3325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            'gl_error': invalid[2],
3326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          })
33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if client_test != False:
33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("// TODO: Implement unit test for %s\n" % func.name)
33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteDestinationInitalizationValidation(self, func, file):
33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the client side destintion initialization validation."""
33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in func.GetOriginalArgs():
33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg.WriteDestinationInitalizationValidation(file, func)
33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteTraceEvent(self, func, file):
33372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write('  TRACE_EVENT0("gpu", "GLES2Implementation::%s");\n' %
33382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               func.original_name)
33392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdComputeSize(self, func, file):
33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the size computation code for the immediate version of a cmd."""
3342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  static uint32_t ComputeSize(uint32_t size_in_bytes) {\n")
3343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    return static_cast<uint32_t>(\n")
33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("        sizeof(ValueType) +  // NOLINT\n")
33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("        RoundSizeToMultipleOfEntries(size_in_bytes));\n")
33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSetHeader(self, func, file):
33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the SetHeader function for the immediate version of a cmd."""
3351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  void SetHeader(uint32_t size_in_bytes) {\n")
33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    header.SetCmdByTotalSize<ValueType>(size_in_bytes);\n")
33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdInit(self, func, file):
33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the Init function for the immediate version of a command."""
33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raise NotImplementedError(func.name)
33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSet(self, func, file):
33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the Set function for the immediate version of a command."""
33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raise NotImplementedError(func.name)
33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdHelper(self, func, file):
33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the cmd helper definition for a cmd."""
33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """  void %(name)s(%(typed_args)s) {
33672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gles2::cmds::%(name)s* c = GetCmdSpace<gles2::cmds::%(name)s>();
33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c) {
33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c->Init(%(args)s);
33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "name": func.name,
33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "typed_args": func.MakeTypedCmdArgString(""),
33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "args": func.MakeCmdArgString(""),
33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdHelper(self, func, file):
33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the cmd helper definition for the immediate version of a cmd."""
33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """  void %(name)s(%(typed_args)s) {
3383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const uint32_t s = 0;  // TODO(gman): compute correct size
33842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gles2::cmds::%(name)s* c =
33852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(s);
33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c) {
33875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c->Init(%(args)s);
33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
33905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           "name": func.name,
33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           "typed_args": func.MakeTypedCmdArgString(""),
33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           "args": func.MakeCmdArgString(""),
33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StateSetHandler(TypeHandler):
34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for commands that simply set state."""
34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation(self, func, file):
34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_name = func.GetInfo('state')
34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state = _STATES[state_name]
34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    states = state['states']
34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetOriginalArgs()
34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for ndx,item in enumerate(states):
34126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      code = []
34132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if 'range_checks' in item:
34142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for range_check in item['range_checks']:
34152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          code.append("%s %s" % (args[ndx].name, range_check['check']))
34166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      if 'nan_check' in item:
34176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        # Drivers might generate an INVALID_VALUE error when a value is set
34186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        # to NaN. This is allowed behavior under GLES 3.0 section 2.1.1 or
34196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        # OpenGL 4.5 section 2.3.4.1 - providing NaN allows undefined results.
34206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        # Make this behavior consistent within Chromium, and avoid leaking GL
34216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        # errors by generating the error in the command buffer instead of
34226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        # letting the GL driver generate it.
34236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        code.append("base::IsNaN(%s)" % args[ndx].name)
34246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      if len(code):
34256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        file.Write("  if (%s) {\n" % " ||\n      ".join(code))
34266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        file.Write(
34276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          '    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE,'
34286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          ' "%s", "%s out of range");\n' %
34296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          (func.name, args[ndx].name))
34306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        file.Write("    return error::kNoError;\n")
34316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        file.Write("  }\n")
34322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    code = []
34332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for ndx,item in enumerate(states):
34342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      code.append("state_.%s != %s" % (item['name'], args[ndx].name))
34352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  if (%s) {\n" % " ||\n      ".join(code))
34362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for ndx,item in enumerate(states):
34372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    state_.%s = %s;\n" % (item['name'], args[ndx].name))
34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if 'state_flag' in state:
34392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    %s = true;\n" % state['state_flag'])
34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not func.GetInfo("no_gl"):
3441010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      for ndx,item in enumerate(states):
3442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        if item.get('cached', False):
3443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          file.Write("    state_.%s = %s;\n" %
3444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     (CachedStateName(item), args[ndx].name))
34452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    %s(%s);\n" %
34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
34472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  }\n")
34482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
344903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
34502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Overrriden from TypeHandler."""
345103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    TypeHandler.WriteServiceUnitTest(self, func, file, *extras)
34522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state_name = func.GetInfo('state')
34532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    state = _STATES[state_name]
34542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    states = state['states']
34552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for ndx,item in enumerate(states):
34562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if 'range_checks' in item:
34572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for check_ndx, range_check in enumerate(item['range_checks']):
34582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          valid_test = """
3459010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidValue%(ndx)d_%(check_ndx)d) {
34602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
34612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
34622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmd.Init(%(args)s);
34632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
34642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
34652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
34662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""
34672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          name = func.name
3468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          arg_strings = [
3469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            arg.GetValidArg(func) \
3470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            for arg in func.GetOriginalArgs() if not arg.IsConstant()
3471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ]
3472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
34732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          arg_strings[ndx] = range_check['test_value']
34742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          vars = {
34752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            'name': name,
34762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            'ndx': ndx,
34772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            'check_ndx': check_ndx,
34782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            'args': ", ".join(arg_strings),
34792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          }
348003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          for extra in extras:
348103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            vars.update(extra)
34822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          file.Write(valid_test % vars)
34836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      if 'nan_check' in item:
34846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        valid_test = """
34856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_P(%(test_name)s, %(name)sNaNValue%(ndx)d) {
34866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
34876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  cmds::%(name)s cmd;
34886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  cmd.Init(%(args)s);
34896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
34906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
34916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
34926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)"""
34936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        name = func.name
34946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        arg_strings = [
34956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          arg.GetValidArg(func) \
34966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          for arg in func.GetOriginalArgs() if not arg.IsConstant()
34976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        ]
34986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
34996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        arg_strings[ndx] = 'nanf("")'
35006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        vars = {
35016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          'name': name,
35026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          'ndx': ndx,
35036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          'args': ", ".join(arg_strings),
35046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
350503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        for extra in extras:
350603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          vars.update(extra)
35076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        file.Write(valid_test % vars)
35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StateSetRGBAlphaHandler(TypeHandler):
35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for commands that simply set state that have rgb/alpha."""
35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation(self, func, file):
35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_name = func.GetInfo('state')
35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state = _STATES[state_name]
35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    states = state['states']
35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetOriginalArgs()
35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_args = len(args)
35232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    code = []
35242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for ndx,item in enumerate(states):
35252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      code.append("state_.%s != %s" % (item['name'], args[ndx % num_args].name))
35262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  if (%s) {\n" % " ||\n      ".join(code))
35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for ndx, item in enumerate(states):
35282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    state_.%s = %s;\n" %
35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (item['name'], args[ndx % num_args].name))
35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if 'state_flag' in state:
35312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    %s = true;\n" % state['state_flag'])
35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not func.GetInfo("no_gl"):
35332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    %s(%s);\n" %
35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
35352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("  }\n")
35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StateSetFrontBackSeparateHandler(TypeHandler):
35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for commands that simply set state that have front/back."""
35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation(self, func, file):
35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_name = func.GetInfo('state')
35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state = _STATES[state_name]
35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    states = state['states']
35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetOriginalArgs()
35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    face = args[0].name
35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_args = len(args)
35522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  bool changed = false;\n")
35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for group_ndx, group in enumerate(Grouper(num_args - 1, states)):
35545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  if (%s == %s || %s == GL_FRONT_AND_BACK) {\n" %
35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (face, ('GL_FRONT', 'GL_BACK')[group_ndx], face))
35562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      code = []
35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for ndx, item in enumerate(group):
35582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        code.append("state_.%s != %s" % (item['name'], args[ndx + 1].name))
35592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    changed |= %s;\n" % " ||\n        ".join(code))
35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  }\n")
35612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  if (changed) {\n")
35622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for group_ndx, group in enumerate(Grouper(num_args - 1, states)):
35632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    if (%s == %s || %s == GL_FRONT_AND_BACK) {\n" %
35642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 (face, ('GL_FRONT', 'GL_BACK')[group_ndx], face))
35652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for ndx, item in enumerate(group):
35662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        file.Write("      state_.%s = %s;\n" %
35672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   (item['name'], args[ndx + 1].name))
35682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    }\n")
35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if 'state_flag' in state:
35702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    %s = true;\n" % state['state_flag'])
35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not func.GetInfo("no_gl"):
35722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    %s(%s);\n" %
35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
35742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  }\n")
35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StateSetFrontBackHandler(TypeHandler):
35785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for commands that simply set state that set both front/back."""
35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation(self, func, file):
35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state_name = func.GetInfo('state')
35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state = _STATES[state_name]
35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    states = state['states']
35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetOriginalArgs()
35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_args = len(args)
35902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    code = []
35912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for group_ndx, group in enumerate(Grouper(num_args, states)):
35922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for ndx, item in enumerate(group):
35932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        code.append("state_.%s != %s" % (item['name'], args[ndx].name))
35942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  if (%s) {\n" % " ||\n      ".join(code))
35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for group_ndx, group in enumerate(Grouper(num_args, states)):
35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for ndx, item in enumerate(group):
35972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        file.Write("    state_.%s = %s;\n" % (item['name'], args[ndx].name))
35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if 'state_flag' in state:
35992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    %s = true;\n" % state['state_flag'])
36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not func.GetInfo("no_gl"):
36012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    %s(%s);\n" %
36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
36032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  }\n")
36042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3606868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class StateSetNamedParameter(TypeHandler):
3607868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  """Handler for commands that set a state chosen with an enum parameter."""
3608868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3609868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  def __init__(self):
3610868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    TypeHandler.__init__(self)
3611868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3612868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  def WriteHandlerImplementation(self, func, file):
3613868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    """Overridden from TypeHandler."""
3614868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    state_name = func.GetInfo('state')
3615868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    state = _STATES[state_name]
3616868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    states = state['states']
3617868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    args = func.GetOriginalArgs()
3618868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    num_args = len(args)
3619868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    assert num_args == 2
3620868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    file.Write("  switch (%s) {\n" % args[0].name)
3621868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for state in states:
3622868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      file.Write("    case %s:\n" % state['enum'])
3623868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      file.Write("      if (state_.%s != %s) {\n" %
3624868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 (state['name'], args[1].name))
3625868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      file.Write("        state_.%s = %s;\n" % (state['name'], args[1].name))
3626868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if not func.GetInfo("no_gl"):
3627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        file.Write("        %s(%s);\n" %
3628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                   (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
3629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      file.Write("      }\n")
3630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      file.Write("      break;\n")
3631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    file.Write("    default:\n")
3632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    file.Write("      NOTREACHED();\n")
3633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    file.Write("  }\n")
3634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
3635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CustomHandler(TypeHandler):
36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for commands that are auto-generated but require minor tweaks."""
36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, func, file):
36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateServiceImplementation(self, func, file):
36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteBucketServiceImplementation(self, func, file):
36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n\n" % func.name)
36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteImmediateServiceUnitTest(self, func, file, *extras):
36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n\n" % func.name)
36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdGetTotalSize(self, func, file):
36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
3664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write(
3665010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        "    uint32_t total_size = 0;  // TODO(gman): get correct size.\n")
36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdInit(self, func, file):
36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void Init(%s) {\n" % func.MakeTypedCmdArgString("_"))
36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteImmediateCmdGetTotalSize(func, file)
36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    SetHeader(total_size);\n")
36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetCmdArgs()
36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in args:
36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    %s = _%s;\n" % (arg.name, arg.name))
36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSet(self, func, file):
36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    copy_args = func.MakeCmdArgString("_", False)
36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* Set(void* cmd%s) {\n" %
36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               func.MakeTypedCmdArgString("_", True))
36835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteImmediateCmdGetTotalSize(func, file)
36845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    static_cast<ValueType*>(cmd)->Init(%s);\n" % copy_args)
36855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return NextImmediateCmdAddressTotalSize<ValueType>("
36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "cmd, total_size);\n")
36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
36885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TodoHandler(CustomHandler):
36925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handle for commands that are not yet implemented."""
36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3694f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def NeedsDataTransferFunction(self, func):
3695f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    """Overriden from TypeHandler."""
3696f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return False
36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
36985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateFormatTest(self, func, file):
36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationUnitTest(self, func, file):
37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
37075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("%s GLES2Implementation::%s(%s) {\n" %
37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.return_type, func.original_name,
37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                func.MakeTypedOriginalArgString("")))
37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  // TODO: for now this is a no-op\n")
37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
37132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  SetGLError("
37142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "GL_INVALID_OPERATION, \"gl%s\", \"not implemented\");\n" %
37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        func.name)
37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if func.return_type != "void":
37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  return 0;\n")
37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
37205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, func, file):
37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.WriteServiceHandlerFunctionHeader(func, file)
37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  // TODO: for now this is a no-op\n")
37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
37262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  LOCAL_SET_GL_ERROR("
37272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "GL_INVALID_OPERATION, \"gl%s\", \"not implemented\");\n" %
37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        func.name)
37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  return error::kNoError;\n")
37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HandWrittenHandler(CustomHandler):
37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for comands where everything must be written by hand."""
37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InitFunction(self, func):
37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Add or adjust anything type specific for this function."""
37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CustomHandler.InitFunction(self, func)
37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.can_auto_generate = False
37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3742f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def NeedsDataTransferFunction(self, func):
3743f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    """Overriden from TypeHandler."""
3744f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    # If specified explicitly, force the data transfer method.
3745f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if func.GetInfo('data_transfer_methods'):
3746f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return True
3747f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return False
3748f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteStruct(self, func, file):
37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteDocs(self, func, file):
37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n\n" % func.name)
37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
376103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteImmediateServiceUnitTest(self, func, file, *extras):
37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n\n" % func.name)
37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
376503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteBucketServiceUnitTest(self, func, file, *extras):
37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n\n" % func.name)
37685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, func, file):
37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateServiceImplementation(self, func, file):
37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteBucketServiceImplementation(self, func, file):
37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdHelper(self, func, file):
37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteBucketCmdHelper(self, func, file):
37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdHelper(self, func, file):
37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteFormatTest(self, func, file):
37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): Write test for %s\n" % func.name)
37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateFormatTest(self, func, file):
37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): Write test for %s\n" % func.name)
38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteBucketFormatTest(self, func, file):
38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): Write test for %s\n" % func.name)
38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ManualHandler(CustomHandler):
38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for commands who's handlers must be written by hand."""
38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CustomHandler.__init__(self)
38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InitFunction(self, func):
38145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (func.name == 'CompressedTexImage2DBucket'):
38165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.cmd_args = func.cmd_args[:-1]
38175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.AddCmdArg(Argument('bucket_id', 'GLuint'))
38185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
38195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CustomHandler.InitFunction(self, func)
38205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, func, file):
38225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
38245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteBucketServiceImplementation(self, func, file):
38265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
38285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
38305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n\n" % func.name)
38325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
383303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteImmediateServiceUnitTest(self, func, file, *extras):
38345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n\n" % func.name)
38365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateServiceImplementation(self, func, file):
38385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
38405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateFormatTest(self, func, file):
38425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): Implement test for %s\n" % func.name)
38445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
38465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if func.GetInfo('impl_func'):
38482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      super(ManualHandler, self).WriteGLES2Implementation(func, file)
38495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationHeader(self, func, file):
38515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("virtual %s %s(%s) OVERRIDE;\n" %
38535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.return_type, func.original_name,
38545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                func.MakeTypedOriginalArgString("")))
38555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
38565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdGetTotalSize(self, func, file):
38585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # TODO(gman): Move this data to _FUNCTION_INFO?
38604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    CustomHandler.WriteImmediateCmdGetTotalSize(self, func, file)
38615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DataHandler(TypeHandler):
38645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for glBufferData, glBufferSubData, glTexImage2D, glTexSubImage2D,
38655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     glCompressedTexImage2D, glCompressedTexImageSub2D."""
38665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
38675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
38685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InitFunction(self, func):
38705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if func.name == 'CompressedTexSubImage2DBucket':
38725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.cmd_args = func.cmd_args[:-1]
38735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.AddCmdArg(Argument('bucket_id', 'GLuint'))
38745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetDataSizeCode(self, func, file):
38765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
38775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # TODO(gman): Move this data to _FUNCTION_INFO?
38785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name = func.name
38795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if name.endswith("Immediate"):
38805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name = name[0:-9]
38815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if name == 'BufferData' or name == 'BufferSubData':
3882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      file.Write("  uint32_t data_size = size;\n")
38835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elif (name == 'CompressedTexImage2D' or
38845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          name == 'CompressedTexSubImage2D'):
3885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      file.Write("  uint32_t data_size = imageSize;\n")
38865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elif (name == 'CompressedTexSubImage2DBucket'):
38875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  Bucket* bucket = GetBucket(c.bucket_id);\n")
3888010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      file.Write("  uint32_t data_size = bucket->size();\n")
38895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  GLsizei imageSize = data_size;\n")
38905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    elif name == 'TexImage2D' or name == 'TexSubImage2D':
3891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      code = """  uint32_t data_size;
38925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!GLES2Util::ComputeImageDataSize(
38935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      width, height, format, type, unpack_alignment_, &data_size)) {
38945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
38955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
38965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
38975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(code)
38985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
3899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      file.Write(
3900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "// uint32_t data_size = 0;  // TODO(gman): get correct size!\n")
39015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdGetTotalSize(self, func, file):
39035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
39048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    pass
39055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSizeTest(self, func, file):
39075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
39085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  EXPECT_EQ(sizeof(cmd), total_size);\n")
39095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdInit(self, func, file):
39115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
39125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void Init(%s) {\n" % func.MakeTypedCmdArgString("_"))
39135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteImmediateCmdGetTotalSize(func, file)
39145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    SetHeader(total_size);\n")
39155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetCmdArgs()
39165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in args:
39175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    %s = _%s;\n" % (arg.name, arg.name))
39185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
39195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
39205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSet(self, func, file):
39225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
39235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    copy_args = func.MakeCmdArgString("_", False)
39245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* Set(void* cmd%s) {\n" %
39255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               func.MakeTypedCmdArgString("_", True))
39265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteImmediateCmdGetTotalSize(func, file)
39275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    static_cast<ValueType*>(cmd)->Init(%s);\n" % copy_args)
39285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return NextImmediateCmdAddressTotalSize<ValueType>("
39295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "cmd, total_size);\n")
39305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
39315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
39325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateFormatTest(self, func, file):
39345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
39355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # TODO(gman): Remove this exception.
39365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): Implement test for %s\n" % func.name)
39375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return
39385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
393903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
39405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
39415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n\n" % func.name)
39425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
394303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteImmediateServiceUnitTest(self, func, file, *extras):
39445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
39455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("// TODO(gman): %s\n\n" % func.name)
39465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteBucketServiceImplementation(self, func, file):
39485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
39495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not func.name == 'CompressedTexSubImage2DBucket':
39505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TypeHandler.WriteBucketServiceImplemenation(self, func, file)
39515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BindHandler(TypeHandler):
39545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for glBind___ type functions."""
39555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
39575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
39585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
39605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
39615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
39625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if len(func.GetOriginalArgs()) == 1:
39635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      valid_test = """
3964010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
39655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
39662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
39672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
39685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
39695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
39705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
39715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3972effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch"""
3973effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if func.GetInfo("gen_func"):
3974effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          valid_test += """
3975010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgsNewId) {
39765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(kNewServiceId));
39775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_gen_func_name)s(1, _))
39785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     .WillOnce(SetArgumentPointee<1>(kNewServiceId));
39792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
39802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
39815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kNewClientId);
39825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
39835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
39842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL);
39855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
39865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
39875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.WriteValidUnitTest(func, file, valid_test, {
39885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'resource_type': func.GetOriginalArgs()[0].resource_type,
39895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'gl_gen_func_name': func.GetInfo("gen_func"),
399003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      }, *extras)
39915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
39925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      valid_test = """
3993010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
39945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
39952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
39962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
39975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
39985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
39995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
40005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4001effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch"""
4002effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if func.GetInfo("gen_func"):
4003effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          valid_test += """
4004010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgsNewId) {
40055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(first_gl_arg)s, kNewServiceId));
40065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_gen_func_name)s(1, _))
40075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     .WillOnce(SetArgumentPointee<1>(kNewServiceId));
40082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
40092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
40105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(first_arg)s, kNewClientId);
40115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
40125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
40132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL);
40145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
40165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.WriteValidUnitTest(func, file, valid_test, {
4017cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          'first_arg': func.GetOriginalArgs()[0].GetValidArg(func),
4018cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          'first_gl_arg': func.GetOriginalArgs()[0].GetValidGLArg(func),
40195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'resource_type': func.GetOriginalArgs()[1].resource_type,
40205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'gl_gen_func_name': func.GetInfo("gen_func"),
402103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      }, *extras)
40225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
4024010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
40255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
40262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
40272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
40285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
40295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
40305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
403203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
40335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
40355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implemention."""
40365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    impl_func = func.GetInfo('impl_func')
40385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    impl_decl = func.GetInfo('impl_decl')
40395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (func.can_auto_generate and
40415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (impl_func == None or impl_func == True) and
40425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (impl_decl == None or impl_decl == True)):
40435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("%s GLES2Implementation::%s(%s) {\n" %
40455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.return_type, func.original_name,
40465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  func.MakeTypedOriginalArgString("")))
40475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
40485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteDestinationInitalizationValidation(file)
40495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.WriteClientGLCallLog(func, file)
40505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for arg in func.GetOriginalArgs():
40515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg.WriteClientSideValidationCode(file, func)
40525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      code = """  if (Is%(type)sReservedId(%(id)s)) {
40545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetGLError(GL_INVALID_OPERATION, "%(name)s\", \"%(id)s reserved id");
40555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
40565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4057effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (%(name)sHelper(%(arg_string)s)) {
40582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    helper_->%(name)s(%(arg_string)s);
40592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
40602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckGLError();
40615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
40625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
40645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name_arg = None
40655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if len(func.GetOriginalArgs()) == 1:
40665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Bind functions that have no target (like BindVertexArrayOES)
40675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name_arg = func.GetOriginalArgs()[0]
40685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
40695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # Bind functions that have both a target and a name (like BindTexture)
40705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        name_arg = func.GetOriginalArgs()[1]
40715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(code % {
40735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'name': func.name,
40745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'arg_string': func.MakeOriginalArgString(""),
40755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'id': name_arg.name,
40765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'type': name_arg.resource_type,
40775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'lc_type': name_arg.resource_type.lower(),
40785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
40795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
40802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteGLES2ImplementationUnitTest(self, func, file):
40812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Overrriden from TypeHandler."""
40822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    client_test = func.GetInfo('client_test')
40832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if client_test == False:
40842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return
40852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    code = """
40862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(GLES2ImplementationTest, %(name)s) {
40872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct Cmds {
40882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::%(name)s cmd;
40892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
40902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Cmds expected;
40912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected.cmd.Init(%(cmd_args)s);
40922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
40932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->%(name)s(%(args)s);
40942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
40952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClearCommands();
40962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gl_->%(name)s(%(args)s);
40972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
40982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
40992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""
4100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    cmd_arg_strings = [
4101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg.GetValidClientSideCmdArg(func) for arg in func.GetCmdArgs()
4102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ]
4103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gl_arg_strings = [
4104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg.GetValidClientSideArg(func) for arg in func.GetOriginalArgs()
4105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ]
4106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
41072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write(code % {
41082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          'name': func.name,
41092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          'args': ", ".join(gl_arg_strings),
41102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          'cmd_args': ", ".join(cmd_arg_strings),
41112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        })
41122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
41135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GENnHandler(TypeHandler):
41155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for glGen___ type functions."""
41165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
41185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
41195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InitFunction(self, func):
41215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
41225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
41235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetDataSizeCode(self, func, file):
41255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
4126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    code = """  uint32_t data_size;
41275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
41285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
41295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
41305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
41315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code)
41325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation (self, func, file):
41345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
41355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  if (!%sHelper(n, %s)) {\n"
41365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    return error::kInvalidArguments;\n"
41375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  }\n" %
41385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.name, func.GetLastOriginalArg().name))
41395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateHandlerImplementation(self, func, file):
41415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
41425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  if (!%sHelper(n, %s)) {\n"
41435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "    return error::kInvalidArguments;\n"
41445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "  }\n" %
41455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.original_name, func.GetLastOriginalArg().name))
41465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
41485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
41495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    log_code = ("""  GPU_CLIENT_LOG_CODE_BLOCK({
41505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (GLsizei i = 0; i < n; ++i) {
41515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GPU_CLIENT_LOG("  " << i << ": " << %s[i]);
41525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
41535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });""" % func.GetOriginalArgs()[1].name)
41545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = {
41555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'log_code': log_code,
41565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'return_type': func.return_type,
41575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': func.original_name,
41585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'typed_args': func.MakeTypedOriginalArgString(""),
41595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'args': func.MakeOriginalArgString(""),
41605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'resource_types': func.GetInfo('resource_types'),
41615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'count_name': func.GetOriginalArgs()[0].name,
41625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
41635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
41645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "%(return_type)s GLES2Implementation::%(name)s(%(typed_args)s) {\n" %
41655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        args)
41665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteDestinationInitalizationValidation(file)
41675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteClientGLCallLog(func, file)
41685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in func.GetOriginalArgs():
41695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg.WriteClientSideValidationCode(file, func)
4170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    not_shared = func.GetInfo('not_shared')
4171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if not_shared:
4172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      alloc_code = (
4173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch"""  IdAllocatorInterface* id_allocator = GetIdAllocator(id_namespaces::k%s);
4174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (GLsizei ii = 0; ii < n; ++ii)
4175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    %s[ii] = id_allocator->AllocateID();""" %
4176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  (func.GetInfo('resource_types'), func.GetOriginalArgs()[1].name))
4177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    else:
4178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      alloc_code = ("""  GetIdHandler(id_namespaces::k%(resource_types)s)->
4179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      MakeIds(this, 0, %(args)s);""" % args)
4180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    args['alloc_code'] = alloc_code
4181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    code = """ GPU_CLIENT_SINGLE_THREAD_CHECK();
4183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch%(alloc_code)s
41842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  %(name)sHelper(%(args)s);
41855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_->%(name)sImmediate(%(args)s);
4186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (share_group_->bind_generates_resource())
4187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    helper_->CommandBufferHelper::Flush();
41885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%(log_code)s
41892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckGLError();
41905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
41915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
41935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % args)
41945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
41955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationUnitTest(self, func, file):
41965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
41975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """
41985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, %(name)s) {
41995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint ids[2] = { 0, };
42005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
42012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::%(name)sImmediate gen;
42025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint data[2];
42035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
42045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
42055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.gen.Init(arraysize(ids), &ids[0]);
42065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.data[0] = k%(types)sStartId;
42075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.data[1] = k%(types)sStartId + 1;
42085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->%(name)s(arraysize(ids), &ids[0]);
42095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
42105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(k%(types)sStartId, ids[0]);
42115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(k%(types)sStartId + 1, ids[1]);
42125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
42145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
42155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'name': func.name,
42165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'types': func.GetInfo('resource_types'),
42175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
42185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
42205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
42215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
4222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
42235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(1, _))
42245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kNewServiceId));
42255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetSharedMemoryAs<GLuint*>()[0] = kNewClientId;
42262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
42272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
42285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
42295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
42305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
42312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(Get%(resource_name)s(kNewClientId) != NULL);
42325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
42345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, {
42355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'resource_name': func.GetInfo('resource_type'),
423603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      }, *extras)
42375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
4238010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs) {
42395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(_, _)).Times(0);
42405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetSharedMemoryAs<GLuint*>()[0] = client_%(resource_name)s_id_;
42412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
42422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
42435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
42445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kInvalidArguments, ExecuteCmd(cmd));
42455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
42475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidUnitTest(func, file, invalid_test, {
42485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'resource_name': func.GetInfo('resource_type').lower(),
424903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        }, *extras)
42505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteImmediateServiceUnitTest(self, func, file, *extras):
42525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
42535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
4254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
42555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(1, _))
42565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetArgumentPointee<1>(kNewServiceId));
42572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s* cmd = GetImmediateAs<cmds::%(name)s>();
42585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint temp = kNewClientId;
42592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
42605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd->Init(1, &temp);
42615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
42625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(*cmd, sizeof(temp)));
42635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
42642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(Get%(resource_name)s(kNewClientId) != NULL);
42655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
42675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, {
42685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'resource_name': func.GetInfo('resource_type'),
426903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      }, *extras)
42705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
4271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs) {
42725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(_, _)).Times(0);
42732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s* cmd = GetImmediateAs<cmds::%(name)s>();
42742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
42755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd->Init(1, &client_%(resource_name)s_id_);
42765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kInvalidArguments,
42775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(*cmd, sizeof(&client_%(resource_name)s_id_)));
42785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
42795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
42805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidUnitTest(func, file, invalid_test, {
42815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'resource_name': func.GetInfo('resource_type').lower(),
428203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        }, *extras)
42835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdComputeSize(self, func, file):
42855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
4286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  static uint32_t ComputeDataSize(GLsizei n) {\n")
42875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
4288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        "    return static_cast<uint32_t>(sizeof(GLuint) * n);  // NOLINT\n")
42895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
42905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
4291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  static uint32_t ComputeSize(GLsizei n) {\n")
4292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    return static_cast<uint32_t>(\n")
42935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("        sizeof(ValueType) + ComputeDataSize(n));  // NOLINT\n")
42945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
42955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
42965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSetHeader(self, func, file):
42985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
42995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void SetHeader(GLsizei n) {\n")
43005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    header.SetCmdByTotalSize<ValueType>(ComputeSize(n));\n")
43015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
43025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
43035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdInit(self, func, file):
43055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
43065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
43075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void Init(%s, %s _%s) {\n" %
43085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.MakeTypedCmdArgString("_"),
43095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                last_arg.type, last_arg.name))
43105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    SetHeader(_n);\n")
43115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetCmdArgs()
43125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in args:
43135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    %s = _%s;\n" % (arg.name, arg.name))
43145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    memcpy(ImmediateDataAddress(this),\n")
43155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("           _%s, ComputeDataSize(_n));\n" % last_arg.name)
43165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
43175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
43185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSet(self, func, file):
43205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
43215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
43225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    copy_args = func.MakeCmdArgString("_", False)
43235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* Set(void* cmd%s, %s _%s) {\n" %
43245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.MakeTypedCmdArgString("_", True),
43255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                last_arg.type, last_arg.name))
43265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" %
43275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (copy_args, last_arg.name))
4328010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    const uint32_t size = ComputeSize(_n);\n")
43295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return NextImmediateCmdAddressTotalSize<ValueType>("
43305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "cmd, size);\n")
43315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
43325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
43335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdHelper(self, func, file):
43355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
43365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """  void %(name)s(%(typed_args)s) {
4337010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const uint32_t size = gles2::cmds::%(name)s::ComputeSize(n);
43382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gles2::cmds::%(name)s* c =
43392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
43405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c) {
43415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c->Init(%(args)s);
43425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
43435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
43445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
43465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
43475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "name": func.name,
43485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "typed_args": func.MakeTypedOriginalArgString(""),
43495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "args": func.MakeOriginalArgString(""),
43505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
43515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateFormatTest(self, func, file):
43535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
43545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
43555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  static GLuint ids[] = { 12, 23, 34, };\n")
43562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
43572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               (func.name, func.name))
43585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* next_cmd = cmd.Set(\n")
43595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      &cmd, static_cast<GLsizei>(arraysize(ids)), ids);\n")
4360010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" %
43612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               func.name)
43625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("            cmd.header.command);\n")
43635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  EXPECT_EQ(sizeof(cmd) +\n")
43645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("            RoundSizeToMultipleOfEntries(cmd.n * 4u),\n")
43655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("            cmd.header.size * 4u);\n")
43665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n);\n");
43675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  CheckBytesWrittenMatchesExpectedSize(\n")
43685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      next_cmd, sizeof(cmd) +\n")
43695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      RoundSizeToMultipleOfEntries(arraysize(ids) * 4u));\n")
43705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  // TODO(gman): Check that ids were inserted;\n")
43715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
43725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
43735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CreateHandler(TypeHandler):
43765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for glCreate___ type functions."""
43775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
43795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
43805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InitFunction(self, func):
43825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
4383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    func.AddCmdArg(Argument("client_id", 'uint32_t'))
43845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
438503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
43865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
43875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
4388010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
43895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s))
43905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(kNewServiceId));
43912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
43922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
43935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s%(comma)skNewClientId);
43945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
43955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
43962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(Get%(resource_type)s(kNewClientId) != NULL);
43975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
43985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
43995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    comma = ""
44005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if len(func.GetOriginalArgs()):
44015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      comma =", "
44025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, {
44035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'comma': comma,
44045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'resource_type': func.name[6:],
440503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        }, *extras)
44065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
4407010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
44085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
44092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
44102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
44115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s%(comma)skNewClientId);
44125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));%(gl_error_test)s
44135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
44145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
44155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteInvalidUnitTest(func, file, invalid_test, {
44165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'comma': comma,
441703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        }, *extras)
44185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation (self, func, file):
44205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
4421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  uint32_t client_id = c.client_id;\n")
44225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  if (!%sHelper(%s)) {\n" %
44235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.name, func.MakeCmdArgString("")))
44245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return error::kInvalidArguments;\n")
44255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
44265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
44285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
44295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("%s GLES2Implementation::%s(%s) {\n" %
44305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.return_type, func.original_name,
44315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                func.MakeTypedOriginalArgString("")))
44325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
44335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteDestinationInitalizationValidation(file)
44345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteClientGLCallLog(func, file)
44355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in func.GetOriginalArgs():
44365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg.WriteClientSideValidationCode(file, func)
44375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  GLuint client_id;\n")
44385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
44395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "  GetIdHandler(id_namespaces::kProgramsAndShaders)->\n")
44405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      MakeIds(this, 0, 1, &client_id);\n")
44415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  helper_->%s(%s);\n" %
44425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.name, func.MakeCmdArgString("")))
44435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write('  GPU_CLIENT_LOG("returned " << client_id);\n')
44442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  CheckGLError();\n")
44455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  return client_id;\n")
44465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
44475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
44485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeleteHandler(TypeHandler):
44515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for glDelete___ single resource type functions."""
44525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
44545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
44555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, func, file):
44575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
44585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
44595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
44615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
44625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("%s GLES2Implementation::%s(%s) {\n" %
44635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.return_type, func.original_name,
44645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                func.MakeTypedOriginalArgString("")))
44655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
44665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteDestinationInitalizationValidation(file)
44675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteClientGLCallLog(func, file)
44685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in func.GetOriginalArgs():
44695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg.WriteClientSideValidationCode(file, func)
44705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
44715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "  GPU_CLIENT_DCHECK(%s != 0);\n" % func.GetOriginalArgs()[-1].name)
44725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  %sHelper(%s);\n" %
44735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.original_name, func.GetOriginalArgs()[-1].name))
44742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  CheckGLError();\n")
44755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
44765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
44775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DELnHandler(TypeHandler):
44805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for glDelete___ type functions."""
44815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
44835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
44845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetDataSizeCode(self, func, file):
44865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
4487010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    code = """  uint32_t data_size;
44885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) {
44895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
44905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
44915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
44925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code)
44935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationUnitTest(self, func, file):
44955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
44965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """
44975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, %(name)s) {
44985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint ids[2] = { k%(types)sStartId, k%(types)sStartId + 1 };
44995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
45002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::%(name)sImmediate del;
45015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GLuint data[2];
45025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
45035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
45045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.del.Init(arraysize(ids), &ids[0]);
45055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.data[0] = k%(types)sStartId;
45065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.data[1] = k%(types)sStartId + 1;
45075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->%(name)s(arraysize(ids), &ids[0]);
45085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
45095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
45115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
45125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'name': func.name,
45135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'types': func.GetInfo('resource_types'),
45145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
45155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
451603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
45175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
45185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
4519010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
45205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(
45215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *gl_,
45225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      %(gl_func_name)s(1, Pointee(kService%(upper_resource_name)sId)))
45235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
45245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetSharedMemoryAs<GLuint*>()[0] = client_%(resource_name)s_id_;
45252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
45262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
45275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
45285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
45295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
45305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
45312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Get%(upper_resource_name)s(client_%(resource_name)s_id_) == NULL);
45325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
45345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, {
45355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'resource_name': func.GetInfo('resource_type').lower(),
45365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'upper_resource_name': func.GetInfo('resource_type'),
453703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        }, *extras)
45385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
4539010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs) {
45405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId;
45412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
45422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
45435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
45445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
45455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
454703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteValidUnitTest(func, file, invalid_test, *extras)
45485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
454903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteImmediateServiceUnitTest(self, func, file, *extras):
45505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
45515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
4552010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
45535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(
45545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *gl_,
45555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      %(gl_func_name)s(1, Pointee(kService%(upper_resource_name)sId)))
45565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(1);
45572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
45582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
45595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(1, &client_%(resource_name)s_id_);
45605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
45615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(cmd, sizeof(client_%(resource_name)s_id_)));
45625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
45635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
45642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Get%(upper_resource_name)s(client_%(resource_name)s_id_) == NULL);
45655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
45675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, {
45685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'resource_name': func.GetInfo('resource_type').lower(),
45695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'upper_resource_name': func.GetInfo('resource_type'),
457003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        }, *extras)
45715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
4572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs) {
45732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
45742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
45755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint temp = kInvalidClientId;
45765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(1, &temp);
45775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
45785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(cmd, sizeof(temp)));
45795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
45805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
458103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteValidUnitTest(func, file, invalid_test, *extras)
45825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation (self, func, file):
45845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
45855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  %sHelper(n, %s);\n" %
45865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.name, func.GetLastOriginalArg().name))
45875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateHandlerImplementation (self, func, file):
45895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
45905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  %sHelper(n, %s);\n" %
45915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.original_name, func.GetLastOriginalArg().name))
45925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
45945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
45955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    impl_decl = func.GetInfo('impl_decl')
45965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if impl_decl == None or impl_decl == True:
45975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      args = {
45985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'return_type': func.return_type,
45995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'name': func.original_name,
46005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'typed_args': func.MakeTypedOriginalArgString(""),
46015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'args': func.MakeOriginalArgString(""),
46025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'resource_type': func.GetInfo('resource_type').lower(),
46035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'count_name': func.GetOriginalArgs()[0].name,
46045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
46055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(
46065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "%(return_type)s GLES2Implementation::%(name)s(%(typed_args)s) {\n" %
46075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          args)
46085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
46095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteDestinationInitalizationValidation(file)
46105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.WriteClientGLCallLog(func, file)
46115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("""  GPU_CLIENT_LOG_CODE_BLOCK({
46125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (GLsizei i = 0; i < n; ++i) {
46135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GPU_CLIENT_LOG("  " << i << ": " << %s[i]);
46145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
46155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
46165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""" % func.GetOriginalArgs()[1].name)
46175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("""  GPU_CLIENT_DCHECK_CODE_BLOCK({
46185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (GLsizei i = 0; i < n; ++i) {
4619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      DCHECK(%s[i] != 0);
46205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
46215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
46225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""" % func.GetOriginalArgs()[1].name)
46235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for arg in func.GetOriginalArgs():
46245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg.WriteClientSideValidationCode(file, func)
46255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      code = """  %(name)sHelper(%(args)s);
46262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckGLError();
46275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
46305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(code % args)
46315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdComputeSize(self, func, file):
46335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
4634010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  static uint32_t ComputeDataSize(GLsizei n) {\n")
46355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
4636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        "    return static_cast<uint32_t>(sizeof(GLuint) * n);  // NOLINT\n")
46375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
46385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
4639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  static uint32_t ComputeSize(GLsizei n) {\n")
4640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    return static_cast<uint32_t>(\n")
46415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("        sizeof(ValueType) + ComputeDataSize(n));  // NOLINT\n")
46425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
46435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
46445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSetHeader(self, func, file):
46465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
46475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void SetHeader(GLsizei n) {\n")
46485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    header.SetCmdByTotalSize<ValueType>(ComputeSize(n));\n")
46495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
46505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
46515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdInit(self, func, file):
46535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
46545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
46555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void Init(%s, %s _%s) {\n" %
46565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.MakeTypedCmdArgString("_"),
46575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                last_arg.type, last_arg.name))
46585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    SetHeader(_n);\n")
46595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetCmdArgs()
46605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in args:
46615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    %s = _%s;\n" % (arg.name, arg.name))
46625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    memcpy(ImmediateDataAddress(this),\n")
46635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("           _%s, ComputeDataSize(_n));\n" % last_arg.name)
46645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
46655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
46665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSet(self, func, file):
46685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
46695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
46705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    copy_args = func.MakeCmdArgString("_", False)
46715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* Set(void* cmd%s, %s _%s) {\n" %
46725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.MakeTypedCmdArgString("_", True),
46735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                last_arg.type, last_arg.name))
46745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" %
46755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (copy_args, last_arg.name))
4676010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    const uint32_t size = ComputeSize(_n);\n")
46775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return NextImmediateCmdAddressTotalSize<ValueType>("
46785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "cmd, size);\n")
46795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
46805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
46815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdHelper(self, func, file):
46835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
46845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """  void %(name)s(%(typed_args)s) {
4685010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const uint32_t size = gles2::cmds::%(name)s::ComputeSize(n);
46862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gles2::cmds::%(name)s* c =
46872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
46885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c) {
46895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c->Init(%(args)s);
46905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
46915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
46925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
46945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
46955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "name": func.name,
46965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "typed_args": func.MakeTypedOriginalArgString(""),
46975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "args": func.MakeOriginalArgString(""),
46985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
46995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateFormatTest(self, func, file):
47015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
47025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
47035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  static GLuint ids[] = { 12, 23, 34, };\n")
47042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
47052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               (func.name, func.name))
47065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* next_cmd = cmd.Set(\n")
47075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      &cmd, static_cast<GLsizei>(arraysize(ids)), ids);\n")
4708010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" %
47092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               func.name)
47105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("            cmd.header.command);\n")
47115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  EXPECT_EQ(sizeof(cmd) +\n")
47125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("            RoundSizeToMultipleOfEntries(cmd.n * 4u),\n")
47135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("            cmd.header.size * 4u);\n")
47145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  EXPECT_EQ(static_cast<GLsizei>(arraysize(ids)), cmd.n);\n");
47155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  CheckBytesWrittenMatchesExpectedSize(\n")
47165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      next_cmd, sizeof(cmd) +\n")
47175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      RoundSizeToMultipleOfEntries(arraysize(ids) * 4u));\n")
47185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  // TODO(gman): Check that ids were inserted;\n")
47195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
47205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
47215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GETnHandler(TypeHandler):
47245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for GETn for glGetBooleanv, glGetFloatv, ... type functions."""
47255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
47275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
47285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4729f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def NeedsDataTransferFunction(self, func):
4730f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    """Overriden from TypeHandler."""
4731f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return False
47325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, func, file):
47345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
47351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.WriteServiceHandlerFunctionHeader(func, file)
47365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
47375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_but_last_args = func.GetOriginalArgs()[:-1]
47395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in all_but_last_args:
47405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg.WriteGetCode(file)
47415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    code = """  typedef cmds::%(func_name)s::Result Result;
47435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei num_values = 0;
47445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNumValuesReturnedForGLGet(pname, &num_values);
47455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetSharedMemoryAs<Result*>(
47465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.params_shm_id, c.params_shm_offset, Result::ComputeSize(num_values));
47475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  %(last_arg_type)s params = result ? result->GetData() : NULL;
47485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
47495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
47505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'last_arg_type': last_arg.type,
47515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'func_name': func.name,
47525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      })
47535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteHandlerValidation(file)
47545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """  // Check that the client initialized the result.
47555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (result->size != 0) {
47565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
47575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
47592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shadowed = func.GetInfo('shadowed')
47602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if not shadowed:
47612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write('  LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("%s");\n' % func.name)
47625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code)
47635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteHandlerImplementation(file)
47642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if shadowed:
47652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      code = """  result->SetNumResults(num_values);
47662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return error::kNoError;
47672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
47682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)"""
47692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else:
47702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     code = """  GLenum error = glGetError();
47715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error == GL_NO_ERROR) {
47725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result->SetNumResults(num_values);
47735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
47742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    LOCAL_SET_GL_ERROR(error, "%(func_name)s", "");
47755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
47765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
47775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
47785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
47802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write(code % {'func_name': func.name})
47815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
47835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
47845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    impl_decl = func.GetInfo('impl_decl')
47855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if impl_decl == None or impl_decl == True:
47865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("%s GLES2Implementation::%s(%s) {\n" %
47875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.return_type, func.original_name,
47885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  func.MakeTypedOriginalArgString("")))
47895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
47905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteDestinationInitalizationValidation(file)
47915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.WriteClientGLCallLog(func, file)
47925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for arg in func.GetOriginalArgs():
47935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg.WriteClientSideValidationCode(file, func)
47945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      all_but_last_args = func.GetOriginalArgs()[:-1]
47955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg_string = (
47965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ", ".join(["%s" % arg.name for arg in all_but_last_args]))
47975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      all_arg_string = (
4798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ", ".join([
4799cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            "%s" % arg.name
4800cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              for arg in func.GetOriginalArgs() if not arg.IsConstant()]))
48012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.WriteTraceEvent(func, file)
48025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      code = """  if (%(func_name)sHelper(%(all_arg_string)s)) {
48035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::%(func_name)s::Result Result;
48065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = GetResultAs<Result*>();
48075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result) {
48085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
48095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
48105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->SetNumResults(0);
48115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_->%(func_name)s(%(arg_string)s,
48125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetResultShmId(), GetResultShmOffset());
48135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WaitForCmd();
48145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->CopyResult(params);
48155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GPU_CLIENT_LOG_CODE_BLOCK({
4816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for (int32_t i = 0; i < result->GetNumResults(); ++i) {
48175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GPU_CLIENT_LOG("  " << i << ": " << result->GetData()[i]);
48185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
48195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  });
48202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckGLError();
48215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
48235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(code % {
48245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'func_name': func.name,
48255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'arg_string': arg_string,
48265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'all_arg_string': all_arg_string,
48275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
48285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationUnitTest(self, func, file):
48305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implemention unit test."""
48315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """
48325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, %(name)s) {
48335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
48342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::%(name)s cmd;
48355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
48362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::%(name)s::Result Result;
48375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result::Type result = 0;
48385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
48395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 = GetExpectedResultMemory(4);
48405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.cmd.Init(%(cmd_args)s, result1.id, result1.offset);
48415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
48425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(SetMemory(result1.ptr, SizedResultHelper<Result::Type>(1)))
48435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
48445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gl_->%(name)s(%(args)s, &result);
48455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
48465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<Result::Type>(1), result);
48475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
4849cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    first_cmd_arg = func.GetCmdArgs()[0].GetValidNonCachedClientSideCmdArg(func)
4850cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if not first_cmd_arg:
4851cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return
4852cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4853cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    first_gl_arg = func.GetCmdArgs()[0].GetValidNonCachedClientSideArg(func)
4854cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    cmd_arg_strings = [first_cmd_arg]
4855cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in func.GetCmdArgs()[1:-2]:
4856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      cmd_arg_strings.append(arg.GetValidClientSideCmdArg(func))
4857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gl_arg_strings = [first_gl_arg]
4858cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in func.GetOriginalArgs()[1:-1]:
4859cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gl_arg_strings.append(arg.GetValidClientSideArg(func))
4860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
48615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
48625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'name': func.name,
48635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'args': ", ".join(gl_arg_strings),
48645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'cmd_args': ", ".join(cmd_arg_strings),
48655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
48665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
486703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
48685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
48695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
4870010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
48715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, GetError())
48725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
48735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(Return(GL_NO_ERROR))
48745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
48752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
48762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef cmds::%(name)s::Result Result;
48775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result = static_cast<Result*>(shared_memory_address_);
48785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(local_gl_args)s));
48795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->size = 0;
48802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
48815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
48825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
48835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(decoder_->GetGLES2Util()->GLGetNumValuesReturned(
48845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                %(valid_pname)s),
48855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            result->GetNumResults());
48865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
48875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
48885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
48895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_arg_strings = []
48905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_pname = ''
4891cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in func.GetOriginalArgs()[:-1]:
4892cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg_value = arg.GetValidGLArg(func)
48935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_arg_strings.append(arg_value)
48945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if arg.name == 'pname':
48955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        valid_pname = arg_value
48965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if func.GetInfo('gl_test_func') == 'glGetIntegerv':
48975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_arg_strings.append("_")
48985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
48995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_arg_strings.append("result->GetData()")
49005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, {
49025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'local_gl_args': ", ".join(gl_arg_strings),
49035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'valid_pname': valid_pname,
490403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      }, *extras)
49055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
4907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
49085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
49092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
49102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s::Result* result =
49112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<cmds::%(name)s::Result*>(shared_memory_address_);
49125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result->size = 0;
49132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
49145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
49155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));
49165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0u, result->size);%(gl_error_test)s
49175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
491903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
49205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4921cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ArrayArgTypeHandler(TypeHandler):
4922cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  """Base class for type handlers that handle args that are arrays"""
49235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4924cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def __init__(self):
4925cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    TypeHandler.__init__(self)
4926cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4927cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetArrayType(self, func):
4928cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Returns the type of the element in the element array being PUT to."""
4929cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in func.GetOriginalArgs():
4930cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if arg.IsPointer():
4931cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        element_type = arg.GetPointedType()
4932cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        return element_type
4933cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4934cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # Special case: array type handler is used for a function that is forwarded
4935cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # to the actual array type implementation
4936cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    element_type = func.GetOriginalArgs()[-1].type
4937cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert all(arg.type == element_type \
4938cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               for arg in func.GetOriginalArgs()[-self.GetArrayCount(func):])
4939cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return element_type
4940cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetArrayCount(self, func):
4942cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Returns the count of the elements in the array being PUT to."""
4943cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return func.GetInfo('count')
4944cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4945cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PUTHandler(ArrayArgTypeHandler):
49465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for glTexParameter_v, glVertexAttrib_v functions."""
49475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
4949cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ArrayArgTypeHandler.__init__(self)
49505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
49525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service unit test for a command."""
49532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    expected_call = "EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));"
49542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if func.GetInfo("first_element_only"):
4955cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gl_arg_strings = [
4956cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        arg.GetValidGLArg(func) for arg in func.GetOriginalArgs()
4957cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ]
49582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gl_arg_strings[-1] = "*" + gl_arg_strings[-1]
49592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      expected_call = ("EXPECT_CALL(*gl_, %%(gl_func_name)s(%s));" %
49602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ", ".join(gl_arg_strings))
49615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
4962010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
49632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
49642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
49655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
49665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetSharedMemoryAs<%(data_type)s*>()[0] = %(data_value)s;
49672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  %(expected_call)s
49685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
49695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
49705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
49725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extra = {
4973cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      'data_type': self.GetArrayType(func),
49745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'data_value': func.GetInfo('data_value') or '0',
49752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'expected_call': expected_call,
49765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
497703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
49785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
4980010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
49815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
49822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
49832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
49845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
49855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetSharedMemoryAs<%(data_type)s*>()[0] = %(data_value)s;
49865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
49875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
498903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteInvalidUnitTest(func, file, invalid_test, extra, *extras)
49905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
499103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteImmediateServiceUnitTest(self, func, file, *extras):
49925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service unit test for a command."""
49935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
4994010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
49952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
49962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
49975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  %(data_type)s temp[%(data_count)s] = { %(data_value)s, };
49985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(gl_args)s, &temp[0]);
49992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_CALL(
50002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      *gl_,
50012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      %(gl_func_name)s(%(gl_args)s, %(data_ref)sreinterpret_cast<
50022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          %(data_type)s*>(ImmediateDataAddress(&cmd))));
50035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
50045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(cmd, sizeof(temp)));
50055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
50065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
5008cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gl_arg_strings = [
5009cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg.GetValidGLArg(func) for arg in func.GetOriginalArgs()[0:-1]
5010cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ]
5011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gl_any_strings = ["_"] * len(gl_arg_strings)
5012cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
50135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extra = {
50142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'data_ref': ("*" if func.GetInfo('first_element_only') else ""),
5015cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      'data_type': self.GetArrayType(func),
5016cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      'data_count': self.GetArrayCount(func),
50175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'data_value': func.GetInfo('data_value') or '0',
50185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'gl_args': ", ".join(gl_arg_strings),
50195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'gl_any_args': ", ".join(gl_any_strings),
50205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
502103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
50225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
5024010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
50252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
50265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_any_args)s, _)).Times(0);
50272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
50285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  %(data_type)s temp[%(data_count)s] = { %(data_value)s, };
50295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(all_but_last_args)s, &temp[0]);
50305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::%(parse_result)s,
50315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(cmd, sizeof(temp)));%(gl_error_test)s
50325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
503403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteInvalidUnitTest(func, file, invalid_test, extra, *extras)
50355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetDataSizeCode(self, func, file):
50375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
5038010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    code = """  uint32_t data_size;
50395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(1, sizeof(%s), %d, &data_size)) {
50405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
50415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
5043cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func)))
5044cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if func.IsImmediate():
50455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  if (data_size > immediate_data_size) {\n")
50465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    return error::kOutOfBounds;\n")
50475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  }\n")
50485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
50505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
50515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    impl_func = func.GetInfo('impl_func')
50525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (impl_func != None and impl_func != True):
50535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
50545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("%s GLES2Implementation::%s(%s) {\n" %
50555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.return_type, func.original_name,
50565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                func.MakeTypedOriginalArgString("")))
50575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
50585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteDestinationInitalizationValidation(file)
50595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteClientGLCallLog(func, file)
50605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg_name = func.GetLastOriginalArg().name
50615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values_str = ' << ", " << '.join(
5062cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ["%s[%d]" % (last_arg_name, ndx) \
5063cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         for ndx in range(0, self.GetArrayCount(func))])
50645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write('  GPU_CLIENT_LOG("values: " << %s);\n' % values_str)
50655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in func.GetOriginalArgs():
50665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg.WriteClientSideValidationCode(file, func)
50675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  helper_->%sImmediate(%s);\n" %
50685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.name, func.MakeOriginalArgString("")))
50692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  CheckGLError();\n")
50705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
50715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
50725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationUnitTest(self, func, file):
50745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implemention unit test."""
50755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    client_test = func.GetInfo('client_test')
50765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (client_test != None and client_test != True):
50775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
50785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """
50795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, %(name)s) {
50807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  %(type)s data[%(count)d] = {0};
50815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
50822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::%(name)sImmediate cmd;
50835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    %(type)s data[%(count)d];
50845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
50855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int jj = 0; jj < %(count)d; ++jj) {
50877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    data[jj] = static_cast<%(type)s>(jj);
50885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
50897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Cmds expected;
50907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  expected.cmd.Init(%(cmd_args)s, &data[0]);
50917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gl_->%(name)s(%(args)s, &data[0]);
50925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
50935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
50945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
5095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    cmd_arg_strings = [
5096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg.GetValidClientSideCmdArg(func) for arg in func.GetCmdArgs()[0:-2]
5097cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ]
5098cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gl_arg_strings = [
5099cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg.GetValidClientSideArg(func) for arg in func.GetOriginalArgs()[0:-1]
5100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ]
5101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
51025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
51035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'name': func.name,
5104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          'type': self.GetArrayType(func),
5105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          'count': self.GetArrayCount(func),
51065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'args': ", ".join(gl_arg_strings),
51075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'cmd_args': ", ".join(cmd_arg_strings),
51085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
51095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdComputeSize(self, func, file):
51115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
5112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  static uint32_t ComputeDataSize() {\n")
5113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    return static_cast<uint32_t>(\n")
51145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("        sizeof(%s) * %d);  // NOLINT\n" %
5115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               (self.GetArrayType(func), self.GetArrayCount(func)))
51165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
51175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
5118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  static uint32_t ComputeSize() {\n")
5119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    return static_cast<uint32_t>(\n")
51205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
51215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "        sizeof(ValueType) + ComputeDataSize());  // NOLINT\n")
51225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
51235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
51245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSetHeader(self, func, file):
51265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
51275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void SetHeader() {\n")
51285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
51295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "    header.SetCmdByTotalSize<ValueType>(ComputeSize());\n")
51305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
51315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
51325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdInit(self, func, file):
51345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
51355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
51365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void Init(%s, %s _%s) {\n" %
51375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.MakeTypedCmdArgString("_"),
51385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                last_arg.type, last_arg.name))
51395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    SetHeader();\n")
51405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetCmdArgs()
51415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in args:
51425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    %s = _%s;\n" % (arg.name, arg.name))
51435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    memcpy(ImmediateDataAddress(this),\n")
51445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("           _%s, ComputeDataSize());\n" % last_arg.name)
51455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
51465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
51475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSet(self, func, file):
51495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
51505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
51515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    copy_args = func.MakeCmdArgString("_", False)
51525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* Set(void* cmd%s, %s _%s) {\n" %
51535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.MakeTypedCmdArgString("_", True),
51545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                last_arg.type, last_arg.name))
51555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" %
51565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (copy_args, last_arg.name))
5157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    const uint32_t size = ComputeSize();\n")
51585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return NextImmediateCmdAddressTotalSize<ValueType>("
51595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "cmd, size);\n")
51605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
51615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
51625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdHelper(self, func, file):
51645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
51655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """  void %(name)s(%(typed_args)s) {
5166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const uint32_t size = gles2::cmds::%(name)s::ComputeSize();
51672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gles2::cmds::%(name)s* c =
51682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
51695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c) {
51705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c->Init(%(args)s);
51715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
51725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
51735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
51755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
51765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "name": func.name,
51775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "typed_args": func.MakeTypedOriginalArgString(""),
51785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "args": func.MakeOriginalArgString(""),
51795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
51805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateFormatTest(self, func, file):
51825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
51835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
51845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  const int kSomeBaseValueToTestWith = 51;\n")
5185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file.Write("  static %s data[] = {\n" % self.GetArrayType(func))
5186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for v in range(0, self.GetArrayCount(func)):
51875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" %
5188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 (self.GetArrayType(func), v))
51895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  };\n")
51902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
51912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               (func.name, func.name))
51925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* next_cmd = cmd.Set(\n")
51935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      &cmd")
51945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetCmdArgs()
51955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for value, arg in enumerate(args):
51965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(",\n      static_cast<%s>(%d)" % (arg.type, value + 11))
51975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(",\n      data);\n")
51985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetCmdArgs()
5199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n"
52002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               % func.name)
52015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("            cmd.header.command);\n")
52025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  EXPECT_EQ(sizeof(cmd) +\n")
52035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("            RoundSizeToMultipleOfEntries(sizeof(data)),\n")
52045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("            cmd.header.size * 4u);\n")
52055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for value, arg in enumerate(args):
52065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
52075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (arg.type, value + 11, arg.name))
52085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  CheckBytesWrittenMatchesExpectedSize(\n")
52095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      next_cmd, sizeof(cmd) +\n")
52105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      RoundSizeToMultipleOfEntries(sizeof(data)));\n")
52115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  // TODO(gman): Check that data was inserted;\n")
52125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
52135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
52145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PUTnHandler(ArrayArgTypeHandler):
52175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for PUTn 'glUniform__v' type functions."""
52185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
5220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ArrayArgTypeHandler.__init__(self)
52215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
522203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
52235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from TypeHandler."""
522403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ArrayArgTypeHandler.WriteServiceUnitTest(self, func, file, *extras)
52255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
5227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgsCountTooLarge) {
52285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
52292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
52302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
52315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
52325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
52335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
52345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
52365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_arg_strings = []
52375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg_strings = []
52385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for count, arg in enumerate(func.GetOriginalArgs()):
52395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # hardcoded to match unit tests.
52405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if count == 0:
52415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # the location of the second element of the 2nd uniform.
52425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # defined in GLES2DecoderBase::SetupShaderForUniform
52435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_arg_strings.append("3")
52445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg_strings.append("ProgramManager::MakeFakeLocation(1, 1)")
52455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      elif count == 1:
52465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # the number of elements that gl will be called with.
52475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gl_arg_strings.append("3")
52485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # the number of elements requested in the command.
52495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg_strings.append("5")
52505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
5251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        gl_arg_strings.append(arg.GetValidGLArg(func))
5252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        if not arg.IsConstant():
5253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          arg_strings.append(arg.GetValidArg(func))
52545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extra = {
52555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'gl_args': ", ".join(gl_arg_strings),
52565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'args': ", ".join(arg_strings),
52575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
525803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
52595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
526003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteImmediateServiceUnitTest(self, func, file, *extras):
52615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from TypeHandler."""
52625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
5263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
52642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
52655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(
52665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *gl_,
52675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      %(gl_func_name)s(%(gl_args)s,
52685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reinterpret_cast<%(data_type)s*>(ImmediateDataAddress(&cmd))));
52692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
52705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  %(data_type)s temp[%(data_count)s * 2] = { 0, };
52715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s, &temp[0]);
52725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError,
52735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(cmd, sizeof(temp)));
52745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
52755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
52765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
52775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_arg_strings = []
52785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_any_strings = []
52795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg_strings = []
5280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in func.GetOriginalArgs()[0:-1]:
5281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gl_arg_strings.append(arg.GetValidGLArg(func))
52825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_any_strings.append("_")
5283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if not arg.IsConstant():
5284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        arg_strings.append(arg.GetValidArg(func))
52855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extra = {
5286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      'data_type': self.GetArrayType(func),
5287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      'data_count': self.GetArrayCount(func),
52885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'args': ", ".join(arg_strings),
52895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'gl_args': ", ".join(gl_arg_strings),
52905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'gl_any_args': ", ".join(gl_any_strings),
52915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
529203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
52935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
5295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
52962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
52975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_any_args)s, _)).Times(0);
52982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
52995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  %(data_type)s temp[%(data_count)s * 2] = { 0, };
53005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(all_but_last_args)s, &temp[0]);
53015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::%(parse_result)s,
53025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ExecuteImmediateCmd(cmd, sizeof(temp)));%(gl_error_test)s
53035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
530503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteInvalidUnitTest(func, file, invalid_test, extra, *extras)
53065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetDataSizeCode(self, func, file):
53085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
5309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    code = """  uint32_t data_size;
53105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ComputeDataSize(count, sizeof(%s), %d, &data_size)) {
53115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
53125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
5314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file.Write(code % (self.GetArrayType(func), self.GetArrayCount(func)))
5315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if func.IsImmediate():
53165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  if (data_size > immediate_data_size) {\n")
53175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    return error::kOutOfBounds;\n")
53185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  }\n")
53195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
53215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
53225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("%s GLES2Implementation::%s(%s) {\n" %
53235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.return_type, func.original_name,
53245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                func.MakeTypedOriginalArgString("")))
53255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
53265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteDestinationInitalizationValidation(file)
53275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteClientGLCallLog(func, file)
53285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg_name = func.GetLastOriginalArg().name
53295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("""  GPU_CLIENT_LOG_CODE_BLOCK({
53305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (GLsizei i = 0; i < count; ++i) {
53315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
53325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values_str = ' << ", " << '.join(
53335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ["%s[%d + i * %d]" % (
5334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            last_arg_name, ndx, self.GetArrayCount(func)) for ndx in range(
5335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                0, self.GetArrayCount(func))])
53365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write('       GPU_CLIENT_LOG("  " << i << ": " << %s);\n' % values_str)
53375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    }\n  });\n")
53385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in func.GetOriginalArgs():
53395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg.WriteClientSideValidationCode(file, func)
53405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  helper_->%sImmediate(%s);\n" %
5341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               (func.name, func.MakeInitString("")))
53422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  CheckGLError();\n")
53435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
53445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
53455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationUnitTest(self, func, file):
53475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implemention unit test."""
53485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """
53495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, %(name)s) {
53507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  %(type)s data[%(count_param)d][%(count)d] = {{0}};
53515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
53522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::%(name)sImmediate cmd;
53532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    %(type)s data[%(count_param)d][%(count)d];
53545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
53555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
53572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int ii = 0; ii < %(count_param)d; ++ii) {
53585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int jj = 0; jj < %(count)d; ++jj) {
53597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      data[ii][jj] = static_cast<%(type)s>(ii * %(count)d + jj);
53605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
53615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
53627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  expected.cmd.Init(%(cmd_args)s, &data[0][0]);
53637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  gl_->%(name)s(%(args)s, &data[0][0]);
53645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
53655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
53665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
5367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    cmd_arg_strings = [
5368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg.GetValidClientSideCmdArg(func) for arg in func.GetCmdArgs()[0:-2]
5369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ]
53705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_arg_strings = []
53712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    count_param = 0
5372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in func.GetOriginalArgs()[0:-1]:
5373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      valid_value = arg.GetValidClientSideArg(func)
5374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gl_arg_strings.append(valid_value)
53752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if arg.name == "count":
5376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        count_param = int(valid_value)
53775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
53785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'name': func.name,
5379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          'type': self.GetArrayType(func),
5380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          'count': self.GetArrayCount(func),
53815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'args': ", ".join(gl_arg_strings),
53825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'cmd_args': ", ".join(cmd_arg_strings),
53832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          'count_param': count_param,
53845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
53855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # Test constants for invalid values, as they are not tested by the
5387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # service.
5388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    constants = [
5389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg for arg in func.GetOriginalArgs()[0:-1] if arg.IsConstant()
5390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ]
5391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if not constants:
5392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return
5393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    code = """
5395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(GLES2ImplementationTest, %(name)sInvalidConstantArg%(invalid_index)d) {
5396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  %(type)s data[%(count_param)d][%(count)d] = {{0}};
5397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (int ii = 0; ii < %(count_param)d; ++ii) {
5398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (int jj = 0; jj < %(count)d; ++jj) {
5399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      data[ii][jj] = static_cast<%(type)s>(ii * %(count)d + jj);
5400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
5401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
5402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gl_->%(name)s(%(args)s, &data[0][0]);
5403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(NoCommandsWritten());
5404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(%(gl_error)s, CheckError());
5405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
5406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)"""
5407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for invalid_arg in constants:
5408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gl_arg_strings = []
5409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      invalid = invalid_arg.GetInvalidArg(func)
5410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      for arg in func.GetOriginalArgs()[0:-1]:
5411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        if arg is invalid_arg:
5412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          gl_arg_strings.append(invalid[0])
5413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        else:
5414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          valid_value = arg.GetValidClientSideArg(func)
5415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          gl_arg_strings.append(valid_value)
5416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          if arg.name == "count":
5417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            count_param = int(valid_value)
5418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      file.Write(code % {
5420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'name': func.name,
5421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'invalid_index': func.GetOriginalArgs().index(invalid_arg),
5422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'type': self.GetArrayType(func),
5423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'count': self.GetArrayCount(func),
5424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'args': ", ".join(gl_arg_strings),
5425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'gl_error': invalid[2],
5426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'count_param': count_param,
5427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      })
5428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
54305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdComputeSize(self, func, file):
54315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
5432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  static uint32_t ComputeDataSize(GLsizei count) {\n")
5433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    return static_cast<uint32_t>(\n")
54345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("        sizeof(%s) * %d * count);  // NOLINT\n" %
5435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               (self.GetArrayType(func), self.GetArrayCount(func)))
54365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
54375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
5438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  static uint32_t ComputeSize(GLsizei count) {\n")
5439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    return static_cast<uint32_t>(\n")
54405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
54415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "        sizeof(ValueType) + ComputeDataSize(count));  // NOLINT\n")
54425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
54435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
54445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSetHeader(self, func, file):
54465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
54475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void SetHeader(GLsizei count) {\n")
54485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
54495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "    header.SetCmdByTotalSize<ValueType>(ComputeSize(count));\n")
54505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
54515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
54525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdInit(self, func, file):
54545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
54555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
54565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void Init(%s, %s _%s) {\n" %
54575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.MakeTypedCmdArgString("_"),
54585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                last_arg.type, last_arg.name))
54595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    SetHeader(_count);\n")
54605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetCmdArgs()
54615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in args:
54625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    %s = _%s;\n" % (arg.name, arg.name))
54635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    memcpy(ImmediateDataAddress(this),\n")
54645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("           _%s, ComputeDataSize(_count));\n" % last_arg.name)
54655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
54665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
54675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSet(self, func, file):
54695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
54705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
54715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    copy_args = func.MakeCmdArgString("_", False)
54725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* Set(void* cmd%s, %s _%s) {\n" %
54735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.MakeTypedCmdArgString("_", True),
54745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                last_arg.type, last_arg.name))
54755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    static_cast<ValueType*>(cmd)->Init(%s, _%s);\n" %
54765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (copy_args, last_arg.name))
5477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    const uint32_t size = ComputeSize(_count);\n")
54785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return NextImmediateCmdAddressTotalSize<ValueType>("
54795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "cmd, size);\n")
54805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
54815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
54825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdHelper(self, func, file):
54845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
54855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """  void %(name)s(%(typed_args)s) {
5486010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const uint32_t size = gles2::cmds::%(name)s::ComputeSize(count);
54872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gles2::cmds::%(name)s* c =
54882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetImmediateCmdSpaceTotalSize<gles2::cmds::%(name)s>(size);
54895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c) {
54905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c->Init(%(args)s);
54915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
54925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
54935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
54955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
54965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "name": func.name,
5497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          "typed_args": func.MakeTypedInitString(""),
5498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          "args": func.MakeInitString("")
54995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
55005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateFormatTest(self, func, file):
55025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
55032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    args = func.GetCmdArgs()
55042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    count_param = 0
5505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in args:
55062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if arg.name == "count":
5507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        count_param = int(arg.GetValidClientSideCmdArg(func))
55085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("TEST_F(GLES2FormatTest, %s) {\n" % func.name)
55095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  const int kSomeBaseValueToTestWith = 51;\n")
5510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file.Write("  static %s data[] = {\n" % self.GetArrayType(func))
5511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for v in range(0, self.GetArrayCount(func) * count_param):
55125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    static_cast<%s>(kSomeBaseValueToTestWith + %d),\n" %
5513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 (self.GetArrayType(func), v))
55145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  };\n")
55152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  cmds::%s& cmd = *GetBufferAs<cmds::%s>();\n" %
55162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               (func.name, func.name))
55172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  const GLsizei kNumElements = %d;\n" % count_param)
55185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  const size_t kExpectedCmdSize =\n")
55195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      sizeof(cmd) + kNumElements * sizeof(%s) * %d;\n" %
5520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               (self.GetArrayType(func), self.GetArrayCount(func)))
55215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* next_cmd = cmd.Set(\n")
55225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      &cmd")
55235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for value, arg in enumerate(args):
55245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(",\n      static_cast<%s>(%d)" % (arg.type, value + 1))
55255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(",\n      data);\n")
5526010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  EXPECT_EQ(static_cast<uint32_t>(cmds::%s::kCmdId),\n" %
55272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               func.name)
55285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("            cmd.header.command);\n")
55295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  EXPECT_EQ(kExpectedCmdSize, cmd.header.size * 4u);\n")
55305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for value, arg in enumerate(args):
55315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  EXPECT_EQ(static_cast<%s>(%d), cmd.%s);\n" %
55325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (arg.type, value + 1, arg.name))
55335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  CheckBytesWrittenMatchesExpectedSize(\n")
55345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      next_cmd, sizeof(cmd) +\n")
55355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      RoundSizeToMultipleOfEntries(sizeof(data)));\n")
55365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  // TODO(gman): Check that data was inserted;\n")
55375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
55385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
55395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class PUTXnHandler(ArrayArgTypeHandler):
55425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for glUniform?f functions."""
55435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
5544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ArrayArgTypeHandler.__init__(self)
55455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation(self, func, file):
55475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
55485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """  %(type)s temp[%(count)s] = { %(values)s};
55495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Do%(name)sv(%(location)s, 1, &temp[0]);
55505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
55515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values = ""
55525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetOriginalArgs()
5553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    count = int(self.GetArrayCount(func))
55545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_args = len(args)
55555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for ii in range(count):
55565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      values += "%s, " % args[len(args) - count + ii].name
55575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
55595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': func.name,
5560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'count': self.GetArrayCount(func),
5561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'type': self.GetArrayType(func),
55625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'location': args[0].name,
55635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'args': func.MakeOriginalArgString(""),
55645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'values': values,
55655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      })
55665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
556703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
55685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
55695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
5570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
55715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(name)sv(%(local_args)s));
55722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
55732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
55745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
55755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
55765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
55775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
55795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetOriginalArgs()
5580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    local_args = "%s, 1, _" % args[0].GetValidGLArg(func)
55815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, {
55825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': func.name,
5583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'count': self.GetArrayCount(func),
55845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'local_args': local_args,
558503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      }, *extras)
55865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
5588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
55895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(name)sv(_, _, _).Times(0);
55902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
55912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
55925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
55935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
55945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
55955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
55965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteInvalidUnitTest(func, file, invalid_test, {
55975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': func.GetInfo('name'),
5598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'count': self.GetArrayCount(func),
55995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      })
56005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLcharHandler(CustomHandler):
56035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for functions that pass a single string ."""
56045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
56065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CustomHandler.__init__(self)
56075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdComputeSize(self, func, file):
56095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
5610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  static uint32_t ComputeSize(uint32_t data_size) {\n")
5611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("    return static_cast<uint32_t>(\n")
56125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("        sizeof(ValueType) + data_size);  // NOLINT\n")
56135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
56145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSetHeader(self, func, file):
56165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
56175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """
5618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void SetHeader(uint32_t data_size) {
56195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    header.SetCmdBySize<ValueType>(data_size);
56205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
56225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code)
56235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdInit(self, func, file):
56255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
56265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
56275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetCmdArgs()
56285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_code = []
56295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in args:
56305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      set_code.append("    %s = _%s;" % (arg.name, arg.name))
56315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """
5632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void Init(%(typed_args)s, uint32_t _data_size) {
56335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetHeader(_data_size);
56345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%(set_code)s
56355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(ImmediateDataAddress(this), _%(last_arg)s, _data_size);
56365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
56395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
5640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          "typed_args": func.MakeTypedArgString("_"),
56415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "set_code": "\n".join(set_code),
56425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "last_arg": last_arg.name
56435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
56445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdSet(self, func, file):
56465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
56475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_arg = func.GetLastOriginalArg()
5648010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  void* Set(void* cmd%s, uint32_t _data_size) {\n" %
5649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               func.MakeTypedCmdArgString("_", True))
56505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    static_cast<ValueType*>(cmd)->Init(%s, _data_size);\n" %
5651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               func.MakeCmdArgString("_"))
56525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return NextImmediateCmdAddress<ValueType>("
56535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "cmd, _data_size);\n")
56545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
56555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
56565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateCmdHelper(self, func, file):
56585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
56595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """  void %(name)s(%(typed_args)s) {
5660010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const uint32_t data_size = strlen(name);
56612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gles2::cmds::%(name)s* c =
56622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        GetImmediateCmdSpace<gles2::cmds::%(name)s>(data_size);
56635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (c) {
56645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c->Init(%(args)s, data_size);
56655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
56665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
56675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
56695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
56705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "name": func.name,
56715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "typed_args": func.MakeTypedOriginalArgString(""),
56725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "args": func.MakeOriginalArgString(""),
56735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
56745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteImmediateFormatTest(self, func, file):
56775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
56785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    init_code = []
56795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    check_code = []
56805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_but_last_arg = func.GetCmdArgs()[:-1]
56815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for value, arg in enumerate(all_but_last_arg):
56825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      init_code.append("      static_cast<%s>(%d)," % (arg.type, value + 11))
56835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for value, arg in enumerate(all_but_last_arg):
56845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      check_code.append("  EXPECT_EQ(static_cast<%s>(%d), cmd.%s);" %
56855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        (arg.type, value + 11, arg.name))
56865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """
56875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2FormatTest, %(func_name)s) {
56882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(func_name)s& cmd = *GetBufferAs<cmds::%(func_name)s>();
56895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char* const test_str = \"test string\";
56905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* next_cmd = cmd.Set(
56915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &cmd,
56925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%(init_code)s
56935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test_str,
56945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      strlen(test_str));
5695010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<uint32_t>(cmds::%(func_name)s::kCmdId),
56965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cmd.header.command);
56975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(sizeof(cmd) +
56985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            RoundSizeToMultipleOfEntries(strlen(test_str)),
56995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            cmd.header.size * 4u);
57005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(static_cast<char*>(next_cmd),
57015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            reinterpret_cast<char*>(&cmd) + sizeof(cmd) +
57025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                RoundSizeToMultipleOfEntries(strlen(test_str)));
57035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%(check_code)s
5704010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(static_cast<uint32_t>(strlen(test_str)), cmd.data_size);
57055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(test_str, ImmediateDataAddress(&cmd), strlen(test_str)));
57065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckBytesWritten(
57075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      next_cmd,
57085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sizeof(cmd) + RoundSizeToMultipleOfEntries(strlen(test_str)),
57095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sizeof(cmd) + strlen(test_str));
57105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
57135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
57145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'func_name': func.name,
57155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'init_code': "\n".join(init_code),
57165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'check_code': "\n".join(check_code),
57175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        })
57185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLcharNHandler(CustomHandler):
57215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for functions that pass a single string with an optional len."""
57225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
57245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CustomHandler.__init__(self)
57255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InitFunction(self, func):
57275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
57285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.cmd_args = []
57295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.AddCmdArg(Argument('bucket_id', 'GLuint'))
57305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5731f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def NeedsDataTransferFunction(self, func):
5732f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    """Overriden from TypeHandler."""
5733f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return False
57345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def AddBucketFunction(self, generator, func):
57365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
57375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
57385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, func, file):
57405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
57411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.WriteServiceHandlerFunctionHeader(func, file)
57421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    file.Write("""
57435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLuint bucket_id = static_cast<GLuint>(c.%(bucket_id)s);
57445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bucket* bucket = GetBucket(bucket_id);
57455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!bucket || bucket->size() == 0) {
57465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
57475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string str;
57495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!bucket->GetAsString(&str)) {
57505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
57515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
57525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  %(gl_func_name)s(0, str.c_str());
57535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return error::kNoError;
57545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""" % {
57575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'name': func.name,
57585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'gl_func_name': func.GetGLFunctionName(),
57595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'bucket_id': func.cmd_args[0].name,
57605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  })
57615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IsHandler(TypeHandler):
57645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for glIs____ type and glGetError functions."""
57655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
57675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
57685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InitFunction(self, func):
57705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
5771010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    func.AddCmdArg(Argument("result_shm_id", 'uint32_t'))
5772010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    func.AddCmdArg(Argument("result_shm_offset", 'uint32_t'))
57735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if func.GetInfo('result') == None:
5774010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      func.AddInfo('result', ['uint32_t'])
57755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
577603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
57775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
57785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
5779010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
57805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));
57812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
57822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
57835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s%(comma)sshared_memory_id_, shared_memory_offset_);
57845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
57855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
57865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
57875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
57885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    comma = ""
57895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if len(func.GetOriginalArgs()):
57905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      comma =", "
57915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, {
57925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'comma': comma,
579303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        }, *extras)
57945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
5796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
57975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
57982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
57992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
58005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s%(comma)sshared_memory_id_, shared_memory_offset_);
58015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
58025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
58045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteInvalidUnitTest(func, file, invalid_test, {
58055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'comma': comma,
580603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        }, *extras)
58075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
5809010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgsBadSharedMemoryId) {
58105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
58112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(false);
58122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
58135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s%(comma)skInvalidSharedMemoryId, shared_memory_offset_);
58145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
58155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s%(comma)sshared_memory_id_, kInvalidSharedMemoryOffset);
58165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd));
58175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
58185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
58195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidUnitTest(func, file, invalid_test, {
58205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          'comma': comma,
582103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        }, *extras)
58225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, func, file):
58245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
58251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self.WriteServiceHandlerFunctionHeader(func, file)
58265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetOriginalArgs()
58275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in args:
58285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg.WriteGetCode(file)
58295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    code = """  typedef cmds::%(func_name)s::Result Result;
58315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Result* result_dst = GetSharedMemoryAs<Result*>(
58325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      c.result_shm_id, c.result_shm_offset, sizeof(*result_dst));
58335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result_dst) {
58345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kOutOfBounds;
58355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
58365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
58375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {'func_name': func.name})
58385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteHandlerValidation(file)
58395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  *result_dst = %s(%s);\n" %
58405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
58415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  return error::kNoError;\n")
58425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
58435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
58445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
58465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
58475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    impl_func = func.GetInfo('impl_func')
58485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if impl_func == None or impl_func == True:
58495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      error_value = func.GetInfo("error_value") or "GL_FALSE"
58505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("%s GLES2Implementation::%s(%s) {\n" %
58515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.return_type, func.original_name,
58525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  func.MakeTypedOriginalArgString("")))
58535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  GPU_CLIENT_SINGLE_THREAD_CHECK();\n")
58542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.WriteTraceEvent(func, file)
58555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteDestinationInitalizationValidation(file)
58565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.WriteClientGLCallLog(func, file)
58572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("  typedef cmds::%s::Result Result;\n" % func.name)
58585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  Result* result = GetResultAs<Result*>();\n")
58595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  if (!result) {\n")
58605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    return %s;\n" % error_value)
58615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  }\n")
58625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  *result = 0;\n")
58635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg_string = func.MakeOriginalArgString("")
58645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      comma = ""
58655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if len(arg_string) > 0:
58665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        comma = ", "
58675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(
58685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "  helper_->%s(%s%sGetResultShmId(), GetResultShmOffset());\n" %
58695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (func.name, arg_string, comma))
58705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  WaitForCmd();\n")
58712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("  %s result_value = *result;\n" % func.return_type)
58722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write('  GPU_CLIENT_LOG("returned " << result_value);\n')
58732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("  CheckGLError();\n")
58742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("  return result_value;\n")
58755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("}\n")
58765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("\n")
58775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationUnitTest(self, func, file):
58795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
58805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    client_test = func.GetInfo('client_test')
58815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if client_test == None or client_test == True:
58825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      code = """
58835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(GLES2ImplementationTest, %(name)s) {
58845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct Cmds {
58852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    cmds::%(name)s cmd;
58865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
58875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Cmds expected;
58895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectedMemoryInfo result1 =
58902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetExpectedResultMemory(sizeof(cmds::%(name)s::Result));
58915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected.cmd.Init(1, result1.id, result1.offset);
58925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*command_buffer(), OnFlush())
5894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      .WillOnce(SetMemory(result1.ptr, uint32_t(1)))
58955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .RetiresOnSaturation();
58965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLboolean result = gl_->%(name)s(1);
58985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
58995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(result);
59005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
59025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(code % {
59035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            'name': func.name,
59045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          })
59055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class STRnHandler(TypeHandler):
59085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Handler for GetProgramInfoLog, GetShaderInfoLog, GetShaderSource, and
59095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetTranslatedShaderSourceANGLE."""
59105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self):
59125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TypeHandler.__init__(self)
59135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InitFunction(self, func):
59155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
59165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # remove all but the first cmd args.
59175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd_args = func.GetCmdArgs()
59185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.ClearCmdArgs()
59195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.AddCmdArg(cmd_args[0])
59205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # add on a bucket id.
5921010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    func.AddCmdArg(Argument('bucket_id', 'uint32_t'))
59225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, func, file):
59245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
59255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code_1 = """%(return_type)s GLES2Implementation::%(func_name)s(%(args)s) {
59265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GPU_CLIENT_SINGLE_THREAD_CHECK();
59275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
59285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code_2 = """  GPU_CLIENT_LOG("[" << GetLogPrefix()
59295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "] gl%(func_name)s" << "("
59305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << %(arg0)s << ", "
59315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << %(arg1)s << ", "
59325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << static_cast<void*>(%(arg2)s) << ", "
59335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << static_cast<void*>(%(arg3)s) << ")");
59345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_->SetBucketSize(kResultBucketId, 0);
59355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_->%(func_name)s(%(id_name)s, kResultBucketId);
59365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string str;
59375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GLsizei max_size = 0;
59385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetBucketAsString(kResultBucketId, &str)) {
59395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (bufsize > 0) {
59405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      max_size =
59415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          std::min(static_cast<size_t>(%(bufsize_name)s) - 1, str.size());
59425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memcpy(%(dest_name)s, str.c_str(), max_size);
59435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      %(dest_name)s[max_size] = '\\0';
59445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GPU_CLIENT_LOG("------\\n" << %(dest_name)s << "\\n------");
59455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (%(length_name)s != NULL) {
59485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *%(length_name)s = max_size;
59495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
59502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CheckGLError();
59515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
59535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetOriginalArgs()
59545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    str_args = {
59555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'return_type': func.return_type,
59565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'func_name': func.original_name,
59575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'args': func.MakeTypedOriginalArgString(""),
59585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'id_name': args[0].name,
59595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'bufsize_name': args[1].name,
59605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'length_name': args[2].name,
59615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'dest_name': args[3].name,
59625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'arg0': args[0].name,
59635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'arg1': args[1].name,
59645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'arg2': args[2].name,
59655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      'arg3': args[3].name,
59665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
59675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code_1 % str_args)
59685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    func.WriteDestinationInitalizationValidation(file)
59695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code_2 % str_args)
59705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
597103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, func, file, *extras):
59725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
59735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_test = """
5974010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sValidArgs) {
59755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kInfo = "hello";
5976010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const uint32_t kBucketId = 123;
59772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SpecializedSetup<cmds::%(name)s, 0>(true);
59785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)%(expect_len_code)s
59795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s))
59805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .WillOnce(DoAll(SetArgumentPointee<2>(strlen(kInfo)),
59815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      SetArrayArgument<3>(kInfo, kInfo + strlen(kInfo) + 1)));
59822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
59835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(%(args)s);
59845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
59855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommonDecoder::Bucket* bucket = decoder_->GetBucket(kBucketId);
59865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(bucket != NULL);
59875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(strlen(kInfo) + 1, bucket->size());
59885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(bucket->GetData(0, bucket->size()), kInfo,
59895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      bucket->size()));
59905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_NO_ERROR, GetGLError());
59915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
59925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
59935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = func.GetOriginalArgs()
5994cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    id_name = args[0].GetValidGLArg(func)
59955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_len_func = func.GetInfo('get_len_func')
59965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    get_len_enum = func.GetInfo('get_len_enum')
59975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sub = {
59985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'id_name': id_name,
59995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'get_len_func': get_len_func,
60005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'get_len_enum': get_len_enum,
60015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'gl_args': '%s, strlen(kInfo) + 1, _, _' %
6002cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)             args[0].GetValidGLArg(func),
6003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'args': '%s, kBucketId' % args[0].GetValidArg(func),
60045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'expect_len_code': '',
60055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
60065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if get_len_func and get_len_func[0:2] == 'gl':
60075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sub['expect_len_code'] = (
60085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "  EXPECT_CALL(*gl_, %s(%s, %s, _))\n"
60095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "      .WillOnce(SetArgumentPointee<2>(strlen(kInfo) + 1));") % (
60105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            get_len_func[2:], id_name, get_len_enum)
601103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteValidUnitTest(func, file, valid_test, sub, *extras)
60125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    invalid_test = """
6014010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_P(%(test_name)s, %(name)sInvalidArgs) {
6015010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const uint32_t kBucketId = 123;
60165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(*gl_, %(gl_func_name)s(_, _, _, _))
60175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Times(0);
60182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cmds::%(name)s cmd;
60195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd.Init(kInvalidClientId, kBucketId);
60205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
60215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
60225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
60235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
602403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.WriteValidUnitTest(func, file, invalid_test, *extras)
60255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, func, file):
60275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overrriden from TypeHandler."""
60285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
60295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6030cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class NamedType(object):
6031cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  """A class that represents a type of an argument in a client function.
6032cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6033cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  A type of an argument that is to be passed through in the command buffer
6034cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  command. Currently used only for the arguments that are specificly named in
6035cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  the 'cmd_buffer_functions.txt' file, mostly enums.
6036cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  """
6037cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def __init__(self, info):
6039cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert not 'is_complete' in info or info['is_complete'] == True
6040cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.info = info
6041cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.valid = info['valid']
6042cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if 'invalid' in info:
6043cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      self.invalid = info['invalid']
6044cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else:
6045cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      self.invalid = []
6046cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6047cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetType(self):
6048cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.info['type']
6049cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6050cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetInvalidValues(self):
6051cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.invalid
60525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6053cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidValues(self):
6054cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.valid
60555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6056cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def IsConstant(self):
6057cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if not 'is_complete' in self.info:
6058cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return False
60595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6060cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return len(self.GetValidValues()) == 1
6061cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6062cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetConstantValue(self):
6063cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.GetValidValues()[0]
60645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Argument(object):
60665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class that represents a function argument."""
60675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd_type_map_ = {
6069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'GLenum': 'uint32_t',
6070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'GLint': 'int32_t',
6071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'GLintptr': 'int32_t',
6072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'GLsizei': 'int32_t',
6073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    'GLsizeiptr': 'int32_t',
60745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'GLfloat': 'float',
60755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    'GLclampf': 'float',
60765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
60775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  need_validation_ = ['GLsizei*', 'GLboolean*', 'GLenum*', 'GLint*']
60785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
60805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
60815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.optional = type.endswith("Optional*")
60825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.optional:
60835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type = type[:-9] + "*"
60845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type = type
60855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if type in self.cmd_type_map_:
60875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.cmd_type = self.cmd_type_map_[type]
60885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
6089010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      self.cmd_type = 'uint32_t'
60905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def IsPointer(self):
60925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns true if argument is a pointer."""
60935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return False
60945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def IsConstant(self):
6096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Returns true if the argument has only one valid value."""
6097cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return False
6098cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
60995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def AddCmdArgs(self, args):
61005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Adds command arguments for this argument to the given list."""
6101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if not self.IsConstant():
6102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return args.append(self)
61035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def AddInitArgs(self, args):
61055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Adds init arguments for this argument to the given list."""
6106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if not self.IsConstant():
6107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return args.append(self)
61085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidArg(self, func):
61105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a valid value for this argument."""
6111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    valid_arg = func.GetValidArg(self)
61125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if valid_arg != None:
61135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return valid_arg
61145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    index = func.GetOriginalArgs().index(self)
6116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return str(index + 1)
61175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidClientSideArg(self, func):
61195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a valid value for this argument."""
6120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    valid_arg = func.GetValidArg(self)
6121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if valid_arg != None:
6122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return valid_arg
61235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    index = func.GetOriginalArgs().index(self)
6125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return str(index + 1)
6126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidClientSideCmdArg(self, func):
6128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Gets a valid value for this argument."""
6129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    valid_arg = func.GetValidArg(self)
61305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if valid_arg != None:
61315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return valid_arg
6132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    try:
6133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      index = func.GetOriginalArgs().index(self)
6134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return str(index + 1)
6135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    except ValueError:
6136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      pass
6137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    index = func.GetCmdArgs().index(self)
6138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return str(index + 1)
6139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidGLArg(self, func):
6141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Gets a valid GL value for this argument."""
6142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.GetValidArg(func)
6143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidNonCachedClientSideArg(self, func):
6145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Returns a valid value for this argument in a GL call.
6146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Using the value will produce a command buffer service invocation.
6147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Returns None if there is no such value."""
6148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return '123'
6149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidNonCachedClientSideCmdArg(self, func):
6151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Returns a valid value for this argument in a command buffer command.
6152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Calling the GL function with the value returned by
6153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GetValidNonCachedClientSideArg will result in a command buffer command
6154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    that contains the value returned by this function. """
6155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return '123'
61565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetNumInvalidValues(self, func):
61585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """returns the number of invalid values to be tested."""
61595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0
61605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetInvalidArg(self, index):
61625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """returns an invalid value and expected parse result by index."""
61635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ("---ERROR0---", "---ERROR2---", None)
61645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetLogArg(self):
61665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Get argument appropriate for LOG macro."""
61675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.type == 'GLboolean':
61685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 'GLES2Util::GetStringBool(%s)' % self.name
61695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.type == 'GLenum':
61705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 'GLES2Util::GetStringEnum(%s)' % self.name
61715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.name
61725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetCode(self, file):
61745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the code to get an argument from a command structure."""
61755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  %s %s = static_cast<%s>(c.%s);\n" %
61765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               (self.type, self.name, self.type, self.name))
61775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteValidationCode(self, file, func):
61795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the validation code for an argument."""
61805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
61815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteClientSideValidationCode(self, file, func):
61835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the validation code for an argument."""
61845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
61855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteDestinationInitalizationValidation(self, file, func):
61875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the client side destintion initialization validation."""
61885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
61895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteDestinationInitalizationValidatationIfNeeded(self, file, func):
61915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the client side destintion initialization validation if needed."""
61925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parts = self.type.split(" ")
61935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if len(parts) > 1:
61945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
61955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if parts[0] in self.need_validation_:
61965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(
61975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "  GPU_CLIENT_VALIDATE_DESTINATION_%sINITALIZATION(%s, %s);\n" %
61985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ("OPTIONAL_" if self.optional else "", self.type[:-1], self.name))
61995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetAddress(self, file):
62025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the code to get the address this argument refers to."""
62035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
62045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetImmediateVersion(self):
62065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets the immediate version of this argument."""
62075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self
62085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetBucketVersion(self):
62105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets the bucket version of this argument."""
62115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self
62125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BoolArgument(Argument):
62155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """class for GLboolean"""
62165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
62185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Argument.__init__(self, name, 'GLboolean')
62195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidArg(self, func):
62215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a valid value for this argument."""
62225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 'true'
62235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidClientSideArg(self, func):
62255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a valid value for this argument."""
62265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 'true'
62275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidClientSideCmdArg(self, func):
62295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a valid value for this argument."""
62305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 'true'
62315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidGLArg(self, func):
62335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a valid GL value for this argument."""
62345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 'true'
62355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UniformLocationArgument(Argument):
62385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """class for uniform locations."""
62395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name):
62415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Argument.__init__(self, name, "GLint")
62425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetCode(self, file):
62445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the code to get an argument from a command structure."""
62455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """  %s %s = static_cast<%s>(c.%s);
62465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
62475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % (self.type, self.name, self.type, self.name))
62485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DataSizeArgument(Argument):
62505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """class for data_size which Bucket commands do not need."""
62515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name):
6253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Argument.__init__(self, name, "uint32_t")
62545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetBucketVersion(self):
62565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
62575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SizeArgument(Argument):
62605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """class for GLsizei and GLsizeiptr."""
62615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
62635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Argument.__init__(self, name, type)
62645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetNumInvalidValues(self, func):
62665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """overridden from Argument."""
6267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if func.IsImmediate():
62685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0
62695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
62705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetInvalidArg(self, index):
62725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """overridden from Argument."""
62735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ("-1", "kNoError", "GL_INVALID_VALUE")
62745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteValidationCode(self, file, func):
62765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """overridden from Argument."""
62775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  if (%s < 0) {\n" % self.name)
62782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write(
62792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "    LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, \"gl%s\", \"%s < 0\");\n" %
62802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        (func.original_name, self.name))
62815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return error::kNoError;\n")
62825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
62835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteClientSideValidationCode(self, file, func):
62855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """overridden from Argument."""
62865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  if (%s < 0) {\n" % self.name)
62872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write(
62882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "    SetGLError(GL_INVALID_VALUE, \"gl%s\", \"%s < 0\");\n" %
62892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        (func.original_name, self.name))
62905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return;\n")
62915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
62925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SizeNotNegativeArgument(SizeArgument):
62955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """class for GLsizeiNotNegative. It's NEVER allowed to be negative"""
62965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type, gl_type):
62985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SizeArgument.__init__(self, name, gl_type)
62995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetInvalidArg(self, index):
63015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """overridden from SizeArgument."""
63025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ("-1", "kOutOfBounds", "GL_NO_ERROR")
63035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteValidationCode(self, file, func):
63055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """overridden from SizeArgument."""
63065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
63075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EnumBaseArgument(Argument):
63105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Base class for EnumArgument, IntArgument and ValidatedBoolArgument"""
63115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, gl_type, type, gl_error):
63135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Argument.__init__(self, name, gl_type)
63145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.local_type = type
63165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.gl_error = gl_error
63175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    name = type[len(gl_type):]
63185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_name = name
6319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.named_type = NamedType(_NAMED_TYPE_INFO[name])
6320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def IsConstant(self):
6322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.named_type.IsConstant()
6323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetConstantValue(self):
6325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.named_type.GetConstantValue()
63265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteValidationCode(self, file, func):
6328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if self.named_type.IsConstant():
6329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return
63305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  if (!validators_->%s.IsValid(%s)) {\n" %
6331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)               (ToUnderscore(self.type_name), self.name))
63325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.gl_error == "GL_INVALID_ENUM":
63335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(
63342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "    LOCAL_SET_GL_ERROR_INVALID_ENUM(\"gl%s\", %s, \"%s\");\n" %
63355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (func.original_name, self.name, self.name))
63365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
63375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(
63382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          "    LOCAL_SET_GL_ERROR(%s, \"gl%s\", \"%s %s\");\n" %
63395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (self.gl_error, func.original_name, self.name, self.gl_error))
63405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return error::kNoError;\n")
63415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
63425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def WriteClientSideValidationCode(self, file, func):
6344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if not self.named_type.IsConstant():
6345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return
6346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file.Write("  if (%s != %s) {" % (self.name,
6347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      self.GetConstantValue()))
6348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file.Write(
6349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "    SetGLError(%s, \"gl%s\", \"%s %s\");\n" %
6350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      (self.gl_error, func.original_name, self.name, self.gl_error))
6351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if func.return_type == "void":
6352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      file.Write("    return;\n")
6353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else:
6354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      file.Write("    return %s;\n" % func.GetErrorReturnString())
6355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file.Write("  }\n")
6356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidArg(self, func):
6358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    valid_arg = func.GetValidArg(self)
63595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if valid_arg != None:
63605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return valid_arg
6361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    valid = self.named_type.GetValidValues()
6362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if valid:
63635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_valid = len(valid)
6364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return valid[0]
6365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    index = func.GetOriginalArgs().index(self)
6367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return str(index + 1)
63685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidClientSideArg(self, func):
63705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a valid value for this argument."""
6371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.GetValidArg(func)
63725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidClientSideCmdArg(self, func):
63745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a valid value for this argument."""
6375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    valid_arg = func.GetValidArg(self)
6376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if valid_arg != None:
6377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return valid_arg
6378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    valid = self.named_type.GetValidValues()
6380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if valid:
6381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      num_valid = len(valid)
6382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return valid[0]
63835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    try:
6385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      index = func.GetOriginalArgs().index(self)
6386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return str(index + 1)
6387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    except ValueError:
6388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      pass
6389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    index = func.GetCmdArgs().index(self)
6390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return str(index + 1)
6391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidGLArg(self, func):
63935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a valid value for this argument."""
6394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.GetValidArg(func)
63955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetNumInvalidValues(self, func):
63975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """returns the number of invalid values to be tested."""
6398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return len(self.named_type.GetInvalidValues())
63995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetInvalidArg(self, index):
64015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """returns an invalid value by index."""
6402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    invalid = self.named_type.GetInvalidValues()
6403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if invalid:
64045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_invalid = len(invalid)
64055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if index >= num_invalid:
64065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        index = num_invalid - 1
64075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (invalid[index], "kNoError", self.gl_error)
64085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ("---ERROR1---", "kNoError", self.gl_error)
64095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EnumArgument(EnumBaseArgument):
64125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class that represents a GLenum argument"""
64135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
64155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnumBaseArgument.__init__(self, name, "GLenum", type, "GL_INVALID_ENUM")
64165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetLogArg(self):
64185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
64195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ("GLES2Util::GetString%s(%s)" %
64205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            (self.type_name, self.name))
64215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IntArgument(EnumBaseArgument):
64245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class for a GLint argument that can only except specific values.
64255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  For example glTexImage2D takes a GLint for its internalformat
64275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  argument instead of a GLenum.
64285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
64295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
64315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnumBaseArgument.__init__(self, name, "GLint", type, "GL_INVALID_VALUE")
64325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ValidatedBoolArgument(EnumBaseArgument):
64355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class for a GLboolean argument that can only except specific values.
64365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  For example glUniformMatrix takes a GLboolean for it's transpose but it
64385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  must be false.
64395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
64405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
64425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EnumBaseArgument.__init__(self, name, "GLboolean", type, "GL_INVALID_VALUE")
64435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetLogArg(self):
64455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
64465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 'GLES2Util::GetStringBool(%s)' % self.name
64475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImmediatePointerArgument(Argument):
64505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class that represents an immediate argument to a function.
64515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  An immediate argument is one where the data follows the command.
64535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """
64545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
64565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Argument.__init__(self, name, type)
64575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def IsPointer(self):
6459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return True
6460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetPointedType(self):
6462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type)
6463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert match
6464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return match.groupdict()['element_type']
6465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
64665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def AddCmdArgs(self, args):
64675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
64685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
64695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetCode(self, file):
64715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
64725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
64735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  %s %s = GetImmediateDataAs<%s>(\n" %
64745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (self.type, self.name, self.type))
64755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("      c, data_size, immediate_data_size);\n")
64765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteValidationCode(self, file, func):
64785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
64795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  if (%s == NULL) {\n" % self.name)
64805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return error::kOutOfBounds;\n")
64815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
64825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetImmediateVersion(self):
64845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
64855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
64865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteDestinationInitalizationValidation(self, file, func):
64885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
64895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteDestinationInitalizationValidatationIfNeeded(file, func)
64905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetLogArg(self):
64925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
64935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "static_cast<const void*>(%s)" % self.name
64945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BucketPointerArgument(Argument):
64975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class that represents an bucket argument to a function."""
64985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
65005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Argument.__init__(self, name, type)
65015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def AddCmdArgs(self, args):
65035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
65055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetCode(self, file):
65075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
65095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  %s %s = bucket->GetData(0, data_size);\n" %
65105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (self.type, self.name))
65115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteValidationCode(self, file, func):
65135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
65155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetImmediateVersion(self):
65175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
65195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteDestinationInitalizationValidation(self, file, func):
65215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteDestinationInitalizationValidatationIfNeeded(file, func)
65235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetLogArg(self):
65255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "static_cast<const void*>(%s)" % self.name
65275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PointerArgument(Argument):
65305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class that represents a pointer argument to a function."""
65315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
65335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Argument.__init__(self, name, type)
65345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def IsPointer(self):
65365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns true if argument is a pointer."""
65375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return True
65385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetPointedType(self):
6540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    match = re.match('(const\s+)?(?P<element_type>[\w]+)\s*\*', self.type)
6541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    assert match
6542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return match.groupdict()['element_type']
6543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidArg(self, func):
65455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "shared_memory_id_, shared_memory_offset_"
65475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidGLArg(self, func):
65495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "reinterpret_cast<%s>(shared_memory_address_)" % self.type
65515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetNumInvalidValues(self, func):
65535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 2
65555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetInvalidArg(self, index):
65575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if index == 0:
65595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ("kInvalidSharedMemoryId, 0", "kOutOfBounds", None)
65605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
65615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ("shared_memory_id_, kInvalidSharedMemoryOffset",
65625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "kOutOfBounds", None)
65635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetLogArg(self):
65655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "static_cast<const void*>(%s)" % self.name
65675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def AddCmdArgs(self, args):
65695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
6570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    args.append(Argument("%s_shm_id" % self.name, 'uint32_t'))
6571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    args.append(Argument("%s_shm_offset" % self.name, 'uint32_t'))
65725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetCode(self, file):
65745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
65765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "  %s %s = GetSharedMemoryAs<%s>(\n" %
65775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (self.type, self.name, self.type))
65785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
65795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "      c.%s_shm_id, c.%s_shm_offset, data_size);\n" %
65805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (self.name, self.name))
65815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetAddress(self, file):
65835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
65855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "  %s %s = GetSharedMemoryAs<%s>(\n" %
65865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (self.type, self.name, self.type))
65875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
65885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "      %s_shm_id, %s_shm_offset, %s_size);\n" %
65895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        (self.name, self.name, self.name))
65905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteValidationCode(self, file, func):
65925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  if (%s == NULL) {\n" % self.name)
65945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return error::kOutOfBounds;\n")
65955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
65965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetImmediateVersion(self):
65985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
65995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ImmediatePointerArgument(self.name, self.type)
66005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetBucketVersion(self):
66025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
66035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.type == "const char*":
66045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return InputStringBucketArgument(self.name, self.type)
66055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return BucketPointerArgument(self.name, self.type)
66065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteDestinationInitalizationValidation(self, file, func):
66085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
66095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteDestinationInitalizationValidatationIfNeeded(file, func)
66105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InputStringBucketArgument(Argument):
66135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """An string input argument where the string is passed in a bucket."""
66145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
6616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Argument.__init__(self, name + "_bucket_id", "uint32_t")
66175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetCode(self, file):
66195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
66205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """
66215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Bucket* %(name)s_bucket = GetBucket(c.%(name)s);
66225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!%(name)s_bucket) {
66235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
66245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
66255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string %(name)s_str;
66265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!%(name)s_bucket->GetAsString(&%(name)s_str)) {
66275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return error::kInvalidArguments;
66285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
66295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* %(name)s = %(name)s_str.c_str();
66305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
66315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {
66325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'name': self.name,
66335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      })
66345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidArg(self, func):
66365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "kNameBucketId"
66375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidGLArg(self, func):
66395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "_"
66405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceIdArgument(Argument):
66435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class that represents a resource id argument to a function."""
66445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
66465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match = re.match("(GLid\w+)", type)
66475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.resource_type = match.group(1)[4:]
66485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type = type.replace(match.group(1), "GLuint")
66495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Argument.__init__(self, name, type)
66505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetCode(self, file):
66525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
66535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  %s %s = c.%s;\n" % (self.type, self.name, self.name))
66545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidArg(self, func):
66565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "client_%s_id_" % self.resource_type.lower()
66575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidGLArg(self, func):
66595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "kService%sId" % self.resource_type
66605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceIdBindArgument(Argument):
66635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Represents a resource id argument to a bind function."""
66645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
66665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match = re.match("(GLidBind\w+)", type)
66675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.resource_type = match.group(1)[8:]
66685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type = type.replace(match.group(1), "GLuint")
66695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Argument.__init__(self, name, type)
66705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetCode(self, file):
66725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
66735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = """  %(type)s %(name)s = c.%(name)s;
66745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
66755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(code % {'type': self.type, 'name': self.name})
66765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidArg(self, func):
66785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "client_%s_id_" % self.resource_type.lower()
66795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidGLArg(self, func):
66815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "kService%sId" % self.resource_type
66825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceIdZeroArgument(Argument):
66855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Represents a resource id argument to a function that can be zero."""
66865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, name, type):
66885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    match = re.match("(GLidZero\w+)", type)
66895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.resource_type = match.group(1)[8:]
66905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    type = type.replace(match.group(1), "GLuint")
66915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Argument.__init__(self, name, type)
66925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGetCode(self, file):
66945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Argument."""
66955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  %s %s = c.%s;\n" % (self.type, self.name, self.name))
66965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidArg(self, func):
66985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "client_%s_id_" % self.resource_type.lower()
66995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidGLArg(self, func):
67015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "kService%sId" % self.resource_type
67025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetNumInvalidValues(self, func):
67045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """returns the number of invalid values to be tested."""
67055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
67065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetInvalidArg(self, index):
67085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """returns an invalid value by index."""
67095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ("kInvalidClientId", "kNoError", "GL_INVALID_VALUE")
67105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Function(object):
67135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class that represents a function."""
67145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  type_handlers = {
6716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    '': TypeHandler(),
6717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'Bind': BindHandler(),
6718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'Create': CreateHandler(),
6719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'Custom': CustomHandler(),
6720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'Data': DataHandler(),
6721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'Delete': DeleteHandler(),
6722cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'DELn': DELnHandler(),
6723cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'GENn': GENnHandler(),
6724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'GETn': GETnHandler(),
6725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'GLchar': GLcharHandler(),
6726cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'GLcharN': GLcharNHandler(),
6727cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'HandWritten': HandWrittenHandler(),
6728cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'Is': IsHandler(),
6729cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'Manual': ManualHandler(),
6730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'PUT': PUTHandler(),
6731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'PUTn': PUTnHandler(),
6732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'PUTXn': PUTXnHandler(),
6733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'StateSet': StateSetHandler(),
6734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'StateSetRGBAlpha': StateSetRGBAlphaHandler(),
6735cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'StateSetFrontBack': StateSetFrontBackHandler(),
6736cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'StateSetFrontBackSeparate': StateSetFrontBackSeparateHandler(),
6737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'StateSetNamedParameter': StateSetNamedParameter(),
6738cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'STRn': STRnHandler(),
6739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    'Todo': TodoHandler(),
6740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
6741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6742cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def __init__(self, name, info):
67435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = name
6744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.original_name = info['original_name']
6745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.original_args = self.ParseArgs(info['original_args'])
6747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6748cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if 'cmd_args' in info:
6749cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      self.args_for_cmds = self.ParseArgs(info['cmd_args'])
6750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else:
6751cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      self.args_for_cmds = self.original_args[:]
6752cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6753cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.return_type = info['return_type']
6754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if self.return_type != 'void':
6755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      self.return_arg = CreateArg(info['return_type'] + " result")
6756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else:
6757cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      self.return_arg = None
6758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6759cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.num_pointer_args = sum(
6760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      [1 for arg in self.args_for_cmds if arg.IsPointer()])
67615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.info = info
6762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.type_handler = self.type_handlers[info['type']]
6763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.can_auto_generate = (self.num_pointer_args == 0 and
6764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                              info['return_type'] == "void")
67655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.InitFunction()
6766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6767cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def ParseArgs(self, arg_string):
6768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Parses a function arg string."""
6769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    args = []
6770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    parts = arg_string.split(',')
6771cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg_string in parts:
6772cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg = CreateArg(arg_string)
6773cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if arg:
6774cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        args.append(arg)
6775cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return args
67765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def IsType(self, type_name):
67785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns true if function is a certain type."""
6779cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.info['type'] == type_name
67805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InitFunction(self):
6782cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Creates command args and calls the init function for the type handler.
6783cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Creates argument lists for command buffer commands, eg. self.cmd_args and
6785cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.init_args.
6786cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Calls the type function initialization.
6787cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Override to create different kind of command buffer command argument lists.
6788cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """
6789cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.cmd_args = []
6790cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in self.args_for_cmds:
6791cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg.AddCmdArgs(self.cmd_args)
6792cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6793cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.init_args = []
6794cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in self.args_for_cmds:
6795cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      arg.AddInitArgs(self.init_args)
6796cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if self.return_arg:
6798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      self.init_args.append(self.return_arg)
6799cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
68005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.InitFunction(self)
68015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6802cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def IsImmediate(self):
6803cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Returns whether the function is immediate data function or not."""
6804cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return False
6805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6806cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetInfo(self, name, default = None):
68075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Returns a value from the function info for this function."""
6808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if name in self.info:
6809cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return self.info[name]
6810cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return default
6811cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6812cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetValidArg(self, arg):
6813cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Gets a valid argument value for the parameter arg from the function info
6814cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if one exists."""
6815cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    try:
6816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      index = self.GetOriginalArgs().index(arg)
6817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    except ValueError:
6818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return None
68195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    valid_args = self.GetInfo('valid_args')
68215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if valid_args and str(index) in valid_args:
68225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return valid_args[str(index)]
68235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
68245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def AddInfo(self, name, value):
68265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Adds an info."""
6827cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.info[name] = value
6828cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6829cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def IsExtension(self):
6830cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.GetInfo('extension') or self.GetInfo('extension_flag')
68315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def IsCoreGLFunction(self):
6833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return (not self.IsExtension() and
68345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            not self.GetInfo('pepper_interface'))
68355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InPepperInterface(self, interface):
68375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ext = self.GetInfo('pepper_interface')
68385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if not interface.GetName():
68395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return self.IsCoreGLFunction()
68405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ext == interface.GetName()
68415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def InAnyPepperExtension(self):
68435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.IsCoreGLFunction() or self.GetInfo('pepper_interface')
68445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetErrorReturnString(self):
6846cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if self.GetInfo("error_return"):
6847cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return self.GetInfo("error_return")
6848cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    elif self.return_type == "GLboolean":
6849cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "GL_FALSE"
6850cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    elif "*" in self.return_type:
6851cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return "NULL"
6852cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return "0"
6853cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
68545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetGLFunctionName(self):
68555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets the function to call to execute GL for this command."""
68565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.GetInfo('decoder_func'):
68575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return self.GetInfo('decoder_func')
68585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "gl%s" % self.original_name
68595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetGLTestFunctionName(self):
68615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gl_func_name = self.GetInfo('gl_test_func')
68625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if gl_func_name == None:
68635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_func_name = self.GetGLFunctionName()
68645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if gl_func_name.startswith("gl"):
68655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_func_name = gl_func_name[2:]
68665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
68675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gl_func_name = self.original_name
68685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gl_func_name
68695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6870f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  def GetDataTransferMethods(self):
6871f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return self.GetInfo('data_transfer_methods',
6872f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                        ['immediate' if self.num_pointer_args == 1 else 'shm'])
6873f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
68745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def AddCmdArg(self, arg):
68755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Adds a cmd argument to this function."""
68765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.cmd_args.append(arg)
68775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetCmdArgs(self):
68795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets the command args for this function."""
68805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.cmd_args
68815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ClearCmdArgs(self):
68835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Clears the command args for this function."""
68845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.cmd_args = []
68855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6886cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def GetCmdConstants(self):
6887cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Gets the constants for this function."""
6888cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return [arg for arg in self.args_for_cmds if arg.IsConstant()]
6889cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
68905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetInitArgs(self):
68915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets the init args for this function."""
68925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.init_args
68935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetOriginalArgs(self):
68955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets the original arguments to this function."""
68965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.original_args
68975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetLastOriginalArg(self):
68995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets the last original argument to this function."""
69005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.original_args[len(self.original_args) - 1]
69015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  def __MaybePrependComma(self, arg_string, add_comma):
69035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Adds a comma if arg_string is not empty and add_comma is true."""
69045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    comma = ""
69055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if add_comma and len(arg_string):
69065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      comma = ", "
69075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "%s%s" % (comma, arg_string)
69085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def MakeTypedOriginalArgString(self, prefix, add_comma = False):
69104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    """Gets a list of arguments as they are in GL."""
69115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = self.GetOriginalArgs()
69125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg_string = ", ".join(
69135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args])
69144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return self.__MaybePrependComma(arg_string, add_comma)
69155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def MakeOriginalArgString(self, prefix, add_comma = False, separator = ", "):
69175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets the list of arguments as they are in GL."""
69185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = self.GetOriginalArgs()
69195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg_string = separator.join(
69205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ["%s%s" % (prefix, arg.name) for arg in args])
69214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return self.__MaybePrependComma(arg_string, add_comma)
69224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
6923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def MakeTypedHelperArgString(self, prefix, add_comma = False):
6924cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Gets a list of typed GL arguments after removing unneeded arguments."""
6925cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    args = self.GetOriginalArgs()
6926cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    arg_string = ", ".join(
6927cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ["%s %s%s" % (
6928cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          arg.type,
6929cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          prefix,
6930cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          arg.name,
6931cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ) for arg in args if not arg.IsConstant()])
6932cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.__MaybePrependComma(arg_string, add_comma)
6933cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6934cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def MakeHelperArgString(self, prefix, add_comma = False, separator = ", "):
6935cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    """Gets a list of GL arguments after removing unneeded arguments."""
6936cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    args = self.GetOriginalArgs()
6937cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    arg_string = separator.join(
6938cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ["%s%s" % (prefix, arg.name)
6939cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         for arg in args if not arg.IsConstant()])
6940cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return self.__MaybePrependComma(arg_string, add_comma)
6941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
69424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  def MakeTypedPepperArgString(self, prefix):
69434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    """Gets a list of arguments as they need to be for Pepper."""
69444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if self.GetInfo("pepper_args"):
69454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return self.GetInfo("pepper_args")
69464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    else:
69474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return self.MakeTypedOriginalArgString(prefix, False)
69485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def MapCTypeToPepperIdlType(self, ctype, is_for_return_type=False):
69501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Converts a C type name to the corresponding Pepper IDL type."""
69511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    idltype = {
69521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'char*': '[out] str_t',
69531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'const GLchar* const*': '[out] cstr_t',
69541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'const char*': 'cstr_t',
69551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'const void*': 'mem_t',
69561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'void*': '[out] mem_t',
69571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        'void**': '[out] mem_ptr_t',
69581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }.get(ctype, ctype)
69591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    # We use "GLxxx_ptr_t" for "GLxxx*".
69601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    matched = re.match(r'(const )?(GL\w+)\*$', ctype)
69611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if matched:
69621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      idltype = matched.group(2) + '_ptr_t'
69631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if not matched.group(1):
69641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        idltype = '[out] ' + idltype
69651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    # If an in/out specifier is not specified yet, prepend [in].
69661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if idltype[0] != '[':
69671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      idltype = '[in] ' + idltype
69681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    # Strip the in/out specifier for a return type.
69691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if is_for_return_type:
69701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      idltype = re.sub(r'\[\w+\] ', '', idltype)
69711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return idltype
69721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
69731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def MakeTypedPepperIdlArgStrings(self):
69741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    """Gets a list of arguments as they need to be for Pepper IDL."""
69751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    args = self.GetOriginalArgs()
69761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return ["%s %s" % (self.MapCTypeToPepperIdlType(arg.type), arg.name)
69771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            for arg in args]
69781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
69795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def GetPepperName(self):
69805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if self.GetInfo("pepper_name"):
69815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return self.GetInfo("pepper_name")
69825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return self.name
69835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
69845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def MakeTypedCmdArgString(self, prefix, add_comma = False):
69855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a typed list of arguments as they need to be for command buffers."""
69865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = self.GetCmdArgs()
69875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg_string = ", ".join(
69885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args])
69894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return self.__MaybePrependComma(arg_string, add_comma)
69905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def MakeCmdArgString(self, prefix, add_comma = False):
69925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets the list of arguments as they need to be for command buffers."""
69935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = self.GetCmdArgs()
69945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg_string = ", ".join(
69955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ["%s%s" % (prefix, arg.name) for arg in args])
69964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return self.__MaybePrependComma(arg_string, add_comma)
69975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def MakeTypedInitString(self, prefix, add_comma = False):
69995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a typed list of arguments as they need to be for cmd Init/Set."""
70005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = self.GetInitArgs()
70015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg_string = ", ".join(
70025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ["%s %s%s" % (arg.type, prefix, arg.name) for arg in args])
70034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return self.__MaybePrependComma(arg_string, add_comma)
70045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def MakeInitString(self, prefix, add_comma = False):
70065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets the list of arguments as they need to be for cmd Init/Set."""
70075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = self.GetInitArgs()
70085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    arg_string = ", ".join(
70095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ["%s%s" % (prefix, arg.name) for arg in args])
70104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return self.__MaybePrependComma(arg_string, add_comma)
70115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def MakeLogArgString(self):
70135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Makes a string of the arguments for the LOG macros"""
70145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = self.GetOriginalArgs()
70155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ' << ", " << '.join([arg.GetLogArg() for arg in args])
70165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCommandDescription(self, file):
70185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes a description of the command."""
70195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("//! Command that corresponds to gl%s.\n" % self.original_name)
70205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerValidation(self, file):
70225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes validation code for the function."""
70235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in self.GetOriginalArgs():
70245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      arg.WriteValidationCode(file, self)
70255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.WriteValidationCode(file)
70265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation(self, file):
70285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the handler implementation for this command."""
70295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteHandlerImplementation(self, file)
70305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteValidationCode(self, file):
70325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the validation code for a command."""
70335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pass
70345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def WriteCmdFlag(self, file):
70365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    """Writes the cmd cmd_flags constant."""
70375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    flags = []
7038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # By default trace only at the highest level 3.
7039cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    trace_level = int(self.GetInfo('trace_level', default = 3))
7040cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if trace_level not in xrange(0, 4):
7041cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      raise KeyError("Unhandled trace_level: %d" % trace_level)
70425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
70435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    flags.append('CMD_FLAG_SET_TRACE_LEVEL(%d)' % trace_level)
70445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
70455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if len(flags) > 0:
70465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cmd_flags = ' | '.join(flags)
70475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else:
70485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cmd_flags = 0
70495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
70505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file.Write("  static const uint8 cmd_flags = %s;\n" % cmd_flags)
70515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
70525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
70535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdArgFlag(self, file):
70545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the cmd kArgFlags constant."""
70555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  static const cmd::ArgFlags kArgFlags = cmd::kFixed;\n")
70565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdComputeSize(self, file):
70585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the ComputeSize function for the command."""
7059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("  static uint32_t ComputeSize() {\n")
70605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
7061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        "    return static_cast<uint32_t>(sizeof(ValueType));  // NOLINT\n")
70625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
70635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
70645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdSetHeader(self, file):
70665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the cmd's SetHeader function."""
70675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void SetHeader() {\n")
70685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    header.SetCmd<ValueType>();\n")
70695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
70705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
70715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdInit(self, file):
70735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the cmd's Init function."""
70745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void Init(%s) {\n" % self.MakeTypedCmdArgString("_"))
70755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    SetHeader();\n")
70765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args = self.GetCmdArgs()
70775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for arg in args:
70785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    %s = _%s;\n" % (arg.name, arg.name))
70795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
70805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
70815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdSet(self, file):
70835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the cmd's Set function."""
70845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    copy_args = self.MakeCmdArgString("_", False)
70855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  void* Set(void* cmd%s) {\n" %
70865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               self.MakeTypedCmdArgString("_", True))
70875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    static_cast<ValueType*>(cmd)->Init(%s);\n" % copy_args)
70885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("    return NextCmdAddress<ValueType>(cmd);\n")
70895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  }\n")
70905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
70915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteStruct(self, file):
70935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteStruct(self, file)
70945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteDocs(self, file):
70965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteDocs(self, file)
70975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdHelper(self, file):
70995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the cmd's helper."""
71005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteCmdHelper(self, file)
71015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, file):
71035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service implementation for a command."""
71045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteServiceImplementation(self, file)
71055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
710603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, file, *extras):
71075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service implementation for a command."""
710803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.type_handler.WriteServiceUnitTest(self, file, *extras)
71095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2CLibImplementation(self, file):
71115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 C Lib Implemention."""
71125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteGLES2CLibImplementation(self, file)
71135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2InterfaceHeader(self, file):
71155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Interface declaration."""
71165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteGLES2InterfaceHeader(self, file)
71175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2InterfaceStub(self, file):
71195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Interface Stub declaration."""
71205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteGLES2InterfaceStub(self, file)
71215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2InterfaceStubImpl(self, file):
71235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Interface Stub declaration."""
71245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteGLES2InterfaceStubImpl(self, file)
71255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationHeader(self, file):
71275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implemention declaration."""
71285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteGLES2ImplementationHeader(self, file)
71295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, file):
71315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implemention definition."""
71325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteGLES2Implementation(self, file)
71335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteGLES2TraceImplementationHeader(self, file):
71352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the GLES2 Trace Implemention declaration."""
71362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.type_handler.WriteGLES2TraceImplementationHeader(self, file)
71372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
71382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteGLES2TraceImplementation(self, file):
71392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the GLES2 Trace Implemention definition."""
71402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.type_handler.WriteGLES2TraceImplementation(self, file)
71412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
71422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteGLES2Header(self, file):
71432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the GLES2 Implemention unit test."""
71442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.type_handler.WriteGLES2Header(self, file)
71452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
71465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationUnitTest(self, file):
71475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implemention unit test."""
71485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteGLES2ImplementationUnitTest(self, file)
71495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteDestinationInitalizationValidation(self, file):
71515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the client side destintion initialization validation."""
71525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteDestinationInitalizationValidation(self, file)
71535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteFormatTest(self, file):
71555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the cmd's format test."""
71565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteFormatTest(self, file)
71575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PepperInterface(object):
71605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class that represents a function."""
71615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, info):
71635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.name = info["name"]
71645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.dev = info["dev"]
71655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetName(self):
71675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return self.name
71685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetInterfaceName(self):
71705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    upperint = ""
71715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dev = ""
71725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.name:
71735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      upperint = "_" + self.name.upper()
71745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.dev:
71755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dev = "_DEV"
71765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "PPB_OPENGLES2%s%s_INTERFACE" % (upperint, dev)
71775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetInterfaceString(self):
71795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dev = ""
71805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.dev:
71815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dev = "(Dev)"
71825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "PPB_OpenGLES2%s%s" % (self.name, dev)
71835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetStructName(self):
71855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dev = ""
71865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.dev:
71875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dev = "_Dev"
71885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "PPB_OpenGLES2%s%s" % (self.name, dev)
71895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ImmediateFunction(Function):
71925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class that represnets an immediate function command."""
71935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, func):
7195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Function.__init__(
7196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        self,
7197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        "%sImmediate" % func.name,
7198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        func.info)
7199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def InitFunction(self):
7201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # Override args in original_args and args_for_cmds with immediate versions
7202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # of the args.
7203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    new_original_args = []
7205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in self.original_args:
72065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_arg = arg.GetImmediateVersion()
72075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if new_arg:
7208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        new_original_args.append(new_arg)
7209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.original_args = new_original_args
72105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_args_for_cmds = []
7212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in self.args_for_cmds:
72135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_arg = arg.GetImmediateVersion()
72145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if new_arg:
72155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new_args_for_cmds.append(new_arg)
72165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.args_for_cmds = new_args_for_cmds
72185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Function.InitFunction(self)
7220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def IsImmediate(self):
7222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return True
72235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCommandDescription(self, file):
72255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
72265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("//! Immediate version of command that corresponds to gl%s.\n" %
72275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.original_name)
72285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, file):
72305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
72315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteImmediateServiceImplementation(self, file)
72325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation(self, file):
72345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
72355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteImmediateHandlerImplementation(self, file)
72365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
723703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, file, *extras):
72385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service implementation for a command."""
723903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.type_handler.WriteImmediateServiceUnitTest(self, file, *extras)
72405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteValidationCode(self, file):
72425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
72435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteImmediateValidationCode(self, file)
72445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdArgFlag(self, file):
72465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
72475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;\n")
72485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdComputeSize(self, file):
72505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
72515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteImmediateCmdComputeSize(self, file)
72525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdSetHeader(self, file):
72545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
72555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteImmediateCmdSetHeader(self, file)
72565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdInit(self, file):
72585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
72595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteImmediateCmdInit(self, file)
72605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdSet(self, file):
72625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
72635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteImmediateCmdSet(self, file)
72645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdHelper(self, file):
72665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
72675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteImmediateCmdHelper(self, file)
72685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteFormatTest(self, file):
72705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
72715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteImmediateFormatTest(self, file)
72725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BucketFunction(Function):
72755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class that represnets a bucket version of a function command."""
72765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, func):
7278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Function.__init__(
7279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      self,
7280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "%sBucket" % func.name,
7281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      func.info)
7282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  def InitFunction(self):
7284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # Override args in original_args and args_for_cmds with bucket versions
7285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    # of the args.
7286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    new_original_args = []
7288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in self.original_args:
72895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_arg = arg.GetBucketVersion()
72905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if new_arg:
7291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        new_original_args.append(new_arg)
7292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.original_args = new_original_args
72935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    new_args_for_cmds = []
7295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for arg in self.args_for_cmds:
72965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_arg = arg.GetBucketVersion()
72975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if new_arg:
72985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new_args_for_cmds.append(new_arg)
72995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    self.args_for_cmds = new_args_for_cmds
73015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    Function.InitFunction(self)
73035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCommandDescription(self, file):
73055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
73065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("//! Bucket version of command that corresponds to gl%s.\n" %
73075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        self.original_name)
73085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, file):
73105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
73115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteBucketServiceImplementation(self, file)
73125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteHandlerImplementation(self, file):
73145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Overridden from Function"""
73155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.type_handler.WriteBucketHandlerImplementation(self, file)
73165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
731703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTest(self, file, *extras):
73185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service implementation for a command."""
731903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.type_handler.WriteBucketServiceUnitTest(self, file, *extras)
73205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def CreateArg(arg_string):
73235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Creates an Argument."""
73245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg_parts = arg_string.split()
73255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if len(arg_parts) == 1 and arg_parts[0] == 'void':
73265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return None
73275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Is this a pointer argument?
73285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif arg_string.find('*') >= 0:
7329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return PointerArgument(
7330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        arg_parts[-1],
7331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        " ".join(arg_parts[0:-1]))
73325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Is this a resource argument? Must come after pointer check.
73335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif arg_parts[0].startswith('GLidBind'):
73345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ResourceIdBindArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
73355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif arg_parts[0].startswith('GLidZero'):
73365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ResourceIdZeroArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
73375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif arg_parts[0].startswith('GLid'):
73385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ResourceIdArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
73395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif arg_parts[0].startswith('GLenum') and len(arg_parts[0]) > 6:
73405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return EnumArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
73415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif arg_parts[0].startswith('GLboolean') and len(arg_parts[0]) > 9:
73425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ValidatedBoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
73435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif arg_parts[0].startswith('GLboolean'):
73445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return BoolArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
73455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif arg_parts[0].startswith('GLintUniformLocation'):
73465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return UniformLocationArgument(arg_parts[-1])
73475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif (arg_parts[0].startswith('GLint') and len(arg_parts[0]) > 5 and
73485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        not arg_parts[0].startswith('GLintptr')):
73495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return IntArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
73505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif (arg_parts[0].startswith('GLsizeiNotNegative') or
73515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg_parts[0].startswith('GLintptrNotNegative')):
73525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SizeNotNegativeArgument(arg_parts[-1],
73535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   " ".join(arg_parts[0:-1]),
73545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   arg_parts[0][0:-11])
73555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif arg_parts[0].startswith('GLsize'):
73565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return SizeArgument(arg_parts[-1], " ".join(arg_parts[0:-1]))
73575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
73585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return Argument(arg_parts[-1], " ".join(arg_parts[0:-1]))
73595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLGenerator(object):
73625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """A class to generate GL command buffers."""
73635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _function_re = re.compile(r'GL_APICALL(.*?)GL_APIENTRY (.*?) \((.*?)\);')
73655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def __init__(self, verbose):
73675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.original_functions = []
73685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.functions = []
73695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.verbose = verbose
73705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.errors = 0
73715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.pepper_interfaces = []
73725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.interface_info = {}
73735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for interface in _PEPPER_INTERFACES:
73755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      interface = PepperInterface(interface)
73765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.pepper_interfaces.append(interface)
73775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.interface_info[interface.GetName()] = interface
73785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def AddFunction(self, func):
73805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Adds a function."""
73815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.functions.append(func)
73825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def GetFunctionInfo(self, name):
73845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Gets a type info for the given function name."""
7385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if name in _FUNCTION_INFO:
7386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      func_info = _FUNCTION_INFO[name].copy()
7387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    else:
7388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      func_info = {}
7389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if not 'type' in func_info:
7391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      func_info['type'] = ''
7392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return func_info
73945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Log(self, msg):
73965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Prints something if verbose is true."""
73975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if self.verbose:
73985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print msg
73995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def Error(self, msg):
74015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Prints an error."""
74025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print "Error: %s" % msg
74035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.errors += 1
74045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteLicense(self, file):
74065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the license."""
74075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(_LICENSE)
74085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteNamespaceOpen(self, file):
74105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the code for the namespace."""
74115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("namespace gpu {\n")
74125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("namespace gles2 {\n")
74135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
74145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteNamespaceClose(self, file):
74165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the code to close the namespace."""
74175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}  // namespace gles2\n")
74185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}  // namespace gpu\n")
74195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
74205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def ParseGLH(self, filename):
74225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Parses the cmd_buffer_functions.txt file and extracts the functions"""
7423a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    f = open(filename, "r")
74245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    functions = f.read()
74255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    f.close()
74265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for line in functions.splitlines():
74275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      match = self._function_re.match(line)
74285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if match:
74295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        func_name = match.group(2)[2:]
74305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        func_info = self.GetFunctionInfo(func_name)
7431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        if func_info['type'] == 'Noop':
7432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          continue
7433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        parsed_func_info = {
7435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          'original_name': func_name,
7436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          'original_args': match.group(3),
7437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          'return_type': match.group(1).strip(),
7438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        }
7439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        for k in parsed_func_info.keys():
7441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          if not k in func_info:
7442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            func_info[k] = parsed_func_info[k]
7443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        f = Function(func_name, func_info)
7445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        self.original_functions.append(f)
7446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        #for arg in f.GetOriginalArgs():
7448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        #  if not isinstance(arg, EnumArgument) and arg.type == 'GLenum':
7449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        #    self.Log("%s uses bare GLenum %s." % (func_name, arg.name))
7450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        gen_cmd = f.GetInfo('gen_cmd')
7452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        if gen_cmd == True or gen_cmd == None:
7453f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          if f.type_handler.NeedsDataTransferFunction(f):
7454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            methods = f.GetDataTransferMethods()
7455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            if 'immediate' in methods:
7456f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              self.AddFunction(ImmediateFunction(f))
7457f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            if 'bucket' in methods:
7458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              self.AddFunction(BucketFunction(f))
7459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)            if 'shm' in methods:
7460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              self.AddFunction(f)
7461f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          else:
74625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            self.AddFunction(f)
74635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.Log("Auto Generated Functions    : %d" %
74655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             len([f for f in self.functions if f.can_auto_generate or
74665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  (not f.IsType('') and not f.IsType('Custom') and
74675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   not f.IsType('Todo'))]))
74685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    funcs = [f for f in self.functions if not f.can_auto_generate and
74705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (f.IsType('') or f.IsType('Custom') or f.IsType('Todo'))]
74715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.Log("Non Auto Generated Functions: %d" % len(funcs))
74725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for f in funcs:
7474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      self.Log("  %-10s %-20s gl%s" % (f.info['type'], f.return_type, f.name))
74755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCommandIds(self, filename):
74775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the command buffer format"""
74785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(filename)
74795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#define GLES2_COMMAND_LIST(OP) \\\n")
74805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    id = 256
74815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.functions:
74825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  %-60s /* %d */ \\\n" %
74835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 ("OP(%s)" % func.name, id))
74845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id += 1
74855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
74865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("enum CommandId {\n")
74885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  kStartPoint = cmd::kLastCommonId,  "
74895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               "// All GLES2 commands start after this.\n")
74905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#define GLES2_CMD_OP(name) k ## name,\n")
74915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  GLES2_COMMAND_LIST(GLES2_CMD_OP)\n")
74925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#undef GLES2_CMD_OP\n")
74935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  kNumCommands\n")
74945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("};\n")
74955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
74965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
74975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteFormat(self, filename):
74995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the command buffer format"""
75005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(filename)
75015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.functions:
75025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if True:
75035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #gen_cmd = func.GetInfo('gen_cmd')
75045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #if gen_cmd == True or gen_cmd == None:
75055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        func.WriteStruct(file)
75065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
75075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
75085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteDocs(self, filename):
75105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the command buffer doc version of the commands"""
75115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CWriter(filename)
75125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.functions:
75135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if True:
75145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #gen_cmd = func.GetInfo('gen_cmd')
75155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #if gen_cmd == True or gen_cmd == None:
75165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        func.WriteDocs(file)
75175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
75185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
75195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteFormatTest(self, filename):
75215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the command buffer format test."""
75225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
75235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      filename,
75245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "// This file contains unit tests for gles2 commmands\n"
75255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "// It is included by gles2_cmd_format_test.cc\n"
75265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\n")
75275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.functions:
75295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if True:
75305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #gen_cmd = func.GetInfo('gen_cmd')
75315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #if gen_cmd == True or gen_cmd == None:
75325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        func.WriteFormatTest(file)
75335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
75355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCmdHelperHeader(self, filename):
75375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the gles2 command helper."""
75385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(filename)
75395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.functions:
75415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if True:
75425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #gen_cmd = func.GetInfo('gen_cmd')
75435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #if gen_cmd == True or gen_cmd == None:
75445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        func.WriteCmdHelper(file)
75455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
75475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteServiceContextStateHeader(self, filename):
75492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the service context state header."""
75505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
75515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename,
75525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// It is included by context_state.h\n")
75535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("struct EnableFlags {\n")
75545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("  EnableFlags();\n")
75555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for capability in _CAPABILITY_FLAGS:
75565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  bool %s;\n" % capability['name'])
7557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      file.Write("  bool cached_%s;\n" % capability['name'])
75585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("};\n\n")
75595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for state_name in sorted(_STATES.keys()):
75615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = _STATES[state_name]
75625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for item in state['states']:
75631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if isinstance(item['default'], list):
75641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          file.Write("%s %s[%d];\n" % (item['type'], item['name'],
75651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                       len(item['default'])))
75661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else:
75671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          file.Write("%s %s;\n" % (item['type'], item['name']))
75681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        if item.get('cached', False):
75701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if isinstance(item['default'], list):
75711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            file.Write("%s cached_%s[%d];\n" % (item['type'], item['name'],
75721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                len(item['default'])))
75731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else:
75741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            file.Write("%s cached_%s;\n" % (item['type'], item['name']))
75751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
75765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
75775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("""
7579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        inline void SetDeviceCapabilityState(GLenum cap, bool enable) {
7580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          switch (cap) {
7581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        """)
7582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    for capability in _CAPABILITY_FLAGS:
7583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      file.Write("""\
7584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            case GL_%s:
7585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          """ % capability['name'].upper())
7586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      file.Write("""\
7587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              if (enable_flags.cached_%(name)s == enable &&
7588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  !ignore_cached_state)
7589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                return;
7590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              enable_flags.cached_%(name)s = enable;
7591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              break;
7592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          """ % capability)
7593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    file.Write("""\
7595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            default:
7596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              NOTREACHED();
7597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              return;
7598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          }
7599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          if (enable)
7600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            glEnable(cap);
7601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          else
7602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            glDisable(cap);
7603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        }
7604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        """)
7605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
76065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
76075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteClientContextStateHeader(self, filename):
76092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the client context state header."""
76102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file = CHeaderWriter(
76112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        filename,
76122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "// It is included by client_context_state.h\n")
76132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("struct EnableFlags {\n")
76142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("  EnableFlags();\n")
76152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for capability in _CAPABILITY_FLAGS:
76162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("  bool %s;\n" % capability['name'])
76172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("};\n\n")
76182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Close()
76202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteContextStateGetters(self, file, class_name):
76222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the state getters."""
76232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for gl_type in ["GLint", "GLfloat"]:
76242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("""
76252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool %s::GetStateAs%s(
76262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum pname, %s* params, GLsizei* num_written) const {
76272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (pname) {
76282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""" % (class_name, gl_type, gl_type))
7629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      for state_name in sorted(_STATES.keys()):
76302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        state = _STATES[state_name]
76312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if 'enum' in state:
76322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          file.Write("    case %s:\n" % state['enum'])
76332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          file.Write("      *num_written = %d;\n" % len(state['states']))
76342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          file.Write("      if (params) {\n")
76352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          for ndx,item in enumerate(state['states']):
76362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file.Write("        params[%d] = static_cast<%s>(%s);\n" %
76372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       (ndx, gl_type, item['name']))
76382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          file.Write("      }\n")
76392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          file.Write("      return true;\n")
76402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        else:
76412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          for item in state['states']:
76422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file.Write("    case %s:\n" % item['enum'])
76431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if isinstance(item['default'], list):
76441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              item_len = len(item['default'])
76451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              file.Write("      *num_written = %d;\n" % item_len)
76461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              file.Write("      if (params) {\n")
76471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              if item['type'] == gl_type:
76481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                file.Write("        memcpy(params, %s, sizeof(%s) * %d);\n" %
76491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           (item['name'], item['type'], item_len))
76501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              else:
76511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                file.Write("        for (size_t i = 0; i < %s; ++i) {\n" %
76521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           item_len)
76531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                file.Write("          params[i] = %s;\n" %
76541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           (GetGLGetTypeConversion(gl_type, item['type'],
76551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                   "%s[i]" % item['name'])))
76561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                file.Write("        }\n");
76571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            else:
76581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              file.Write("      *num_written = 1;\n")
76591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              file.Write("      if (params) {\n")
76601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              file.Write("        params[0] = %s;\n" %
76611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         (GetGLGetTypeConversion(gl_type, item['type'],
76621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 item['name'])))
76632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file.Write("      }\n")
76642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file.Write("      return true;\n")
76652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      for capability in _CAPABILITY_FLAGS:
76662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file.Write("    case GL_%s:\n" % capability['name'].upper())
76672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file.Write("      *num_written = 1;\n")
76682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file.Write("      if (params) {\n")
76692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file.Write(
76702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                "        params[0] = static_cast<%s>(enable_flags.%s);\n" %
76712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                (gl_type, capability['name']))
76722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file.Write("      }\n")
76732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            file.Write("      return true;\n")
76742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("""    default:
76752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
76762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
76772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
76782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""")
76792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
76802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteServiceContextStateImpl(self, filename):
76812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the context state service implementation."""
76825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
76835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename,
76845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// It is included by context_state.cc\n")
76855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = []
76865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for capability in _CAPABILITY_FLAGS:
76875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      code.append("%s(%s)" %
76885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  (capability['name'],
76895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   ('false', 'true')['default' in capability]))
7690010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      code.append("cached_%s(%s)" %
7691010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  (capability['name'],
7692010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   ('false', 'true')['default' in capability]))
76935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("ContextState::EnableFlags::EnableFlags()\n    : %s {\n}\n" %
76945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ",\n      ".join(code))
76955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
76965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("void ContextState::Initialize() {\n")
76985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for state_name in sorted(_STATES.keys()):
76995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = _STATES[state_name]
77005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for item in state['states']:
77011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if isinstance(item['default'], list):
77021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          for ndx, value in enumerate(item['default']):
77031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            file.Write("  %s[%d] = %s;\n" % (item['name'], ndx, value))
77041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        else:
77051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          file.Write("  %s = %s;\n" % (item['name'], item['default']))
7706010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        if item.get('cached', False):
77071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if isinstance(item['default'], list):
77081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            for ndx, value in enumerate(item['default']):
77091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              file.Write("  cached_%s[%d] = %s;\n" % (item['name'], ndx, value))
77101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          else:
77111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            file.Write("  cached_%s = %s;\n" % (item['name'], item['default']))
77125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
77135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("""
7715c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ContextState::InitCapabilities(const ContextState* prev_state) const {
77165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
7717c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    def WriteCapabilities(test_prev):
7718c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      for capability in _CAPABILITY_FLAGS:
7719c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        capability_name = capability['name']
7720c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        if test_prev:
7721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          file.Write("""  if (prev_state->enable_flags.cached_%s !=
7722010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              enable_flags.cached_%s)\n""" %
7723c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                     (capability_name, capability_name))
7724010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        file.Write("    EnableDisable(GL_%s, enable_flags.cached_%s);\n" %
7725c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                   (capability_name.upper(), capability_name))
7726c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
7727c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    file.Write("  if (prev_state) {")
7728c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    WriteCapabilities(True)
7729c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    file.Write("  } else {")
7730c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    WriteCapabilities(False)
7731c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    file.Write("  }")
7732c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
77335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("""}
77345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ContextState::InitState(const ContextState *prev_state) const {
77365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
77375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7738c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    def WriteStates(test_prev):
7739c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      # We need to sort the keys so the expectations match
7740c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      for state_name in sorted(_STATES.keys()):
7741c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        state = _STATES[state_name]
7742c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        if state['type'] == 'FrontBack':
7743c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          num_states = len(state['states'])
7744c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          for ndx, group in enumerate(Grouper(num_states / 2, state['states'])):
7745c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            if test_prev:
7746c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              file.Write("  if (")
7747c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            args = []
7748c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            for place, item in enumerate(group):
7749010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              item_name = CachedStateName(item)
7750c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              args.append('%s' % item_name)
7751c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              if test_prev:
7752c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                if place > 0:
7753c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                  file.Write(' ||\n')
7754c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                file.Write("(%s != prev_state->%s)" % (item_name, item_name))
7755c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            if test_prev:
7756c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              file.Write(")\n")
7757c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            file.Write(
7758c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                "  gl%s(%s, %s);\n" %
7759c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args)))
7760c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        elif state['type'] == 'NamedParameter':
7761c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          for item in state['states']:
7762010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            item_name = CachedStateName(item)
7763010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7764c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            if 'extension_flag' in item:
77651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              file.Write("  if (feature_info_->feature_flags().%s) {\n  " %
7766c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                         item['extension_flag'])
7767c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            if test_prev:
77681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              if isinstance(item['default'], list):
77691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                file.Write("  if (memcmp(prev_state->%s, %s, "
77701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           "sizeof(%s) * %d)) {\n" %
77711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           (item_name, item_name, item['type'],
77721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            len(item['default'])))
77731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              else:
77741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                file.Write("  if (prev_state->%s != %s) {\n  " %
77751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           (item_name, item_name))
7776c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            file.Write("  gl%s(%s, %s);\n" %
77771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       (state['func'],
77781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        (item['enum_set']
77791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           if 'enum_set' in item else item['enum']),
77801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        item['name']))
77811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if test_prev:
77821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              if 'extension_flag' in item:
77831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                file.Write("  ")
77841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              file.Write("  }")
77851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            if 'extension_flag' in item:
77861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              file.Write("  }")
7787c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        else:
778803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          if 'extension_flag' in state:
778903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            file.Write("  if (feature_info_->feature_flags().%s)\n  " %
779003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       state['extension_flag'])
7791c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          if test_prev:
7792c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            file.Write("  if (")
77935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          args = []
7794c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          for place, item in enumerate(state['states']):
7795010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            item_name = CachedStateName(item)
7796c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            args.append('%s' % item_name)
7797c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            if test_prev:
7798c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              if place > 0:
7799c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                file.Write(' ||\n')
7800c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              file.Write("(%s != prev_state->%s)" %
7801c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                         (item_name, item_name))
7802c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          if test_prev:
7803c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            file.Write("    )\n")
7804c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          file.Write("  gl%s(%s);\n" % (state['func'], ", ".join(args)))
7805c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
7806c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    file.Write("  if (prev_state) {")
7807c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    WriteStates(True)
7808c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    file.Write("  } else {")
7809c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    WriteStates(False)
7810c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    file.Write("  }")
78115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n")
78125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("""bool ContextState::GetEnabled(GLenum cap) const {
78142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (cap) {
78152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""")
78162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for capability in _CAPABILITY_FLAGS:
78172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    case GL_%s:\n" % capability['name'].upper())
78182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("      return enable_flags.%s;\n" % capability['name'])
78192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("""    default:
7820f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      NOTREACHED();
78212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
78222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
78232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
78242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""")
78252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
78262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.WriteContextStateGetters(file, "ContextState")
78272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Close()
78282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
78292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteClientContextStateImpl(self, filename):
78302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the context state client side implementation."""
78312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file = CHeaderWriter(
78322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        filename,
78332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "// It is included by client_context_state.cc\n")
78342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    code = []
78352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for capability in _CAPABILITY_FLAGS:
78362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      code.append("%s(%s)" %
78372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  (capability['name'],
78382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   ('false', 'true')['default' in capability]))
78392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write(
78402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "ClientContextState::EnableFlags::EnableFlags()\n    : %s {\n}\n" %
78412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ",\n      ".join(code))
78422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("\n")
78432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
78442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("""
78452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ClientContextState::SetCapabilityState(
78462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum cap, bool enabled, bool* changed) {
78472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *changed = false;
78482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (cap) {
78492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""")
78502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for capability in _CAPABILITY_FLAGS:
78512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    case GL_%s:\n" % capability['name'].upper())
78522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("""      if (enable_flags.%(name)s != enabled) {
78532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         *changed = true;
78542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         enable_flags.%(name)s = enabled;
78552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
78562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return true;
78572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""" % capability)
78582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("""    default:
78592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
78602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
78612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
78622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""")
78632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("""bool ClientContextState::GetEnabled(
78642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GLenum cap, bool* enabled) const {
78652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (cap) {
78662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""")
78672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for capability in _CAPABILITY_FLAGS:
78682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("    case GL_%s:\n" % capability['name'].upper())
78692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("      *enabled = enable_flags.%s;\n" % capability['name'])
78702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write("      return true;\n")
78712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("""    default:
78722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
78732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
78742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
78752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""")
78765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
78775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceImplementation(self, filename):
78795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service decorder implementation."""
78805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
78815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename,
78825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// It is included by gles2_cmd_decoder.cc\n")
78835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.functions:
78855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if True:
78865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #gen_cmd = func.GetInfo('gen_cmd')
78875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      #if gen_cmd == True or gen_cmd == None:
78885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        func.WriteServiceImplementation(file)
78895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("""
78915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) {
78925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (cap) {
78935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
78945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for capability in _CAPABILITY_FLAGS:
78955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    case GL_%s:\n" % capability['name'].upper())
78965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if 'state_flag' in capability:
7897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
7898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        file.Write("""\
7899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            state_.enable_flags.%(name)s = enabled;
7900010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            if (state_.enable_flags.cached_%(name)s != enabled
7901010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                || state_.ignore_cached_state) {
7902010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              %(state_flag)s = true;
7903010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            }
7904010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            return false;
7905010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            """ % capability)
79065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
7907010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        file.Write("""\
7908010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            state_.enable_flags.%(name)s = enabled;
7909010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            if (state_.enable_flags.cached_%(name)s != enabled
7910010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                || state_.ignore_cached_state) {
7911010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              state_.enable_flags.cached_%(name)s = enabled;
7912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              return true;
7913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            }
7914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            return false;
7915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            """ % capability)
79165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("""    default:
79175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
79185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
79195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
79205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
79215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
79225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
79235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceUnitTests(self, filename):
79255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the service decorder unit tests."""
79265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_tests = len(self.functions)
79275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FUNCTIONS_PER_FILE = 98  # hard code this so it doesn't change.
79285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    count = 0
79295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for test_num in range(0, num_tests, FUNCTIONS_PER_FILE):
79305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      count += 1
79315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name = filename % count
79325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file = CHeaderWriter(
79335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          name,
79345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "// It is included by gles2_cmd_decoder_unittest_%d.cc\n" % count)
793503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      test_name = 'GLES2DecoderTest%d' % count
79365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      end = test_num + FUNCTIONS_PER_FILE
79375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if end > num_tests:
79385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        end = num_tests
79395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for idx in range(test_num, end):
79405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        func = self.functions[idx]
794103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
794203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        # Do any filtering of the functions here, so that the functions
794303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        # will not move between the numbered files if filtering properties
794403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        # are changed.
794503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        if func.GetInfo('extension_flag'):
794603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          continue
794703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
79485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if True:
79495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        #gen_cmd = func.GetInfo('gen_cmd')
79505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        #if gen_cmd == True or gen_cmd == None:
79515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if func.GetInfo('unit_test') == False:
79525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            file.Write("// TODO(gman): %s\n" % func.name)
79535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          else:
795403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            func.WriteServiceUnitTest(file, {
795503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              'test_name': test_name
795603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            })
79575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Close()
79595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
79605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename % 0,
79615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// It is included by gles2_cmd_decoder_unittest_base.cc\n")
79625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(
79635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""void GLES2DecoderTestBase::SetupInitCapabilitiesExpectations() {
79645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
79655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for capability in _CAPABILITY_FLAGS:
79665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  ExpectEnableDisable(GL_%s, %s);\n" %
79675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (capability['name'].upper(),
79685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  ('false', 'true')['default' in capability]))
79695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("""}
79705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GLES2DecoderTestBase::SetupInitStateExpectations() {
79725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
79735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # We need to sort the keys so the expectations match
79755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for state_name in sorted(_STATES.keys()):
79765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = _STATES[state_name]
79775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if state['type'] == 'FrontBack':
79785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        num_states = len(state['states'])
79795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for ndx, group in enumerate(Grouper(num_states / 2, state['states'])):
79805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          args = []
79815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          for item in group:
79825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if 'expected' in item:
79835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              args.append(item['expected'])
79845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            else:
79855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              args.append(item['default'])
79865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          file.Write(
79875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              "  EXPECT_CALL(*gl_, %s(%s, %s))\n" %
79885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              (state['func'], ('GL_FRONT', 'GL_BACK')[ndx], ", ".join(args)))
79895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          file.Write("      .Times(1)\n")
79905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          file.Write("      .RetiresOnSaturation();\n")
7991868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      elif state['type'] == 'NamedParameter':
7992868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        for item in state['states']:
7993868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          if 'extension_flag' in item:
799403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            file.Write("  if (group_->feature_info()->feature_flags().%s) {\n" %
799503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                       item['extension_flag'])
799603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            file.Write("  ")
79971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          expect_value = item['default']
79981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          if isinstance(expect_value, list):
79991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            # TODO: Currently we do not check array values.
80001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expect_value = "_"
800103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8002868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          file.Write(
8003868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              "  EXPECT_CALL(*gl_, %s(%s, %s))\n" %
80041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              (state['func'],
80051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               (item['enum_set']
80061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           if 'enum_set' in item else item['enum']),
80071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci               expect_value))
8008868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          file.Write("      .Times(1)\n")
8009868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          file.Write("      .RetiresOnSaturation();\n")
801003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          if 'extension_flag' in item:
801103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            file.Write("  }\n")
80125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
801303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        if 'extension_flag' in state:
801403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          file.Write("  if (group_->feature_info()->feature_flags().%s) {\n" %
801503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                     state['extension_flag'])
801603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          file.Write("  ")
80175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        args = []
80185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for item in state['states']:
80195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if 'expected' in item:
80205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            args.append(item['expected'])
80215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          else:
80225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            args.append(item['default'])
80231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        # TODO: Currently we do not check array values.
80241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        args = ["_" if isinstance(arg, list) else arg for arg in args]
80255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("  EXPECT_CALL(*gl_, %s(%s))\n" %
80265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (state['func'], ", ".join(args)))
80275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("      .Times(1)\n")
80285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("      .RetiresOnSaturation();\n")
802903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        if 'extension_flag' in state:
803003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          file.Write("  }\n")
80315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("""}
80325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
80335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
80345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
803503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def WriteServiceUnitTestsForExtensions(self, filename):
803603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    """Writes the service decorder unit tests for functions with extension_flag.
803703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
803803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       The functions are special in that they need a specific unit test
803903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       baseclass to turn on the extension.
804003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    """
804103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    functions = [f for f in self.functions if f.GetInfo('extension_flag')]
804203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    file = CHeaderWriter(
804303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      filename,
804403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      "// It is included by gles2_cmd_decoder_unittest_extensions.cc\n")
804503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    for func in functions:
804603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      if True:
804703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        if func.GetInfo('unit_test') == False:
804803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          file.Write("// TODO(gman): %s\n" % func.name)
804903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        else:
805003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          extension = ToCamelCase(
805103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            ToGLExtensionString(func.GetInfo('extension_flag')))
805203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          func.WriteServiceUnitTest(file, {
805303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            'test_name': 'GLES2DecoderTestWith%s' % extension
805403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          })
805503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
805603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    file.Close()
805703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
80582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteGLES2Header(self, filename):
80592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the GLES2 header."""
80602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file = CHeaderWriter(
80612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        filename,
80622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "// This file contains Chromium-specific GLES2 declarations.\n\n")
80632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
80642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for func in self.original_functions:
80652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      func.WriteGLES2Header(file)
80662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
80672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("\n")
80682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Close()
80695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2CLibImplementation(self, filename):
80715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 c lib implementation."""
80725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
80735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename,
80745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// These functions emulate GLES2 over command buffers.\n")
80755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.original_functions:
80775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteGLES2CLibImplementation(file)
80785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("""
80802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gles2 {
80812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
80827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochextern const NameToFunc g_gles2_function_table[] = {
80832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""")
80842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for func in self.original_functions:
80852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      file.Write(
80862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          '  { "gl%s", reinterpret_cast<GLES2FunctionPointer>(gl%s), },\n' %
80872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          (func.name, func.name))
80882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Write("""  { NULL, NULL, },
80892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
80902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
80912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace gles2
80922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)""")
80935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
80945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2InterfaceHeader(self, filename):
80965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 interface header."""
80975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
80985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename,
80995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// This file is included by gles2_interface.h to declare the\n"
81005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// GL api functions.\n")
81015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.original_functions:
81025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteGLES2InterfaceHeader(file)
81035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
81045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2InterfaceStub(self, filename):
81065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 interface stub header."""
81075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
81085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename,
81095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// This file is included by gles2_interface_stub.h.\n")
81105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.original_functions:
81115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteGLES2InterfaceStub(file)
81125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
81135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2InterfaceStubImpl(self, filename):
81155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 interface header."""
81165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
81175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename,
81185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// This file is included by gles2_interface_stub.cc.\n")
81195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.original_functions:
81205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteGLES2InterfaceStubImpl(file)
81215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
81225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationHeader(self, filename):
81245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implementation header."""
81255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
81265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename,
81275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// This file is included by gles2_implementation.h to declare the\n"
81285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// GL api functions.\n")
81295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.original_functions:
81305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteGLES2ImplementationHeader(file)
81315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
81325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2Implementation(self, filename):
81345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 Implementation."""
81355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
81365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename,
81375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// This file is included by gles2_implementation.cc to define the\n"
81385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// GL api functions.\n")
81395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.original_functions:
81405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteGLES2Implementation(file)
81415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
81425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteGLES2TraceImplementationHeader(self, filename):
81442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the GLES2 Trace Implementation header."""
81452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file = CHeaderWriter(
81462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        filename,
81472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "// This file is included by gles2_trace_implementation.h\n")
81482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for func in self.original_functions:
81492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      func.WriteGLES2TraceImplementationHeader(file)
81502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Close()
81512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
81522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def WriteGLES2TraceImplementation(self, filename):
81532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Writes the GLES2 Trace Implementation."""
81542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file = CHeaderWriter(
81552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        filename,
81562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "// This file is included by gles2_trace_implementation.cc\n")
81572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for func in self.original_functions:
81582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      func.WriteGLES2TraceImplementation(file)
81592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    file.Close()
81602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
81615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ImplementationUnitTests(self, filename):
81625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the GLES2 helper header."""
81635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(
81645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        filename,
81655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// This file is included by gles2_implementation.h to declare the\n"
81665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        "// GL api functions.\n")
81675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.original_functions:
81685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      func.WriteGLES2ImplementationUnitTest(file)
81695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
81705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceUtilsHeader(self, filename):
81725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the gles2 auto generated utility header."""
81735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(filename)
8174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for name in sorted(_NAMED_TYPE_INFO.keys()):
8175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      named_type = NamedType(_NAMED_TYPE_INFO[name])
8176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if named_type.IsConstant():
8177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        continue
81785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("ValueValidator<%s> %s;\n" %
8179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                 (named_type.GetType(), ToUnderscore(name)))
81805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
81815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
81825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteServiceUtilsImplementation(self, filename):
81845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the gles2 auto generated utility implementation."""
81855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(filename)
8186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    names = sorted(_NAMED_TYPE_INFO.keys())
8187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for name in names:
8188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      named_type = NamedType(_NAMED_TYPE_INFO[name])
8189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if named_type.IsConstant():
8190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        continue
8191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if named_type.GetValidValues():
81927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        file.Write("static const %s valid_%s_table[] = {\n" %
8193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   (named_type.GetType(), ToUnderscore(name)))
8194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        for value in named_type.GetValidValues():
81955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          file.Write("  %s,\n" % value)
81965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("};\n")
81975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("\n")
8198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file.Write("Validators::Validators()")
8199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pre = '    : '
8200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for count, name in enumerate(names):
8201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      named_type = NamedType(_NAMED_TYPE_INFO[name])
8202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if named_type.IsConstant():
8203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        continue
8204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if named_type.GetValidValues():
8205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        code = """%(pre)s%(name)s(
8206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          valid_%(name)s_table, arraysize(valid_%(name)s_table))"""
82075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
8208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        code = "%(pre)s%(name)s()"
82095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(code % {
8210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'name': ToUnderscore(name),
8211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        'pre': pre,
8212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      })
8213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      pre = ',\n    '
8214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file.Write(" {\n");
82155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}\n\n");
82165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
82175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCommonUtilsHeader(self, filename):
82195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the gles2 common utility header."""
82205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(filename)
8221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    type_infos = sorted(_NAMED_TYPE_INFO.keys())
8222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for type_info in type_infos:
8223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if _NAMED_TYPE_INFO[type_info]['type'] == 'GLenum':
8224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        file.Write("static std::string GetString%s(uint32_t value);\n" %
8225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                   type_info)
82265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("\n")
82275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
82285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteCommonUtilsImpl(self, filename):
82305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the gles2 common utility header."""
82315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum_re = re.compile(r'\#define\s+(GL_[a-zA-Z0-9_]+)\s+([0-9A-Fa-fx]+)')
82325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict = {}
82335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for fname in ['../../third_party/khronos/GLES2/gl2.h',
82342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  '../../third_party/khronos/GLES2/gl2ext.h',
82352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  '../../gpu/GLES2/gl2chromium.h',
82362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                  '../../gpu/GLES2/gl2extchromium.h']:
82375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      lines = open(fname).readlines()
82385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for line in lines:
82395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m = enum_re.match(line)
82405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if m:
82415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          name = m.group(1)
82425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          value = m.group(2)
82432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if len(value) <= 10 and not value in dict:
82445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            dict[value] = name
82455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CHeaderWriter(filename)
82477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    file.Write("static const GLES2Util::EnumToString "
82487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch               "enum_to_string_table[] = {\n")
82495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for value in dict:
82505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write('  { %s, "%s", },\n' % (value, dict[value]))
82515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("""};
82525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst GLES2Util::EnumToString* const GLES2Util::enum_to_string_table_ =
82545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum_to_string_table;
82555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t GLES2Util::enum_to_string_table_len_ =
82565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sizeof(enum_to_string_table) / sizeof(enum_to_string_table[0]);
82575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
82595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    enums = sorted(_NAMED_TYPE_INFO.keys())
82615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for enum in enums:
8262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if _NAMED_TYPE_INFO[enum]['type'] == 'GLenum':
8263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        file.Write("std::string GLES2Util::GetString%s(uint32_t value) {\n" %
82645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   enum)
8265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        if len(_NAMED_TYPE_INFO[enum]['valid']) > 0:
82667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          file.Write("  static const EnumToString string_table[] = {\n")
8267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          for value in _NAMED_TYPE_INFO[enum]['valid']:
82685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            file.Write('    { %s, "%s" },\n' % (value, value))
82695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          file.Write("""  };
82705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GLES2Util::GetQualifiedEnumString(
82715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string_table, arraysize(string_table), value);
82725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
82735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
82755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else:
82765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          file.Write("""  return GLES2Util::GetQualifiedEnumString(
82775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL, 0, value);
82785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
82795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""")
82815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
82825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WritePepperGLES2Interface(self, filename, dev):
82845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the Pepper OpenGLES interface definition."""
82851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    file = CWriter(filename)
82861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    file.Write(_LICENSE)
82871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    file.Write(_DO_NOT_EDIT_WARNING)
82881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
82891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    file.Write("label Chrome {\n")
82901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    file.Write("  M39 = 1.0\n")
82911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    file.Write("};\n\n")
82925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if not dev:
82941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      # Declare GL types.
82951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      file.Write("[version=1.0]\n")
82961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      file.Write("describe {\n")
82971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      for gltype in ['GLbitfield', 'GLboolean', 'GLbyte', 'GLclampf',
82981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     'GLclampx', 'GLenum', 'GLfixed', 'GLfloat', 'GLint',
82991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     'GLintptr', 'GLshort', 'GLsizei', 'GLsizeiptr',
83001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     'GLubyte', 'GLuint', 'GLushort']:
83011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        file.Write("  %s;\n" % gltype)
83021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        file.Write("  %s_ptr_t;\n" % gltype)
83031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      file.Write("};\n\n")
83041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
83051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    # C level typedefs.
83061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    file.Write("#inline c\n")
83075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#include \"ppapi/c/pp_resource.h\"\n")
83085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if dev:
83095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("#include \"ppapi/c/ppb_opengles2.h\"\n\n")
83105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
83115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("\n#ifndef __gl2_h_\n")
83125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (k, v) in _GL_TYPES.iteritems():
83135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("typedef %s %s;\n" % (v, k))
83145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("#ifdef _WIN64\n")
83155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      for (k, v) in _GL_TYPES_64.iteritems():
83165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file.Write("typedef %s %s;\n" % (v, k))
83175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("#else\n")
83185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      for (k, v) in _GL_TYPES_32.iteritems():
83195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        file.Write("typedef %s %s;\n" % (v, k))
83205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("#endif  // _WIN64\n")
83215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("#endif  // __gl2_h_\n\n")
83221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    file.Write("#endinl\n")
83235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for interface in self.pepper_interfaces:
83255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if interface.dev != dev:
83265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue
83271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      # Historically, we provide OpenGLES2 interfaces with struct
83281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      # namespace. Not to break code which uses the interface as
83291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      # "struct OpenGLES2", we put it in struct namespace.
83301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      file.Write('\n[macro="%s", force_struct_namespace]\n' %
83311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 interface.GetInterfaceName())
83321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      file.Write("interface %s {\n" % interface.GetStructName())
83335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for func in self.original_functions:
83345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if not func.InPepperInterface(interface):
83355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          continue
83365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ret_type = func.MapCTypeToPepperIdlType(func.return_type,
83381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                is_for_return_type=True)
83391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        func_prefix = "  %s %s(" % (ret_type, func.GetPepperName())
83401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        file.Write(func_prefix)
83411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        file.Write("[in] PP_Resource context")
83421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        for arg in func.MakeTypedPepperIdlArgStrings():
83431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          file.Write(",\n" + " " * len(func_prefix) + arg)
83441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        file.Write(");\n")
83455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("};\n\n")
83465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
83495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WritePepperGLES2Implementation(self, filename):
83515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Writes the Pepper OpenGLES interface implementation."""
83525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CWriter(filename)
83545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(_LICENSE)
83555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(_DO_NOT_EDIT_WARNING)
83565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#include \"ppapi/shared_impl/ppb_opengles2_shared.h\"\n\n")
83585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#include \"base/logging.h\"\n")
83595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#include \"gpu/command_buffer/client/gles2_implementation.h\"\n")
83605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#include \"ppapi/shared_impl/ppb_graphics_3d_shared.h\"\n")
83615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#include \"ppapi/thunk/enter.h\"\n\n")
83625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("namespace ppapi {\n\n")
83645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("namespace {\n\n")
83655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    file.Write("typedef thunk::EnterResource<thunk::PPB_Graphics3D_API>"
83674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               " Enter3D;\n\n")
83684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
83694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    file.Write("gpu::gles2::GLES2Implementation* ToGles2Impl(Enter3D*"
83704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               " enter) {\n")
83714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    file.Write("  DCHECK(enter);\n")
83724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    file.Write("  DCHECK(enter->succeeded());\n")
83734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    file.Write("  return static_cast<PPB_Graphics3D_Shared*>(enter->object())->"
83744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)               "gles2_impl();\n");
83754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    file.Write("}\n\n");
83765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.original_functions:
83785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if not func.InAnyPepperExtension():
83795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue
83805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      original_arg = func.MakeTypedPepperArgString("")
83825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_arg = "PP_Resource context_id"
83835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if len(original_arg):
83845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg = context_arg + ", " + original_arg
83855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
83865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg = context_arg
83875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("%s %s(%s) {\n" %
83885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 (func.return_type, func.GetPepperName(), arg))
83894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      file.Write("  Enter3D enter(context_id, true);\n")
83904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      file.Write("  if (enter.succeeded()) {\n")
83915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
83925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return_str = "" if func.return_type == "void" else "return "
83934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      file.Write("    %sToGles2Impl(&enter)->%s(%s);\n" %
83945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (return_str, func.original_name,
83955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  func.MakeOriginalArgString("")))
83964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      file.Write("  }")
83974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      if func.return_type == "void":
83984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        file.Write("\n")
83994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      else:
84004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        file.Write(" else {\n")
8401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        file.Write("    return %s;\n" % func.GetErrorReturnString())
84024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        file.Write("  }\n")
84035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("}\n\n")
84045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}  // namespace\n")
84065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for interface in self.pepper_interfaces:
84085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("const %s* PPB_OpenGLES2_Shared::Get%sInterface() {\n" %
84095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 (interface.GetStructName(), interface.GetName()))
84105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  static const struct %s "
84115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 "ppb_opengles2 = {\n" % interface.GetStructName())
84125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("    &")
84135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write(",\n    &".join(
84145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        f.GetPepperName() for f in self.original_functions
84155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if f.InPepperInterface(interface)))
84165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("\n")
84175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  };\n")
84195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("  return &ppb_opengles2;\n")
84205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("}\n")
84215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("}  // namespace ppapi\n")
84235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
84245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def WriteGLES2ToPPAPIBridge(self, filename):
84265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Connects GLES2 helper library to PPB_OpenGLES2 interface"""
84275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file = CWriter(filename)
84295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(_LICENSE)
84305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write(_DO_NOT_EDIT_WARNING)
84315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#ifndef GL_GLEXT_PROTOTYPES\n")
84335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#define GL_GLEXT_PROTOTYPES\n")
84345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#endif\n")
84355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#include <GLES2/gl2.h>\n")
84365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#include <GLES2/gl2ext.h>\n")
84375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Write("#include \"ppapi/lib/gl/gles2/gl2ext_ppapi.h\"\n\n")
84385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for func in self.original_functions:
84405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if not func.InAnyPepperExtension():
84415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue
84425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      interface = self.interface_info[func.GetInfo('pepper_interface') or '']
84445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("%s GL_APIENTRY gl%s(%s) {\n" %
84465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                 (func.return_type, func.GetPepperName(),
84475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                  func.MakeTypedPepperArgString("")))
84485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return_str = "" if func.return_type == "void" else "return "
84495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      interface_str = "glGet%sInterfacePPAPI()" % interface.GetName()
84505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      original_arg = func.MakeOriginalArgString("")
84515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context_arg = "glGetCurrentContextPPAPI()"
84525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if len(original_arg):
84535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg = context_arg + ", " + original_arg
84545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
84555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        arg = context_arg
84565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if interface.GetName():
84575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("  const struct %s* ext = %s;\n" %
84585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   (interface.GetStructName(), interface_str))
84595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("  if (ext)\n")
84605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("    %sext->%s(%s);\n" %
84615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   (return_str, func.GetPepperName(), arg))
84625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if return_str:
84635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          file.Write("  %s0;\n" % return_str)
84645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else:
84655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file.Write("  %s%s->%s(%s);\n" %
84665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   (return_str, interface_str, func.GetPepperName(), arg))
84675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file.Write("}\n\n")
84685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    file.Close()
84695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def WriteMojoGLCallVisitor(self, filename):
84715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    """Provides the GL implementation for mojo"""
84725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file = CWriter(filename)
84735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file.Write(_LICENSE)
84745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file.Write(_DO_NOT_EDIT_WARNING)
84755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
84765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for func in self.original_functions:
84775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if not func.IsCoreGLFunction():
84785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        continue
84795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      file.Write("VISIT_GL_CALL(%s, %s, (%s), (%s))\n" %
84805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             (func.name, func.return_type,
84815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              func.MakeTypedOriginalArgString(""),
84825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              func.MakeOriginalArgString("")))
84835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
84845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    file.Close()
84855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
84866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def WriteMojoGLCallVisitorForExtension(self, filename, extension):
84876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    """Provides the GL implementation for mojo for a particular extension"""
84886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    file = CWriter(filename)
84896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    file.Write(_LICENSE)
84906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    file.Write(_DO_NOT_EDIT_WARNING)
84916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
84926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    for func in self.original_functions:
84936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      if func.GetInfo("extension") != extension:
84946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        continue
84956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      file.Write("VISIT_GL_CALL(%s, %s, (%s), (%s))\n" %
84966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                             (func.name, func.return_type,
84976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                              func.MakeTypedOriginalArgString(""),
84986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                              func.MakeOriginalArgString("")))
84996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
85006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    file.Close()
85016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8502a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)def Format(generated_files):
8503a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for filename in generated_files:
8504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    call(["clang-format", "-i", "-style=chromium", filename])
8505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
85065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def main(argv):
85075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """This is the main function."""
85085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser = OptionParser()
85095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option(
85105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "--output-dir",
85115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      help="base directory for resulting files, under chrome/src. default is "
85125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "empty. Use this if you want the result stored under gen.")
85135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  parser.add_option(
85145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "-v", "--verbose", action="store_true",
85155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      help="prints more output.")
85165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (options, args) = parser.parse_args(args=argv)
85185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Add in states and capabilites to GLState
8520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gl_state_valid = _NAMED_TYPE_INFO['GLState']['valid']
85215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for state_name in sorted(_STATES.keys()):
85225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    state = _STATES[state_name]
85231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if 'extension_flag' in state:
85241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue
85255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if 'enum' in state:
8526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      if not state['enum'] in gl_state_valid:
8527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        gl_state_valid.append(state['enum'])
85285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
85295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for item in state['states']:
8530868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if 'extension_flag' in item:
8531868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          continue
8532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        if not item['enum'] in gl_state_valid:
8533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          gl_state_valid.append(item['enum'])
85345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for capability in _CAPABILITY_FLAGS:
8535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    valid_value = "GL_%s" % capability['name'].upper()
8536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if not valid_value in gl_state_valid:
8537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      gl_state_valid.append(valid_value)
85385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # This script lives under gpu/command_buffer, cd to base directory.
85405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  os.chdir(os.path.dirname(__file__) + "/../..")
85415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gen = GLGenerator(options.verbose)
8543a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gen.ParseGLH("gpu/command_buffer/cmd_buffer_functions.txt")
85445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Support generating files under gen/
85465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if options.output_dir != None:
85475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    os.chdir(options.output_dir)
85485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gen.WritePepperGLES2Interface("ppapi/api/ppb_opengles2.idl", False)
85501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gen.WritePepperGLES2Interface("ppapi/api/dev/ppb_opengles2ext_dev.idl", True)
85515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteGLES2ToPPAPIBridge("ppapi/lib/gl/gles2/gles2.c")
85525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WritePepperGLES2Implementation(
85535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "ppapi/shared_impl/ppb_opengles2_shared.cc")
85545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  os.chdir("gpu/command_buffer")
85555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteCommandIds("common/gles2_cmd_ids_autogen.h")
85565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteFormat("common/gles2_cmd_format_autogen.h")
85575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteFormatTest("common/gles2_cmd_format_test_autogen.h")
85585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteGLES2InterfaceHeader("client/gles2_interface_autogen.h")
85595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteGLES2InterfaceStub("client/gles2_interface_stub_autogen.h")
85605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteGLES2InterfaceStubImpl(
85615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "client/gles2_interface_stub_impl_autogen.h")
85625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteGLES2ImplementationHeader("client/gles2_implementation_autogen.h")
85635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteGLES2Implementation("client/gles2_implementation_impl_autogen.h")
85645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteGLES2ImplementationUnitTests(
85655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "client/gles2_implementation_unittest_autogen.h")
85665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteGLES2TraceImplementationHeader(
85675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "client/gles2_trace_implementation_autogen.h")
85685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteGLES2TraceImplementation(
85695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "client/gles2_trace_implementation_impl_autogen.h")
85705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteGLES2CLibImplementation("client/gles2_c_lib_autogen.h")
85715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteCmdHelperHeader("client/gles2_cmd_helper_autogen.h")
85725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteServiceImplementation("service/gles2_cmd_decoder_autogen.h")
85735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteServiceContextStateHeader("service/context_state_autogen.h")
85745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteServiceContextStateImpl("service/context_state_impl_autogen.h")
85755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteClientContextStateHeader("client/client_context_state_autogen.h")
85765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteClientContextStateImpl(
85775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "client/client_context_state_impl_autogen.h")
85785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteServiceUnitTests("service/gles2_cmd_decoder_unittest_%d_autogen.h")
857903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gen.WriteServiceUnitTestsForExtensions(
858003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    "service/gles2_cmd_decoder_unittest_extensions_autogen.h")
85815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteServiceUtilsHeader("service/gles2_cmd_validation_autogen.h")
85825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteServiceUtilsImplementation(
85835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "service/gles2_cmd_validation_implementation_autogen.h")
85845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteCommonUtilsHeader("common/gles2_cmd_utils_autogen.h")
85855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteCommonUtilsImpl("common/gles2_cmd_utils_implementation_autogen.h")
85865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gen.WriteGLES2Header("../GLES2/gl2chromium_autogen.h")
85876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  mojo_gles2_prefix = "../../mojo/public/c/gles2/gles2_call_visitor"
85886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  gen.WriteMojoGLCallVisitor(mojo_gles2_prefix + "_autogen.h")
85896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  gen.WriteMojoGLCallVisitorForExtension(
85906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      mojo_gles2_prefix + "_chromium_texture_mailbox_autogen.h",
85916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "CHROMIUM_texture_mailbox")
85926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  gen.WriteMojoGLCallVisitorForExtension(
85936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      mojo_gles2_prefix + "_chromium_sync_point_autogen.h",
85946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "CHROMIUM_sync_point")
85955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Format([
8597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "common/gles2_cmd_format_autogen.h",
8598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "common/gles2_cmd_format_test_autogen.h",
8599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "common/gles2_cmd_ids_autogen.h",
8600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "common/gles2_cmd_utils_autogen.h",
8601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "common/gles2_cmd_utils_implementation_autogen.h",
8602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/client_context_state_autogen.h",
8603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/client_context_state_impl_autogen.h",
8604a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/gles2_cmd_helper_autogen.h",
8605a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/gles2_c_lib_autogen.h",
8606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/gles2_implementation_autogen.h",
8607a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/gles2_implementation_impl_autogen.h",
8608a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/gles2_implementation_unittest_autogen.h",
8609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/gles2_interface_autogen.h",
8610a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/gles2_interface_stub_autogen.h",
8611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/gles2_interface_stub_impl_autogen.h",
8612a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/gles2_trace_implementation_autogen.h",
8613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "client/gles2_trace_implementation_impl_autogen.h",
8614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "service/context_state_autogen.h",
8615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "service/context_state_impl_autogen.h",
8616a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "service/gles2_cmd_decoder_autogen.h",
8617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "service/gles2_cmd_decoder_unittest_0_autogen.h",
8618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "service/gles2_cmd_decoder_unittest_1_autogen.h",
8619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "service/gles2_cmd_decoder_unittest_2_autogen.h",
8620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "service/gles2_cmd_decoder_unittest_3_autogen.h",
8621a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "service/gles2_cmd_validation_autogen.h",
8622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "service/gles2_cmd_validation_implementation_autogen.h"])
8623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  os.chdir("../..")
86246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  mojo_gles2_prefix = "mojo/public/c/gles2/gles2_call_visitor"
8625a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Format([
8626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "gpu/GLES2/gl2chromium_autogen.h",
86276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      mojo_gles2_prefix + "_autogen.h",
86286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      mojo_gles2_prefix + "_chromium_texture_mailbox_autogen.h",
86296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      mojo_gles2_prefix + "_chromium_sync_point_autogen.h",
8630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "ppapi/lib/gl/gles2/gles2.c",
8631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "ppapi/shared_impl/ppb_opengles2_shared.cc"])
8632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
86335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if gen.errors > 0:
86345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print "%d errors" % gen.errors
86355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
86365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0
86375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
86405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sys.exit(main(sys.argv[1:]))
8641