Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / gpu / command_buffer / build_gles2_cmd_buffer.py
index 56f59fc..09099d5 100755 (executable)
@@ -506,6 +506,36 @@ _STATES = {
       },
     ],
   },
+  'MatrixValuesCHROMIUM': {
+    'type': 'NamedParameter',
+    'func': 'MatrixLoadfEXT',
+    'states': [
+      { 'enum': 'GL_PATH_MODELVIEW_MATRIX_CHROMIUM',
+        'enum_set': 'GL_PATH_MODELVIEW_CHROMIUM',
+        'name': 'modelview_matrix',
+        'type': 'GLfloat',
+        'default': [
+          '1.0f', '0.0f','0.0f','0.0f',
+          '0.0f', '1.0f','0.0f','0.0f',
+          '0.0f', '0.0f','1.0f','0.0f',
+          '0.0f', '0.0f','0.0f','1.0f',
+        ],
+        'extension_flag': 'chromium_path_rendering',
+      },
+      { 'enum': 'GL_PATH_PROJECTION_MATRIX_CHROMIUM',
+        'enum_set': 'GL_PATH_PROJECTION_CHROMIUM',
+        'name': 'projection_matrix',
+        'type': 'GLfloat',
+        'default': [
+          '1.0f', '0.0f','0.0f','0.0f',
+          '0.0f', '1.0f','0.0f','0.0f',
+          '0.0f', '0.0f','1.0f','0.0f',
+          '0.0f', '0.0f','0.0f','1.0f',
+        ],
+        'extension_flag': 'chromium_path_rendering',
+      },
+    ],
+  },
 }
 
 # Named type info object represents a named type that is used in OpenGL call
@@ -839,6 +869,13 @@ _NAMED_TYPE_INFO = {
       'GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE',
     ],
   },
