| #!/usr/bin/env python |
| # Copyright 2018 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """code generator for raster command buffers.""" |
| |
| 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 OpenGL call |
| # arguments. Each named type defines a set of valid OpenGL call arguments. The |
| # named types are used in 'raster_cmd_buffer_functions.txt'. |
| # type: The actual GL type of the named type. |
| # valid: The list of values that are valid for both the client and the service. |
| # invalid: Examples of invalid values for the type. At least these values |
| # should be tested to be invalid. |
| # is_complete: The list of valid values of type are final and will not be |
| # modified during runtime. |
| # validator: If set to False will prevent creation of a ValueValidator. Values |
| # are still expected to be checked for validity and will be tested. |
| _NAMED_TYPE_INFO = { |
| 'GLState': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_ACTIVE_TEXTURE', |
| ], |
| 'invalid': [ |
| 'GL_FOG_HINT', |
| ], |
| }, |
| 'QueryObjectParameter': { |
| 'type': 'GLenum', |
| 'is_complete': True, |
| 'valid': [ |
| 'GL_QUERY_RESULT_EXT', |
| 'GL_QUERY_RESULT_AVAILABLE_EXT', |
| 'GL_QUERY_RESULT_AVAILABLE_NO_FLUSH_CHROMIUM_EXT', |
| ], |
| }, |
| 'QueryTarget': { |
| 'type': 'GLenum', |
| 'is_complete': True, |
| 'valid': [ |
| 'GL_COMMANDS_ISSUED_CHROMIUM', |
| 'GL_COMMANDS_COMPLETED_CHROMIUM', |
| ], |
| 'invalid': [ |
| 'GL_LATENCY_QUERY_CHROMIUM', |
| ], |
| }, |
| 'TextureParameter': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_TEXTURE_MAG_FILTER', |
| 'GL_TEXTURE_MIN_FILTER', |
| 'GL_TEXTURE_WRAP_S', |
| 'GL_TEXTURE_WRAP_T', |
| ], |
| 'invalid': [ |
| 'GL_GENERATE_MIPMAP', |
| ], |
| }, |
| 'TextureWrapMode': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_CLAMP_TO_EDGE', |
| ], |
| 'invalid': [ |
| 'GL_REPEAT', |
| ], |
| }, |
| 'TextureMinFilterMode': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_NEAREST', |
| ], |
| 'invalid': [ |
| 'GL_NEAREST_MIPMAP_NEAREST', |
| ], |
| }, |
| 'TextureMagFilterMode': { |
| 'type': 'GLenum', |
| 'valid': [ |
| 'GL_NEAREST', |
| ], |
| 'invalid': [ |
| 'GL_LINEAR', |
| ], |
| }, |
| 'ResetStatus': { |
| 'type': 'GLenum', |
| 'is_complete': True, |
| 'valid': [ |
| 'GL_GUILTY_CONTEXT_RESET_ARB', |
| 'GL_INNOCENT_CONTEXT_RESET_ARB', |
| 'GL_UNKNOWN_CONTEXT_RESET_ARB', |
| ], |
| }, |
| 'gfx::BufferUsage': { |
| 'type': 'gfx::BufferUsage', |
| 'valid': [ |
| 'gfx::BufferUsage::GPU_READ', |
| 'gfx::BufferUsage::SCANOUT', |
| 'gfx::BufferUsage::GPU_READ_CPU_READ_WRITE', |
| 'gfx::BufferUsage::GPU_READ_CPU_READ_WRITE_PERSISTENT', |
| ], |
| 'invalid': [ |
| 'gfx::BufferUsage::SCANOUT_CAMERA_READ_WRITE', |
| 'gfx::BufferUsage::CAMERA_AND_CPU_READ_WRITE', |
| ], |
| }, |
| 'viz::ResourceFormat': { |
| 'type': 'viz::ResourceFormat', |
| 'valid': [ |
| 'viz::ResourceFormat::RGBA_8888', |
| 'viz::ResourceFormat::RGBA_4444', |
| 'viz::ResourceFormat::BGRA_8888', |
| 'viz::ResourceFormat::ALPHA_8', |
| 'viz::ResourceFormat::LUMINANCE_8', |
| 'viz::ResourceFormat::RGB_565', |
| 'viz::ResourceFormat::BGR_565', |
| 'viz::ResourceFormat::RED_8', |
| 'viz::ResourceFormat::RG_88', |
| 'viz::ResourceFormat::LUMINANCE_F16', |
| 'viz::ResourceFormat::RGBA_F16', |
| 'viz::ResourceFormat::R16_EXT', |
| 'viz::ResourceFormat::RGBX_8888', |
| 'viz::ResourceFormat::BGRX_8888', |
| 'viz::ResourceFormat::RGBX_1010102', |
| 'viz::ResourceFormat::BGRX_1010102', |
| 'viz::ResourceFormat::YVU_420', |
| 'viz::ResourceFormat::YUV_420_BIPLANAR', |
| 'viz::ResourceFormat::UYVY_422', |
| |
| ], |
| 'invalid': [ |
| 'viz::ResourceFormat::ETC1', |
| ], |
| }, |
| } |
| |
| # 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 "raster_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 "raster_cmd_buffer_functions.txt". |
| # |
| # type: defines which handler will be used to generate code. |
| # decoder_func: defines which function to call in the decoder to execute the |
| # corresponding GL command. If not specified the GL command will |
| # be called directly. |
| # cmd_args: The arguments to use for the command. This overrides generating |
| # them based on the GL function arguments. |
| # data_transfer_methods: Array of methods that are used for transfering the |
| # pointer data. Possible values: 'immediate', 'shm', 'bucket'. |
| # The default is 'immediate' if the command has one pointer |
| # argument, otherwise 'shm'. One command is generated for each |
| # transfer method. Affects only commands which are not of type |
| # 'GETn' or 'GLcharN'. |
| # Note: the command arguments that affect this are the final args, |
| # taking cmd_args override into consideration. |
| # impl_func: Whether or not to generate the GLES2Implementation part of this |
| # command. |
| # internal: If true, this is an internal command only, not exposed to the |
| # client. |
| # count: The number of units per element. For PUTn or PUT types. |
| # use_count_func: If True the actual data count needs to be computed; the count |
| # argument specifies the maximum count. |
| # unit_test: If False no service side unit test will be generated. |
| # client_test: If False no client side unit test will be generated. |
| # expectation: If False the unit test will have no expected calls. |
| # valid_args: A dictionary of argument indices to args to use in unit tests |
| # when they can not be automatically determined. |
| # invalid_test: False if no invalid test needed. |
| # not_shared: For GENn types, True if objects can't be shared between contexts |
| |
| _FUNCTION_INFO = { |
| 'CopySubTextureINTERNAL': { |
| 'decoder_func': 'DoCopySubTextureINTERNAL', |
| 'internal': True, |
| 'type': 'PUT', |
| 'count': 32, # GL_MAILBOX_SIZE_CHROMIUM x2 |
| 'unit_test': False, |
| 'trace_level': 2, |
| }, |
| 'Finish': { |
| 'impl_func': False, |
| 'client_test': False, |
| 'decoder_func': 'DoFinish', |
| 'trace_level': 1, |
| }, |
| 'Flush': { |
| 'impl_func': False, |
| 'decoder_func': 'DoFlush', |
| 'trace_level': 1, |
| }, |
| 'GetError': { |
| 'type': 'Is', |
| 'decoder_func': 'GetErrorState()->GetGLError', |
| 'impl_func': False, |
| 'result': ['GLenum'], |
| 'client_test': False, |
| }, |
| 'GetGraphicsResetStatusKHR': { |
| 'type': 'NoCommand', |
| 'trace_level': 1, |
| }, |
| 'GenQueriesEXT': { |
| 'type': 'GENn', |
| 'gl_test_func': 'glGenQueriesARB', |
| 'resource_type': 'Query', |
| 'resource_types': 'Queries', |
| 'unit_test': False, |
| 'not_shared': 'True', |
| }, |
| 'DeleteQueriesEXT': { |
| 'type': 'DELn', |
| 'gl_test_func': 'glDeleteQueriesARB', |
| 'resource_type': 'Query', |
| 'resource_types': 'Queries', |
| 'unit_test': False, |
| }, |
| 'BeginQueryEXT': { |
| 'type': 'Custom', |
| 'impl_func': False, |
| 'cmd_args': 'GLenumQueryTarget target, GLidQuery id, void* sync_data', |
| 'data_transfer_methods': ['shm'], |
| 'gl_test_func': 'glBeginQuery', |
| }, |
| 'EndQueryEXT': { |
| 'type': 'Custom', |
| 'impl_func': False, |
| 'cmd_args': 'GLenumQueryTarget target, GLuint submit_count', |
| 'gl_test_func': 'glEndnQuery', |
| 'client_test': False, |
| }, |
| 'GetQueryObjectuivEXT': { |
| 'type': 'NoCommand', |
| 'gl_test_func': 'glGetQueryObjectuiv', |
| }, |
| 'ShallowFlushCHROMIUM': { |
| 'type': 'NoCommand', |
| }, |
| 'OrderingBarrierCHROMIUM': { |
| 'type': 'NoCommand', |
| }, |
| 'TraceBeginCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': False, |
| 'client_test': False, |
| 'cmd_args': 'GLuint category_bucket_id, GLuint name_bucket_id', |
| 'extension': 'CHROMIUM_trace_marker', |
| }, |
| 'TraceEndCHROMIUM': { |
| 'impl_func': False, |
| 'client_test': False, |
| 'decoder_func': 'DoTraceEndCHROMIUM', |
| 'unit_test': False, |
| 'extension': 'CHROMIUM_trace_marker', |
| }, |
| 'SetActiveURLCHROMIUM': { |
| 'type': 'Custom', |
| 'impl_func': False, |
| 'client_test': False, |
| 'cmd_args': 'GLuint url_bucket_id', |
| }, |
| 'InsertFenceSyncCHROMIUM': { |
| 'type': 'Custom', |
| 'internal': True, |
| 'impl_func': False, |
| 'cmd_args': 'GLuint64 release_count', |
| 'trace_level': 1, |
| }, |
| 'LoseContextCHROMIUM': { |
| 'decoder_func': 'DoLoseContextCHROMIUM', |
| 'unit_test': False, |
| 'trace_level': 1, |
| }, |
| 'GenUnverifiedSyncTokenCHROMIUM': { |
| 'type': 'NoCommand', |
| }, |
| 'VerifySyncTokensCHROMIUM' : { |
| 'type': 'NoCommand', |
| }, |
| 'WaitSyncTokenCHROMIUM': { |
| 'type': 'NoCommand', |
| }, |
| 'BeginRasterCHROMIUM': { |
| 'decoder_func': 'DoBeginRasterCHROMIUM', |
| 'type': 'PUT', |
| 'count': 16, # GL_MAILBOX_SIZE_CHROMIUM |
| 'internal': True, |
| 'impl_func': False, |
| 'unit_test': False, |
| }, |
| 'RasterCHROMIUM': { |
| 'decoder_func': 'DoRasterCHROMIUM', |
| 'internal': True, |
| 'impl_func': True, |
| 'cmd_args': 'GLuint raster_shm_id, GLuint raster_shm_offset,' |
| 'GLsizeiptr raster_shm_size, GLuint font_shm_id,' |
| 'GLuint font_shm_offset, GLsizeiptr font_shm_size', |
| 'extension': 'CHROMIUM_raster_transport', |
| 'extension_flag': 'chromium_raster_transport', |
| }, |
| 'EndRasterCHROMIUM': { |
| 'decoder_func': 'DoEndRasterCHROMIUM', |
| 'impl_func': False, |
| 'unit_test': False, |
| 'client_test': False, |
| }, |
| 'CreateTransferCacheEntryINTERNAL': { |
| 'decoder_func': 'DoCreateTransferCacheEntryINTERNAL', |
| 'cmd_args': 'GLuint entry_type, GLuint entry_id, GLuint handle_shm_id, ' |
| 'GLuint handle_shm_offset, GLuint data_shm_id, ' |
| 'GLuint data_shm_offset, GLuint data_size', |
| 'internal': True, |
| 'impl_func': True, |
| 'client_test': False, |
| 'unit_test': False, |
| }, |
| 'DeleteTransferCacheEntryINTERNAL': { |
| 'decoder_func': 'DoDeleteTransferCacheEntryINTERNAL', |
| 'cmd_args': 'GLuint entry_type, GLuint entry_id', |
| 'internal': True, |
| 'impl_func': True, |
| 'client_test': False, |
| 'unit_test': False, |
| }, |
| 'DeletePaintCacheTextBlobsINTERNAL': { |
| 'type': 'DELn', |
| 'internal': True, |
| 'unit_test': False, |
| }, |
| 'DeletePaintCachePathsINTERNAL': { |
| 'type': 'DELn', |
| 'internal': True, |
| 'unit_test': False, |
| }, |
| 'ClearPaintCacheINTERNAL': { |
| 'decoder_func': 'DoClearPaintCacheINTERNAL', |
| 'internal': True, |
| 'unit_test': False, |
| }, |
| 'UnlockTransferCacheEntryINTERNAL': { |
| 'decoder_func': 'DoUnlockTransferCacheEntryINTERNAL', |
| 'cmd_args': 'GLuint entry_type, GLuint entry_id', |
| 'internal': True, |
| 'impl_func': True, |
| 'client_test': False, |
| 'unit_test': False, |
| }, |
| } |
| |
| |
| def main(argv): |
| """This is the main function.""" |
| parser = OptionParser() |
| parser.add_option( |
| "--output-dir", |
| help="base directory for resulting files, under chrome/src. default is " |
| "empty. Use this if you want the result stored under gen.") |
| parser.add_option( |
| "-v", "--verbose", action="store_true", |
| help="prints more output.") |
| |
| (options, _) = parser.parse_args(args=argv) |
| |
| # This script lives under gpu/command_buffer, cd to base directory. |
| os.chdir(os.path.dirname(__file__) + "/../..") |
| base_dir = os.getcwd() |
| build_cmd_buffer_lib.InitializePrefix("Raster") |
| gen = build_cmd_buffer_lib.GLGenerator(options.verbose, "2018", |
| _FUNCTION_INFO, _NAMED_TYPE_INFO) |
| gen.ParseGLH("gpu/command_buffer/raster_cmd_buffer_functions.txt") |
| |
| # Support generating files under gen/ |
| if options.output_dir != None: |
| os.chdir(options.output_dir) |
| |
| os.chdir(base_dir) |
| |
| gen.WriteCommandIds("gpu/command_buffer/common/raster_cmd_ids_autogen.h") |
| gen.WriteFormat("gpu/command_buffer/common/raster_cmd_format_autogen.h") |
| gen.WriteFormatTest( |
| "gpu/command_buffer/common/raster_cmd_format_test_autogen.h") |
| gen.WriteGLES2InterfaceHeader( |
| "gpu/command_buffer/client/raster_interface_autogen.h") |
| gen.WriteGLES2ImplementationHeader( |
| "gpu/command_buffer/client/raster_implementation_autogen.h") |
| gen.WriteGLES2Implementation( |
| "gpu/command_buffer/client/raster_implementation_impl_autogen.h") |
| gen.WriteGLES2ImplementationUnitTests( |
| "gpu/command_buffer/client/raster_implementation_unittest_autogen.h") |
| gen.WriteCmdHelperHeader( |
| "gpu/command_buffer/client/raster_cmd_helper_autogen.h") |
| gen.WriteServiceImplementation( |
| "gpu/command_buffer/service/raster_decoder_autogen.h") |
| gen.WriteServiceUnitTests( |
| "gpu/command_buffer/service/raster_decoder_unittest_%d_autogen.h") |
| gen.WriteServiceUtilsHeader( |
| "gpu/command_buffer/service/raster_cmd_validation_autogen.h") |
| gen.WriteServiceUtilsImplementation( |
| "gpu/command_buffer/service/" |
| "raster_cmd_validation_implementation_autogen.h") |
| |
| build_cmd_buffer_lib.Format(gen.generated_cpp_filenames) |
| |
| if gen.errors > 0: |
| print "%d errors" % gen.errors |
| return 1 |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main(sys.argv[1:])) |