Implement GPUCompilationInfo
Implements the GPUCompilationInfo and GPUCompilationMessage interfaces,
adds the GPUCompilationMessageType enum, and adds the compilationInfo
method to GPUShaderModule.
BUG: dawn:746
Change-Id: Ied70cbbfedbf4890916ec076993714e5042f70e4
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/46600
Commit-Queue: Brandon Jones <bajones@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn_wire/client/ApiObjects.h b/src/dawn_wire/client/ApiObjects.h
index f842d53..8ec482a 100644
--- a/src/dawn_wire/client/ApiObjects.h
+++ b/src/dawn_wire/client/ApiObjects.h
@@ -21,6 +21,7 @@
#include "dawn_wire/client/Device.h"
#include "dawn_wire/client/Fence.h"
#include "dawn_wire/client/Queue.h"
+#include "dawn_wire/client/ShaderModule.h"
#include "dawn_wire/client/ApiObjects_autogen.h"
diff --git a/src/dawn_wire/client/ClientDoers.cpp b/src/dawn_wire/client/ClientDoers.cpp
index 2c6e23f..4073baa 100644
--- a/src/dawn_wire/client/ClientDoers.cpp
+++ b/src/dawn_wire/client/ClientDoers.cpp
@@ -122,4 +122,15 @@
return device->OnCreateRenderPipelineAsyncCallback(requestSerial, status, message);
}
+ bool Client::DoShaderModuleGetCompilationInfoCallback(ShaderModule* shaderModule,
+ uint64_t requestSerial,
+ WGPUCompilationInfoRequestStatus status,
+ const WGPUCompilationInfo* info) {
+ // The shader module might have been deleted or recreated so this isn't an error.
+ if (shaderModule == nullptr) {
+ return true;
+ }
+ return shaderModule->GetCompilationInfoCallback(requestSerial, status, info);
+ }
+
}} // namespace dawn_wire::client
diff --git a/src/dawn_wire/client/ShaderModule.cpp b/src/dawn_wire/client/ShaderModule.cpp
new file mode 100644
index 0000000..97e0204
--- /dev/null
+++ b/src/dawn_wire/client/ShaderModule.cpp
@@ -0,0 +1,66 @@
+// Copyright 2021 The Dawn Authors
+//
+// 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.
+
+#include "dawn_wire/client/ShaderModule.h"
+
+#include "dawn_wire/client/Client.h"
+
+namespace dawn_wire { namespace client {
+
+ ShaderModule::~ShaderModule() {
+ // Callbacks need to be fired in all cases, as they can handle freeing resources. So we call
+ // them with "Unknown" status.
+ for (auto& it : mCompilationInfoRequests) {
+ if (it.second.callback) {
+ it.second.callback(WGPUCompilationInfoRequestStatus_Unknown, nullptr,
+ it.second.userdata);
+ }
+ }
+ mCompilationInfoRequests.clear();
+ }
+
+ void ShaderModule::GetCompilationInfo(WGPUCompilationInfoCallback callback, void* userdata) {
+ if (client->IsDisconnected()) {
+ callback(WGPUCompilationInfoRequestStatus_DeviceLost, nullptr, userdata);
+ return;
+ }
+
+ uint64_t serial = mCompilationInfoRequestSerial++;
+ ShaderModuleGetCompilationInfoCmd cmd;
+ cmd.shaderModuleId = this->id;
+ cmd.requestSerial = serial;
+
+ mCompilationInfoRequests[serial] = {callback, userdata};
+
+ client->SerializeCommand(cmd);
+ }
+
+ bool ShaderModule::GetCompilationInfoCallback(uint64_t requestSerial,
+ WGPUCompilationInfoRequestStatus status,
+ const WGPUCompilationInfo* info) {
+ auto requestIt = mCompilationInfoRequests.find(requestSerial);
+ if (requestIt == mCompilationInfoRequests.end()) {
+ return false;
+ }
+
+ // Remove the request data so that the callback cannot be called again.
+ // ex.) inside the callback: if the shader module is deleted, all callbacks reject.
+ CompilationInfoRequest request = std::move(requestIt->second);
+ mCompilationInfoRequests.erase(requestIt);
+
+ request.callback(status, info, request.userdata);
+ return true;
+ }
+
+}} // namespace dawn_wire::client
diff --git a/src/dawn_wire/client/ShaderModule.h b/src/dawn_wire/client/ShaderModule.h
new file mode 100644
index 0000000..add5b97
--- /dev/null
+++ b/src/dawn_wire/client/ShaderModule.h
@@ -0,0 +1,46 @@
+// Copyright 2021 The Dawn Authors
+//
+// 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.
+
+#ifndef DAWNWIRE_CLIENT_SHADER_MODULE_H_
+#define DAWNWIRE_CLIENT_SHADER_MODULE_H_
+
+#include <dawn/webgpu.h>
+
+#include "common/SerialMap.h"
+#include "dawn_wire/client/ObjectBase.h"
+
+namespace dawn_wire { namespace client {
+
+ class ShaderModule final : public ObjectBase {
+ public:
+ using ObjectBase::ObjectBase;
+ ~ShaderModule();
+
+ void GetCompilationInfo(WGPUCompilationInfoCallback callback, void* userdata);
+ bool GetCompilationInfoCallback(uint64_t requestSerial,
+ WGPUCompilationInfoRequestStatus status,
+ const WGPUCompilationInfo* info);
+
+ private:
+ struct CompilationInfoRequest {
+ WGPUCompilationInfoCallback callback = nullptr;
+ void* userdata = nullptr;
+ };
+ uint64_t mCompilationInfoRequestSerial = 0;
+ std::map<uint64_t, CompilationInfoRequest> mCompilationInfoRequests;
+ };
+
+}} // namespace dawn_wire::client
+
+#endif // DAWNWIRE_CLIENT_SHADER_MODULE_H_