+  'MatrixMode': {
+    'type': 'GLenum',
+    'valid': [
+      'GL_PATH_PROJECTION_CHROMIUM',
+      'GL_PATH_MODELVIEW_CHROMIUM',
+    ],
+  },
   'ProgramParameter': {
     'type': 'GLenum',
     'valid': [
@@ -2584,6 +2621,23 @@ _FUNCTION_INFO = {
       'extension': True,
       'chromium': True,
   },
+  'MatrixLoadfCHROMIUM': {
+    'type': 'PUT',
+    'count': 16,
+    'data_type': 'GLfloat',
+    'decoder_func': 'DoMatrixLoadfCHROMIUM',
+    'gl_test_func': 'glMatrixLoadfEXT',
+    'chromium': True,
+    'extension': True,
+    'extension_flag': 'chromium_path_rendering',
+  },
+  'MatrixLoadIdentityCHROMIUM': {
+    'decoder_func': 'DoMatrixLoadIdentityCHROMIUM',
+    'gl_test_func': 'glMatrixLoadIdentityEXT',
+    'chromium': True,
+    'extension': True,
+    'extension_flag': 'chromium_path_rendering',
+  },
 }
 
 
@@ -2638,19 +2692,51 @@ def CachedStateName(item):
     return 'cached_' + item['name']
   return item['name']
 
+def ToGLExtensionString(extension_flag):
+  """Returns GL-type extension string of a extension flag."""
+  if extension_flag == "oes_compressed_etc1_rgb8_texture":
+    return "OES_compressed_ETC1_RGB8_texture" # Fixup inconsitency with rgb8,
+                                              # unfortunate.
+  uppercase_words = [ 'img', 'ext', 'arb', 'chromium', 'oes', 'amd', 'bgra8888',
+                      'egl', 'atc', 'etc1', 'angle']
+  parts = extension_flag.split('_')
+  return "_".join(
+    [part.upper() if part in uppercase_words else part for part in parts])
+
+def ToCamelCase(input_string):
+  """converts ABC_underscore_case to ABCUnderscoreCase."""
+  return ''.join(w[0].upper() + w[1:] for w in input_string.split('_'))
+
+def GetGLGetTypeConversion(result_type, value_type, value):
+  """Makes a gl compatible type conversion string for accessing state variables.
+
+   Useful when accessing state variables through glGetXXX calls.
+   glGet documetation (for example, the manual pages):
+   [...] If glGetIntegerv is called, [...] most floating-point values are
+   rounded to the nearest integer value. [...]
+
+  Args:
+   result_type: the gl type to be obtained
+   value_type: the GL type of the state variable
+   value: the name of the state variable
+
+  Returns:
+   String that converts the state variable to desired GL type according to GL
+   rules.
+  """
+
+  if result_type == 'GLint':
+    if value_type == 'GLfloat':
+      return 'static_cast<GLint>(round(%s))' % value
+  return 'static_cast<%s>(%s)' % (result_type, value)
 
 class CWriter(object):
   """Writes to a file formatting it for Google's style guidelines."""
 
   def __init__(self, filename):
     self.filename = filename
-    self.file_num = 0
     self.content = []
 
-  def SetFileNum(self, num):
-    """Used to help write number files and tests."""
-    self.file_num = num
-
   def Write(self, string):
     """Writes a string to a file spliting if it's > 80 characters."""
     lines = string.splitlines()
@@ -2848,13 +2934,18 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
     file.Write("  %s(%s);\n" %
                (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
 
+  def WriteServiceHandlerFunctionHeader(self, func, file):
+    """Writes function header for service implementation handlers."""
+    file.Write("""error::Error GLES2DecoderImpl::Handle%(name)s(
+        uint32_t immediate_data_size, const void* cmd_data) {
+      const gles2::cmds::%(name)s& c =
+          *static_cast<const gles2::cmds::%(name)s*>(cmd_data);
+      (void)c;
+      """ % {'name': func.name})
+
   def WriteServiceImplementation(self, func, file):
     """Writes the service implementation for a command."""
-    file.Write(
-        "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
-    file.Write(
-        "    uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" %
-        func.name)
+    self.WriteServiceHandlerFunctionHeader(func, file)
     self.WriteHandlerExtensionCheck(func, file)
     self.WriteHandlerDeferReadWrite(func, file);
     if len(func.GetOriginalArgs()) > 0:
@@ -2872,11 +2963,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
 
   def WriteImmediateServiceImplementation(self, func, file):
     """Writes the service implementation for an immediate version of command."""
-    file.Write(
-        "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
-    file.Write(
-        "    uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" %
-        func.name)
+    self.WriteServiceHandlerFunctionHeader(func, file)
     self.WriteHandlerExtensionCheck(func, file)
     self.WriteHandlerDeferReadWrite(func, file);
     last_arg = func.GetLastOriginalArg()
@@ -2893,11 +2980,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
 
   def WriteBucketServiceImplementation(self, func, file):
     """Writes the service implementation for a bucket version of command."""
-    file.Write(
-        "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
-    file.Write(
-        "    uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" %
-        func.name)
+    self.WriteServiceHandlerFunctionHeader(func, file)
     self.WriteHandlerExtensionCheck(func, file)
     self.WriteHandlerDeferReadWrite(func, file);
     last_arg = func.GetLastOriginalArg()
@@ -2935,7 +3018,7 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
       file.Write("  if (error != error::kNoError)\n")
       file.Write("    return error;\n")
 
-  def WriteValidUnitTest(self, func, file, test, extra = {}):
+  def WriteValidUnitTest(self, func, file, test, *extras):
     """Writes a valid unit test for the service implementation."""
     if func.GetInfo('expectation') == False:
       test = self._remove_expected_call_re.sub('', test)
@@ -2950,20 +3033,20 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
     ]
     gl_func_name = func.GetGLTestFunctionName()
     vars = {
-      'test_name': 'GLES2DecoderTest%d' % file.file_num,
       'name':name,
       'gl_func_name': gl_func_name,
       'args': ", ".join(arg_strings),
       'gl_args': ", ".join(gl_arg_strings),
     }
-    vars.update(extra)
+    for extra in extras:
+      vars.update(extra)
     old_test = ""
     while (old_test != test):
       old_test = test
       test = test % vars
     file.Write(test % vars)
 
-  def WriteInvalidUnitTest(self, func, file, test, extra = {}):
+  def WriteInvalidUnitTest(self, func, file, test, *extras):
     """Writes an invalid unit test for the service implementation."""
     for invalid_arg_index, invalid_arg in enumerate(func.GetOriginalArgs()):
       # Service implementation does not test constants, as they are not part of
@@ -2994,7 +3077,6 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
           gl_error_test = '\n  EXPECT_EQ(%s, GetGLError());' % gl_error
 
         vars = {
-          'test_name': 'GLES2DecoderTest%d' % file.file_num ,
           'name': func.name,
           'arg_index': invalid_arg_index,
           'value_index': value_index,
@@ -3005,10 +3087,11 @@ COMPILE_ASSERT(offsetof(%(cmd_name)s::Result, %(field_name)s) == %(offset)d,
           'parse_result': parse_result,
             'gl_error_test': gl_error_test,
         }
-        vars.update(extra)
+        for extra in extras:
+          vars.update(extra)
         file.Write(test % vars)
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Writes the service unit test for a command."""
 
     if func.name == 'Enable':
@@ -3044,7 +3127,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
   EXPECT_EQ(GL_NO_ERROR, GetGLError());
 }
 """
-    self.WriteValidUnitTest(func, file, valid_test)
+    self.WriteValidUnitTest(func, file, valid_test, *extras)
 
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
@@ -3055,9 +3138,9 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
   EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
 }
 """
-    self.WriteInvalidUnitTest(func, file, invalid_test)
+    self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
 
-  def WriteImmediateServiceUnitTest(self, func, file):
+  def WriteImmediateServiceUnitTest(self, func, file, *extras):
     """Writes the service unit test for an immediate command."""
     file.Write("// TODO(gman): %s\n" % func.name)
 
@@ -3065,7 +3148,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
     """Writes the validation code for an immediate version of a command."""
     pass
 
-  def WriteBucketServiceUnitTest(self, func, file):
+  def WriteBucketServiceUnitTest(self, func, file, *extras):
     """Writes the service unit test for a bucket command."""
     file.Write("// TODO(gman): %s\n" % func.name)
 
@@ -3363,9 +3446,9 @@ class StateSetHandler(TypeHandler):
                  (func.GetGLFunctionName(), func.MakeOriginalArgString("")))
     file.Write("  }\n")
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
-    TypeHandler.WriteServiceUnitTest(self, func, file)
+    TypeHandler.WriteServiceUnitTest(self, func, file, *extras)
     state_name = func.GetInfo('state')
     state = _STATES[state_name]
     states = state['states']
@@ -3389,12 +3472,13 @@ TEST_P(%(test_name)s, %(name)sInvalidValue%(ndx)d_%(check_ndx)d) {
 
           arg_strings[ndx] = range_check['test_value']
           vars = {
-            'test_name': 'GLES2DecoderTest%d' % file.file_num,
             'name': name,
             'ndx': ndx,
             'check_ndx': check_ndx,
             'args': ", ".join(arg_strings),
           }
+          for extra in extras:
+            vars.update(extra)
           file.Write(valid_test % vars)
       if 'nan_check' in item:
         valid_test = """
@@ -3414,11 +3498,12 @@ TEST_P(%(test_name)s, %(name)sNaNValue%(ndx)d) {
 
         arg_strings[ndx] = 'nanf("")'
         vars = {
-          'test_name': 'GLES2DecoderTest%d' % file.file_num,
           'name': name,
           'ndx': ndx,
           'args': ", ".join(arg_strings),
         }
+        for extra in extras:
+          vars.update(extra)
         file.Write(valid_test % vars)
 
 
@@ -3566,11 +3651,11 @@ class CustomHandler(TypeHandler):
     """Overrriden from TypeHandler."""
     pass
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     file.Write("// TODO(gman): %s\n\n" % func.name)
 
-  def WriteImmediateServiceUnitTest(self, func, file):
+  def WriteImmediateServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     file.Write("// TODO(gman): %s\n\n" % func.name)
 
@@ -3635,11 +3720,7 @@ class TodoHandler(CustomHandler):
 
   def WriteServiceImplementation(self, func, file):
     """Overrriden from TypeHandler."""
-    file.Write(
-        "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
-    file.Write(
-        "    uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" %
-        func.name)
+    self.WriteServiceHandlerFunctionHeader(func, file)
     file.Write("  // TODO: for now this is a no-op\n")
     file.Write(
         "  LOCAL_SET_GL_ERROR("
@@ -3673,15 +3754,15 @@ class HandWrittenHandler(CustomHandler):
     """Overrriden from TypeHandler."""
     pass
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     file.Write("// TODO(gman): %s\n\n" % func.name)
 
-  def WriteImmediateServiceUnitTest(self, func, file):
+  def WriteImmediateServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     file.Write("// TODO(gman): %s\n\n" % func.name)
 
-  def WriteBucketServiceUnitTest(self, func, file):
+  def WriteBucketServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     file.Write("// TODO(gman): %s\n\n" % func.name)
 
@@ -3745,11 +3826,11 @@ class ManualHandler(CustomHandler):
     """Overrriden from TypeHandler."""
     pass
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     file.Write("// TODO(gman): %s\n\n" % func.name)
 
-  def WriteImmediateServiceUnitTest(self, func, file):
+  def WriteImmediateServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     file.Write("// TODO(gman): %s\n\n" % func.name)
 
@@ -3855,11 +3936,11 @@ class DataHandler(TypeHandler):
     file.Write("// TODO(gman): Implement test for %s\n" % func.name)
     return
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     file.Write("// TODO(gman): %s\n\n" % func.name)
 
-  def WriteImmediateServiceUnitTest(self, func, file):
+  def WriteImmediateServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     file.Write("// TODO(gman): %s\n\n" % func.name)
 
@@ -3875,7 +3956,7 @@ class BindHandler(TypeHandler):
   def __init__(self):
     TypeHandler.__init__(self)
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
 
     if len(func.GetOriginalArgs()) == 1:
@@ -3906,7 +3987,7 @@ TEST_P(%(test_name)s, %(name)sValidArgsNewId) {
       self.WriteValidUnitTest(func, file, valid_test, {
           'resource_type': func.GetOriginalArgs()[0].resource_type,
           'gl_gen_func_name': func.GetInfo("gen_func"),
-      })
+      }, *extras)
     else:
       valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -3937,7 +4018,7 @@ TEST_P(%(test_name)s, %(name)sValidArgsNewId) {
           'first_gl_arg': func.GetOriginalArgs()[0].GetValidGLArg(func),
           'resource_type': func.GetOriginalArgs()[1].resource_type,
           'gl_gen_func_name': func.GetInfo("gen_func"),
-      })
+      }, *extras)
 
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
@@ -3948,7 +4029,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
   EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
 }
 """
-    self.WriteInvalidUnitTest(func, file, invalid_test)
+    self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
 
   def WriteGLES2Implementation(self, func, file):
     """Writes the GLES2 Implemention."""
@@ -4135,7 +4216,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) {
           'types': func.GetInfo('resource_types'),
         })
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -4152,7 +4233,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
 """
     self.WriteValidUnitTest(func, file, valid_test, {
         'resource_name': func.GetInfo('resource_type'),
-      })
+      }, *extras)
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs) {
   EXPECT_CALL(*gl_, %(gl_func_name)s(_, _)).Times(0);
@@ -4165,9 +4246,9 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs) {
 """
     self.WriteValidUnitTest(func, file, invalid_test, {
           'resource_name': func.GetInfo('resource_type').lower(),
-        })
+        }, *extras)
 
-  def WriteImmediateServiceUnitTest(self, func, file):
+  def WriteImmediateServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -4185,7 +4266,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
 """
     self.WriteValidUnitTest(func, file, valid_test, {
         'resource_name': func.GetInfo('resource_type'),
-      })
+      }, *extras)
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs) {
   EXPECT_CALL(*gl_, %(gl_func_name)s(_, _)).Times(0);
@@ -4198,7 +4279,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs) {
 """
     self.WriteValidUnitTest(func, file, invalid_test, {
           'resource_name': func.GetInfo('resource_type').lower(),
-        })
+        }, *extras)
 
   def WriteImmediateCmdComputeSize(self, func, file):
     """Overrriden from TypeHandler."""
@@ -4301,7 +4382,7 @@ class CreateHandler(TypeHandler):
     """Overrriden from TypeHandler."""
     func.AddCmdArg(Argument("client_id", 'uint32_t'))
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -4321,7 +4402,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
     self.WriteValidUnitTest(func, file, valid_test, {
           'comma': comma,
           'resource_type': func.name[6:],
-        })
+        }, *extras)
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
   EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s)).Times(0);
@@ -4333,7 +4414,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
 """
     self.WriteInvalidUnitTest(func, file, invalid_test, {
           'comma': comma,
-        })
+        }, *extras)
 
   def WriteHandlerImplementation (self, func, file):
     """Overrriden from TypeHandler."""
