| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import {VulkanInfo_Deserialize} from './vulkan_info.mojom-webui.js'; |
| |
| export class VulkanInfo { |
| private vulkanInfo_: Record<string, any>; |
| |
| constructor(base64Data: string) { |
| const array = Uint8Array.from(atob(base64Data), c => c.charCodeAt(0)); |
| const dataView = new DataView(array.buffer); |
| this.vulkanInfo_ = VulkanInfo_Deserialize(dataView); |
| this.beautify(this.vulkanInfo_); |
| } |
| |
| private beautify(obj: {[key: string]: any}) { |
| for (const key of Object.keys(obj)) { |
| const value = obj[key]; |
| |
| if (key === 'specVersion') { |
| continue; |
| } |
| |
| if (key.endsWith('Version')) { |
| obj[key] = this.beautifyVersion(value); |
| continue; |
| } |
| |
| if (key === 'extensions' || key === 'instanceExtensions') { |
| obj[key] = this.beautifyExtensions(value); |
| continue; |
| } |
| |
| if (key.endsWith('UUID')) { |
| obj[key] = this.beautifyUuid(value); |
| continue; |
| } |
| |
| if (typeof value === 'bigint') { |
| // JSON.stringify() doesn't support bigint. |
| obj[key] = Number(value); |
| continue; |
| } |
| |
| if (typeof value === 'object') { |
| this.beautify(value); |
| continue; |
| } |
| } |
| } |
| |
| private beautifyVersion(version: number): string { |
| const major = version >> 22; |
| const minor = (version >> 12) & 0x3ff; |
| const patch = version & 0xfff; |
| return `${major}.${minor}.${patch}`; |
| } |
| |
| private beautifyUuid(uuid: number[]): string { |
| // xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
| let result = ''; |
| for (let i = 0; i < 16; ++i) { |
| const value = uuid[i]!; |
| if (i === 4 || i === 6 || i === 8 || i === 10) { |
| result += '-'; |
| } |
| if (value < 0x10) { |
| result += '0'; |
| } |
| result += value.toString(16); |
| } |
| return result; |
| } |
| |
| private beautifyExtensions( |
| extensions: Array<{extensionName: string, specVersion: string}>): |
| {[key: string]: any} { |
| const result: {[key: string]: any} = {}; |
| for (const extension of extensions) { |
| const name = extension['extensionName']; |
| const version = extension['specVersion']; |
| result[name] = version; |
| } |
| return result; |
| } |
| |
| toString(): string { |
| return JSON.stringify(this.vulkanInfo_, null, 2); |
| } |
| } |