Wire: Add support for nullptr objects as arguments

BUG=dawn:5

Change-Id: I84c80796e9bdfbcf59fafdd38d33ab2101a1d795
Reviewed-on: https://dawn-review.googlesource.com/1541
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
This commit is contained in:
Corentin Wallez 2018-09-21 00:28:33 +00:00 committed by Commit Bot service account
parent 82fbccbd78
commit 386b8889bd
3 changed files with 49 additions and 1 deletions

View File

@ -215,6 +215,9 @@ namespace dawn_wire {
// Implementation of the ObjectIdProvider interface
{% for type in by_category["object"] %}
ObjectId GetId({{as_cType(type.name)}} object) const override {
if (object == nullptr) {
return 0;
}
return reinterpret_cast<{{as_wireType(type)}}>(object)->id;
}
{% endfor %}

View File

@ -358,6 +358,11 @@ namespace dawn_wire {
// Implementation of the ObjectIdResolver interface
{% for type in by_category["object"] %}
DeserializeResult GetFromId(ObjectId id, {{as_cType(type.name)}}* out) const override {
if (id == 0) {
*out = nullptr;
return DeserializeResult::Success;
}
auto data = mKnown{{type.name.CamelCase()}}.Get(id);
if (data == nullptr) {
return DeserializeResult::FatalError;

View File

@ -328,7 +328,7 @@ TEST_F(WireTests, CStringArgument) {
}
// Test that the wire is able to send objects as value arguments
TEST_F(WireTests, DISABLED_ObjectAsValueArgument) {
TEST_F(WireTests, ObjectAsValueArgument) {
// Create pipeline
dawnComputePipelineDescriptor pipelineDesc;
pipelineDesc.nextInChain = nullptr;
@ -485,6 +485,46 @@ TEST_F(WireTests, StructureOfStructureArrayArgument) {
FlushClient();
}
// Test passing nullptr instead of objects - object as value version
TEST_F(WireTests, NullptrAsValue) {
dawnCommandBufferBuilder builder = dawnDeviceCreateCommandBufferBuilder(device);
dawnComputePassEncoder pass = dawnCommandBufferBuilderBeginComputePass(builder);
dawnComputePassEncoderSetComputePipeline(pass, nullptr);
dawnCommandBufferBuilder apiBuilder = api.GetNewCommandBufferBuilder();
EXPECT_CALL(api, DeviceCreateCommandBufferBuilder(apiDevice))
.WillOnce(Return(apiBuilder));
dawnComputePassEncoder apiPass = api.GetNewComputePassEncoder();
EXPECT_CALL(api, CommandBufferBuilderBeginComputePass(apiBuilder))
.WillOnce(Return(apiPass));
EXPECT_CALL(api, ComputePassEncoderSetComputePipeline(apiPass, nullptr))
.Times(1);
FlushClient();
}
// Test passing nullptr instead of objects - array of objects version
TEST_F(WireTests, NullptrInArray) {
dawnBindGroupLayout nullBGL = nullptr;
dawnPipelineLayoutDescriptor descriptor;
descriptor.nextInChain = nullptr;
descriptor.numBindGroupLayouts = 1;
descriptor.bindGroupLayouts = &nullBGL;
dawnDeviceCreatePipelineLayout(device, &descriptor);
EXPECT_CALL(api, DeviceCreatePipelineLayout(apiDevice, MatchesLambda([](const dawnPipelineLayoutDescriptor* desc) -> bool {
return desc->nextInChain == nullptr &&
desc->numBindGroupLayouts == 1 &&
desc->bindGroupLayouts[0] == nullptr;
})))
.WillOnce(Return(nullptr));
FlushClient();
}
// Test that the server doesn't forward calls to error objects or with error objects
// Also test that when GetResult is called on an error builder, the error callback is fired
// TODO(cwallez@chromium.org): This test is disabled because the introduction of encoders breaks