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