• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //* Copyright 2019 The Dawn Authors
2 //*
3 //* Licensed under the Apache License, Version 2.0 (the "License");
4 //* you may not use this file except in compliance with the License.
5 //* You may obtain a copy of the License at
6 //*
7 //*     http://www.apache.org/licenses/LICENSE-2.0
8 //*
9 //* Unless required by applicable law or agreed to in writing, software
10 //* distributed under the License is distributed on an "AS IS" BASIS,
11 //* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 //* See the License for the specific language governing permissions and
13 //* limitations under the License.
14 
15 #ifndef DAWNWIRE_SERVER_SERVERBASE_H_
16 #define DAWNWIRE_SERVER_SERVERBASE_H_
17 
18 #include "dawn/dawn_proc_table.h"
19 #include "dawn_wire/ChunkedCommandHandler.h"
20 #include "dawn_wire/Wire.h"
21 #include "dawn_wire/WireCmd_autogen.h"
22 #include "dawn_wire/WireDeserializeAllocator.h"
23 #include "dawn_wire/server/ObjectStorage.h"
24 
25 namespace dawn_wire { namespace server {
26 
27     class ServerBase : public ChunkedCommandHandler, public ObjectIdResolver {
28       public:
29         ServerBase() = default;
30         virtual ~ServerBase() = default;
31 
32       protected:
DestroyAllObjects(const DawnProcTable & procs)33         void DestroyAllObjects(const DawnProcTable& procs) {
34             //* Free all objects when the server is destroyed
35             {% for type in by_category["object"] if type.name.get() != "device" %}
36                 {
37                     std::vector<{{as_cType(type.name)}}> handles = mKnown{{type.name.CamelCase()}}.AcquireAllHandles();
38                     for ({{as_cType(type.name)}} handle : handles) {
39                         procs.{{as_varName(type.name, Name("release"))}}(handle);
40                     }
41                 }
42             {% endfor %}
43             //* Release devices last because dawn_native requires this.
44             {
45                 std::vector<WGPUDevice> handles = mKnownDevice.AcquireAllHandles();
46                 for (WGPUDevice handle : handles) {
47                     procs.deviceRelease(handle);
48                 }
49             }
50         }
51 
52         {% for type in by_category["object"] %}
53             const KnownObjects<{{as_cType(type.name)}}>& {{type.name.CamelCase()}}Objects() const {
54                 return mKnown{{type.name.CamelCase()}};
55             }
56             KnownObjects<{{as_cType(type.name)}}>& {{type.name.CamelCase()}}Objects() {
57                 return mKnown{{type.name.CamelCase()}};
58             }
59         {% endfor %}
60 
61         {% for type in by_category["object"] if type.name.CamelCase() in server_reverse_lookup_objects %}
62             const ObjectIdLookupTable<{{as_cType(type.name)}}>& {{type.name.CamelCase()}}ObjectIdTable() const {
63                 return m{{type.name.CamelCase()}}IdTable;
64             }
65             ObjectIdLookupTable<{{as_cType(type.name)}}>& {{type.name.CamelCase()}}ObjectIdTable() {
66                 return m{{type.name.CamelCase()}}IdTable;
67             }
68         {% endfor %}
69 
70       private:
71         // Implementation of the ObjectIdResolver interface
72         {% for type in by_category["object"] %}
73             WireResult GetFromId(ObjectId id, {{as_cType(type.name)}}* out) const final {
74                 auto data = mKnown{{type.name.CamelCase()}}.Get(id);
75                 if (data == nullptr) {
76                     return WireResult::FatalError;
77                 }
78 
79                 *out = data->handle;
80                 return WireResult::Success;
81             }
82 
83             WireResult GetOptionalFromId(ObjectId id, {{as_cType(type.name)}}* out) const final {
84                 if (id == 0) {
85                     *out = nullptr;
86                     return WireResult::Success;
87                 }
88 
89                 return GetFromId(id, out);
90             }
91         {% endfor %}
92 
93         //* The list of known IDs for each object type.
94         {% for type in by_category["object"] %}
95             KnownObjects<{{as_cType(type.name)}}> mKnown{{type.name.CamelCase()}};
96         {% endfor %}
97 
98         {% for type in by_category["object"] if type.name.CamelCase() in server_reverse_lookup_objects %}
99             ObjectIdLookupTable<{{as_cType(type.name)}}> m{{type.name.CamelCase()}}IdTable;
100         {% endfor %}
101     };
102 
103 }}  // namespace dawn_wire::server
104 
105 #endif  // DAWNWIRE_SERVER_SERVERBASE_H_
106