mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-06-06 14:43:31 +00:00
Use single DestroyObject command in the wire
Bug: dawn:83 Change-Id: Ic875d5111f59e7166d2decb3dc6a84973d9babdf Reviewed-on: https://dawn-review.googlesource.com/c/3680 Commit-Queue: Austin Eng <enga@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
parent
7c0f0fbf91
commit
9dc1250d3e
@ -349,7 +349,8 @@ namespace dawn_wire {
|
|||||||
|
|
||||||
obj->builderCallback.Call(DAWN_BUILDER_ERROR_STATUS_UNKNOWN, "Unknown");
|
obj->builderCallback.Call(DAWN_BUILDER_ERROR_STATUS_UNKNOWN, "Unknown");
|
||||||
|
|
||||||
{{as_MethodSuffix(type.name, Name("destroy"))}}Cmd cmd;
|
DestroyObjectCmd cmd;
|
||||||
|
cmd.objectType = ObjectType::{{type.name.CamelCase()}};
|
||||||
cmd.objectId = obj->id;
|
cmd.objectId = obj->id;
|
||||||
|
|
||||||
auto allocCmd = static_cast<decltype(cmd)*>(obj->device->GetCmdSpace(sizeof(cmd)));
|
auto allocCmd = static_cast<decltype(cmd)*>(obj->device->GetCmdSpace(sizeof(cmd)));
|
||||||
|
@ -53,16 +53,22 @@ namespace dawn_wire {
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class ObjectType : uint32_t {
|
||||||
|
{% for type in by_category["object"] %}
|
||||||
|
{{type.name.CamelCase()}},
|
||||||
|
{% endfor %}
|
||||||
|
};
|
||||||
|
|
||||||
//* Enum used as a prefix to each command on the wire format.
|
//* Enum used as a prefix to each command on the wire format.
|
||||||
enum class WireCmd : uint32_t {
|
enum class WireCmd : uint32_t {
|
||||||
{% for type in by_category["object"] %}
|
{% for type in by_category["object"] %}
|
||||||
{% for method in type.methods %}
|
{% for method in type.methods %}
|
||||||
{{as_MethodSuffix(type.name, method.name)}},
|
{{as_MethodSuffix(type.name, method.name)}},
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{{as_MethodSuffix(type.name, Name("destroy"))}},
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
BufferMapAsync,
|
BufferMapAsync,
|
||||||
BufferUpdateMappedDataCmd,
|
BufferUpdateMappedDataCmd,
|
||||||
|
DestroyObject,
|
||||||
};
|
};
|
||||||
|
|
||||||
{% for type in by_category["object"] %}
|
{% for type in by_category["object"] %}
|
||||||
@ -110,14 +116,6 @@ namespace dawn_wire {
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
};
|
};
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
//* The command structure used when sending that an ID is destroyed.
|
|
||||||
{% set Suffix = as_MethodSuffix(type.name, Name("destroy")) %}
|
|
||||||
struct {{Suffix}}Cmd {
|
|
||||||
WireCmd commandId = WireCmd::{{Suffix}};
|
|
||||||
ObjectId objectId;
|
|
||||||
};
|
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
//* Enum used as a prefix to each command on the return wire format.
|
//* Enum used as a prefix to each command on the return wire format.
|
||||||
|
@ -406,10 +406,6 @@ namespace dawn_wire {
|
|||||||
break;
|
break;
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% set Suffix = as_MethodSuffix(type.name, Name("destroy")) %}
|
|
||||||
case WireCmd::{{Suffix}}:
|
|
||||||
success = Handle{{Suffix}}(&commands, &size);
|
|
||||||
break;
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
case WireCmd::BufferMapAsync:
|
case WireCmd::BufferMapAsync:
|
||||||
success = HandleBufferMapAsync(&commands, &size);
|
success = HandleBufferMapAsync(&commands, &size);
|
||||||
@ -417,7 +413,9 @@ namespace dawn_wire {
|
|||||||
case WireCmd::BufferUpdateMappedDataCmd:
|
case WireCmd::BufferUpdateMappedDataCmd:
|
||||||
success = HandleBufferUpdateMappedData(&commands, &size);
|
success = HandleBufferUpdateMappedData(&commands, &size);
|
||||||
break;
|
break;
|
||||||
|
case WireCmd::DestroyObject:
|
||||||
|
success = HandleDestroyObject(&commands, &size);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
success = false;
|
success = false;
|
||||||
}
|
}
|
||||||
@ -632,45 +630,6 @@ namespace dawn_wire {
|
|||||||
}
|
}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
//* Handlers for the destruction of objects: clients do the tracking of the
|
|
||||||
//* reference / release and only send destroy on refcount = 0.
|
|
||||||
{% set Suffix = as_MethodSuffix(type.name, Name("destroy")) %}
|
|
||||||
bool Handle{{Suffix}}(const char** commands, size_t* size) {
|
|
||||||
|
|
||||||
//* Freeing the device has to be done out of band.
|
|
||||||
{% if type.name.canonical_case() == "device" %}
|
|
||||||
return false;
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
const auto* cmd = GetCommand<{{Suffix}}Cmd>(commands, size);
|
|
||||||
if (cmd == nullptr) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
ObjectId objectId = cmd->objectId;
|
|
||||||
|
|
||||||
//* ID 0 are reserved for nullptr and cannot be destroyed.
|
|
||||||
if (objectId == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto* data = mKnown{{type.name.CamelCase()}}.Get(objectId);
|
|
||||||
if (data == nullptr) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
{% if type.name.CamelCase() in reverse_lookup_object_types %}
|
|
||||||
m{{type.name.CamelCase()}}IdTable.Remove(data->handle);
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
if (data->handle != nullptr) {
|
|
||||||
mProcs.{{as_varName(type.name, Name("release"))}}(data->handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
mKnown{{type.name.CamelCase()}}.Free(objectId);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
bool HandleBufferMapAsync(const char** commands, size_t* size) {
|
bool HandleBufferMapAsync(const char** commands, size_t* size) {
|
||||||
@ -755,6 +714,48 @@ namespace dawn_wire {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HandleDestroyObject(const char** commands, size_t* size) {
|
||||||
|
const auto* cmd = GetCommand<DestroyObjectCmd>(commands, size);
|
||||||
|
if (cmd == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectId objectId = cmd->objectId;
|
||||||
|
//* ID 0 are reserved for nullptr and cannot be destroyed.
|
||||||
|
if (objectId == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (cmd->objectType) {
|
||||||
|
{% for type in by_category["object"] %}
|
||||||
|
{% set ObjectType = type.name.CamelCase() %}
|
||||||
|
case ObjectType::{{ObjectType}}: {
|
||||||
|
{% if ObjectType == "Device" %}
|
||||||
|
//* Freeing the device has to be done out of band.
|
||||||
|
return false;
|
||||||
|
{% else %}
|
||||||
|
auto* data = mKnown{{type.name.CamelCase()}}.Get(objectId);
|
||||||
|
if (data == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
{% if type.name.CamelCase() in reverse_lookup_object_types %}
|
||||||
|
m{{type.name.CamelCase()}}IdTable.Remove(data->handle);
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
if (data->handle != nullptr) {
|
||||||
|
mProcs.{{as_varName(type.name, Name("release"))}}(data->handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
mKnown{{type.name.CamelCase()}}.Free(objectId);
|
||||||
|
return true;
|
||||||
|
{% endif %}
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
default:
|
||||||
|
UNREACHABLE();
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void ForwardDeviceErrorToServer(const char* message, dawnCallbackUserdata userdata) {
|
void ForwardDeviceErrorToServer(const char* message, dawnCallbackUserdata userdata) {
|
||||||
|
@ -71,6 +71,13 @@ namespace dawn_wire {
|
|||||||
uint32_t dataLength;
|
uint32_t dataLength;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct DestroyObjectCmd {
|
||||||
|
WireCmd commandId = WireCmd::DestroyObject;
|
||||||
|
|
||||||
|
ObjectType objectType;
|
||||||
|
ObjectId objectId;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace dawn_wire
|
} // namespace dawn_wire
|
||||||
|
|
||||||
#endif // DAWNWIRE_WIRECMD_H_
|
#endif // DAWNWIRE_WIRECMD_H_
|
||||||
|
Loading…
x
Reference in New Issue
Block a user