@@ -4432,7 +4513,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) {
           'types': func.GetInfo('resource_types'),
         })
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -4453,7 +4534,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
     self.WriteValidUnitTest(func, file, valid_test, {
           'resource_name': func.GetInfo('resource_type').lower(),
           'upper_resource_name': func.GetInfo('resource_type'),
-        })
+        }, *extras)
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs) {
   GetSharedMemoryAs<GLuint*>()[0] = kInvalidClientId;
@@ -4463,9 +4544,9 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs) {
   EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
 }
 """
-    self.WriteValidUnitTest(func, file, invalid_test)
+    self.WriteValidUnitTest(func, file, invalid_test, *extras)
 
-  def WriteImmediateServiceUnitTest(self, func, file):
+  def WriteImmediateServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -4486,7 +4567,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
     self.WriteValidUnitTest(func, file, valid_test, {
           'resource_name': func.GetInfo('resource_type').lower(),
           'upper_resource_name': func.GetInfo('resource_type'),
-        })
+        }, *extras)
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs) {
   cmds::%(name)s& cmd = *GetImmediateAs<cmds::%(name)s>();
@@ -4497,7 +4578,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs) {
             ExecuteImmediateCmd(cmd, sizeof(temp)));
 }
 """
-    self.WriteValidUnitTest(func, file, invalid_test)
+    self.WriteValidUnitTest(func, file, invalid_test, *extras)
 
   def WriteHandlerImplementation (self, func, file):
     """Overrriden from TypeHandler."""
