xref: /aosp_15_r20/external/mesa3d/src/gfxstream/codegen/scripts/cereal/frontend.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1# Copyright 2018 Google LLC
2# SPDX-License-Identifier: MIT
3
4from .common.codegen import CodeGen, VulkanAPIWrapper
5from .common.vulkantypes import \
6        VulkanAPI, makeVulkanTypeSimple, iterateVulkanType
7
8from .wrapperdefs import VulkanWrapperGenerator
9
10from .wrapperdefs import API_PREFIX_VALIDATE
11from .wrapperdefs import PARAMETERS_VALIDATE
12from .wrapperdefs import VOID_TYPE
13from .wrapperdefs import VALIDATE_RESULT_TYPE
14from .wrapperdefs import VALIDATE_VAR_NAME
15from .wrapperdefs import VALIDATE_GOOD_RESULT
16
17from .wrapperdefs import VULKAN_STREAM_TYPE
18from .wrapperdefs import VULKAN_STREAM_VAR_NAME
19
20from .wrapperdefs import API_PREFIX_MARSHAL
21from .wrapperdefs import API_PREFIX_FRONTEND
22
23# Frontend
24class VulkanFrontend(VulkanWrapperGenerator):
25
26    def __init__(self, module, typeInfo):
27        VulkanWrapperGenerator.__init__(self, module, typeInfo)
28
29        def validateDefFunc(_codegen, _api):
30            # TODO
31            pass
32
33        self.validateWrapper = \
34            VulkanAPIWrapper(
35                API_PREFIX_VALIDATE,
36                PARAMETERS_VALIDATE,
37                VOID_TYPE,
38                validateDefFunc)
39
40        def frontendDefFunc(codegen, api):
41            retTypeName = api.retType.typeName
42
43            codegen.stmt(
44                "%s %s = %s" % (VALIDATE_RESULT_TYPE, VALIDATE_VAR_NAME,
45                                VALIDATE_GOOD_RESULT))
46            codegen.funcCall(None, API_PREFIX_VALIDATE + api.origName,
47                             ["&%s" % VALIDATE_VAR_NAME] + list(
48                                 map(lambda p: p.paramName, api.parameters)))
49
50            codegen.beginIf(
51                "%s != %s" % (VALIDATE_VAR_NAME, VALIDATE_GOOD_RESULT))
52            if retTypeName == VALIDATE_RESULT_TYPE:
53                codegen.stmt("return %s" % VALIDATE_VAR_NAME)
54            elif retTypeName != "void":
55                codegen.stmt("return (%s)0" % retTypeName)
56            else:
57                codegen.stmt("return")
58            codegen.endIf()
59
60            codegen.stmt("// VULKAN_STREAM_GET()")
61            codegen.stmt("%s* %s = nullptr" % (VULKAN_STREAM_TYPE,
62                                               VULKAN_STREAM_VAR_NAME))
63
64            retLhs = None
65            if retTypeName != "void":
66                retLhs = retTypeName + " res"
67
68            codegen.funcCall(retLhs, API_PREFIX_MARSHAL + api.origName,
69                             [VULKAN_STREAM_VAR_NAME] + list(
70                                 map(lambda p: p.paramName, api.parameters)))
71
72            if retTypeName != "void":
73                codegen.stmt("return res")
74
75        self.frontendWrapper = \
76            VulkanAPIWrapper(
77                API_PREFIX_FRONTEND,
78                [],
79                None,
80                frontendDefFunc)
81
82    def onGenCmd(self, cmdinfo, name, alias):
83        VulkanWrapperGenerator.onGenCmd(self, cmdinfo, name, alias)
84        self.module.appendHeader(
85            self.frontendWrapper.makeDecl(self.typeInfo, name))
86        self.module.appendImpl(
87            self.validateWrapper.makeDefinition(
88                self.typeInfo, name, isStatic=True))
89        self.module.appendImpl(
90            self.frontendWrapper.makeDefinition(self.typeInfo, name))
91