blob: 1a15203e5e7c45f976f78eb4175aacb23c8d231e [file] [log] [blame]
#!/usr/bin/python3 -i
#
# Copyright (c) 2013-2018 The Khronos Group Inc.
# Copyright (c) 2013-2018 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os, re, sys
from generator import *
import cereal
from cereal.wrapperdefs import VULKAN_STREAM_TYPE
from cereal.wrapperdefs import VULKAN_STREAM_TYPE_GUEST
# CerealGenerator - generates set of driver sources
# while being agnostic to the stream implementation
copyrightHeader = """// Copyright (C) 2018 The Android Open Source Project
// Copyright (C) 2018 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
"""
autogeneratedHeaderTemplate = """
// Autogenerated module %s
// %s
// Please do not modify directly;
// re-run generate-vulkan-sources.sh,
// or directly from Python by defining:
// VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
// CEREAL_OUTPUT_DIR: Where to put the generated sources.
// python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
"""
autogeneratedMkTemplate = """
# Autogenerated makefile
# %s
# Please do not modify directly;
# re-run generate-vulkan-sources.sh,
# or directly from Python by defining:
# VULKAN_REGISTRY_XML_DIR : Directory containing genvk.py and vk.xml
# CEREAL_OUTPUT_DIR: Where to put the generated sources.
# python3 $VULKAN_REGISTRY_XML_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o $CEREAL_OUTPUT_DIR
"""
def banner_command(argv):
"""Return sanitized command-line description.
|argv| must be a list of command-line parameters, e.g. sys.argv.
Return a string corresponding to the command, with platform-specific
paths removed."""
def makeRelative(someArg):
if os.path.exists(someArg):
return os.path.relpath(someArg)
return someArg
return ' '.join(map(makeRelative, argv))
suppressEnabled = False
suppressExceptModule = None
def envGetOrDefault(key, default=None):
if key in os.environ:
return os.environ[key]
print("envGetOrDefault: notfound: %s" % key)
return default
def init_suppress_option():
global suppressEnabled
global suppressExceptModule
if "ANDROID_EMU_VK_CEREAL_SUPPRESS" in os.environ:
option = os.environ["ANDROID_EMU_VK_CEREAL_SUPPRESS"]
if option != "":
suppressExceptModule = option
suppressEnabled = True
print("suppressEnabled: %s" % suppressExceptModule)
# ---- methods overriding base class ----
# beginFile(genOpts)
# endFile()
# beginFeature(interface, emit)
# endFeature()
# genType(typeinfo,name)
# genStruct(typeinfo,name)
# genGroup(groupinfo,name)
# genEnum(enuminfo, name)
# genCmd(cmdinfo)
class CerealGenerator(OutputGenerator):
"""Generate serialization code"""
def __init__(self, errFile = sys.stderr,
warnFile = sys.stderr,
diagFile = sys.stdout):
OutputGenerator.__init__(self, errFile, warnFile, diagFile)
init_suppress_option()
self.typeInfo = cereal.VulkanTypeInfo()
self.modules = {}
self.protos = {}
self.moduleList = []
self.protoList = []
self.wrappers = []
self.codegen = cereal.CodeGen()
self.baseLibDirPrefix = \
envGetOrDefault("VK_CEREAL_BASELIB_PREFIX", "android/base")
self.baseLibLinkName = \
envGetOrDefault("VK_CEREAL_BASELIB_LINKNAME", "android-emu-base")
default_guest_abs_encoder_destination = \
os.path.join(
os.getcwd(),
"..", "..",
"device", "generic", "goldfish-opengl",
"system", "vulkan_enc")
self.guest_abs_encoder_destination = \
envGetOrDefault("VK_CEREAL_GUEST_ENCODER_DIR",
default_guest_abs_encoder_destination)
default_guest_abs_hal_destination = \
os.path.join(
os.getcwd(),
"..", "..",
"device", "generic", "goldfish-opengl",
"system", "vulkan")
self.guest_abs_hal_destination = \
envGetOrDefault("VK_CEREAL_GUEST_HAL_DIR",
default_guest_abs_hal_destination)
default_host_abs_decoder_destination = \
os.path.join(
os.getcwd(),
"android", "android-emugl", "host",
"libs", "libOpenglRender", "vulkan")
self.host_abs_decoder_destination = \
envGetOrDefault("VK_CEREAL_HOST_DECODER_DIR",
default_host_abs_decoder_destination)
default_host_include_dir = \
os.path.join(
os.getcwd(),
"android", "android-emugl", "host", "include")
self.host_vk_include_dir = \
envGetOrDefault("VK_CEREAL_HOST_INCLUDE_DIR",
default_host_include_dir)
default_host_abs_proto_destination = \
os.path.join(
os.getcwd(),
"android", "android-emugl", "host",
"libs", "libOpenglRender", "vulkan", "cereal", "proto")
self.host_abs_proto_destination = \
envGetOrDefault("VK_CEREAL_HOST_PROTO_DIR",
default_host_abs_proto_destination)
self.host_cmake_generator = lambda cppFiles: f"""{autogeneratedMkTemplate % banner_command(sys.argv)}
add_library(OpenglRender_vulkan_cereal {cppFiles})
target_compile_definitions(OpenglRender_vulkan_cereal PRIVATE -DVK_ANDROID_native_buffer -DVK_GOOGLE_address_space)
# target_compile_definitions(OpenglRender_vulkan_cereal windows PRIVATE -DVK_USE_PLATFORM_WIN32_KHR)
# TODO: target_link_libraries(OpenglRender_vulkan_cereal PUBLIC OpenglRender_vulkan_cereal_proto)
target_link_libraries(OpenglRender_vulkan_cereal PUBLIC {self.baseLibLinkName})
target_include_directories(OpenglRender_vulkan_cereal
PUBLIC
{self.host_abs_decoder_destination}/cereal
PRIVATE
{self.host_vk_include_dir}
{self.host_abs_decoder_destination})
"""
self.host_cmake_proto_generator = lambda protoFiles: """%s
android_add_big_protobuf(OpenglRender_vulkan_cereal_proto %s)
""" % (autogeneratedMkTemplate % banner_command(sys.argv), protoFiles)
self.guest_android_mk_generator = lambda cppFiles: """%s
LOCAL_PATH := $(call my-dir)
$(call emugl-begin-shared-library,libvulkan_enc)
$(call emugl-export,C_INCLUDES,$(LOCAL_PATH))
$(call emugl-import,libOpenglCodecCommon$(GOLDFISH_OPENGL_LIB_SUFFIX) libandroidemu lib_renderControl_enc)
# Vulkan include dir
ifeq (true,$(GOLDFISH_OPENGL_BUILD_FOR_HOST))
LOCAL_C_INCLUDES += \\
$(LOCAL_PATH) \\
$(HOST_EMUGL_PATH)/host/include \\
$(HOST_EMUGL_PATH)/host/include/vulkan
endif
ifneq (true,$(GOLDFISH_OPENGL_BUILD_FOR_HOST))
LOCAL_C_INCLUDES += \\
$(LOCAL_PATH) \\
$(LOCAL_PATH)/../vulkan_enc \\
LOCAL_HEADER_LIBRARIES += \\
hwvulkan_headers \\
vulkan_headers \\
endif
LOCAL_CFLAGS += \\
-DLOG_TAG=\\"goldfish_vulkan\\" \\
-DVK_ANDROID_native_buffer \\
-DVK_GOOGLE_address_space \\
-Wno-missing-field-initializers \\
-Werror \\
-fstrict-aliasing \\
-DVK_USE_PLATFORM_ANDROID_KHR \\
-DVK_NO_PROTOTYPES \\
LOCAL_SRC_FILES := AndroidHardwareBuffer.cpp \\
HostVisibleMemoryVirtualization.cpp \\
Resources.cpp \\
Validation.cpp \\
%s.cpp \\
VulkanHandleMapping.cpp \\
ResourceTracker.cpp \\
%s
ifeq (true,$(GOLDFISH_OPENGL_BUILD_FOR_HOST))
LOCAL_CFLAGS += -D__ANDROID_API__=28
$(call emugl-export,SHARED_LIBRARIES,libgui)
else
$(call emugl-export,SHARED_LIBRARIES,libsync libnativewindow)
LOCAL_STATIC_LIBRARIES += libarect
endif
$(call emugl-end-module)
"""% (autogeneratedMkTemplate % banner_command(sys.argv), VULKAN_STREAM_TYPE_GUEST, cppFiles)
encoderInclude = f"""
#include "goldfish_vk_private_defs.h"
#include <functional>
#include <memory>
class IOStream;
"""
encoderImplInclude = f"""
#include "IOStream.h"
#include "Resources.h"
#include "ResourceTracker.h"
#include "Validation.h"
#include "{VULKAN_STREAM_TYPE_GUEST}.h"
#include "{self.baseLibDirPrefix}/AlignedBuf.h"
#include "{self.baseLibDirPrefix}/Pool.h"
#include "{self.baseLibDirPrefix}/synchronization/AndroidLock.h"
#include <cutils/properties.h>
#include "goldfish_vk_marshaling_guest.h"
#include "goldfish_vk_deepcopy_guest.h"
#include "goldfish_vk_handlemap_guest.h"
#include "goldfish_vk_private_defs.h"
#include "goldfish_vk_transform_guest.h"
#include <unordered_map>
"""
functableImplInclude = """
#include "VkEncoder.h"
#include "HostConnection.h"
#include "ResourceTracker.h"
#include "goldfish_vk_private_defs.h"
#include <log/log.h>
// Stuff we are not going to use but if included,
// will cause compile errors. These are Android Vulkan
// required extensions, but the approach will be to
// implement them completely on the guest side.
#undef VK_KHR_android_surface
"""
marshalIncludeGuest = """
#include "goldfish_vk_marshaling_guest.h"
#include "goldfish_vk_private_defs.h"
#include "%s.h"
// Stuff we are not going to use but if included,
// will cause compile errors. These are Android Vulkan
// required extensions, but the approach will be to
// implement them completely on the guest side.
#undef VK_KHR_android_surface
#undef VK_ANDROID_external_memory_android_hardware_buffer
""" % VULKAN_STREAM_TYPE_GUEST
vulkanStreamIncludeHost = f"""
#include "goldfish_vk_private_defs.h"
#include "{VULKAN_STREAM_TYPE}.h"
#include "{self.baseLibDirPrefix}/StreamSerializing.h"
"""
testingInclude = """
#include "goldfish_vk_private_defs.h"
#include <string.h>
#include <functional>
using OnFailCompareFunc = std::function<void(const char*)>;
"""
poolInclude = f"""
#include "goldfish_vk_private_defs.h"
#include "{self.baseLibDirPrefix}/Pool.h"
using android::base::Pool;
"""
handleMapInclude = """
#include "goldfish_vk_private_defs.h"
#include "VulkanHandleMapping.h"
"""
transformIncludeGuest = """
#include "goldfish_vk_private_defs.h"
"""
transformInclude = """
#include "goldfish_vk_private_defs.h"
#include "goldfish_vk_extension_structs.h"
"""
transformImplIncludeGuest = """
#include "ResourceTracker.h"
"""
transformImplInclude = """
#include "VkDecoderGlobalState.h"
"""
unboxInclude = """
#include "goldfish_vk_private_defs.h"
#include "goldfish_vk_extension_structs.h"
namespace android {
namespace base {
class Pool;
} // namespace base
} // namespace android
using android::base::Pool;
"""
unboxImplInclude = f"""
#include "{self.baseLibDirPrefix}/Pool.h"
#include "VkDecoderGlobalState.h"
#include "goldfish_vk_deepcopy.h"
#include "goldfish_vk_handlemap.h"
"""
baseProtoConversionInclude = f"""
#include "VulkanHandleMapping.h"
#include "{self.baseLibDirPrefix}/Pool.h"
#include "goldfish_vk_private_defs.h"
#include "goldfish_vk_extension_structs.h"
#include "goldfish_vk_baseprotodefs.pb.h"
using android::base::Pool;
"""
baseProtoConversionImplInclude = """
#include <vector>
#include <string.h>
"""
poolIncludeGuest = f"""
#include "goldfish_vk_private_defs.h"
#include "{self.baseLibDirPrefix}/Pool.h"
using android::base::Pool;
// Stuff we are not going to use but if included,
// will cause compile errors. These are Android Vulkan
// required extensions, but the approach will be to
// implement them completely on the guest side.
#undef VK_KHR_android_surface
#undef VK_ANDROID_external_memory_android_hardware_buffer
"""
handleMapIncludeGuest = """
#include "goldfish_vk_private_defs.h"
#include "VulkanHandleMapping.h"
// Stuff we are not going to use but if included,
// will cause compile errors. These are Android Vulkan
// required extensions, but the approach will be to
// implement them completely on the guest side.
#undef VK_KHR_android_surface
#undef VK_ANDROID_external_memory_android_hardware_buffer
"""
dispatchHeaderDefs = """
#include "goldfish_vk_private_defs.h"
namespace goldfish_vk {
struct VulkanDispatch;
} // namespace goldfish_vk
using DlOpenFunc = void* (void);
using DlSymFunc = void* (void*, const char*);
"""
extensionStructsInclude = """
#include "goldfish_vk_private_defs.h"
"""
extensionStructsIncludeGuest = """
#include "vk_platform_compat.h"
#include "goldfish_vk_private_defs.h"
// Stuff we are not going to use but if included,
// will cause compile errors. These are Android Vulkan
// required extensions, but the approach will be to
// implement them completely on the guest side.
#undef VK_KHR_android_surface
#undef VK_ANDROID_external_memory_android_hardware_buffer
"""
commonCerealImplIncludes = """
#include "goldfish_vk_extension_structs.h"
#include "goldfish_vk_private_defs.h"
"""
commonCerealIncludesGuest = """
#include "vk_platform_compat.h"
"""
commonCerealImplIncludesGuest = """
#include "goldfish_vk_extension_structs_guest.h"
#include "goldfish_vk_private_defs.h"
"""
dispatchImplIncludes = """
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
"""
decoderSnapshotHeaderIncludes = """
#include <memory>
#include "common/goldfish_vk_private_defs.h"
"""
decoderSnapshotImplIncludes = f"""
#include "VulkanHandleMapping.h"
#include "VkDecoderGlobalState.h"
#include "VkReconstruction.h"
#include "goldfish_vk_baseprotodefs.pb.h"
#include "common/goldfish_vk_baseprotoconversion.h"
#include "{self.baseLibDirPrefix}/synchronization/Lock.h"
"""
decoderHeaderIncludes = """
#include <memory>
namespace android {
namespace base {
class Pool;
} // namespace android
} // namespace base
"""
decoderImplIncludes = f"""
#include "common/goldfish_vk_marshaling.h"
#include "common/goldfish_vk_private_defs.h"
#include "common/goldfish_vk_transform.h"
#include "{self.baseLibDirPrefix}/Pool.h"
#include "{self.baseLibDirPrefix}/system/System.h"
#include "IOStream.h"
#include "emugl/common/logging.h"
#include "VkDecoderGlobalState.h"
#include "VkDecoderSnapshot.h"
#include "VulkanDispatch.h"
#include "%s.h"
#include <unordered_map>
""" % VULKAN_STREAM_TYPE
self.guest_encoder_tag = "guest_encoder"
self.guest_hal_tag = "guest_hal"
self.host_tag = "host"
self.addGuestEncoderModule(
"VkEncoder",
extraHeader = encoderInclude,
extraImpl = encoderImplInclude)
self.addGuestEncoderModule("goldfish_vk_extension_structs_guest",
extraHeader=extensionStructsIncludeGuest)
self.addGuestEncoderModule("goldfish_vk_marshaling_guest",
extraHeader=commonCerealIncludesGuest + marshalIncludeGuest,
extraImpl=commonCerealImplIncludesGuest)
self.addGuestEncoderModule("goldfish_vk_deepcopy_guest",
extraHeader=commonCerealIncludesGuest + poolIncludeGuest,
extraImpl=commonCerealImplIncludesGuest)
self.addGuestEncoderModule("goldfish_vk_handlemap_guest",
extraHeader=commonCerealIncludesGuest + handleMapIncludeGuest,
extraImpl=commonCerealImplIncludesGuest)
self.addGuestEncoderModule("goldfish_vk_transform_guest",
extraHeader=commonCerealIncludesGuest + transformIncludeGuest,
extraImpl=commonCerealImplIncludesGuest + transformImplIncludeGuest)
self.addGuestHalModule("func_table", extraImpl=functableImplInclude)
self.addModule("common", "goldfish_vk_extension_structs",
extraHeader=extensionStructsInclude)
self.addModule("common", "goldfish_vk_marshaling",
extraHeader=vulkanStreamIncludeHost,
extraImpl=commonCerealImplIncludes)
self.addModule("common", "goldfish_vk_testing",
extraHeader=testingInclude,
extraImpl=commonCerealImplIncludes)
self.addModule("common", "goldfish_vk_deepcopy",
extraHeader=poolInclude,
extraImpl=commonCerealImplIncludes)
self.addModule("common", "goldfish_vk_handlemap",
extraHeader=handleMapInclude,
extraImpl=commonCerealImplIncludes)
self.addModule("common", "goldfish_vk_dispatch",
extraHeader=dispatchHeaderDefs,
extraImpl=dispatchImplIncludes)
# TODO-NEXT: Better separate transform from resource tracker types
# and other macros
# self.addModule("common", "goldfish_vk_transform",
# extraHeader=transformInclude,
# extraImpl=transformImplInclude)
# self.addModule("common", "goldfish_vk_unbox",
# extraHeader=unboxInclude,
# extraImpl=unboxImplInclude)
self.addHostModule("VkDecoder",
extraHeader=decoderHeaderIncludes,
extraImpl=decoderImplIncludes,
useNamespace=False)
self.addHostModule("VkDecoderSnapshot",
extraHeader=decoderSnapshotHeaderIncludes,
extraImpl=decoderSnapshotImplIncludes,
useNamespace=False)
# TODO: Protobuf build
# self.addProto(
# "proto", "goldfish_vk_baseprotodefs",
# customAbsDir = self.host_abs_proto_destination)
# self.addModule("common", "goldfish_vk_baseprotoconversion",
# extraHeader=baseProtoConversionInclude,
# extraImpl=baseProtoConversionImplInclude)
self.addWrapper(cereal.VulkanEncoder, "VkEncoder")
self.addWrapper(cereal.VulkanExtensionStructs, "goldfish_vk_extension_structs_guest")
self.addWrapper(cereal.VulkanMarshaling, "goldfish_vk_marshaling_guest", variant = "guest")
self.addWrapper(cereal.VulkanDeepcopy, "goldfish_vk_deepcopy_guest")
self.addWrapper(cereal.VulkanHandleMap, "goldfish_vk_handlemap_guest")
self.addWrapper(cereal.VulkanTransform, "goldfish_vk_transform_guest")
self.addWrapper(cereal.VulkanFuncTable, "func_table")
self.addWrapper(cereal.VulkanExtensionStructs, "goldfish_vk_extension_structs")
self.addWrapper(cereal.VulkanMarshaling, "goldfish_vk_marshaling")
self.addWrapper(cereal.VulkanTesting, "goldfish_vk_testing")
self.addWrapper(cereal.VulkanDeepcopy, "goldfish_vk_deepcopy")
self.addWrapper(cereal.VulkanHandleMap, "goldfish_vk_handlemap")
self.addWrapper(cereal.VulkanDispatch, "goldfish_vk_dispatch")
# TODO-NEXT: Better separate transform from resource tracker type
# self.addWrapper(cereal.VulkanTransform, "goldfish_vk_transform", resourceTrackerTypeName="VkDecoderGlobalState")
# self.addWrapper(cereal.VulkanUnbox, "goldfish_vk_unbox")
self.addWrapper(cereal.VulkanDecoder, "VkDecoder")
self.addWrapper(cereal.VulkanDecoderSnapshot, "VkDecoderSnapshot")
# self.addProtoWrapper(cereal.VulkanBaseProtoDefs, "goldfish_vk_baseprotodefs")
# self.addWrapper(cereal.VulkanBaseProtoConversion, "goldfish_vk_baseprotoconversion")
self.guestAndroidMkCppFiles = ""
self.hostCMakeCppFiles = ""
self.hostCMakeProtoFiles = ""
self.hostDecoderCMakeCppFiles = ""
def addSrcEntry(m):
mkSrcEntry = m.getMakefileSrcEntry()
cmakeSrcEntry = m.getCMakeSrcEntry()
if m.directory == self.guest_encoder_tag:
self.guestAndroidMkCppFiles += mkSrcEntry
elif m.directory == self.host_tag:
self.hostDecoderCMakeCppFiles += cmakeSrcEntry
elif m.directory != self.guest_hal_tag:
self.hostCMakeCppFiles += cmakeSrcEntry
def addProtoEntry(m):
cmakeSrcEntry = m.getCMakeSrcEntry()
self.hostCMakeProtoFiles += cmakeSrcEntry
self.forEachModule(addSrcEntry)
self.forEachProto(addProtoEntry)
def addGuestEncoderModule(self, basename, extraHeader = "", extraImpl = "", useNamespace = True):
self.addModule(self.guest_encoder_tag,
basename,
extraHeader = extraHeader,
extraImpl = extraImpl,
customAbsDir = self.guest_abs_encoder_destination,
useNamespace = useNamespace)
def addGuestHalModule(self, basename, extraHeader = "", extraImpl = "", useNamespace = True):
self.addModule(self.guest_hal_tag,
basename,
extraHeader = extraHeader,
extraImpl = extraImpl,
customAbsDir = self.guest_abs_hal_destination,
useNamespace = useNamespace)
def addHostModule(self, basename, extraHeader = "", extraImpl = "", useNamespace = True):
self.addModule(self.host_tag,
basename,
extraHeader = extraHeader,
extraImpl = extraImpl,
customAbsDir = self.host_abs_decoder_destination,
useNamespace = useNamespace)
def addModule(self, directory, basename,
extraHeader = "", extraImpl = "",
customAbsDir = None,
useNamespace = True):
self.moduleList.append(basename)
self.modules[basename] = \
cereal.Module(directory, basename, customAbsDir = customAbsDir)
self.modules[basename].headerPreamble = copyrightHeader
self.modules[basename].headerPreamble += \
autogeneratedHeaderTemplate % \
(basename, "(header) generated by %s" % banner_command(sys.argv))
namespaceBegin = "namespace goldfish_vk {" if useNamespace else ""
namespaceEnd = "} // namespace goldfish_vk" if useNamespace else ""
self.modules[basename].headerPreamble += """
#pragma once
#include <vulkan/vulkan.h>
%s
%s
""" % (extraHeader, namespaceBegin)
self.modules[basename].implPreamble = copyrightHeader
self.modules[basename].implPreamble += \
autogeneratedHeaderTemplate % \
(basename, "(impl) generated by %s" % \
banner_command(sys.argv))
self.modules[basename].implPreamble += """
#include "%s.h"
%s
%s
""" % (basename, extraImpl, namespaceBegin)
self.modules[basename].headerPostamble = """
%s
""" % namespaceEnd
self.modules[basename].implPostamble = """
%s
""" % namespaceEnd
def addWrapper(self, moduleType, moduleName, **kwargs):
self.wrappers.append( \
moduleType( \
self.modules[moduleName],
self.typeInfo, **kwargs))
def addProtoWrapper(self, moduleType, moduleName, **kwargs):
self.wrappers.append( \
moduleType( \
self.protos[moduleName],
self.typeInfo, **kwargs))
def addProto(self, directory, basename, customAbsDir = None):
self.protoList.append(basename)
self.protos[basename] = \
cereal.Proto(directory, basename, customAbsDir = customAbsDir)
self.protos[basename].preamble = copyrightHeader
self.protos[basename].preamble += "syntax = \"proto2\";\n"
self.protos[basename].preamble += "package goldfish_vk_proto;\n"
def forEachModule(self, func):
for moduleName in self.moduleList:
func(self.modules[moduleName])
def forEachWrapper(self, func):
for wrapper in self.wrappers:
func(wrapper)
def forEachProto(self, func):
for protoName in self.protoList:
func(self.protos[protoName])
## Overrides####################################################################
def beginFile(self, genOpts):
OutputGenerator.beginFile(self, genOpts, suppressEnabled)
if suppressEnabled:
def enableSuppression(m):
m.suppress = True;
self.forEachModule(enableSuppression)
self.forEachProto(enableSuppression)
self.modules[suppressExceptModule].suppress = False
if not suppressEnabled:
write(self.host_cmake_generator(self.hostCMakeCppFiles),
file = self.outFile)
self.outProtoFile = open(
os.path.join(
self.host_abs_proto_destination,
"CMakeLists.txt"), "w", encoding="utf-8")
write(self.host_cmake_proto_generator(self.hostCMakeProtoFiles),
file = self.outProtoFile)
self.outProtoFile.close()
guestEncoderAndroidMkPath = \
os.path.join( \
self.guest_abs_encoder_destination,
"Android.mk")
guestAndroidMkFile = open(guestEncoderAndroidMkPath, "w", encoding="utf-8")
write(self.guest_android_mk_generator(self.guestAndroidMkCppFiles),
file = guestAndroidMkFile)
guestAndroidMkFile.close()
self.forEachModule(lambda m: m.begin(self.genOpts.directory))
self.forEachProto(lambda m: m.begin(self.genOpts.directory))
self.forEachWrapper(lambda w: w.onBegin())
def endFile(self):
OutputGenerator.endFile(self)
self.typeInfo.onEnd()
self.forEachWrapper(lambda w: w.onEnd())
self.forEachModule(lambda m: m.end())
self.forEachProto(lambda m: m.end())
def beginFeature(self, interface, emit):
# Start processing in superclass
OutputGenerator.beginFeature(self, interface, emit)
self.typeInfo.onBeginFeature(self.featureName)
self.forEachModule(lambda m: m.appendHeader("#ifdef %s\n" % self.featureName))
self.forEachModule(lambda m: m.appendImpl("#ifdef %s\n" % self.featureName))
self.forEachWrapper(lambda w: w.onBeginFeature(self.featureName))
def endFeature(self):
# Finish processing in superclass
OutputGenerator.endFeature(self)
self.typeInfo.onEndFeature()
self.forEachModule(lambda m: m.appendHeader("#endif\n"))
self.forEachModule(lambda m: m.appendImpl("#endif\n"))
self.forEachWrapper(lambda w: w.onEndFeature())
def genType(self, typeinfo, name, alias):
OutputGenerator.genType(self, typeinfo, name, alias)
self.typeInfo.onGenType(typeinfo, name, alias)
self.forEachWrapper(lambda w: w.onGenType(typeinfo, name, alias))
def genStruct(self, typeinfo, typeName, alias):
OutputGenerator.genStruct(self, typeinfo, typeName, alias)
self.typeInfo.onGenStruct(typeinfo, typeName, alias)
self.forEachWrapper(lambda w: w.onGenStruct(typeinfo, typeName, alias))
def genGroup(self, groupinfo, groupName, alias = None):
OutputGenerator.genGroup(self, groupinfo, groupName, alias)
self.typeInfo.onGenGroup(groupinfo, groupName, alias)
self.forEachWrapper(lambda w: w.onGenGroup(groupinfo, groupName, alias))
def genEnum(self, enuminfo, name, alias):
OutputGenerator.genEnum(self, enuminfo, name, alias)
self.typeInfo.onGenEnum(enuminfo, name, alias)
self.forEachWrapper(lambda w: w.onGenEnum(enuminfo, name, alias))
def genCmd(self, cmdinfo, name, alias):
OutputGenerator.genCmd(self, cmdinfo, name, alias)
self.typeInfo.onGenCmd(cmdinfo, name, alias)
self.forEachWrapper(lambda w: w.onGenCmd(cmdinfo, name, alias))