| {{/* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * 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. |
| */}} |
| |
| {{Global "module" ""}} |
| {{Include "go_common.tmpl"}} |
| {{$ | Macro "schema.go" | GoFmt | Write "schema.go"}} |
| |
| {{define "schema.go"}} |
| {{Global "api" $}} |
| {{template "Go.GeneratedHeader" (Global "OutputDir")}} |
| |
| import ( |
| "android.googlesource.com/platform/tools/gpu/atom" |
| "android.googlesource.com/platform/tools/gpu/gfxapi/schema" |
| "android.googlesource.com/platform/tools/gpu/service" |
| ) |
| |
| func init() { |
| s := schemaBuilder{ |
| staticArrays: make(map[int]*service.StaticArrayInfo), |
| maps: make(map[int]*service.MapInfo), |
| enums: make(map[int]*service.EnumInfo), |
| structs: make(map[int]*service.StructInfo), |
| classes: make(map[int]*service.ClassInfo), |
| } |
| _ = s |
| |
| {{range $i, $c := AllCommands $}} |
| schema.RegisterAtom({{Macro "Command" "Command" $c "Index" $i}}) |
| {{end}} |
| schema.RegisterAPI(api{}, service.StructInfo{ |
| Name: "state", |
| Kind: service.TypeKindStruct, |
| Fields: service.FieldInfoPtrArray{ |
| {{Macro "Globals" $}} |
| }, |
| }) |
| } |
| |
| type schemaBuilder struct { |
| staticArrays map[int]*service.StaticArrayInfo |
| maps map[int]*service.MapInfo |
| enums map[int]*service.EnumInfo |
| structs map[int]*service.StructInfo |
| classes map[int]*service.ClassInfo |
| } |
| {{Macro "GetInfo" "Type" "StaticArray" "Map" "staticArrays" "List" $.StaticArrays}} |
| {{Macro "GetInfo" "Type" "Map" "Map" "maps" "List" $.Maps }} |
| {{Macro "GetInfo" "Type" "Enum" "Map" "enums" "List" $.Enums }} |
| {{Macro "GetInfo" "Type" "Class" "Map" "classes" "List" $.Classes }} |
| |
| {{end}} |
| |
| |
| {{/* |
| ------------------------------------------------------------------------------- |
| Emits the logic for retrieving information for the specified items list. |
| ------------------------------------------------------------------------------- |
| */}} |
| {{define "GetInfo"}} |
| {{AssertType $.Type "string"}} |
| |
| func (s schemaBuilder) get{{$.Type}}Info(id int) *service.{{$.Type}}Info { |
| e, f := s.{{$.Map}}[id] |
| if f { |
| return e |
| } |
| switch id { |
| {{range $id, $e := $.List}} |
| case {{$id}}: |
| e = {{Macro $.Type $e}} |
| {{end}} |
| } |
| s.{{$.Map}}[id] = e |
| return e |
| } |
| {{end}} |
| |
| |
| {{/* |
| ------------------------------------------------------------------------------- |
| Emits information for the specified array. |
| ------------------------------------------------------------------------------- |
| */}} |
| {{define "Array"}} |
| {{AssertType $ "Array"}} |
| |
| service.CreateArrayInfo("{{$.Name}}", service.TypeKindArray, {{Macro "TypeInfo" $.ValueType}}) |
| {{end}} |
| |
| |
| {{/* |
| ------------------------------------------------------------------------------- |
| Emits information for the specified static array. |
| ------------------------------------------------------------------------------- |
| */}} |
| {{define "StaticArray"}} |
| {{AssertType $ "StaticArray"}} |
| |
| service.CreateStaticArrayInfo("{{$.Name}}", service.TypeKindStaticArray, {{Macro "TypeInfo" $.ValueType}}, {{$.Size}}) |
| {{end}} |
| |
| |
| {{/* |
| ------------------------------------------------------------------------------- |
| Emits information for the specified map. |
| ------------------------------------------------------------------------------- |
| */}} |
| {{define "Map"}} |
| {{AssertType $ "Map"}} |
| |
| service.CreateMapInfo("{{$.Name}}", service.TypeKindMap, {{Macro "TypeInfo" $.KeyType}}, {{Macro "TypeInfo" $.ValueType}}) |
| {{end}} |
| |
| |
| {{/* |
| ------------------------------------------------------------------------------- |
| Emits information for the specified enum. |
| ------------------------------------------------------------------------------- |
| */}} |
| {{define "Enum"}} |
| {{AssertType $ "Enum"}} |
| |
| {{$api := Global "api"}} |
| service.CreateEnumInfo( |
| "{{$.Name}}", |
| service.TypeKindEnum, |
| []service.EnumEntry{ |
| {{range $v := $.Entries}} |
| service.EnumEntry{ |
| Name: "{{$v.Name}}", |
| Value: {{$v.Value}}, |
| }, |
| {{end}} |
| }, |
| service.EnumInfoPtrArray { |
| {{range $v := $.Extends}} |
| s.getEnumInfo({{IndexOf $api.Enums $v}}), |
| {{end}} |
| }, |
| ) |
| {{end}} |
| |
| |
| {{/* |
| ------------------------------------------------------------------------------- |
| Emits information for the specified class. |
| ------------------------------------------------------------------------------- |
| */}} |
| {{define "Class"}} |
| {{AssertType $ "Class"}} |
| |
| {{$api := Global "api"}} |
| service.CreateClassInfo( |
| "{{$.Name}}", |
| service.TypeKindClass, |
| service.FieldInfoPtrArray{ |
| {{Macro "Fields" $}} |
| }, |
| service.ClassInfoPtrArray { |
| {{range $v := $.Extends}} |
| s.getClassInfo({{IndexOf $api.Classes $v}}), |
| {{end}} |
| }, |
| ) |
| {{end}} |
| |
| |
| {{/* |
| ------------------------------------------------------------------------------- |
| Emits information for all global variables of the specified API. |
| ------------------------------------------------------------------------------- |
| */}} |
| {{define "Globals"}} |
| {{AssertType $ "API"}} |
| |
| {{range $g := $.Globals}} |
| &service.FieldInfo{ |
| Name: "{{$g.Name}}", |
| Type: {{Macro "TypeInfo" (TypeOf $g)}}, |
| }, |
| {{end}} |
| {{end}} |
| |
| |
| {{/* |
| ------------------------------------------------------------------------------- |
| Emits information for all fields of the specified class. |
| ------------------------------------------------------------------------------- |
| */}} |
| {{define "Fields"}} |
| {{AssertType $ "Class"}} |
| |
| {{range $f := $.Fields}} |
| &service.FieldInfo{ |
| Name: "{{$f.Name}}", |
| Type: {{Macro "TypeInfo" (TypeOf $f)}}, |
| }, |
| {{end}} |
| {{end}} |
| |
| |
| {{/* |
| ------------------------------------------------------------------------------- |
| Emits information for the specified command. |
| ------------------------------------------------------------------------------- |
| */}} |
| {{define "Command"}} |
| {{AssertType $.Command "Function"}} |
| |
| service.AtomInfo{ |
| Api: service.ApiId{ID: binary.ID(apiID)}, |
| Type: {{$.Index}}, |
| Name: "{{Macro "CmdName" $.Command}}", |
| Parameters: []service.ParameterInfo{ |
| {{range $p := $.Command.FullParameters}} |
| service.ParameterInfo{ |
| Name: "{{$p.Name}}", |
| Type: {{Macro "TypeInfo" (TypeOf $p)}}, |
| Out: {{if $p.Output}}true{{else}}false{{end}}, |
| }, |
| {{end}} |
| }, |
| IsCommand: true, |
| IsDrawCall: {{if GetAnnotation $.Command "DrawCall"}}true{{else}}false{{end}}, |
| IsEndOfFrame: {{if GetAnnotation $.Command "EndOfFrame"}}true{{else}}false{{end}}, |
| DocumentationUrl: "{{$.Command.Docs}}", |
| } |
| {{end}} |
| |
| |
| {{/* |
| ------------------------------------------------------------------------------- |
| Emits information for manually declared atoms. |
| ------------------------------------------------------------------------------- |
| */}} |
| {{define "FixedAtoms"}} |
| service.AtomInfo{ |
| Type: uint16(atom.TypeIDEos), |
| Name: "EndOfStream", |
| }, |
| {{end}} |
| |
| |
| {{/* |
| ------------------------------------------------------------------------------- |
| Emits logic to get the information for the given item. |
| ------------------------------------------------------------------------------- |
| */}} |
| {{define "TypeInfo"}}ยง |
| {{$api := Global "api"}} |
| {{ if IsPseudonym $}}{{Macro "TypeInfo" $.To}} |
| {{else if IsSlice $}}schema.Int /* TODO: Slice */ |
| {{else if IsStaticArray $}}s.getStaticArrayInfo({{IndexOf $api.StaticArrays $}}) |
| {{else if IsMap $}}s.getMapInfo({{IndexOf $api.Maps $}}) |
| {{else if IsEnum $}}s.getEnumInfo({{IndexOf $api.Enums $}}) |
| {{else if IsClass $}}s.getClassInfo({{IndexOf $api.Classes $}}) |
| {{else if IsPointer $}}schema.Pointer |
| {{else if IsReference $}}schema.Int /* TODO: Reference */ |
| {{else if IsBool $}}schema.Bool |
| {{else if IsInt $}}schema.Int |
| {{else if IsUint $}}schema.Uint |
| {{else if IsS8 $}}schema.S8 |
| {{else if IsU8 $}}schema.U8 |
| {{else if IsS16 $}}schema.S16 |
| {{else if IsU16 $}}schema.U16 |
| {{else if IsS32 $}}schema.S32 |
| {{else if IsU32 $}}schema.U32 |
| {{else if IsF32 $}}schema.Float |
| {{else if IsS64 $}}schema.S64 |
| {{else if IsU64 $}}schema.U64 |
| {{else if IsF64 $}}schema.Double |
| {{else if IsString $}}schema.String |
| {{else if IsAny $}}schema.Any |
| {{else}}{{Error "macro TypeInfo called with unsupported type: %v" $.Name}} |
| {{end}} |
| {{end}} |