1e5c31af7Sopenharmony_ci// Copyright (c) 2014-2020 Khronos Group. 2e5c31af7Sopenharmony_ci// 3e5c31af7Sopenharmony_ci// SPDX-License-Identifier: CC-BY-4.0 4e5c31af7Sopenharmony_ci 5e5c31af7Sopenharmony_ci[appendix] 6e5c31af7Sopenharmony_ci[[vulkansc-deviations]] 7e5c31af7Sopenharmony_ci= Vulkan SC Deviations From Base Vulkan 8e5c31af7Sopenharmony_ci 9e5c31af7Sopenharmony_ci== Additions 10e5c31af7Sopenharmony_ciThe following extensions have been added to Vulkan SC: 11e5c31af7Sopenharmony_ci 12e5c31af7Sopenharmony_ci[width="95%",cols="60%,40%",options="header"] 13e5c31af7Sopenharmony_ci|=== 14e5c31af7Sopenharmony_ci| Extension | Level 15e5c31af7Sopenharmony_ciifdef::VK_KHR_object_refresh[] 16e5c31af7Sopenharmony_ci|<<VK_KHR_object_refresh>> | Optional 17e5c31af7Sopenharmony_ciendif::VK_KHR_object_refresh[] 18e5c31af7Sopenharmony_ci|=== 19e5c31af7Sopenharmony_ci 20e5c31af7Sopenharmony_ci 21e5c31af7Sopenharmony_ciThe following items have been added to Vulkan SC: 22e5c31af7Sopenharmony_ci 23e5c31af7Sopenharmony_ci[width="95%",cols="20%,80%",options="header"] 24e5c31af7Sopenharmony_ci|=== 25e5c31af7Sopenharmony_ci| Chapter a| Additions 26e5c31af7Sopenharmony_ci| <<fundamentals,Fundamentals>> a| include::{chapters}/fundamentals.adoc[tag=scaddition] 27e5c31af7Sopenharmony_ci| <<devsandqueues,Devices and Queues>> a| include::{chapters}/devsandqueues.adoc[tag=scaddition] 28e5c31af7Sopenharmony_ci| <<commandbuffers,Command Buffers>> a| include::{chapters}/cmdbuffers.adoc[tag=scaddition] 29e5c31af7Sopenharmony_ci| <<pipelines,Pipelines>> a| include::{chapters}/pipelines.adoc[tag=scaddition] 30e5c31af7Sopenharmony_ci| <<memory,Memory Allocation>> a| include::{chapters}/memory.adoc[tag=scaddition] 31e5c31af7Sopenharmony_ci| <<features,Features>> a| include::{chapters}/features.adoc[tag=scaddition] 32e5c31af7Sopenharmony_ci| <<debugging,Debugging>> a| include::{chapters}/fault_handling.adoc[tag=scaddition] 33e5c31af7Sopenharmony_ci|=== 34e5c31af7Sopenharmony_ci 35e5c31af7Sopenharmony_ci== Modifications 36e5c31af7Sopenharmony_ciThe following aspects of Base Vulkan have been modified for Vulkan SC: 37e5c31af7Sopenharmony_ci 38e5c31af7Sopenharmony_ciifdef::editing-notes[] 39e5c31af7Sopenharmony_ci[NOTE] 40e5c31af7Sopenharmony_ci.editing-note 41e5c31af7Sopenharmony_ci==== 42e5c31af7Sopenharmony_ciTable entries should be listed in the order listed in table of contents 43e5c31af7Sopenharmony_ci==== 44e5c31af7Sopenharmony_ciendif::editing-notes[] 45e5c31af7Sopenharmony_ci 46e5c31af7Sopenharmony_ci[width="95%",cols="20%,80%",options="header"] 47e5c31af7Sopenharmony_ci|=== 48e5c31af7Sopenharmony_ci| Chapter a| Modifications 49e5c31af7Sopenharmony_ci| <<fundamentals,Fundamentals>> a| include::{chapters}/fundamentals.adoc[tag=scdeviation] 50e5c31af7Sopenharmony_ci| <<devsandqueues,Devices and Queues>> a| include::{chapters}/devsandqueues.adoc[tag=scdeviation] 51e5c31af7Sopenharmony_ci| <<commandbuffers,Command Buffers>> a| include::{chapters}/cmdbuffers.adoc[tag=scdeviation] 52e5c31af7Sopenharmony_ci| <<pipelines,Pipelines>> a| include::{chapters}/pipelines.adoc[tag=scdeviation] 53e5c31af7Sopenharmony_ci| <<memory,Memory Allocation>> a| include::{chapters}/memory.adoc[tag=scdeviation] 54e5c31af7Sopenharmony_ci| <<resources,Resource Creation>> a| include::{chapters}/resources.adoc[tag=scdeviation] 55e5c31af7Sopenharmony_ci| <<descriptorsets,Resource Descriptors>> a| include::{chapters}/descriptorsets.adoc[tag=scdeviation] 56e5c31af7Sopenharmony_ci| <<sparsememory,Sparse Resources>> a| include::{chapters}/sparsemem.adoc[tag=scdeviation] 57e5c31af7Sopenharmony_ci| <<wsi,WSI Swapchain>> a| include::{chapters}/VK_KHR_swapchain/wsi.adoc[tag=scdeviation] 58e5c31af7Sopenharmony_ci| <<features,Features>> a| include::{chapters}/features.adoc[tag=scdeviation] 59e5c31af7Sopenharmony_ci| <<limits,Limits>> a| include::{chapters}/limits.adoc[tag=scdeviation] 60e5c31af7Sopenharmony_ci|=== 61e5c31af7Sopenharmony_ci 62e5c31af7Sopenharmony_ci== Removals 63e5c31af7Sopenharmony_ciThe following functionality has been removed from Base Vulkan in Vulkan SC: 64e5c31af7Sopenharmony_ci 65e5c31af7Sopenharmony_ciifdef::editing-notes[] 66e5c31af7Sopenharmony_ci[NOTE] 67e5c31af7Sopenharmony_ci.editing-note 68e5c31af7Sopenharmony_ci==== 69e5c31af7Sopenharmony_ciTable entries should be listed in the order listed in table of contents. 70e5c31af7Sopenharmony_ci==== 71e5c31af7Sopenharmony_ciendif::editing-notes[] 72e5c31af7Sopenharmony_ci 73e5c31af7Sopenharmony_ci[width="95%",cols="20%,80%",options="header"] 74e5c31af7Sopenharmony_ci|=== 75e5c31af7Sopenharmony_ci| Chapter a| Removals 76e5c31af7Sopenharmony_ci| <<fundamentals,Fundamentals>> a| include::{chapters}/fundamentals.adoc[tag=scremoved] 77e5c31af7Sopenharmony_ci| <<devsandqueues,Devices and Queues>> a| include::{chapters}/devsandqueues.adoc[tag=scremoved] 78e5c31af7Sopenharmony_ci| <<commandbuffers,Command Buffers>> a| include::{chapters}/cmdbuffers.adoc[tag=scremoved] 79e5c31af7Sopenharmony_ci| <<synchronization,Synchronization and Cache Control>> a| include::{chapters}/synchronization.adoc[tag=scremoved] 80e5c31af7Sopenharmony_ci| <<shaders,Shaders>> a| include::{chapters}/shaders.adoc[tag=scremoved] 81e5c31af7Sopenharmony_ci| <<pipelines,Pipelines>> a| include::{chapters}/pipelines.adoc[tag=scremoved] 82e5c31af7Sopenharmony_ci| <<memory,Memory Allocation>> a| include::{chapters}/memory.adoc[tag=scremoved] 83e5c31af7Sopenharmony_ci| <<descriptorsets,Resource Descriptors>> a| include::{chapters}/descriptorsets.adoc[tag=scremoved] 84e5c31af7Sopenharmony_ci| <<queries,Queries>> a| include::{chapters}/queries.adoc[tag=scremoved] 85e5c31af7Sopenharmony_ci| <<fragops,Fragment Operations>> a| include::{chapters}/fragops.adoc[tag=scremoved] 86e5c31af7Sopenharmony_ci| <<sparsememory,Sparse Resources>> a| include::{chapters}/sparsemem.adoc[tag=scremoved] 87e5c31af7Sopenharmony_ci| <<wsi,Window System Integration>> a| include::{chapters}/VK_KHR_surface/wsi.adoc[tag=scremoved] 88e5c31af7Sopenharmony_ci| <<wsi,WSI Swapchain>> a| include::{chapters}/VK_KHR_swapchain/wsi.adoc[tag=scremoved] 89e5c31af7Sopenharmony_ci|=== 90e5c31af7Sopenharmony_ci 91e5c31af7Sopenharmony_ci== Extension Support 92e5c31af7Sopenharmony_ci 93e5c31af7Sopenharmony_ciVulkan SC supports a subset of the extensions supported in Base Vulkan. 94e5c31af7Sopenharmony_ciThis subset was decided by: 95e5c31af7Sopenharmony_ci 96e5c31af7Sopenharmony_ci * Excluding any extensions that would pose significant difficulty to 97e5c31af7Sopenharmony_ci certify their implementations. 98e5c31af7Sopenharmony_ci * Excluding any extension that would not be used in deployed devices. 99e5c31af7Sopenharmony_ci This was primarily extensions focused on application development and 100e5c31af7Sopenharmony_ci debug. 101e5c31af7Sopenharmony_ci * Excluding any extensions that are specific to an Operating System or 102e5c31af7Sopenharmony_ci Windowing system that is highly unlikely to be used in the Safety 103e5c31af7Sopenharmony_ci Critical space. 104e5c31af7Sopenharmony_ci * Non-KHR or EXT extension are supported on request. 105e5c31af7Sopenharmony_ci 106e5c31af7Sopenharmony_ci[NOTE] 107e5c31af7Sopenharmony_ci.Note 108e5c31af7Sopenharmony_ci==== 109e5c31af7Sopenharmony_ciDuring development it is likely that application developers will need 110e5c31af7Sopenharmony_ciadditional functionality in a Vulkan SC implementation beyond what is 111e5c31af7Sopenharmony_ciprovided by the supported extensions. 112e5c31af7Sopenharmony_ciThis can be achieved by implementing a development focused version of the 113e5c31af7Sopenharmony_ciimplementation that exposes additional Vulkan extensions and tools support 114e5c31af7Sopenharmony_cibut is non-conformant to the Vulkan SC specification. 115e5c31af7Sopenharmony_ci 116e5c31af7Sopenharmony_ciA Vulkan SC conformant implementation with this additional functionality 117e5c31af7Sopenharmony_ciremoved will be used on the end device. 118e5c31af7Sopenharmony_ci==== 119e5c31af7Sopenharmony_ci 120e5c31af7Sopenharmony_ci== Fault and Error Handling 121e5c31af7Sopenharmony_ci 122e5c31af7Sopenharmony_ciVulkan SC maintains the use of <<fundamentals-returncodes>> on a small 123e5c31af7Sopenharmony_cinumber of commands. 124e5c31af7Sopenharmony_ciThese allow the command to confirm it completed successfully or return an 125e5c31af7Sopenharmony_cierror code for situations where a failure could be detected at runtime 126e5c31af7Sopenharmony_ciduring the execution of the command. 127e5c31af7Sopenharmony_ci 128e5c31af7Sopenharmony_ciIn addition to <<fundamentals-returncodes>> Vulkan SC adds 129e5c31af7Sopenharmony_ci<<fault-handling>> support. 130e5c31af7Sopenharmony_ciThis provides the implementation the ability to communicate information on 131e5c31af7Sopenharmony_cierrors or faults to the application that have been detected but are not 132e5c31af7Sopenharmony_cicovered by <<fundamentals-returncodes>> in the Vulkan SC API. 133e5c31af7Sopenharmony_ciThese could be runtime failures of the system or application faults that are 134e5c31af7Sopenharmony_cidetected asynchronously to the Vulkan API commands. 135e5c31af7Sopenharmony_ci 136e5c31af7Sopenharmony_ci== Undefined Behavior in the API 137e5c31af7Sopenharmony_ci 138e5c31af7Sopenharmony_ciIf an application uses the API incorrectly the behavior of the API is 139e5c31af7Sopenharmony_ciundefined:. 140e5c31af7Sopenharmony_ciThe Vulkan SC runtime will perform minimal error and state checking and it 141e5c31af7Sopenharmony_ciis assumed that applications are using the API correctly, see 142e5c31af7Sopenharmony_ci<<fundamentals-validusage>>. 143e5c31af7Sopenharmony_ci 144e5c31af7Sopenharmony_ciWith incorrect input to the API, the implementation could continue to 145e5c31af7Sopenharmony_cifunction correctly, generate unexpected output, become unstable, or be 146e5c31af7Sopenharmony_citerminated. 147e5c31af7Sopenharmony_ciThe exact behavior will vary and be dependent on the specifics of the 148e5c31af7Sopenharmony_ciinvalid usage and the implementation. 149e5c31af7Sopenharmony_ci 150e5c31af7Sopenharmony_ciIt is primarily the application's responsibility to ensure it always uses 151e5c31af7Sopenharmony_cithe API correctly. 152e5c31af7Sopenharmony_ciPotential methods to detect incorrect API usage include performing manual 153e5c31af7Sopenharmony_cicode inspection, use of validation layers during development, use of 154e5c31af7Sopenharmony_civalidation layers at runtime, or adding runtime checking to the application. 155e5c31af7Sopenharmony_ciOutside of this, Vulkan SC implementations can: add implementation-specific 156e5c31af7Sopenharmony_citargeted checks to detect invalid API usage that could significantly impact 157e5c31af7Sopenharmony_cithe correct operation of the application or implementation. 158e5c31af7Sopenharmony_ciThe <<fault-handling>> extension allows implementations to communicate 159e5c31af7Sopenharmony_ciinformation on such occurrences. 160e5c31af7Sopenharmony_ci 161e5c31af7Sopenharmony_ci== MISRA C:2012 Deviations 162e5c31af7Sopenharmony_ci 163e5c31af7Sopenharmony_ci`{core_header}` is intended to be compatible with safety coding standards 164e5c31af7Sopenharmony_cilike MISRA C:2012. 165e5c31af7Sopenharmony_ci 166e5c31af7Sopenharmony_ciThe following provides information on items a MISRA C code analysis tool 167e5c31af7Sopenharmony_cimay: report for a project using Vulkan SC. 168e5c31af7Sopenharmony_ci 169e5c31af7Sopenharmony_ciMISRA headline guidelines are copyright (C) The MISRA Consortium Limited and 170e5c31af7Sopenharmony_ciare reproduced with permission. 171e5c31af7Sopenharmony_ciFor further explanation of the directives and rules please see the _MISRA 172e5c31af7Sopenharmony_ciC:2012_ specification (https://www.misra.org.uk/misra-c/). 173e5c31af7Sopenharmony_ciSee _MISRA Compliance:2020_ 174e5c31af7Sopenharmony_ci(https://www.misra.org.uk/app/uploads/2021/06/MISRA-Compliance-2020.pdf) for 175e5c31af7Sopenharmony_cia framework for handling deviations. 176e5c31af7Sopenharmony_ci 177e5c31af7Sopenharmony_ci=== Directives 178e5c31af7Sopenharmony_ci 179e5c31af7Sopenharmony_ci[width="100%",cols="15%,85%",options="header"] 180e5c31af7Sopenharmony_ci|=== 181e5c31af7Sopenharmony_ci|Directive |4.6: "_typedefs_ that indicate size and signedness should be used 182e5c31af7Sopenharmony_ci in place of the basic numerical types" 183e5c31af7Sopenharmony_ci|Category |Advisory 184e5c31af7Sopenharmony_ci|Note |This is reported for every `char` and `float` variable used in the 185e5c31af7Sopenharmony_ci API. 186e5c31af7Sopenharmony_ci|Rationale |Vulkan SC maintains the Base Vulkan type conventions for 187e5c31af7Sopenharmony_ci compatibility between APIs. 188e5c31af7Sopenharmony_ci|=== 189e5c31af7Sopenharmony_ci 190e5c31af7Sopenharmony_ci=== Rules 191e5c31af7Sopenharmony_ci 192e5c31af7Sopenharmony_ci[width="100%",cols="15%,85%",options="header"] 193e5c31af7Sopenharmony_ci|=== 194e5c31af7Sopenharmony_ci|Rule |2.3: "A project should not contain unused type declarations" 195e5c31af7Sopenharmony_ci|Category |Advisory 196e5c31af7Sopenharmony_ci|Note |This is reported for any unused type definitions. 197e5c31af7Sopenharmony_ci|Rationale |The `{core_header}` provides a complete API definition and it is 198e5c31af7Sopenharmony_ci expected that an application may: not use all the provided type declarations. 199e5c31af7Sopenharmony_ci|=== 200e5c31af7Sopenharmony_ci 201e5c31af7Sopenharmony_ci[width="100%",cols="15%,85%",options="header"] 202e5c31af7Sopenharmony_ci|=== 203e5c31af7Sopenharmony_ci|Rule |2.4: "A project should not contain unused tag declarations" 204e5c31af7Sopenharmony_ci|Category |Advisory 205e5c31af7Sopenharmony_ci|Note |This is reported for each instance of 206e5c31af7Sopenharmony_ci `typedef struct VkStruct { ... } VkStruct;` and 207e5c31af7Sopenharmony_ci `typedef enum VkEnum { ... } VkEnum;` where the tag declaration is 208e5c31af7Sopenharmony_ci unused. 209e5c31af7Sopenharmony_ci|Rationale |The `{core_header}` provides a complete API definition and it is 210e5c31af7Sopenharmony_ci expected that an application may: not use all the provided tag 211e5c31af7Sopenharmony_ci declarations. 212e5c31af7Sopenharmony_ci Vulkan SC maintains the Base Vulkan type conventions for 213e5c31af7Sopenharmony_ci compatibility between APIs. 214e5c31af7Sopenharmony_ci Tag declarations are required in case an application wishes to 215e5c31af7Sopenharmony_ci make forward declarations to API-defined types. 216e5c31af7Sopenharmony_ci|=== 217e5c31af7Sopenharmony_ci 218e5c31af7Sopenharmony_ci[width="100%",cols="15%,85%",options="header"] 219e5c31af7Sopenharmony_ci|=== 220e5c31af7Sopenharmony_ci|Rule |2.5: "A project should not contain unused macro declarations" 221e5c31af7Sopenharmony_ci|Category |Advisory 222e5c31af7Sopenharmony_ci|Note |This is reported for every unused macro defined in the header. 223e5c31af7Sopenharmony_ci|Rationale |The `{core_header}` provides a complete API definition and it is 224e5c31af7Sopenharmony_ci expected that an application may: not use all the provided macro 225e5c31af7Sopenharmony_ci declarations. 226e5c31af7Sopenharmony_ci|=== 227e5c31af7Sopenharmony_ci 228e5c31af7Sopenharmony_ci[width="100%",cols="15%,85%",options="header"] 229e5c31af7Sopenharmony_ci|=== 230e5c31af7Sopenharmony_ci|Rule |5.1: "_External identifiers_ shall be distinct" 231e5c31af7Sopenharmony_ci|Category |Required 232e5c31af7Sopenharmony_ci|Note |This is reported for identifiers with names that do not differ in 233e5c31af7Sopenharmony_ci the first 31 characters, such as 234e5c31af7Sopenharmony_ci flink:vkGetPhysicalDeviceFormatProperties and 235e5c31af7Sopenharmony_ci flink:vkGetPhysicalDeviceFormatProperties2. 236e5c31af7Sopenharmony_ci|Rationale |Vulkan SC maintains the Base Vulkan naming conventions for 237e5c31af7Sopenharmony_ci compatibility between APIs. 238e5c31af7Sopenharmony_ci Vulkan SC applications must: be built using a compiler that treats 239e5c31af7Sopenharmony_ci enough characters as significant. 240e5c31af7Sopenharmony_ci|=== 241e5c31af7Sopenharmony_ci 242e5c31af7Sopenharmony_ci[width="100%",cols="15%,85%",options="header"] 243e5c31af7Sopenharmony_ci|=== 244e5c31af7Sopenharmony_ci|Rule |5.2: "Identifiers declared in the same _scope_ and name space 245e5c31af7Sopenharmony_ci shall be distinct" 246e5c31af7Sopenharmony_ci|Category |Required 247e5c31af7Sopenharmony_ci|Note |This is reported for many code:typedef statements with long 248e5c31af7Sopenharmony_ci identifiers. 249e5c31af7Sopenharmony_ci|Rationale |Vulkan SC maintains the Base Vulkan type and naming conventions for 250e5c31af7Sopenharmony_ci compatibility between APIs. 251e5c31af7Sopenharmony_ci Vulkan SC applications must: be built using a compiler that treats 252e5c31af7Sopenharmony_ci enough characters as significant. 253e5c31af7Sopenharmony_ci|=== 254e5c31af7Sopenharmony_ci 255e5c31af7Sopenharmony_ci[width="100%",cols="15%,85%",options="header"] 256e5c31af7Sopenharmony_ci|=== 257e5c31af7Sopenharmony_ci|Rule |5.4: "_Macro identifiers_ shall be distinct" 258e5c31af7Sopenharmony_ci|Category |Required 259e5c31af7Sopenharmony_ci|Note |This is reported for macros with names that do not differ in the 260e5c31af7Sopenharmony_ci first 31 characters, such as 261e5c31af7Sopenharmony_ci ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT and 262e5c31af7Sopenharmony_ci ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT. 263e5c31af7Sopenharmony_ci|Rationale |Vulkan SC maintains the Base Vulkan naming conventions for 264e5c31af7Sopenharmony_ci compatibility between APIs. 265e5c31af7Sopenharmony_ci Vulkan SC applications must: be built using a compiler that treats 266e5c31af7Sopenharmony_ci enough characters as significant. 267e5c31af7Sopenharmony_ci|=== 268e5c31af7Sopenharmony_ci 269e5c31af7Sopenharmony_ci[width="100%",cols="15%,85%",options="header"] 270e5c31af7Sopenharmony_ci|=== 271e5c31af7Sopenharmony_ci|Rule |8.6: "An identifier with external linkage shall have exactly one 272e5c31af7Sopenharmony_ci external definition" 273e5c31af7Sopenharmony_ci|Category |Required 274e5c31af7Sopenharmony_ci|Note |This is reported for every API entry point declaration, and the 275e5c31af7Sopenharmony_ci external definitions are provided by the implementation. 276e5c31af7Sopenharmony_ci|Rationale |It is expected that a Vulkan SC application will link against an 277e5c31af7Sopenharmony_ci implementation that provides these definitions. 278e5c31af7Sopenharmony_ci|=== 279e5c31af7Sopenharmony_ci 280e5c31af7Sopenharmony_ci[width="100%",cols="15%,85%",options="header"] 281e5c31af7Sopenharmony_ci|=== 282e5c31af7Sopenharmony_ci|Rule |19.2: "The _union_ keyword should not be used" 283e5c31af7Sopenharmony_ci|Category |Advisory 284e5c31af7Sopenharmony_ci|Note |This is reported on the slink:VkClearColorValue, 285e5c31af7Sopenharmony_ci slink:VkClearValue, and slink:VkPerformanceCounterResultKHR 286e5c31af7Sopenharmony_ci unions. 287e5c31af7Sopenharmony_ci|Rationale |These are required to remain compatible with the Base Vulkan API. 288e5c31af7Sopenharmony_ci|=== 289e5c31af7Sopenharmony_ci 290e5c31af7Sopenharmony_ci[width="100%",cols="15%,85%",options="header"] 291e5c31af7Sopenharmony_ci|=== 292e5c31af7Sopenharmony_ci|Rule |20.1: "_#include_ directives should only be preceded by 293e5c31af7Sopenharmony_ci preprocessor directives or comments" 294e5c31af7Sopenharmony_ci|Category |Advisory 295e5c31af7Sopenharmony_ci|Note |This is reported because the entire Vulkan SC API definition is 296e5c31af7Sopenharmony_ci wrapped in an `extern "C"` block. 297e5c31af7Sopenharmony_ci|Rationale |This is expected because the Vulkan SC API is a C ABI and the 298e5c31af7Sopenharmony_ci header may be included from C++ code. 299e5c31af7Sopenharmony_ci|=== 300e5c31af7Sopenharmony_ci 301e5c31af7Sopenharmony_ci[width="100%",cols="15%,85%",options="header"] 302e5c31af7Sopenharmony_ci|=== 303e5c31af7Sopenharmony_ci|Rule |20.10: "The # and ## preprocessor operators should not be used" 304e5c31af7Sopenharmony_ci|Category |Advisory 305e5c31af7Sopenharmony_ci|Note a|This is reported for the two lines: 306e5c31af7Sopenharmony_ci[source,c] 307e5c31af7Sopenharmony_ci--------------------------------------------------- 308e5c31af7Sopenharmony_ci#define VK_DEFINE_HANDLE(object) typedef struct object##_T* (object); 309e5c31af7Sopenharmony_ci#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *(object); 310e5c31af7Sopenharmony_ci--------------------------------------------------- 311e5c31af7Sopenharmony_ci|Rationale |This is expected usage of the macro expansion operation and there 312e5c31af7Sopenharmony_ci are not multiple operators used in the statement. 313e5c31af7Sopenharmony_ci|=== 314