@@ -4651,11 +4732,7 @@ class GETnHandler(TypeHandler):
 
   def WriteServiceImplementation(self, func, file):
     """Overrriden from TypeHandler."""
-    file.Write(
-        "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
-    file.Write(
-        "    uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" %
-        func.name)
+    self.WriteServiceHandlerFunctionHeader(func, file)
     last_arg = func.GetLastOriginalArg()
 
     all_but_last_args = func.GetOriginalArgs()[:-1]
@@ -4787,7 +4864,7 @@ TEST_F(GLES2ImplementationTest, %(name)s) {
           'cmd_args': ", ".join(cmd_arg_strings),
         })
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -4824,7 +4901,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
     self.WriteValidUnitTest(func, file, valid_test, {
         'local_gl_args': ", ".join(gl_arg_strings),
         'valid_pname': valid_pname,
-      })
+      }, *extras)
 
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
@@ -4839,7 +4916,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
   EXPECT_EQ(0u, result->size);%(gl_error_test)s
 }
 """
-    self.WriteInvalidUnitTest(func, file, invalid_test)
+    self.WriteInvalidUnitTest(func, file, invalid_test, *extras)
 
 class ArrayArgTypeHandler(TypeHandler):
   """Base class for type handlers that handle args that are arrays"""
@@ -4871,7 +4948,7 @@ class PUTHandler(ArrayArgTypeHandler):
   def __init__(self):
     ArrayArgTypeHandler.__init__(self)
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Writes the service unit test for a command."""
     expected_call = "EXPECT_CALL(*gl_, %(gl_func_name)s(%(gl_args)s));"
     if func.GetInfo("first_element_only"):
@@ -4897,7 +4974,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
       'data_value': func.GetInfo('data_value') or '0',
       'expected_call': expected_call,
     }
-    self.WriteValidUnitTest(func, file, valid_test, extra)
+    self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
 
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
@@ -4909,9 +4986,9 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
   EXPECT_EQ(error::%(parse_result)s, ExecuteCmd(cmd));%(gl_error_test)s
 }
 """
-    self.WriteInvalidUnitTest(func, file, invalid_test, extra)
+    self.WriteInvalidUnitTest(func, file, invalid_test, extra, *extras)
 
-  def WriteImmediateServiceUnitTest(self, func, file):
+  def WriteImmediateServiceUnitTest(self, func, file, *extras):
     """Writes the service unit test for a command."""
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -4941,7 +5018,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
       'gl_args': ", ".join(gl_arg_strings),
       'gl_any_args': ", ".join(gl_any_strings),
     }
-    self.WriteValidUnitTest(func, file, valid_test, extra)
+    self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
 
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
@@ -4954,7 +5031,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
             ExecuteImmediateCmd(cmd, sizeof(temp)));%(gl_error_test)s
 }
 """
-    self.WriteInvalidUnitTest(func, file, invalid_test, extra)
+    self.WriteInvalidUnitTest(func, file, invalid_test, extra, *extras)
 
   def WriteGetDataSizeCode(self, func, file):
     """Overrriden from TypeHandler."""
@@ -5142,9 +5219,9 @@ class PUTnHandler(ArrayArgTypeHandler):
   def __init__(self):
     ArrayArgTypeHandler.__init__(self)
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overridden from TypeHandler."""
-    ArrayArgTypeHandler.WriteServiceUnitTest(self, func, file)
+    ArrayArgTypeHandler.WriteServiceUnitTest(self, func, file, *extras)
 
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgsCountTooLarge) {
@@ -5178,9 +5255,9 @@ TEST_P(%(test_name)s, %(name)sValidArgsCountTooLarge) {
       'gl_args': ", ".join(gl_arg_strings),
       'args': ", ".join(arg_strings),
     }
-    self.WriteValidUnitTest(func, file, valid_test, extra)
+    self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
 
-  def WriteImmediateServiceUnitTest(self, func, file):
+  def WriteImmediateServiceUnitTest(self, func, file, *extras):
     """Overridden from TypeHandler."""
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -5212,7 +5289,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
       'gl_args': ", ".join(gl_arg_strings),
       'gl_any_args': ", ".join(gl_any_strings),
     }
-    self.WriteValidUnitTest(func, file, valid_test, extra)
+    self.WriteValidUnitTest(func, file, valid_test, extra, *extras)
 
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
@@ -5225,7 +5302,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
             ExecuteImmediateCmd(cmd, sizeof(temp)));%(gl_error_test)s
 }
 """
