#!/usr/bin/env python3
# Copyright 2018 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""code generator for webgpu command buffers."""

import filecmp
import os
import os.path
import sys
from optparse import OptionParser

import build_cmd_buffer_lib

# Named type info object represents a named type that is used in API call
# arguments. The named types are used in 'webgpu_cmd_buffer_functions.txt'.
#
# Options are documented in build_gles2_cmd_buffer.py/build_raster_cmd_buffer.py
_NAMED_TYPE_INFO = {
  'PowerPreference': {
    'type': 'PowerPreference',
    'valid': [
      'PowerPreference::kDefault',
      'PowerPreference::kHighPerformance',
      'PowerPreference::kLowPower',
    ],
    'invalid': [
      'PowerPreference::kNumPowerPreferences',
    ],
  },
  'MailboxFlags': {
    'type': 'MailboxFlags',
    'valid': [
      'WEBGPU_MAILBOX_NONE',
      'WEBGPU_MAILBOX_DISCARD',
    ],
  },
}

# A function info object specifies the type and other special data for the
# command that will be generated. A base function info object is generated by
# parsing the "webgpu_cmd_buffer_functions.txt", one for each function in the
# file. These function info objects can be augmented and their values can be
# overridden by adding an object to the table below.
#
# Must match function names specified in "webgpu_cmd_buffer_functions.txt".
#
# Options are documented in build_gles2_cmd_buffer.py/build_raster_cmd_buffer.py
# (Note: some options (like decoder_func and unit_test) currently have no
# effect, because WriteServiceImplementation and WriteServiceUnitTests are not
# used below.)
_FUNCTION_INFO = {
  'DawnCommands': {
    'impl_func': False,
    'internal': True,
    'data_transfer_methods': ['shm'],
    'cmd_args': 'uint32_t trace_id_high, uint32_t trace_id_low, '
    'uint32_t commands_shm_id, uint32_t commands_shm_offset, '
    'uint32_t size',
    'size_args': {
      'commands': 'size * sizeof(char)',
    },
  },
  'AssociateMailbox': {
    'impl_func': False,
    'client_test': False,
    'internal': True,
    'cmd_args': 'GLuint device_id, GLuint device_generation, GLuint id, '
    'GLuint generation, uint64_t usage, '
    'uint64_t internal_usage, MailboxFlags flags, '
    'GLuint view_format_count, GLuint count, '
    'const GLuint* mailbox_and_view_formats',
    'type': 'PUTn',
    'count': 1,
  },
  'AssociateMailboxForBuffer': {
    'impl_func': False,
    'client_test': False,
    'internal': True,
    'cmd_args': 'GLuint device_id, GLuint device_generation, GLuint id, '
    'GLuint generation, uint64_t usage, const GLuint* mailbox',
    'type': 'PUT',
    'count': 4,
  },
  'DissociateMailbox': {
    'impl_func': False,
    'client_test': False,
  },
  'DissociateMailboxForBuffer': {
    'impl_func': False,
    'client_test': False,
  },
  'DissociateMailboxForPresent': {
    'impl_func': False,
    'client_test': False,
  },
  'DestroyServer': {
    'impl_func': False,
    'internal': True,
  },
  'SetWebGPUExecutionContextToken': {
    'impl_func': False,
    'client_test': False,
  },
}


def main(argv):
  """This is the main function."""
  parser = OptionParser()
  parser.add_option(
    "--output-dir",
    help="Output directory for generated files. Defaults to chromium root "
    "directory.",
  )
  parser.add_option(
    "-v", "--verbose", action="store_true", help="Verbose logging output."
  )
  parser.add_option(
    "-c",
    "--check",
    action="store_true",
    help="Check if output files match generated files in chromium root "
    "directory.  Use this in PRESUBMIT scripts with --output-dir.",
  )

  (options, _) = parser.parse_args(args=argv)

  # This script lives under src/gpu/command_buffer.
  script_dir = os.path.dirname(os.path.abspath(__file__))
  assert script_dir.endswith(
    (
      os.path.normpath("src/gpu/command_buffer"),
      os.path.normpath("chromium/gpu/command_buffer"),
    )
  )
  # os.path.join doesn't do the right thing with relative paths.
  chromium_root_dir = os.path.abspath(script_dir + "/../..")

  # Support generating files under gen/ and for PRESUBMIT.
  if options.output_dir:
    output_dir = options.output_dir
  else:
    output_dir = chromium_root_dir
  os.chdir(output_dir)

  # This script lives under gpu/command_buffer, cd to base directory.
  build_cmd_buffer_lib.InitializePrefix("WebGPU")
  gen = build_cmd_buffer_lib.GLGenerator(
    options.verbose, "2018", _FUNCTION_INFO, _NAMED_TYPE_INFO, chromium_root_dir
  )
  gen.ParseGLH("gpu/command_buffer/webgpu_cmd_buffer_functions.txt")

  gen.WriteCommandIds("gpu/command_buffer/common/webgpu_cmd_ids_autogen.h")
  gen.WriteFormat("gpu/command_buffer/common/webgpu_cmd_format_autogen.h")
  gen.WriteFormatTest(
    "gpu/command_buffer/common/webgpu_cmd_format_test_autogen.h"
  )
  gen.WriteGLES2InterfaceHeader(
    "gpu/command_buffer/client/webgpu_interface_autogen.h"
  )
  gen.WriteGLES2ImplementationHeader(
    "gpu/command_buffer/client/webgpu_implementation_autogen.h"
  )
  gen.WriteGLES2InterfaceStub(
    "gpu/command_buffer/client/webgpu_interface_stub_autogen.h"
  )
  gen.WriteGLES2InterfaceStubImpl(
    "gpu/command_buffer/client/webgpu_interface_stub_impl_autogen.h"
  )
  gen.WriteGLES2Implementation(
    "gpu/command_buffer/client/webgpu_implementation_impl_autogen.h"
  )
  gen.WriteGLES2ImplementationUnitTests(
    "gpu/command_buffer/client/webgpu_implementation_unittest_autogen.h"
  )
  gen.WriteCmdHelperHeader(
    "gpu/command_buffer/client/webgpu_cmd_helper_autogen.h"
  )
  # Note: No gen.WriteServiceImplementation
  # Note: No gen.WriteServiceUnitTests
  gen.WriteServiceUtilsHeader(
    "gpu/command_buffer/service/webgpu_cmd_validation_autogen.h"
  )
  gen.WriteServiceUtilsImplementation(
    "gpu/command_buffer/service/webgpu_cmd_validation_implementation_autogen.h"
  )

  build_cmd_buffer_lib.Format(
    gen.generated_cpp_filenames, output_dir, chromium_root_dir
  )

  if gen.errors > 0:
    print("build_webgpu_cmd_buffer.py: Failed with %d errors" % gen.errors)
    return 1

  check_failed_filenames = []
  if options.check:
    for filename in gen.generated_cpp_filenames:
      if not filecmp.cmp(
        os.path.join(output_dir, filename),
        os.path.join(chromium_root_dir, filename),
      ):
        check_failed_filenames.append(filename)

  if len(check_failed_filenames) > 0:
    print('Please run gpu/command_buffer/build_webgpu_cmd_buffer.py')
    print('Failed check on autogenerated command buffer files:')
    for filename in check_failed_filenames:
      print(filename)
    return 1

  return 0


if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))