-    self.WriteInvalidUnitTest(func, file, invalid_test, extra)
+    self.WriteInvalidUnitTest(func, file, invalid_test, extra, *extras)
 
   def WriteGetDataSizeCode(self, func, file):
     """Overrriden from TypeHandler."""
@@ -5487,7 +5564,7 @@ class PUTXnHandler(ArrayArgTypeHandler):
         'values': values,
       })
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -5505,7 +5582,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
         'name': func.name,
         'count': self.GetArrayCount(func),
         'local_args': local_args,
-      })
+      }, *extras)
 
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
@@ -5661,8 +5738,8 @@ class GLcharNHandler(CustomHandler):
 
   def WriteServiceImplementation(self, func, file):
     """Overrriden from TypeHandler."""
-    file.Write("""error::Error GLES2DecoderImpl::Handle%(name)s(
-  uint32_t immediate_data_size, const gles2::cmds::%(name)s& c) {
+    self.WriteServiceHandlerFunctionHeader(func, file)
+    file.Write("""
   GLuint bucket_id = static_cast<GLuint>(c.%(bucket_id)s);
   Bucket* bucket = GetBucket(bucket_id);
   if (!bucket || bucket->size() == 0) {
@@ -5696,7 +5773,7 @@ class IsHandler(TypeHandler):
     if func.GetInfo('result') == None:
       func.AddInfo('result', ['uint32_t'])
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -5713,7 +5790,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
       comma =", "
     self.WriteValidUnitTest(func, file, valid_test, {
           'comma': comma,
-        })
+        }, *extras)
 
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
@@ -5726,7 +5803,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs%(arg_index)d_%(value_index)d) {
 """
     self.WriteInvalidUnitTest(func, file, invalid_test, {
           'comma': comma,
-        })
+        }, *extras)
 
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgsBadSharedMemoryId) {
@@ -5741,15 +5818,11 @@ TEST_P(%(test_name)s, %(name)sInvalidArgsBadSharedMemoryId) {
 """
     self.WriteValidUnitTest(func, file, invalid_test, {
           'comma': comma,
-        })
+        }, *extras)
 
   def WriteServiceImplementation(self, func, file):
     """Overrriden from TypeHandler."""
-    file.Write(
-        "error::Error GLES2DecoderImpl::Handle%s(\n" % func.name)
-    file.Write(
-        "    uint32_t immediate_data_size, const gles2::cmds::%s& c) {\n" %
-        func.name)
+    self.WriteServiceHandlerFunctionHeader(func, file)
     args = func.GetOriginalArgs()
     for arg in args:
       arg.WriteGetCode(file)
@@ -5895,7 +5968,7 @@ class STRnHandler(TypeHandler):
     func.WriteDestinationInitalizationValidation(file)
     file.Write(code_2 % str_args)
 
-  def WriteServiceUnitTest(self, func, file):
+  def WriteServiceUnitTest(self, func, file, *extras):
     """Overrriden from TypeHandler."""
     valid_test = """
 TEST_P(%(test_name)s, %(name)sValidArgs) {
@@ -5935,7 +6008,7 @@ TEST_P(%(test_name)s, %(name)sValidArgs) {
         "  EXPECT_CALL(*gl_, %s(%s, %s, _))\n"
         "      .WillOnce(SetArgumentPointee<2>(strlen(kInfo) + 1));") % (
             get_len_func[2:], id_name, get_len_enum)
-    self.WriteValidUnitTest(func, file, valid_test, sub)
+    self.WriteValidUnitTest(func, file, valid_test, sub, *extras)
 
     invalid_test = """
 TEST_P(%(test_name)s, %(name)sInvalidArgs) {
@@ -5948,7 +6021,7 @@ TEST_P(%(test_name)s, %(name)sInvalidArgs) {
   EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
 }
 """
-    self.WriteValidUnitTest(func, file, invalid_test)
+    self.WriteValidUnitTest(func, file, invalid_test, *extras)
 
   def WriteServiceImplementation(self, func, file):
     """Overrriden from TypeHandler."""
@@ -6873,6 +6946,36 @@ class Function(object):
     else:
       return self.MakeTypedOriginalArgString(prefix, False)
 
+  def MapCTypeToPepperIdlType(self, ctype, is_for_return_type=False):
+    """Converts a C type name to the corresponding Pepper IDL type."""
+    idltype = {
+        'char*': '[out] str_t',
+        'const GLchar* const*': '[out] cstr_t',
+        'const char*': 'cstr_t',
+        'const void*': 'mem_t',
+        'void*': '[out] mem_t',
+        'void**': '[out] mem_ptr_t',
+    }.get(ctype, ctype)
+    # We use "GLxxx_ptr_t" for "GLxxx*".
+    matched = re.match(r'(const )?(GL\w+)\*$', ctype)
+    if matched:
+      idltype = matched.group(2) + '_ptr_t'
+      if not matched.group(1):
+        idltype = '[out] ' + idltype
+    # If an in/out specifier is not specified yet, prepend [in].
+    if idltype[0] != '[':
+      idltype = '[in] ' + idltype
+    # Strip the in/out specifier for a return type.
+    if is_for_return_type:
+      idltype = re.sub(r'\[\w+\] ', '', idltype)
+    return idltype
+
+  def MakeTypedPepperIdlArgStrings(self):
+    """Gets a list of arguments as they need to be for Pepper IDL."""
+    args = self.GetOriginalArgs()
+    return ["%s %s" % (self.MapCTypeToPepperIdlType(arg.type), arg.name)
+            for arg in args]
+
   def GetPepperName(self):
     if self.GetInfo("pepper_name"):
       return self.GetInfo("pepper_name")
@@ -7000,9 +7103,9 @@ class Function(object):
     """Writes the service implementation for a command."""
     self.type_handler.WriteServiceImplementation(self, file)
 
-  def WriteServiceUnitTest(self, file):
+  def WriteServiceUnitTest(self, file, *extras):
     """Writes the service implementation for a command."""
-    self.type_handler.WriteServiceUnitTest(self, file)
+    self.type_handler.WriteServiceUnitTest(self, file, *extras)
 
   def WriteGLES2CLibImplementation(self, file):
     """Writes the GLES2 C Lib Implemention."""
@@ -7131,9 +7234,9 @@ class ImmediateFunction(Function):
     """Overridden from Function"""
     self.type_handler.WriteImmediateHandlerImplementation(self, file)
 
-  def WriteServiceUnitTest(self, file):
+  def WriteServiceUnitTest(self, file, *extras):
     """Writes the service implementation for a command."""
-    self.type_handler.WriteImmediateServiceUnitTest(self, file)
+    self.type_handler.WriteImmediateServiceUnitTest(self, file, *extras)
 
   def WriteValidationCode(self, file):
     """Overridden from Function"""
@@ -7211,9 +7314,9 @@ class BucketFunction(Function):
     """Overridden from Function"""
     self.type_handler.WriteBucketHandlerImplementation(self, file)
 
-  def WriteServiceUnitTest(self, file):
+  def WriteServiceUnitTest(self, file, *extras):
     """Writes the service implementation for a command."""
-    self.type_handler.WriteBucketServiceUnitTest(self, file)
+    self.type_handler.WriteBucketServiceUnitTest(self, file, *extras)
 
 
 def CreateArg(arg_string):
@@ -7457,9 +7560,19 @@ class GLGenerator(object):
     for state_name in sorted(_STATES.keys()):
       state = _STATES[state_name]
       for item in state['states']:
-        file.Write("%s %s;\n" % (item['type'], item['name']))
+        if isinstance(item['default'], list):
+          file.Write("%s %s[%d];\n" % (item['type'], item['name'],
+                                       len(item['default'])))
+        else:
+          file.Write("%s %s;\n" % (item['type'], item['name']))
+
         if item.get('cached', False):
-          file.Write("%s cached_%s;\n" % (item['type'], item['name']))
+          if isinstance(item['default'], list):
+            file.Write("%s cached_%s[%d];\n" % (item['type'], item['name'],
+                                                len(item['default'])))
+          else:
+            file.Write("%s cached_%s;\n" % (item['type'], item['name']))
+
     file.Write("\n")
 
     file.Write("""
@@ -7527,10 +7640,26 @@ bool %s::GetStateAs%s(
         else:
           for item in state['states']:
             file.Write("    case %s:\n" % item['enum'])
-            file.Write("      *num_written = 1;\n")
-            file.Write("      if (params) {\n")
-            file.Write("        params[0] = static_cast<%s>(%s);\n" %
-                       (gl_type, item['name']))
+            if isinstance(item['default'], list):
+              item_len = len(item['default'])
+              file.Write("      *num_written = %d;\n" % item_len)
+              file.Write("      if (params) {\n")
+              if item['type'] == gl_type:
+                file.Write("        memcpy(params, %s, sizeof(%s) * %d);\n" %
+                           (item['name'], item['type'], item_len))
+              else:
+                file.Write("        for (size_t i = 0; i < %s; ++i) {\n" %
+                           item_len)
+                file.Write("          params[i] = %s;\n" %
+                           (GetGLGetTypeConversion(gl_type, item['type'],
+                                                   "%s[i]" % item['name'])))
+                file.Write("        }\n");
+            else:
+              file.Write("      *num_written = 1;\n")
+              file.Write("      if (params) {\n")
+              file.Write("        params[0] = %s;\n" %
+                         (GetGLGetTypeConversion(gl_type, item['type'],
+                                                 item['name'])))
             file.Write("      }\n")
             file.Write("      return true;\n")
       for capability in _CAPABILITY_FLAGS:
@@ -7569,9 +7698,17 @@ bool %s::GetStateAs%s(
     for state_name in sorted(_STATES.keys()):
       state = _STATES[state_name]
       for item in state['states']:
-        file.Write("  %s = %s;\n" % (item['name'], item['default']))
+        if isinstance(item['default'], list):
+          for ndx, value in enumerate(item['default']):
+            file.Write("  %s[%d] = %s;\n" % (item['name'], ndx, value))
+        else:
+          file.Write("  %s = %s;\n" % (item['name'], item['default']))
         if item.get('cached', False):
-          file.Write("  cached_%s = %s;\n" % (item['name'], item['default']))
+          if isinstance(item['default'], list):
+            for ndx, value in enumerate(item['default']):
+              file.Write("  cached_%s[%d] = %s;\n" % (item['name'], ndx, value))
+          else:
+            file.Write("  cached_%s = %s;\n" % (item['name'], item['default']))
     file.Write("}\n")
 
     file.Write("""
@@ -7625,14 +7762,32 @@ void ContextState::InitState(const ContextState *prev_state) const {
             item_name = CachedStateName(item)
 
             if 'extension_flag' in item:
-              file.Write("  if (feature_info_->feature_flags().%s)\n  " %
+              file.Write("  if (feature_info_->feature_flags().%s) {\n  " %
                          item['extension_flag'])
             if test_prev:
-              file.Write("  if (prev_state->%s != %s)\n" %
-                         (item_name, item_name))
+              if isinstance(item['default'], list):
+                file.Write("  if (memcmp(prev_state->%s, %s, "
+                           "sizeof(%s) * %d)) {\n" %
+                           (item_name, item_name, item['type'],
+                            len(item['default'])))
+              else:
+                file.Write("  if (prev_state->%s != %s) {\n  " %
+                           (item_name, item_name))
             file.Write("  gl%s(%s, %s);\n" %
-                       (state['func'], item['enum'], item_name))
+                       (state['func'],
+                        (item['enum_set']
+                           if 'enum_set' in item else item['enum']),
+                        item['name']))
+            if test_prev:
+              if 'extension_flag' in item:
+                file.Write("  ")
+              file.Write("  }")
+            if 'extension_flag' in item:
+              file.Write("  }")
         else:
+          if 'extension_flag' in state:
+            file.Write("  if (feature_info_->feature_flags().%s)\n  " %
+                       state['extension_flag'])
           if test_prev:
             file.Write("  if (")
           args = []
@@ -7653,7 +7808,6 @@ void ContextState::InitState(const ContextState *prev_state) const {
     file.Write("  } else {")
     WriteStates(False)
     file.Write("  }")
-
     file.Write("}\n")
 
     file.Write("""bool ContextState::GetEnabled(GLenum cap) const {
@@ -7778,19 +7932,28 @@ bool GLES2DecoderImpl::SetCapabilityState(GLenum cap, bool enabled) {
       file = CHeaderWriter(
           name,
           "// It is included by gles2_cmd_decoder_unittest_%d.cc\n" % count)
-      file.SetFileNum(count)
+      test_name = 'GLES2DecoderTest%d' % count
       end = test_num + FUNCTIONS_PER_FILE
       if end > num_tests:
         end = num_tests
       for idx in range(test_num, end):
         func = self.functions[idx]
+
+        # Do any filtering of the functions here, so that the functions
+        # will not move between the numbered files if filtering properties
+        # are changed.
+        if func.GetInfo('extension_flag'):
+          continue
+
         if True:
         #gen_cmd = func.GetInfo('gen_cmd')
         #if gen_cmd == True or gen_cmd == None:
           if func.GetInfo('unit_test') == False:
             file.Write("// TODO(gman): %s\n" % func.name)
           else:
-            func.WriteServiceUnitTest(file)
+            func.WriteServiceUnitTest(file, {
+              'test_name': test_name
+            })
 
       file.Close()
     file = CHeaderWriter(
@@ -7828,27 +7991,70 @@ void GLES2DecoderTestBase::SetupInitStateExpectations() {
       elif state['type'] == 'NamedParameter':
         for item in state['states']:
           if 'extension_flag' in item:
-            continue
+            file.Write("  if (group_->feature_info()->feature_flags().%s) {\n" %
+                       item['extension_flag'])
+            file.Write("  ")
+          expect_value = item['default']
+          if isinstance(expect_value, list):
+            # TODO: Currently we do not check array values.
+            expect_value = "_"
+
           file.Write(
               "  EXPECT_CALL(*gl_, %s(%s, %s))\n" %
-              (state['func'], item['enum'], item['default']))
+              (state['func'],
+               (item['enum_set']
+                           if 'enum_set' in item else item['enum']),
+               expect_value))
           file.Write("      .Times(1)\n")
           file.Write("      .RetiresOnSaturation();\n")
+          if 'extension_flag' in item:
+            file.Write("  }\n")
       else:
+        if 'extension_flag' in state:
+          file.Write("  if (group_->feature_info()->feature_flags().%s) {\n" %
+                     state['extension_flag'])
+          file.Write("  ")
         args = []
         for item in state['states']:
           if 'expected' in item:
             args.append(item['expected'])
           else:
             args.append(item['default'])
+        # TODO: Currently we do not check array values.
+        args = ["_" if isinstance(arg, list) else arg for arg in args]
         file.Write("  EXPECT_CALL(*gl_, %s(%s))\n" %
                    (state['func'], ", ".join(args)))
         file.Write("      .Times(1)\n")
         file.Write("      .RetiresOnSaturation();\n")
+        if 'extension_flag' in state:
+          file.Write("  }\n")
     file.Write("""}
 """)
     file.Close()
 
+  def WriteServiceUnitTestsForExtensions(self, filename):
+    """Writes the service decorder unit tests for functions with extension_flag.
+
+       The functions are special in that they need a specific unit test
+       baseclass to turn on the extension.
+    """
+    functions = [f for f in self.functions if f.GetInfo('extension_flag')]
+    file = CHeaderWriter(
+      filename,
+      "// It is included by gles2_cmd_decoder_unittest_extensions.cc\n")
+    for func in functions:
+      if True:
+        if func.GetInfo('unit_test') == False:
+          file.Write("// TODO(gman): %s\n" % func.name)
+        else:
+          extension = ToCamelCase(
+            ToGLExtensionString(func.GetInfo('extension_flag')))
+          func.WriteServiceUnitTest(file, {
+            'test_name': 'GLES2DecoderTestWith%s' % extension
+          })
+
+    file.Close()
+
   def WriteGLES2Header(self, filename):
     """Writes the GLES2 header."""
     file = CHeaderWriter(
@@ -8076,10 +8282,28 @@ const size_t GLES2Util::enum_to_string_table_len_ =
 
   def WritePepperGLES2Interface(self, filename, dev):
     """Writes the Pepper OpenGLES interface definition."""
-    file = CHeaderWriter(
-        filename,
-        "// OpenGL ES interface.\n")
+    file = CWriter(filename)
+    file.Write(_LICENSE)
+    file.Write(_DO_NOT_EDIT_WARNING)
 
+    file.Write("label Chrome {\n")
+    file.Write("  M39 = 1.0\n")
+    file.Write("};\n\n")
+
+    if not dev:
+      # Declare GL types.
+      file.Write("[version=1.0]\n")
+      file.Write("describe {\n")
+      for gltype in ['GLbitfield', 'GLboolean', 'GLbyte', 'GLclampf',
+                     'GLclampx', 'GLenum', 'GLfixed', 'GLfloat', 'GLint',
+                     'GLintptr', 'GLshort', 'GLsizei', 'GLsizeiptr',
+                     'GLubyte', 'GLuint', 'GLushort']:
+        file.Write("  %s;\n" % gltype)
+        file.Write("  %s_ptr_t;\n" % gltype)
+      file.Write("};\n\n")
+
+    # C level typedefs.
+    file.Write("#inline c\n")
     file.Write("#include \"ppapi/c/pp_resource.h\"\n")
     if dev:
       file.Write("#include \"ppapi/c/ppb_opengles2.h\"\n\n")
@@ -8095,28 +8319,29 @@ const size_t GLES2Util::enum_to_string_table_len_ =
         file.Write("typedef %s %s;\n" % (v, k))
       file.Write("#endif  // _WIN64\n")
       file.Write("#endif  // __gl2_h_\n\n")
+    file.Write("#endinl\n")
 
     for interface in self.pepper_interfaces:
       if interface.dev != dev:
         continue
-      file.Write("#define %s_1_0 \"%s;1.0\"\n" %
-                 (interface.GetInterfaceName(), interface.GetInterfaceString()))
-      file.Write("#define %s %s_1_0\n" %
-                 (interface.GetInterfaceName(), interface.GetInterfaceName()))
-
-      file.Write("\nstruct %s {\n" % interface.GetStructName())
+      # Historically, we provide OpenGLES2 interfaces with struct
+      # namespace. Not to break code which uses the interface as
+      # "struct OpenGLES2", we put it in struct namespace.
+      file.Write('\n[macro="%s", force_struct_namespace]\n' %
+                 interface.GetInterfaceName())
+      file.Write("interface %s {\n" % interface.GetStructName())
       for func in self.original_functions:
         if not func.InPepperInterface(interface):
           continue
 
-        original_arg = func.MakeTypedPepperArgString("")
-        context_arg = "PP_Resource context"
-        if len(original_arg):
-          arg = context_arg + ", " + original_arg
-        else:
-          arg = context_arg
-        file.Write("  %s (*%s)(%s);\n" %
-                   (func.return_type, func.GetPepperName(), arg))
+        ret_type = func.MapCTypeToPepperIdlType(func.return_type,
+                                                is_for_return_type=True)
+        func_prefix = "  %s %s(" % (ret_type, func.GetPepperName())
+        file.Write(func_prefix)
+        file.Write("[in] PP_Resource context")
+        for arg in func.MakeTypedPepperIdlArgStrings():
+          file.Write(",\n" + " " * len(func_prefix) + arg)
+        file.Write(");\n")
       file.Write("};\n\n")
 
 
@@ -8295,6 +8520,8 @@ def main(argv):
   gl_state_valid = _NAMED_TYPE_INFO['GLState']['valid']
   for state_name in sorted(_STATES.keys()):
     state = _STATES[state_name]
+    if 'extension_flag' in state:
+      continue
     if 'enum' in state:
       if not state['enum'] in gl_state_valid:
         gl_state_valid.append(state['enum'])
@@ -8319,8 +8546,8 @@ def main(argv):
   if options.output_dir != None:
     os.chdir(options.output_dir)
 
-  gen.WritePepperGLES2Interface("ppapi/c/ppb_opengles2.h", False)
-  gen.WritePepperGLES2Interface("ppapi/c/dev/ppb_opengles2ext_dev.h", True)
+  gen.WritePepperGLES2Interface("ppapi/api/ppb_opengles2.idl", False)
+  gen.WritePepperGLES2Interface("ppapi/api/dev/ppb_opengles2ext_dev.idl", True)
   gen.WriteGLES2ToPPAPIBridge("ppapi/lib/gl/gles2/gles2.c")
   gen.WritePepperGLES2Implementation(
       "ppapi/shared_impl/ppb_opengles2_shared.cc")
@@ -8349,6 +8576,8 @@ def main(argv):
   gen.WriteClientContextStateImpl(
       "client/client_context_state_impl_autogen.h")
   gen.WriteServiceUnitTests("service/gles2_cmd_decoder_unittest_%d_autogen.h")
+  gen.WriteServiceUnitTestsForExtensions(
+    "service/gles2_cmd_decoder_unittest_extensions_autogen.h")
   gen.WriteServiceUtilsHeader("service/gles2_cmd_validation_autogen.h")
   gen.WriteServiceUtilsImplementation(
       "service/gles2_cmd_validation_implementation_autogen.h")
@@ -8398,8 +8627,6 @@ def main(argv):
       mojo_gles2_prefix + "_autogen.h",
       mojo_gles2_prefix + "_chromium_texture_mailbox_autogen.h",
       mojo_gles2_prefix + "_chromium_sync_point_autogen.h",
-      "ppapi/c/dev/ppb_opengles2ext_dev.h",
-      "ppapi/c/ppb_opengles2.h",
       "ppapi/lib/gl/gles2/gles2.c",
       "ppapi/shared_impl/ppb_opengles2_shared.cc"])