blob: c014454ba185dfb6c96d202a388877d7a1a5bb46 [file] [log] [blame]
Jesse Halld27f6aa2015-08-15 17:58:48 -07001// Copyright (c) 2015 The Khronos Group Inc.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and/or associated documentation files (the
5// "Materials"), to deal in the Materials without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Materials, and to
8// permit persons to whom the Materials are furnished to do so, subject to
9// the following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Materials.
13//
14// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
21
22import platform "platform.api"
23
24///////////////
25// Constants //
26///////////////
27
28// API version (major.minor.patch)
29define VERSION_MAJOR 0
30define VERSION_MINOR 138
Jesse Hallf09c6b12015-08-15 19:54:28 -070031define VERSION_PATCH 2
Jesse Halld27f6aa2015-08-15 17:58:48 -070032
33// API limits
34define VK_MAX_PHYSICAL_DEVICE_NAME 256
35define VK_UUID_LENGTH 16
36define VK_MAX_EXTENSION_NAME 256
37define VK_MAX_DESCRIPTION 256
38define VK_MAX_MEMORY_TYPES 32
39define VK_MAX_MEMORY_HEAPS 16 /// The maximum number of unique memory heaps, each of which supporting 1 or more memory types.
40
41// API keywords
42define VK_TRUE 1
43define VK_FALSE 0
44define VK_NULL_HANDLE 0
45
46
47/////////////
48// Types //
49/////////////
50
51/// Dispatchable handle types.
52@dispatchHandle type u64 VkInstance
53@dispatchHandle type u64 VkPhysicalDevice
54@dispatchHandle type u64 VkDevice
55@dispatchHandle type u64 VkQueue
56@dispatchHandle type u64 VkCmdBuffer
57
58/// Non dispatchable handle types.
59@nonDispatchHandle type u64 VkDeviceMemory
60@nonDispatchHandle type u64 VkCmdPool
61@nonDispatchHandle type u64 VkBuffer
62@nonDispatchHandle type u64 VkBufferView
63@nonDispatchHandle type u64 VkImage
64@nonDispatchHandle type u64 VkImageView
65@nonDispatchHandle type u64 VkAttachmentView
66@nonDispatchHandle type u64 VkShaderModule
67@nonDispatchHandle type u64 VkShader
68@nonDispatchHandle type u64 VkPipeline
69@nonDispatchHandle type u64 VkPipelineLayout
70@nonDispatchHandle type u64 VkSampler
71@nonDispatchHandle type u64 VkDescriptorSet
72@nonDispatchHandle type u64 VkDescriptorSetLayout
73@nonDispatchHandle type u64 VkDescriptorPool
74@nonDispatchHandle type u64 VkDynamicViewportState
75@nonDispatchHandle type u64 VkDynamicRasterState
76@nonDispatchHandle type u64 VkDynamicColorBlendState
77@nonDispatchHandle type u64 VkDynamicDepthStencilState
78@nonDispatchHandle type u64 VkFence
79@nonDispatchHandle type u64 VkSemaphore
80@nonDispatchHandle type u64 VkEvent
81@nonDispatchHandle type u64 VkQueryPool
82@nonDispatchHandle type u64 VkFramebuffer
83@nonDispatchHandle type u64 VkRenderPass
84@nonDispatchHandle type u64 VkPipelineCache
85
86
87/////////////
88// Enums //
89/////////////
90
91enum VkImageLayout {
92 VK_IMAGE_LAYOUT_UNDEFINED = 0x00000000, /// Implicit layout an image is when its contents are undefined due to various reasons (e.g. right after creation)
93 VK_IMAGE_LAYOUT_GENERAL = 0x00000001, /// General layout when image can be used for any kind of access
94 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 0x00000002, /// Optimal layout when image is only used for color attachment read/write
95 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 0x00000003, /// Optimal layout when image is only used for depth/stencil attachment read/write
96 VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 0x00000004, /// Optimal layout when image is used for read only depth/stencil attachment and shader access
97 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 0x00000005, /// Optimal layout when image is used for read only shader access
98 VK_IMAGE_LAYOUT_TRANSFER_SOURCE_OPTIMAL = 0x00000006, /// Optimal layout when image is used only as source of transfer operations
99 VK_IMAGE_LAYOUT_TRANSFER_DESTINATION_OPTIMAL = 0x00000007, /// Optimal layout when image is used only as destination of transfer operations
100}
101
102enum VkAttachmentLoadOp {
103 VK_ATTACHMENT_LOAD_OP_LOAD = 0x00000000,
104 VK_ATTACHMENT_LOAD_OP_CLEAR = 0x00000001,
105 VK_ATTACHMENT_LOAD_OP_DONT_CARE = 0x00000002,
106}
107
108enum VkAttachmentStoreOp {
109 VK_ATTACHMENT_STORE_OP_STORE = 0x00000000,
110 VK_ATTACHMENT_STORE_OP_DONT_CARE = 0x00000001,
111}
112
113enum VkImageType {
114 VK_IMAGE_TYPE_1D = 0x00000000,
115 VK_IMAGE_TYPE_2D = 0x00000001,
116 VK_IMAGE_TYPE_3D = 0x00000002,
117}
118
119enum VkImageTiling {
120 VK_IMAGE_TILING_LINEAR = 0x00000000,
121 VK_IMAGE_TILING_OPTIMAL = 0x00000001,
122}
123
124enum VkImageViewType {
125 VK_IMAGE_VIEW_TYPE_1D = 0x00000000,
126 VK_IMAGE_VIEW_TYPE_2D = 0x00000001,
127 VK_IMAGE_VIEW_TYPE_3D = 0x00000002,
128 VK_IMAGE_VIEW_TYPE_CUBE = 0x00000003,
129 VK_IMAGE_VIEW_TYPE_1D_ARRAY = 0x00000004,
130 VK_IMAGE_VIEW_TYPE_2D_ARRAY = 0x00000005,
131 VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = 0x00000006,
132}
133
134enum VkImageAspect {
135 VK_IMAGE_ASPECT_COLOR = 0x00000000,
136 VK_IMAGE_ASPECT_DEPTH = 0x00000001,
137 VK_IMAGE_ASPECT_STENCIL = 0x00000002,
138 VK_IMAGE_ASPECT_METADATA = 0x00000003,
139}
140
141enum VkBufferViewType {
142 VK_BUFFER_VIEW_TYPE_RAW = 0x00000000, /// Raw buffer without special structure (UBO, SSBO)
143 VK_BUFFER_VIEW_TYPE_FORMATTED = 0x00000001, /// Buffer with format (TBO, IBO)
144}
145
146enum VkCmdBufferLevel {
147 VK_CMD_BUFFER_LEVEL_PRIMARY = 0x00000000,
148 VK_CMD_BUFFER_LEVEL_SECONDARY = 0x00000001,
149}
150
151enum VkChannelSwizzle {
152 VK_CHANNEL_SWIZZLE_ZERO = 0x00000000,
153 VK_CHANNEL_SWIZZLE_ONE = 0x00000001,
154 VK_CHANNEL_SWIZZLE_R = 0x00000002,
155 VK_CHANNEL_SWIZZLE_G = 0x00000003,
156 VK_CHANNEL_SWIZZLE_B = 0x00000004,
157 VK_CHANNEL_SWIZZLE_A = 0x00000005,
158}
159
160enum VkDescriptorType {
161 VK_DESCRIPTOR_TYPE_SAMPLER = 0x00000000,
162 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = 0x00000001,
163 VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = 0x00000002,
164 VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = 0x00000003,
165 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = 0x00000004,
166 VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = 0x00000005,
167 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = 0x00000006,
168 VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = 0x00000007,
169 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = 0x00000008,
170 VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = 0x00000009,
171 VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = 0x0000000a,
172}
173
174enum VkDescriptorPoolUsage {
175 VK_DESCRIPTOR_POOL_USAGE_ONE_SHOT = 0x00000000,
176 VK_DESCRIPTOR_POOL_USAGE_DYNAMIC = 0x00000001,
177}
178
179enum VkDescriptorSetUsage {
180 VK_DESCRIPTOR_SET_USAGE_ONE_SHOT = 0x00000000,
181 VK_DESCRIPTOR_SET_USAGE_STATIC = 0x00000001,
182}
183
184enum VkQueryType {
185 VK_QUERY_TYPE_OCCLUSION = 0x00000000,
186 VK_QUERY_TYPE_PIPELINE_STATISTICS = 0x00000001, /// Optional
187}
188
189enum VkTimestampType {
190 VK_TIMESTAMP_TYPE_TOP = 0x00000000,
191 VK_TIMESTAMP_TYPE_BOTTOM = 0x00000001,
192}
193
194enum VkBorderColor {
195 VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = 0x00000000,
196 VK_BORDER_COLOR_INT_TRANSPARENT_BLACK = 0x00000001,
197 VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK = 0x00000002,
198 VK_BORDER_COLOR_INT_OPAQUE_BLACK = 0x00000003,
199 VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE = 0x00000004,
200 VK_BORDER_COLOR_INT_OPAQUE_WHITE = 0x00000005,
201}
202
203enum VkPipelineBindPoint {
204 VK_PIPELINE_BIND_POINT_COMPUTE = 0x00000000,
205 VK_PIPELINE_BIND_POINT_GRAPHICS = 0x00000001,
206}
207
208enum VkPrimitiveTopology {
209 VK_PRIMITIVE_TOPOLOGY_POINT_LIST = 0x00000000,
210 VK_PRIMITIVE_TOPOLOGY_LINE_LIST = 0x00000001,
211 VK_PRIMITIVE_TOPOLOGY_LINE_STRIP = 0x00000002,
212 VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST = 0x00000003,
213 VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP = 0x00000004,
214 VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN = 0x00000005,
215 VK_PRIMITIVE_TOPOLOGY_LINE_LIST_ADJ = 0x00000006,
216 VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_ADJ = 0x00000007,
217 VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_ADJ = 0x00000008,
218 VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_ADJ = 0x00000009,
219 VK_PRIMITIVE_TOPOLOGY_PATCH = 0x0000000a,
220}
221
222enum VkSharingMode {
223 VK_SHARING_MODE_EXCLUSIVE = 0x00000000,
224 VK_SHARING_MODE_CONCURRENT = 0x00000001,
225}
226
227enum VkIndexType {
228 VK_INDEX_TYPE_UINT16 = 0x00000000,
229 VK_INDEX_TYPE_UINT32 = 0x00000001,
230}
231
232enum VkTexFilter {
233 VK_TEX_FILTER_NEAREST = 0x00000000,
234 VK_TEX_FILTER_LINEAR = 0x00000001,
235}
236
237enum VkTexMipmapMode {
238 VK_TEX_MIPMAP_MODE_BASE = 0x00000000, /// Always choose base level
239 VK_TEX_MIPMAP_MODE_NEAREST = 0x00000001, /// Choose nearest mip level
240 VK_TEX_MIPMAP_MODE_LINEAR = 0x00000002, /// Linear filter between mip levels
241}
242
243enum VkTexAddress {
244 VK_TEX_ADDRESS_WRAP = 0x00000000,
245 VK_TEX_ADDRESS_MIRROR = 0x00000001,
246 VK_TEX_ADDRESS_CLAMP = 0x00000002,
247 VK_TEX_ADDRESS_MIRROR_ONCE = 0x00000003,
248 VK_TEX_ADDRESS_CLAMP_BORDER = 0x00000004,
249}
250
251enum VkCompareOp {
252 VK_COMPARE_OP_NEVER = 0x00000000,
253 VK_COMPARE_OP_LESS = 0x00000001,
254 VK_COMPARE_OP_EQUAL = 0x00000002,
255 VK_COMPARE_OP_LESS_EQUAL = 0x00000003,
256 VK_COMPARE_OP_GREATER = 0x00000004,
257 VK_COMPARE_OP_NOT_EQUAL = 0x00000005,
258 VK_COMPARE_OP_GREATER_EQUAL = 0x00000006,
259 VK_COMPARE_OP_ALWAYS = 0x00000007,
260}
261
262enum VkFillMode {
263 VK_FILL_MODE_POINTS = 0x00000000,
264 VK_FILL_MODE_WIREFRAME = 0x00000001,
265 VK_FILL_MODE_SOLID = 0x00000002,
266}
267
268enum VkCullMode {
269 VK_CULL_MODE_NONE = 0x00000000,
270 VK_CULL_MODE_FRONT = 0x00000001,
271 VK_CULL_MODE_BACK = 0x00000002,
272 VK_CULL_MODE_FRONT_AND_BACK = 0x00000003,
273}
274
275enum VkFrontFace {
276 VK_FRONT_FACE_CCW = 0x00000000,
277 VK_FRONT_FACE_CW = 0x00000001,
278}
279
280enum VkBlend {
281 VK_BLEND_ZERO = 0x00000000,
282 VK_BLEND_ONE = 0x00000001,
283 VK_BLEND_SRC_COLOR = 0x00000002,
284 VK_BLEND_ONE_MINUS_SRC_COLOR = 0x00000003,
285 VK_BLEND_DEST_COLOR = 0x00000004,
286 VK_BLEND_ONE_MINUS_DEST_COLOR = 0x00000005,
287 VK_BLEND_SRC_ALPHA = 0x00000006,
288 VK_BLEND_ONE_MINUS_SRC_ALPHA = 0x00000007,
289 VK_BLEND_DEST_ALPHA = 0x00000008,
290 VK_BLEND_ONE_MINUS_DEST_ALPHA = 0x00000009,
291 VK_BLEND_CONSTANT_COLOR = 0x0000000a,
292 VK_BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0000000b,
293 VK_BLEND_CONSTANT_ALPHA = 0x0000000c,
294 VK_BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x0000000d,
295 VK_BLEND_SRC_ALPHA_SATURATE = 0x0000000e,
296 VK_BLEND_SRC1_COLOR = 0x0000000f,
297 VK_BLEND_ONE_MINUS_SRC1_COLOR = 0x00000010,
298 VK_BLEND_SRC1_ALPHA = 0x00000011,
299 VK_BLEND_ONE_MINUS_SRC1_ALPHA = 0x00000012,
300}
301
302enum VkBlendOp {
303 VK_BLEND_OP_ADD = 0x00000000,
304 VK_BLEND_OP_SUBTRACT = 0x00000001,
305 VK_BLEND_OP_REVERSE_SUBTRACT = 0x00000002,
306 VK_BLEND_OP_MIN = 0x00000003,
307 VK_BLEND_OP_MAX = 0x00000004,
308}
309
310enum VkStencilOp {
311 VK_STENCIL_OP_KEEP = 0x00000000,
312 VK_STENCIL_OP_ZERO = 0x00000001,
313 VK_STENCIL_OP_REPLACE = 0x00000002,
314 VK_STENCIL_OP_INC_CLAMP = 0x00000003,
315 VK_STENCIL_OP_DEC_CLAMP = 0x00000004,
316 VK_STENCIL_OP_INVERT = 0x00000005,
317 VK_STENCIL_OP_INC_WRAP = 0x00000006,
318 VK_STENCIL_OP_DEC_WRAP = 0x00000007,
319}
320
321enum VkLogicOp {
322 VK_LOGIC_OP_CLEAR = 0x00000000,
323 VK_LOGIC_OP_AND = 0x00000001,
324 VK_LOGIC_OP_AND_REVERSE = 0x00000002,
325 VK_LOGIC_OP_COPY = 0x00000003,
326 VK_LOGIC_OP_AND_INVERTED = 0x00000004,
327 VK_LOGIC_OP_NOOP = 0x00000005,
328 VK_LOGIC_OP_XOR = 0x00000006,
329 VK_LOGIC_OP_OR = 0x00000007,
330 VK_LOGIC_OP_NOR = 0x00000008,
331 VK_LOGIC_OP_EQUIV = 0x00000009,
332 VK_LOGIC_OP_INVERT = 0x0000000a,
333 VK_LOGIC_OP_OR_REVERSE = 0x0000000b,
334 VK_LOGIC_OP_COPY_INVERTED = 0x0000000c,
335 VK_LOGIC_OP_OR_INVERTED = 0x0000000d,
336 VK_LOGIC_OP_NAND = 0x0000000e,
337 VK_LOGIC_OP_SET = 0x0000000f,
338}
339
340enum VkSystemAllocType {
341 VK_SYSTEM_ALLOC_TYPE_API_OBJECT = 0x00000000,
342 VK_SYSTEM_ALLOC_TYPE_INTERNAL = 0x00000001,
343 VK_SYSTEM_ALLOC_TYPE_INTERNAL_TEMP = 0x00000002,
344 VK_SYSTEM_ALLOC_TYPE_INTERNAL_SHADER = 0x00000003,
345 VK_SYSTEM_ALLOC_TYPE_DEBUG = 0x00000004,
346}
347
348enum VkPhysicalDeviceType {
349 VK_PHYSICAL_DEVICE_TYPE_OTHER = 0x00000000,
350 VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU = 0x00000001,
351 VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU = 0x00000002,
352 VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU = 0x00000003,
353 VK_PHYSICAL_DEVICE_TYPE_CPU = 0x00000004,
354}
355
356enum VkVertexInputStepRate {
357 VK_VERTEX_INPUT_STEP_RATE_VERTEX = 0x00000000,
358 VK_VERTEX_INPUT_STEP_RATE_INSTANCE = 0x00000001,
359}
360
361/// Vulkan format definitions
362enum VkFormat {
363 VK_FORMAT_UNDEFINED = 0x00000000,
364 VK_FORMAT_R4G4_UNORM = 0x00000001,
365 VK_FORMAT_R4G4_USCALED = 0x00000002,
366 VK_FORMAT_R4G4B4A4_UNORM = 0x00000003,
367 VK_FORMAT_R4G4B4A4_USCALED = 0x00000004,
368 VK_FORMAT_R5G6B5_UNORM = 0x00000005,
369 VK_FORMAT_R5G6B5_USCALED = 0x00000006,
370 VK_FORMAT_R5G5B5A1_UNORM = 0x00000007,
371 VK_FORMAT_R5G5B5A1_USCALED = 0x00000008,
372 VK_FORMAT_R8_UNORM = 0x00000009,
373 VK_FORMAT_R8_SNORM = 0x0000000A,
374 VK_FORMAT_R8_USCALED = 0x0000000B,
375 VK_FORMAT_R8_SSCALED = 0x0000000C,
376 VK_FORMAT_R8_UINT = 0x0000000D,
377 VK_FORMAT_R8_SINT = 0x0000000E,
378 VK_FORMAT_R8_SRGB = 0x0000000F,
379 VK_FORMAT_R8G8_UNORM = 0x00000010,
380 VK_FORMAT_R8G8_SNORM = 0x00000011,
381 VK_FORMAT_R8G8_USCALED = 0x00000012,
382 VK_FORMAT_R8G8_SSCALED = 0x00000013,
383 VK_FORMAT_R8G8_UINT = 0x00000014,
384 VK_FORMAT_R8G8_SINT = 0x00000015,
385 VK_FORMAT_R8G8_SRGB = 0x00000016,
386 VK_FORMAT_R8G8B8_UNORM = 0x00000017,
387 VK_FORMAT_R8G8B8_SNORM = 0x00000018,
388 VK_FORMAT_R8G8B8_USCALED = 0x00000019,
389 VK_FORMAT_R8G8B8_SSCALED = 0x0000001A,
390 VK_FORMAT_R8G8B8_UINT = 0x0000001B,
391 VK_FORMAT_R8G8B8_SINT = 0x0000001C,
392 VK_FORMAT_R8G8B8_SRGB = 0x0000001D,
393 VK_FORMAT_R8G8B8A8_UNORM = 0x0000001E,
394 VK_FORMAT_R8G8B8A8_SNORM = 0x0000001F,
395 VK_FORMAT_R8G8B8A8_USCALED = 0x00000020,
396 VK_FORMAT_R8G8B8A8_SSCALED = 0x00000021,
397 VK_FORMAT_R8G8B8A8_UINT = 0x00000022,
398 VK_FORMAT_R8G8B8A8_SINT = 0x00000023,
399 VK_FORMAT_R8G8B8A8_SRGB = 0x00000024,
400 VK_FORMAT_R10G10B10A2_UNORM = 0x00000025,
401 VK_FORMAT_R10G10B10A2_SNORM = 0x00000026,
402 VK_FORMAT_R10G10B10A2_USCALED = 0x00000027,
403 VK_FORMAT_R10G10B10A2_SSCALED = 0x00000028,
404 VK_FORMAT_R10G10B10A2_UINT = 0x00000029,
405 VK_FORMAT_R10G10B10A2_SINT = 0x0000002A,
406 VK_FORMAT_R16_UNORM = 0x0000002B,
407 VK_FORMAT_R16_SNORM = 0x0000002C,
408 VK_FORMAT_R16_USCALED = 0x0000002D,
409 VK_FORMAT_R16_SSCALED = 0x0000002E,
410 VK_FORMAT_R16_UINT = 0x0000002F,
411 VK_FORMAT_R16_SINT = 0x00000030,
412 VK_FORMAT_R16_SFLOAT = 0x00000031,
413 VK_FORMAT_R16G16_UNORM = 0x00000032,
414 VK_FORMAT_R16G16_SNORM = 0x00000033,
415 VK_FORMAT_R16G16_USCALED = 0x00000034,
416 VK_FORMAT_R16G16_SSCALED = 0x00000035,
417 VK_FORMAT_R16G16_UINT = 0x00000036,
418 VK_FORMAT_R16G16_SINT = 0x00000037,
419 VK_FORMAT_R16G16_SFLOAT = 0x00000038,
420 VK_FORMAT_R16G16B16_UNORM = 0x00000039,
421 VK_FORMAT_R16G16B16_SNORM = 0x0000003A,
422 VK_FORMAT_R16G16B16_USCALED = 0x0000003B,
423 VK_FORMAT_R16G16B16_SSCALED = 0x0000003C,
424 VK_FORMAT_R16G16B16_UINT = 0x0000003D,
425 VK_FORMAT_R16G16B16_SINT = 0x0000003E,
426 VK_FORMAT_R16G16B16_SFLOAT = 0x0000003F,
427 VK_FORMAT_R16G16B16A16_UNORM = 0x00000040,
428 VK_FORMAT_R16G16B16A16_SNORM = 0x00000041,
429 VK_FORMAT_R16G16B16A16_USCALED = 0x00000042,
430 VK_FORMAT_R16G16B16A16_SSCALED = 0x00000043,
431 VK_FORMAT_R16G16B16A16_UINT = 0x00000044,
432 VK_FORMAT_R16G16B16A16_SINT = 0x00000045,
433 VK_FORMAT_R16G16B16A16_SFLOAT = 0x00000046,
434 VK_FORMAT_R32_UINT = 0x00000047,
435 VK_FORMAT_R32_SINT = 0x00000048,
436 VK_FORMAT_R32_SFLOAT = 0x00000049,
437 VK_FORMAT_R32G32_UINT = 0x0000004A,
438 VK_FORMAT_R32G32_SINT = 0x0000004B,
439 VK_FORMAT_R32G32_SFLOAT = 0x0000004C,
440 VK_FORMAT_R32G32B32_UINT = 0x0000004D,
441 VK_FORMAT_R32G32B32_SINT = 0x0000004E,
442 VK_FORMAT_R32G32B32_SFLOAT = 0x0000004F,
443 VK_FORMAT_R32G32B32A32_UINT = 0x00000050,
444 VK_FORMAT_R32G32B32A32_SINT = 0x00000051,
445 VK_FORMAT_R32G32B32A32_SFLOAT = 0x00000052,
446 VK_FORMAT_R64_SFLOAT = 0x00000053,
447 VK_FORMAT_R64G64_SFLOAT = 0x00000054,
448 VK_FORMAT_R64G64B64_SFLOAT = 0x00000055,
449 VK_FORMAT_R64G64B64A64_SFLOAT = 0x00000056,
450 VK_FORMAT_R11G11B10_UFLOAT = 0x00000057,
451 VK_FORMAT_R9G9B9E5_UFLOAT = 0x00000058,
452 VK_FORMAT_D16_UNORM = 0x00000059,
453 VK_FORMAT_D24_UNORM = 0x0000005A,
454 VK_FORMAT_D32_SFLOAT = 0x0000005B,
455 VK_FORMAT_S8_UINT = 0x0000005C,
456 VK_FORMAT_D16_UNORM_S8_UINT = 0x0000005D,
457 VK_FORMAT_D24_UNORM_S8_UINT = 0x0000005E,
458 VK_FORMAT_D32_SFLOAT_S8_UINT = 0x0000005F,
459 VK_FORMAT_BC1_RGB_UNORM = 0x00000060,
460 VK_FORMAT_BC1_RGB_SRGB = 0x00000061,
461 VK_FORMAT_BC1_RGBA_UNORM = 0x00000062,
462 VK_FORMAT_BC1_RGBA_SRGB = 0x00000063,
463 VK_FORMAT_BC2_UNORM = 0x00000064,
464 VK_FORMAT_BC2_SRGB = 0x00000065,
465 VK_FORMAT_BC3_UNORM = 0x00000066,
466 VK_FORMAT_BC3_SRGB = 0x00000067,
467 VK_FORMAT_BC4_UNORM = 0x00000068,
468 VK_FORMAT_BC4_SNORM = 0x00000069,
469 VK_FORMAT_BC5_UNORM = 0x0000006A,
470 VK_FORMAT_BC5_SNORM = 0x0000006B,
471 VK_FORMAT_BC6H_UFLOAT = 0x0000006C,
472 VK_FORMAT_BC6H_SFLOAT = 0x0000006D,
473 VK_FORMAT_BC7_UNORM = 0x0000006E,
474 VK_FORMAT_BC7_SRGB = 0x0000006F,
475 VK_FORMAT_ETC2_R8G8B8_UNORM = 0x00000070,
476 VK_FORMAT_ETC2_R8G8B8_SRGB = 0x00000071,
477 VK_FORMAT_ETC2_R8G8B8A1_UNORM = 0x00000072,
478 VK_FORMAT_ETC2_R8G8B8A1_SRGB = 0x00000073,
479 VK_FORMAT_ETC2_R8G8B8A8_UNORM = 0x00000074,
480 VK_FORMAT_ETC2_R8G8B8A8_SRGB = 0x00000075,
481 VK_FORMAT_EAC_R11_UNORM = 0x00000076,
482 VK_FORMAT_EAC_R11_SNORM = 0x00000077,
483 VK_FORMAT_EAC_R11G11_UNORM = 0x00000078,
484 VK_FORMAT_EAC_R11G11_SNORM = 0x00000079,
485 VK_FORMAT_ASTC_4x4_UNORM = 0x0000007A,
486 VK_FORMAT_ASTC_4x4_SRGB = 0x0000007B,
487 VK_FORMAT_ASTC_5x4_UNORM = 0x0000007C,
488 VK_FORMAT_ASTC_5x4_SRGB = 0x0000007D,
489 VK_FORMAT_ASTC_5x5_UNORM = 0x0000007E,
490 VK_FORMAT_ASTC_5x5_SRGB = 0x0000007F,
491 VK_FORMAT_ASTC_6x5_UNORM = 0x00000080,
492 VK_FORMAT_ASTC_6x5_SRGB = 0x00000081,
493 VK_FORMAT_ASTC_6x6_UNORM = 0x00000082,
494 VK_FORMAT_ASTC_6x6_SRGB = 0x00000083,
495 VK_FORMAT_ASTC_8x5_UNORM = 0x00000084,
496 VK_FORMAT_ASTC_8x5_SRGB = 0x00000085,
497 VK_FORMAT_ASTC_8x6_UNORM = 0x00000086,
498 VK_FORMAT_ASTC_8x6_SRGB = 0x00000087,
499 VK_FORMAT_ASTC_8x8_UNORM = 0x00000088,
500 VK_FORMAT_ASTC_8x8_SRGB = 0x00000089,
501 VK_FORMAT_ASTC_10x5_UNORM = 0x0000008A,
502 VK_FORMAT_ASTC_10x5_SRGB = 0x0000008B,
503 VK_FORMAT_ASTC_10x6_UNORM = 0x0000008C,
504 VK_FORMAT_ASTC_10x6_SRGB = 0x0000008D,
505 VK_FORMAT_ASTC_10x8_UNORM = 0x0000008E,
506 VK_FORMAT_ASTC_10x8_SRGB = 0x0000008F,
507 VK_FORMAT_ASTC_10x10_UNORM = 0x00000090,
508 VK_FORMAT_ASTC_10x10_SRGB = 0x00000091,
509 VK_FORMAT_ASTC_12x10_UNORM = 0x00000092,
510 VK_FORMAT_ASTC_12x10_SRGB = 0x00000093,
511 VK_FORMAT_ASTC_12x12_UNORM = 0x00000094,
512 VK_FORMAT_ASTC_12x12_SRGB = 0x00000095,
513 VK_FORMAT_B4G4R4A4_UNORM = 0x00000096,
514 VK_FORMAT_B5G5R5A1_UNORM = 0x00000097,
515 VK_FORMAT_B5G6R5_UNORM = 0x00000098,
516 VK_FORMAT_B5G6R5_USCALED = 0x00000099,
517 VK_FORMAT_B8G8R8_UNORM = 0x0000009A,
518 VK_FORMAT_B8G8R8_SNORM = 0x0000009B,
519 VK_FORMAT_B8G8R8_USCALED = 0x0000009C,
520 VK_FORMAT_B8G8R8_SSCALED = 0x0000009D,
521 VK_FORMAT_B8G8R8_UINT = 0x0000009E,
522 VK_FORMAT_B8G8R8_SINT = 0x0000009F,
523 VK_FORMAT_B8G8R8_SRGB = 0x000000A0,
524 VK_FORMAT_B8G8R8A8_UNORM = 0x000000A1,
525 VK_FORMAT_B8G8R8A8_SNORM = 0x000000A2,
526 VK_FORMAT_B8G8R8A8_USCALED = 0x000000A3,
527 VK_FORMAT_B8G8R8A8_SSCALED = 0x000000A4,
528 VK_FORMAT_B8G8R8A8_UINT = 0x000000A5,
529 VK_FORMAT_B8G8R8A8_SINT = 0x000000A6,
530 VK_FORMAT_B8G8R8A8_SRGB = 0x000000A7,
531 VK_FORMAT_B10G10R10A2_UNORM = 0x000000A8,
532 VK_FORMAT_B10G10R10A2_SNORM = 0x000000A9,
533 VK_FORMAT_B10G10R10A2_USCALED = 0x000000AA,
534 VK_FORMAT_B10G10R10A2_SSCALED = 0x000000AB,
535 VK_FORMAT_B10G10R10A2_UINT = 0x000000AC,
536 VK_FORMAT_B10G10R10A2_SINT = 0x000000AD,
537}
538
539/// Shader stage enumerant
540enum VkShaderStage {
541 VK_SHADER_STAGE_VERTEX = 0x00000000,
542 VK_SHADER_STAGE_TESS_CONTROL = 0x00000001,
543 VK_SHADER_STAGE_TESS_EVALUATION = 0x00000002,
544 VK_SHADER_STAGE_GEOMETRY = 0x00000003,
545 VK_SHADER_STAGE_FRAGMENT = 0x00000004,
546 VK_SHADER_STAGE_COMPUTE = 0x00000005,
547}
548
549/// Structure type enumerant
550enum VkStructureType {
551 VK_STRUCTURE_TYPE_APPLICATION_INFO = 0,
552 VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO = 1,
553 VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO = 2,
554 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO = 3,
555 VK_STRUCTURE_TYPE_ATTACHMENT_VIEW_CREATE_INFO = 4,
556 VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO = 5,
557 VK_STRUCTURE_TYPE_SHADER_CREATE_INFO = 6,
558 VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = 7,
559 VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = 8,
560 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 9,
561 VK_STRUCTURE_TYPE_DYNAMIC_VIEWPORT_STATE_CREATE_INFO = 10,
562 VK_STRUCTURE_TYPE_DYNAMIC_RASTER_STATE_CREATE_INFO = 11,
563 VK_STRUCTURE_TYPE_DYNAMIC_COLOR_BLEND_STATE_CREATE_INFO = 12,
564 VK_STRUCTURE_TYPE_DYNAMIC_DEPTH_STENCIL_STATE_CREATE_INFO = 13,
565 VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO = 14,
566 VK_STRUCTURE_TYPE_EVENT_CREATE_INFO = 15,
567 VK_STRUCTURE_TYPE_FENCE_CREATE_INFO = 16,
568 VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO = 17,
569 VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO = 18,
570 VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = 19,
571 VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = 20,
572 VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 21,
573 VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 22,
574 VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = 23,
575 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = 24,
576 VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO = 25,
577 VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 26,
578 VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 27,
579 VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 28,
580 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO = 29,
581 VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO = 30,
582 VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO = 31,
583 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = 32,
584 VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO = 33,
585 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = 34,
Jesse Hallf09c6b12015-08-15 19:54:28 -0700586 VK_STRUCTURE_TYPE_MEMORY_BARRIER = 35,
587 VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = 36,
588 VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = 37,
589 VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = 38,
590 VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = 39,
591 VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = 40,
592 VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO = 41,
593 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = 42,
594 VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE = 43,
595 VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = 44,
596 VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION = 45,
597 VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION = 46,
598 VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY = 47,
599 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = 48,
600 VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO = 49,
Jesse Halld27f6aa2015-08-15 17:58:48 -0700601}
602
603enum VkRenderPassContents {
604 VK_RENDER_PASS_CONTENTS_INLINE = 0x00000000,
605 VK_RENDER_PASS_CONTENTS_SECONDARY_CMD_BUFFERS = 0x00000001,
606}
607
608@lastUnused(-33)
609/// Error and return codes
610enum VkResult {
611 // Return codes for successful operation execution (positive values)
612 VK_SUCCESS = 0x00000000,
613 VK_UNSUPPORTED = 0x00000001,
614 VK_NOT_READY = 0x00000002,
615 VK_TIMEOUT = 0x00000003,
616 VK_EVENT_SET = 0x00000004,
617 VK_EVENT_RESET = 0x00000005,
618 VK_INCOMPLETE = 0x00000006,
619
620 // Error codes (negative values)
621 VK_ERROR_UNKNOWN = 0xFFFFFFFF,
622 VK_ERROR_UNAVAILABLE = 0xFFFFFFFE,
623 VK_ERROR_INITIALIZATION_FAILED = 0xFFFFFFFD,
624 VK_ERROR_OUT_OF_HOST_MEMORY = 0xFFFFFFFC,
625 VK_ERROR_OUT_OF_DEVICE_MEMORY = 0xFFFFFFFB,
626 VK_ERROR_DEVICE_ALREADY_CREATED = 0xFFFFFFFA,
627 VK_ERROR_DEVICE_LOST = 0xFFFFFFF9,
628 VK_ERROR_INVALID_POINTER = 0xFFFFFFF8,
629 VK_ERROR_INVALID_VALUE = 0xFFFFFFF7,
630 VK_ERROR_INVALID_HANDLE = 0xFFFFFFF6,
631 VK_ERROR_INVALID_ORDINAL = 0xFFFFFFF5,
632 VK_ERROR_INVALID_MEMORY_SIZE = 0xFFFFFFF4,
633 VK_ERROR_INVALID_EXTENSION = 0xFFFFFFF3,
634 VK_ERROR_INVALID_FLAGS = 0xFFFFFFF2,
635 VK_ERROR_INVALID_ALIGNMENT = 0xFFFFFFF1,
636 VK_ERROR_INVALID_FORMAT = 0xFFFFFFF0,
637 VK_ERROR_INVALID_IMAGE = 0xFFFFFFEF,
638 VK_ERROR_INVALID_DESCRIPTOR_SET_DATA = 0xFFFFFFEE,
639 VK_ERROR_INVALID_QUEUE_TYPE = 0xFFFFFFED,
640 VK_ERROR_UNSUPPORTED_SHADER_IL_VERSION = 0xFFFFFFEC,
641 VK_ERROR_BAD_SHADER_CODE = 0xFFFFFFEB,
642 VK_ERROR_BAD_PIPELINE_DATA = 0xFFFFFFEA,
643 VK_ERROR_NOT_MAPPABLE = 0xFFFFFFE9,
644 VK_ERROR_MEMORY_MAP_FAILED = 0xFFFFFFE8,
645 VK_ERROR_MEMORY_UNMAP_FAILED = 0xFFFFFFE7,
646 VK_ERROR_INCOMPATIBLE_DEVICE = 0xFFFFFFE6,
647 VK_ERROR_INCOMPATIBLE_DRIVER = 0xFFFFFFE5,
648 VK_ERROR_INCOMPLETE_COMMAND_BUFFER = 0xFFFFFFE4,
649 VK_ERROR_BUILDING_COMMAND_BUFFER = 0xFFFFFFE3,
650 VK_ERROR_MEMORY_NOT_BOUND = 0xFFFFFFE2,
651 VK_ERROR_INCOMPATIBLE_QUEUE = 0xFFFFFFE1,
652 VK_ERROR_INVALID_LAYER = 0xFFFFFFE0,
653}
654
655
656/////////////////
657// Bitfields //
658/////////////////
659
660/// Device creation flags
661bitfield VkDeviceCreateFlags {
662 VK_DEVICE_CREATE_VALIDATION_BIT = 0x00000001,
663}
664
665/// Queue capabilities
666bitfield VkQueueFlags {
667 VK_QUEUE_GRAPHICS_BIT = 0x00000001, /// Queue supports graphics operations
668 VK_QUEUE_COMPUTE_BIT = 0x00000002, /// Queue supports compute operations
669 VK_QUEUE_DMA_BIT = 0x00000004, /// Queue supports DMA operations
670 VK_QUEUE_SPARSE_MEMMGR_BIT = 0x00000008, /// Queue supports sparse resource memory management operations
671 VK_QUEUE_EXTENDED_BIT = 0x40000000, /// Extended queue
672}
673
674/// Memory properties passed into vkAllocMemory().
675bitfield VkMemoryPropertyFlags {
676 VK_MEMORY_PROPERTY_DEVICE_ONLY = 0x00000000, /// If otherwise stated, then allocate memory on device
677 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT = 0x00000001, /// Memory should be mappable by host
678 VK_MEMORY_PROPERTY_HOST_NON_COHERENT_BIT = 0x00000002, /// Memory may not have i/o coherency so vkFlushMappedMemoryRanges and vkInvalidateMappedMemoryRanges must be used flush/invalidate host cache
679 /// vkInvalidateMappedMemoryRanges must be used flush/invalidate host cache
680 VK_MEMORY_PROPERTY_HOST_UNCACHED_BIT = 0x00000004, /// Memory should not be cached by the host
681 VK_MEMORY_PROPERTY_HOST_WRITE_COMBINED_BIT = 0x00000008, /// Memory should support host write combining
682 VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT = 0x00000010, /// Memory may be allocated by the driver when it is required
683}
684
685/// Memory heap flags
686bitfield VkMemoryHeapFlags {
687 VK_MEMORY_HEAP_HOST_LOCAL = 0x00000001, /// If set, heap represents host memory
688}
689
690/// Memory output flags passed to resource transition commands
691bitfield VkMemoryOutputFlags {
692 VK_MEMORY_OUTPUT_HOST_WRITE_BIT = 0x00000001, /// Controls output coherency of host writes
693 VK_MEMORY_OUTPUT_SHADER_WRITE_BIT = 0x00000002, /// Controls output coherency of generic shader writes
694 VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT = 0x00000004, /// Controls output coherency of color attachment writes
695 VK_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000008, /// Controls output coherency of depth/stencil attachment writes
696 VK_MEMORY_OUTPUT_TRANSFER_BIT = 0x00000010, /// Controls output coherency of transfer operations
697}
698
699/// Memory input flags passed to resource transition commands
700bitfield VkMemoryInputFlags {
701 VK_MEMORY_INPUT_HOST_READ_BIT = 0x00000001, /// Controls input coherency of host reads
702 VK_MEMORY_INPUT_INDIRECT_COMMAND_BIT = 0x00000002, /// Controls input coherency of indirect command reads
703 VK_MEMORY_INPUT_INDEX_FETCH_BIT = 0x00000004, /// Controls input coherency of index fetches
704 VK_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT = 0x00000008, /// Controls input coherency of vertex attribute fetches
705 VK_MEMORY_INPUT_UNIFORM_READ_BIT = 0x00000010, /// Controls input coherency of uniform buffer reads
706 VK_MEMORY_INPUT_SHADER_READ_BIT = 0x00000020, /// Controls input coherency of generic shader reads
707 VK_MEMORY_INPUT_COLOR_ATTACHMENT_BIT = 0x00000040, /// Controls input coherency of color attachment reads
708 VK_MEMORY_INPUT_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000080, /// Controls input coherency of depth/stencil attachment reads
709 VK_MEMORY_INPUT_INPUT_ATTACHMENT_BIT = 0x00000100, /// Controls input coherency of input attachment reads
710 VK_MEMORY_INPUT_TRANSFER_BIT = 0x00000200, /// Controls input coherency of transfer operations
711}
712
713/// Buffer usage flags
714bitfield VkBufferUsageFlags {
715 VK_BUFFER_USAGE_GENERAL = 0x00000000, /// No special usage
716 VK_BUFFER_USAGE_TRANSFER_SOURCE_BIT = 0x00000001, /// Can be used as a source of transfer operations
717 VK_BUFFER_USAGE_TRANSFER_DESTINATION_BIT = 0x00000002, /// Can be used as a destination of transfer operations
718 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004, /// Can be used as TBO
719 VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT = 0x00000008, /// Can be used as IBO
720 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT = 0x00000010, /// Can be used as UBO
721 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT = 0x00000020, /// Can be used as SSBO
722 VK_BUFFER_USAGE_INDEX_BUFFER_BIT = 0x00000040, /// Can be used as source of fixed function index fetch (index buffer)
723 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT = 0x00000080, /// Can be used as source of fixed function vertex fetch (VBO)
724 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT = 0x00000100, /// Can be the source of indirect parameters (e.g. indirect buffer, parameter buffer)
725}
726
727/// Buffer creation flags
728bitfield VkBufferCreateFlags {
729 VK_BUFFER_CREATE_SPARSE_BIT = 0x00000001, /// Buffer should support sparse backing
730 VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002, /// Buffer should support sparse backing with partial residency
731 VK_BUFFER_CREATE_SPARSE_ALIASED_BIT = 0x00000004, /// Buffer should support constent data access to physical memory blocks mapped into multiple locations of sparse buffers
732}
733
734/// Shader stage flags
735bitfield VkShaderStageFlags {
736 VK_SHADER_STAGE_VERTEX_BIT = 0x00000001,
737 VK_SHADER_STAGE_TESS_CONTROL_BIT = 0x00000002,
738 VK_SHADER_STAGE_TESS_EVALUATION_BIT = 0x00000004,
739 VK_SHADER_STAGE_GEOMETRY_BIT = 0x00000008,
740 VK_SHADER_STAGE_FRAGMENT_BIT = 0x00000010,
741 VK_SHADER_STAGE_COMPUTE_BIT = 0x00000020,
742
743 VK_SHADER_STAGE_ALL = 0x7FFFFFFF,
744}
745
746/// Image usage flags
747bitfield VkImageUsageFlags {
748 VK_IMAGE_USAGE_GENERAL = 0x00000000, /// No special usage
749 VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT = 0x00000001, /// Can be used as a source of transfer operations
750 VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT = 0x00000002, /// Can be used as a destination of transfer operations
751 VK_IMAGE_USAGE_SAMPLED_BIT = 0x00000004, /// Can be sampled from (SAMPLED_IMAGE and COMBINED_IMAGE_SAMPLER descriptor types)
752 VK_IMAGE_USAGE_STORAGE_BIT = 0x00000008, /// Can be used as storage image (STORAGE_IMAGE descriptor type)
753 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000010, /// Can be used as framebuffer color attachment
754 VK_IMAGE_USAGE_DEPTH_STENCIL_BIT = 0x00000020, /// Can be used as framebuffer depth/stencil attachment
755 VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040, /// Image data not needed outside of rendering
756 VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080, /// Can be used as framebuffer input attachment
757}
758
759/// Image creation flags
760bitfield VkImageCreateFlags {
761 VK_IMAGE_CREATE_SPARSE_BIT = 0x00000001, /// Image should support sparse backing
762 VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002, /// Image should support sparse backing with partial residency
763 VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0x00000004, /// Image should support constent data access to physical memory blocks mapped into multiple locations of sparse images
764 VK_IMAGE_CREATE_INVARIANT_DATA_BIT = 0x00000008,
765 VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0x00000010, /// Allows image views to have different format than the base image
766 VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0x00000020, /// Allows creating image views with cube type from the created image
767}
768
769/// Framebuffer attachment view creation flags
770bitfield VkAttachmentViewCreateFlags {
771 VK_ATTACHMENT_VIEW_CREATE_READ_ONLY_DEPTH_BIT = 0x00000001,
772 VK_ATTACHMENT_VIEW_CREATE_READ_ONLY_STENCIL_BIT = 0x00000002,
773}
774
775/// Pipeline creation flags
776bitfield VkPipelineCreateFlags {
777 VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0x00000001,
778 VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 0x00000002,
779 VK_PIPELINE_CREATE_DERIVATIVE_BIT = 0x00000004,
780}
781
782/// Channel flags
783bitfield VkChannelFlags {
784 VK_CHANNEL_R_BIT = 0x00000001,
785 VK_CHANNEL_G_BIT = 0x00000002,
786 VK_CHANNEL_B_BIT = 0x00000004,
787 VK_CHANNEL_A_BIT = 0x00000008,
788}
789
790/// Fence creation flags
791bitfield VkFenceCreateFlags {
792 VK_FENCE_CREATE_SIGNALED_BIT = 0x00000001,
793}
794
795/// Semaphore creation flags
796bitfield VkSemaphoreCreateFlags {
797}
798
799/// Format capability flags
800bitfield VkFormatFeatureFlags {
801 VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT = 0x00000001, /// Format can be used for sampled images (SAMPLED_IMAGE and COMBINED_IMAGE_SAMPLER descriptor types)
802 VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT = 0x00000002, /// Format can be used for storage images (STORAGE_IMAGE descriptor type)
803 VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT = 0x00000004, /// Format supports atomic operations in case it's used for storage images
804 VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT = 0x00000008, /// Format can be used for uniform texel buffers (TBOs)
805 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT = 0x00000010, /// Format can be used for storage texel buffers (IBOs)
806 VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = 0x00000020, /// Format supports atomic operations in case it's used for storage texel buffers
807 VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT = 0x00000040, /// Format can be used for vertex buffers (VBOs)
808 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT = 0x00000080, /// Format can be used for color attachment images
809 VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT = 0x00000100, /// Format supports blending in case it's used for color attachment images
810 VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000200, /// Format can be used for depth/stencil attachment images
811 VK_FORMAT_FEATURE_CONVERSION_BIT = 0x00000400, /// Format can be used as the source or destination of format converting blits
812}
813
814/// Query control flags
815bitfield VkQueryControlFlags {
816 VK_QUERY_CONTROL_CONSERVATIVE_BIT = 0x00000001, /// Allow conservative results to be collected by the query
817}
818
819/// Query result flags
820bitfield VkQueryResultFlags {
821 VK_QUERY_RESULT_DEFAULT = 0x00000000, /// Results of the queries are immediately written to the destination buffer as 32-bit values
822 VK_QUERY_RESULT_64_BIT = 0x00000001, /// Results of the queries are written to the destination buffer as 64-bit values
823 VK_QUERY_RESULT_WAIT_BIT = 0x00000002, /// Results of the queries are waited on before proceeding with the result copy
824 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0x00000004, /// Besides the results of the query, the availability of the results is also written
825 VK_QUERY_RESULT_PARTIAL_BIT = 0x00000008, /// Copy the partial results of the query even if the final results aren't available
826}
827
828/// Shader module creation flags
829bitfield VkShaderModuleCreateFlags {
830}
831
832/// Shader creation flags
833bitfield VkShaderCreateFlags {
834}
835
836/// Event creation flags
837bitfield VkEventCreateFlags {
838}
839
840/// Command buffer creation flags
841bitfield VkCmdBufferCreateFlags {
842}
843
844/// Command buffer optimization flags
845bitfield VkCmdBufferOptimizeFlags {
846 VK_CMD_BUFFER_OPTIMIZE_SMALL_BATCH_BIT = 0x00000001,
847 VK_CMD_BUFFER_OPTIMIZE_PIPELINE_SWITCH_BIT = 0x00000002,
848 VK_CMD_BUFFER_OPTIMIZE_ONE_TIME_SUBMIT_BIT = 0x00000004,
849 VK_CMD_BUFFER_OPTIMIZE_DESCRIPTOR_SET_SWITCH_BIT = 0x00000008,
850 VK_CMD_BUFFER_OPTIMIZE_NO_SIMULTANEOUS_USE_BIT = 0x00000010, /// Only one call to the secondary command buffer will exist at any given time
851}
852
853/// Pipeline statistics flags
854bitfield VkQueryPipelineStatisticFlags {
855 VK_QUERY_PIPELINE_STATISTIC_IA_VERTICES_BIT = 0x00000001, /// Optional
856 VK_QUERY_PIPELINE_STATISTIC_IA_PRIMITIVES_BIT = 0x00000002, /// Optional
857 VK_QUERY_PIPELINE_STATISTIC_VS_INVOCATIONS_BIT = 0x00000004, /// Optional
858 VK_QUERY_PIPELINE_STATISTIC_GS_INVOCATIONS_BIT = 0x00000008, /// Optional
859 VK_QUERY_PIPELINE_STATISTIC_GS_PRIMITIVES_BIT = 0x00000010, /// Optional
860 VK_QUERY_PIPELINE_STATISTIC_C_INVOCATIONS_BIT = 0x00000020, /// Optional
861 VK_QUERY_PIPELINE_STATISTIC_C_PRIMITIVES_BIT = 0x00000040, /// Optional
862 VK_QUERY_PIPELINE_STATISTIC_FS_INVOCATIONS_BIT = 0x00000080, /// Optional
863 VK_QUERY_PIPELINE_STATISTIC_TCS_PATCHES_BIT = 0x00000100, /// Optional
864 VK_QUERY_PIPELINE_STATISTIC_TES_INVOCATIONS_BIT = 0x00000200, /// Optional
865 VK_QUERY_PIPELINE_STATISTIC_CS_INVOCATIONS_BIT = 0x00000400, /// Optional
866}
867
868/// Memory mapping flags
869bitfield VkMemoryMapFlags {
870}
871
872/// Bitfield of image aspects
873bitfield VkImageAspectFlags {
874 VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001,
875 VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002,
876 VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004,
877 VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008,
878}
879
880/// Sparse memory bind flags
881bitfield VkSparseMemoryBindFlags {
882 VK_SPARSE_MEMORY_BIND_REPLICATE_64KIB_BLOCK_BIT = 0x00000001, /// Replicate the first 64 KiB memory block to the entire bind rage
883}
884
885/// Sparse image memory requirements flags
886bitfield VkSparseImageFormatFlags {
887 VK_SPARSE_IMAGE_FMT_SINGLE_MIPTAIL_BIT = 0x00000001, /// Image uses a single miptail region for all array slices
888 VK_SPARSE_IMAGE_FMT_ALIGNED_MIP_SIZE_BIT = 0x00000002, /// Image requires mip levels to be an exact multiple of the sparse iamge block size for non-mip-tail levels.
889 VK_SPARSE_IMAGE_FMT_NONSTD_BLOCK_SIZE_BIT = 0x00000004, /// Image uses a non-standard sparse block size
890}
891
892/// Pipeline stages
893bitfield VkPipelineStageFlags {
894 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT = 0x00000001, /// Before subsequent commands are processed
895 VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT = 0x00000002, /// Draw/DispatchIndirect command fetch
896 VK_PIPELINE_STAGE_VERTEX_INPUT_BIT = 0x00000004, /// Vertex/index fetch
897 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT = 0x00000008, /// Vertex shading
898 VK_PIPELINE_STAGE_TESS_CONTROL_SHADER_BIT = 0x00000010, /// Tessellation control shading
899 VK_PIPELINE_STAGE_TESS_EVALUATION_SHADER_BIT = 0x00000020, /// Tessellation evaluation shading
900 VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT = 0x00000040, /// Geometry shading
901 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT = 0x00000080, /// Fragment shading
902 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT = 0x00000100, /// Early fragment (depth/stencil) tests
903 VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT = 0x00000200, /// Late fragment (depth/stencil) tests
904 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT = 0x00000400, /// Color attachment writes
905 VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT = 0x00000800, /// Compute shading
906 VK_PIPELINE_STAGE_TRANSFER_BIT = 0x00001000, /// Transfer/copy operations
907 VK_PIPELINE_STAGE_TRANSITION_BIT = 0x00002000, /// Resource transition commands
908 VK_PIPELINE_STAGE_HOST_BIT = 0x00004000, /// Indicates host (CPU) is a source/sink of the dependency
909
910 VK_PIPELINE_STAGE_ALL_GRAPHICS = 0x000007FF, /// All stages of the graphics pipeline
911 VK_PIPELINE_STAGE_ALL_GPU_COMMANDS = 0x00003FFF, /// All graphics, compute, copy, and transition commands
912}
913
914/// Subpass description flags
915bitfield VkSubpassDescriptionFlags {
916 VK_SUBPASS_DESCRIPTION_NO_OVERDRAW_BIT = 0x00000001,
917}
918
919/// Command pool creation flags
920bitfield VkCmdPoolCreateFlags {
921 VK_CMD_POOL_CREATE_TRANSIENT_BIT = 0x00000001, /// Command buffers have a short lifetime
922 VK_CMD_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = 0x00000002, /// Command buffers may release their memory individually
923}
924
925/// Command pool reset flags
926bitfield VkCmdPoolResetFlags {
927 VK_CMD_POOL_RESET_RELEASE_RESOURCES = 0x00000001, /// Release resources owned by the pool
928}
929
930bitfield VkCmdBufferResetFlags {
931 VK_CMD_BUFFER_RESET_RELEASE_RESOURCES = 0x00000001, /// Release resources owned by the buffer
932}
933
934
935//////////////////
936// Structures //
937//////////////////
938
939class VkOffset2D {
940 s32 x
941 s32 y
942}
943
944class VkOffset3D {
945 s32 x
946 s32 y
947 s32 z
948}
949
950class VkExtent2D {
951 s32 width
952 s32 height
953}
954
955class VkExtent3D {
956 s32 width
957 s32 height
958 s32 depth
959}
960
961class VkViewport {
962 f32 originX
963 f32 originY
964 f32 width
965 f32 height
966 f32 minDepth
967 f32 maxDepth
968}
969
970class VkRect2D {
971 VkOffset2D offset
972 VkExtent2D extent
973}
974
975class VkRect3D {
976 VkOffset3D offset
977 VkExtent3D extent
978}
979
980class VkChannelMapping {
981 VkChannelSwizzle r
982 VkChannelSwizzle g
983 VkChannelSwizzle b
984 VkChannelSwizzle a
985}
986
987class VkPhysicalDeviceProperties {
988 u32 apiVersion
989 u32 driverVersion
990 u32 vendorId
991 u32 deviceId
992 VkPhysicalDeviceType deviceType
993 char[VK_MAX_PHYSICAL_DEVICE_NAME] deviceName
994 u8[VK_UUID_LENGTH] pipelineCacheUUID
995}
996
997class VkExtensionProperties {
998 char[VK_MAX_EXTENSION_NAME] extName /// extension name
999 u32 specVersion /// version of the extension specification implemented
1000}
1001
1002class VkLayerProperties {
1003 char[VK_MAX_EXTENSION_NAME] layerName /// layer name
1004 u32 specVersion /// version of the layer specification implemented
1005 u32 implVersion /// build or release version of the layer's library
Jesse Hallf09c6b12015-08-15 19:54:28 -07001006 char[VK_MAX_DESCRIPTION] description /// Free-form description of the layer
Jesse Halld27f6aa2015-08-15 17:58:48 -07001007}
1008
1009class VkApplicationInfo {
1010 VkStructureType sType /// Type of structure. Should be VK_STRUCTURE_TYPE_APPLICATION_INFO
1011 const void* pNext /// Next structure in chain
1012 const char* pAppName
1013 u32 appVersion
1014 const char* pEngineName
1015 u32 engineVersion
1016 u32 apiVersion
1017}
1018
1019class VkAllocCallbacks {
1020 void* pUserData
1021 PFN_vkAllocFunction pfnAlloc
1022 PFN_vkFreeFunction pfnFree
1023}
1024
1025class VkDeviceQueueCreateInfo {
1026 u32 queueFamilyIndex
1027 u32 queueCount
1028}
1029
1030class VkDeviceCreateInfo {
1031 VkStructureType sType /// Should be VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO
1032 const void* pNext /// Pointer to next structure
1033 u32 queueRecordCount
1034 const VkDeviceQueueCreateInfo* pRequestedQueues
1035 u32 layerCount
1036 const char* const* ppEnabledLayerNames /// Ordered list of layer names to be enabled
1037 u32 extensionCount
1038 const char* const* ppEnabledExtensionNames
1039 const VkPhysicalDeviceFeatures* pEnabledFeatures
1040 VkDeviceCreateFlags flags /// Device creation flags
1041}
1042
1043class VkInstanceCreateInfo {
1044 VkStructureType sType /// Should be VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO
1045 const void* pNext /// Pointer to next structure
1046 const VkApplicationInfo* pAppInfo
1047 const VkAllocCallbacks* pAllocCb
1048 u32 layerCount
1049 const char* const* ppEnabledLayerNames /// Ordered list of layer names to be enabled
1050 u32 extensionCount
1051 const char* const* ppEnabledExtensionNames /// Extension names to be enabled
1052}
1053
1054class VkPhysicalDeviceQueueProperties {
1055 VkQueueFlags queueFlags /// Queue flags
1056 u32 queueCount
1057 platform.VkBool32 supportsTimestamps
1058}
1059
1060class VkPhysicalDeviceMemoryProperties {
1061 u32 memoryTypeCount
1062 VkMemoryType[VK_MAX_MEMORY_TYPES] memoryTypes
1063 u32 memoryHeapCount
1064 VkMemoryHeap[VK_MAX_MEMORY_HEAPS] memoryHeaps
1065}
1066
1067class VkMemoryAllocInfo {
1068 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO
1069 const void* pNext /// Pointer to next structure
1070 platform.VkDeviceSize allocationSize /// Size of memory allocation
1071 u32 memoryTypeIndex /// Index of the of the memory type to allocate from
1072}
1073
1074class VkMemoryRequirements {
1075 platform.VkDeviceSize size /// Specified in bytes
1076 platform.VkDeviceSize alignment /// Specified in bytes
1077 u32 memoryTypeBits /// Bitfield of the allowed memory type indices into memoryTypes[] for this object
1078}
1079
1080class VkSparseImageFormatProperties {
1081 VkImageAspect aspect
1082 VkExtent3D imageGranularity
1083 VkSparseImageFormatFlags flags
1084}
1085
1086class VkSparseImageMemoryRequirements {
1087 VkSparseImageFormatProperties formatProps
1088 u32 imageMipTailStartLOD
1089 platform.VkDeviceSize imageMipTailSize /// Specified in bytes, must be a multiple of image block size / alignment
1090 platform.VkDeviceSize imageMipTailOffset /// Specified in bytes, must be a multiple of image block size / alignment
1091 platform.VkDeviceSize imageMipTailStride /// Specified in bytes, must be a multiple of image block size / alignment
1092}
1093
1094class VkMemoryType {
1095 VkMemoryPropertyFlags propertyFlags /// Memory properties of this memory type
1096 u32 heapIndex /// Index of the memory heap allocations of this memory type are taken from
1097}
1098
1099class VkMemoryHeap {
1100 platform.VkDeviceSize size /// Available memory in the heap
1101 VkMemoryHeapFlags flags /// Flags for the heap
1102}
1103
1104class VkMappedMemoryRange {
1105 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE
1106 const void* pNext /// Pointer to next structure
1107 VkDeviceMemory mem /// Mapped memory object
1108 platform.VkDeviceSize offset /// Offset within the mapped memory the range starts from
1109 platform.VkDeviceSize size /// Size of the range within the mapped memory
1110}
1111
1112class VkFormatProperties {
1113 VkFormatFeatureFlags linearTilingFeatures /// Format features in case of linear tiling
1114 VkFormatFeatureFlags optimalTilingFeatures /// Format features in case of optimal tiling
1115}
1116
1117class VkImageFormatProperties {
1118 u64 maxResourceSize /// max size (in bytes) of this resource type
1119 u32 maxSamples /// max sample count for this resource type
1120}
1121
1122class VkDescriptorInfo {
1123 VkBufferView bufferView /// Buffer view to write to the descriptor (in case it's a buffer descriptor, otherwise should be VK_NULL_HANDLE)
1124 VkSampler sampler /// Sampler to write to the descriptor (in case it's a SAMPLER or COMBINED_IMAGE_SAMPLER descriptor, otherwise should be VK_NULL_HANDLE)
1125 VkImageView imageView /// Image view to write to the descriptor (in case it's a SAMPLED_IMAGE, STORAGE_IMAGE, or COMBINED_IMAGE_SAMPLER descriptor, otherwise should be VK_NULL_HANDLE)
1126 VkAttachmentView attachmentView /// Input attachment view to write to the descriptor (in case it's a INPUT_ATTACHMENT descriptor, otherwise should be VK_NULL_HANDLE)
1127 VkImageLayout imageLayout /// Layout the image is expected to be in when accessed using this descriptor (only used if imageView or attachmentView is not VK_NULL_HANDLE)
1128}
1129
1130class VkWriteDescriptorSet {
1131 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
1132 const void* pNext /// Pointer to next structure
1133 VkDescriptorSet destSet /// Destination descriptor set
1134 u32 destBinding /// Binding within the destination descriptor set to write
1135 u32 destArrayElement /// Array element within the destination binding to write
1136 u32 count /// Number of descriptors to write (determines the size of the array pointed by <pDescriptors>)
1137 VkDescriptorType descriptorType /// Descriptor type to write (determines which fields of the array pointed by <pDescriptors> are going to be used)
1138 const VkDescriptorInfo* pDescriptors /// Array of info structures describing the descriptors to write
1139}
1140
1141class VkCopyDescriptorSet {
1142 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET
1143 const void* pNext /// Pointer to next structure
1144 VkDescriptorSet srcSet /// Source descriptor set
1145 u32 srcBinding /// Binding within the source descriptor set to copy from
1146 u32 srcArrayElement /// Array element within the source binding to copy from
1147 VkDescriptorSet destSet /// Destination descriptor set
1148 u32 destBinding /// Binding within the destination descriptor set to copy to
1149 u32 destArrayElement /// Array element within the destination binding to copy to
1150 u32 count /// Number of descriptors to copy
1151}
1152
1153class VkBufferCreateInfo {
1154 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO
1155 const void* pNext /// Pointer to next structure.
1156 platform.VkDeviceSize size /// Specified in bytes
1157 VkBufferUsageFlags usage /// Buffer usage flags
1158 VkBufferCreateFlags flags /// Buffer creation flags
1159 VkSharingMode sharingMode
1160 u32 queueFamilyCount
1161 const u32* pQueueFamilyIndices
1162}
1163
1164class VkBufferViewCreateInfo {
1165 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO
1166 const void* pNext /// Pointer to next structure.
1167 VkBuffer buffer
1168 VkBufferViewType viewType
1169 VkFormat format /// Optionally specifies format of elements
1170 platform.VkDeviceSize offset /// Specified in bytes
1171 platform.VkDeviceSize range /// View size specified in bytes
1172}
1173
1174class VkImageSubresource {
1175 VkImageAspect aspect
1176 u32 mipLevel
1177 u32 arraySlice
1178}
1179
1180class VkImageSubresourceRange {
1181 VkImageAspect aspect
1182 u32 baseMipLevel
1183 u32 mipLevels
1184 u32 baseArraySlice
1185 u32 arraySize
1186}
1187
1188class VkMemoryBarrier {
1189 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_MEMORY_BARRIER
1190 const void* pNext /// Pointer to next structure.
1191 VkMemoryOutputFlags outputMask /// Outputs the barrier should sync
1192 VkMemoryInputFlags inputMask /// Inputs the barrier should sync to
1193}
1194
1195class VkBufferMemoryBarrier {
1196 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER
1197 const void* pNext /// Pointer to next structure.
1198 VkMemoryOutputFlags outputMask /// Outputs the barrier should sync
1199 VkMemoryInputFlags inputMask /// Inputs the barrier should sync to
1200 u32 srcQueueFamilyIndex /// Queue family to transition ownership from
1201 u32 destQueueFamilyIndex /// Queue family to transition ownership to
1202 VkBuffer buffer /// Buffer to sync
1203 platform.VkDeviceSize offset /// Offset within the buffer to sync
1204 platform.VkDeviceSize size /// Amount of bytes to sync
1205}
1206
1207class VkImageMemoryBarrier {
1208 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER
1209 const void* pNext /// Pointer to next structure.
1210 VkMemoryOutputFlags outputMask /// Outputs the barrier should sync
1211 VkMemoryInputFlags inputMask /// Inputs the barrier should sync to
1212 VkImageLayout oldLayout /// Current layout of the image
1213 VkImageLayout newLayout /// New layout to transition the image to
1214 u32 srcQueueFamilyIndex /// Queue family to transition ownership from
1215 u32 destQueueFamilyIndex /// Queue family to transition ownership to
1216 VkImage image /// Image to sync
1217 VkImageSubresourceRange subresourceRange /// Subresource range to sync
1218}
1219
1220class VkImageCreateInfo {
1221 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
1222 const void* pNext /// Pointer to next structure.
1223 VkImageType imageType
1224 VkFormat format
1225 VkExtent3D extent
1226 u32 mipLevels
1227 u32 arraySize
1228 u32 samples
1229 VkImageTiling tiling
1230 VkImageUsageFlags usage /// Image usage flags
1231 VkImageCreateFlags flags /// Image creation flags
1232 VkSharingMode sharingMode /// Cross-queue-family sharing mode
1233 u32 queueFamilyCount /// Number of queue families to share across
1234 const u32* pQueueFamilyIndices /// Array of queue family indices to share across
1235}
1236
1237class VkSubresourceLayout {
1238 platform.VkDeviceSize offset /// Specified in bytes
1239 platform.VkDeviceSize size /// Specified in bytes
1240 platform.VkDeviceSize rowPitch /// Specified in bytes
1241 platform.VkDeviceSize depthPitch /// Specified in bytes
1242}
1243
1244class VkImageViewCreateInfo {
1245 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
1246 const void* pNext /// Pointer to next structure
1247 VkImage image
1248 VkImageViewType viewType
1249 VkFormat format
1250 VkChannelMapping channels
1251 VkImageSubresourceRange subresourceRange
1252}
1253
1254class VkAttachmentViewCreateInfo {
1255 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_ATTACHMENT_VIEW_CREATE_INFO
1256 const void* pNext /// Pointer to next structure
1257 VkImage image
1258 VkFormat format
1259 u32 mipLevel
1260 u32 baseArraySlice
1261 u32 arraySize
1262 VkAttachmentViewCreateFlags flags /// Framebuffer attachment view flags
1263}
1264
1265class VkAttachmentBindInfo {
1266 VkAttachmentView view
1267 VkImageLayout layout
1268}
1269
1270class VkBufferCopy {
1271 platform.VkDeviceSize srcOffset /// Specified in bytes
1272 platform.VkDeviceSize destOffset /// Specified in bytes
1273 platform.VkDeviceSize copySize /// Specified in bytes
1274}
1275
1276class VkSparseMemoryBindInfo {
Jesse Hallf09c6b12015-08-15 19:54:28 -07001277 platform.VkDeviceSize rangeOffset /// Specified in bytes
1278 platform.VkDeviceSize rangeSize /// Specified in bytes
Jesse Halld27f6aa2015-08-15 17:58:48 -07001279 platform.VkDeviceSize memOffset /// Specified in bytes
1280 VkDeviceMemory mem
1281 VkSparseMemoryBindFlags flags
1282}
1283
1284class VkSparseImageMemoryBindInfo {
1285 VkImageSubresource subresource
1286 VkOffset3D offset
1287 VkExtent3D extent
1288 platform.VkDeviceSize memOffset /// Specified in bytes
1289 VkDeviceMemory mem
1290 VkSparseMemoryBindFlags flags
1291}
1292
1293class VkImageCopy {
1294 VkImageSubresource srcSubresource
1295 VkOffset3D srcOffset /// Specified in pixels for both compressed and uncompressed images
1296 VkImageSubresource destSubresource
1297 VkOffset3D destOffset /// Specified in pixels for both compressed and uncompressed images
1298 VkExtent3D extent /// Specified in pixels for both compressed and uncompressed images
1299}
1300
1301class VkImageBlit {
1302 VkImageSubresource srcSubresource
1303 VkOffset3D srcOffset /// Specified in pixels for both compressed and uncompressed images
1304 VkExtent3D srcExtent /// Specified in pixels for both compressed and uncompressed images
1305 VkImageSubresource destSubresource
1306 VkOffset3D destOffset /// Specified in pixels for both compressed and uncompressed images
1307 VkExtent3D destExtent /// Specified in pixels for both compressed and uncompressed images
1308}
1309
1310class VkBufferImageCopy {
1311 platform.VkDeviceSize bufferOffset /// Specified in bytes
1312 u32 bufferRowLength /// Specified in texels
1313 u32 bufferImageHeight
1314 VkImageSubresource imageSubresource
1315 VkOffset3D imageOffset /// Specified in pixels for both compressed and uncompressed images
1316 VkExtent3D imageExtent /// Specified in pixels for both compressed and uncompressed images
1317}
1318
1319class VkImageResolve {
1320 VkImageSubresource srcSubresource
1321 VkOffset3D srcOffset
1322 VkImageSubresource destSubresource
1323 VkOffset3D destOffset
1324 VkExtent3D extent
1325}
1326
1327class VkShaderModuleCreateInfo {
1328 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO
1329 const void* pNext /// Pointer to next structure
1330 platform.size_t codeSize /// Specified in bytes
1331 const void* pCode /// Binary code of size codeSize
1332 VkShaderModuleCreateFlags flags /// Reserved
1333}
1334
1335class VkShaderCreateInfo {
1336 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_SHADER_CREATE_INFO
1337 const void* pNext /// Pointer to next structure
1338 VkShaderModule module /// Module containing entry point
1339 const char* pName /// Null-terminated entry point name
1340 VkShaderCreateFlags flags /// Reserved
1341}
1342
1343class VkDescriptorSetLayoutBinding {
1344 VkDescriptorType descriptorType /// Type of the descriptors in this binding
1345 u32 arraySize /// Number of descriptors in this binding
1346 VkShaderStageFlags stageFlags /// Shader stages this binding is visible to
1347 const VkSampler* pImmutableSamplers /// Immutable samplers (used if descriptor type is SAMPLER or COMBINED_IMAGE_SAMPLER, is either NULL or contains <count> number of elements)
1348}
1349
1350class VkDescriptorSetLayoutCreateInfo {
1351 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
1352 const void* pNext /// Pointer to next structure
1353 u32 count /// Number of bindings in the descriptor set layout
1354 const VkDescriptorSetLayoutBinding* pBinding /// Array of descriptor set layout bindings
1355}
1356
1357class VkDescriptorTypeCount {
1358 VkDescriptorType type
1359 u32 count
1360}
1361
1362class VkDescriptorPoolCreateInfo {
1363 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO
1364 const void* pNext /// Pointer to next structure
1365 u32 count
1366 const VkDescriptorTypeCount* pTypeCount
1367}
1368
1369class VkSpecializationMapEntry {
1370 u32 constantId /// The SpecConstant ID specified in the BIL
1371 platform.size_t size /// Size in bytes of the SpecConstant
1372 u32 offset /// Offset of the value in the data block
1373}
1374
1375class VkSpecializationInfo {
1376 u32 mapEntryCount /// Number of entries in the map
1377 const VkSpecializationMapEntry* pMap /// Array of map entries
1378 platform.size_t dataSize /// Size in bytes of pData
1379 const void* pData /// Pointer to SpecConstant data
1380}
1381
1382class VkPipelineShaderStageCreateInfo {
1383 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO
1384 const void* pNext /// Pointer to next structure
1385 VkShaderStage stage
1386 VkShader shader
1387 const VkSpecializationInfo* pSpecializationInfo
1388}
1389
1390class VkComputePipelineCreateInfo {
1391 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
1392 const void* pNext /// Pointer to next structure
1393 VkPipelineShaderStageCreateInfo cs
1394 VkPipelineCreateFlags flags /// Pipeline creation flags
1395 VkPipelineLayout layout /// Interface layout of the pipeline
1396 VkPipeline basePipelineHandle /// If VK_PIPELINE_CREATE_DERIVATIVE_BIT is set and this value is nonzero, it specifies the handle of the base pipeline this is a derivative of
1397 s32 basePipelineIndex /// If VK_PIPELINE_CREATE_DERIVATIVE_BIT is set and this value is not -1, it specifies an index into pCreateInfos of the base pipeline this is a derivative of
1398}
1399
1400class VkVertexInputBindingDescription {
1401 u32 binding /// Vertex buffer binding id
1402 u32 strideInBytes /// Distance between vertices in bytes (0 = no advancement)
1403 VkVertexInputStepRate stepRate /// Rate at which binding is incremented
1404}
1405
1406class VkVertexInputAttributeDescription {
1407 u32 location /// location of the shader vertex attrib
1408 u32 binding /// Vertex buffer binding id
1409 VkFormat format /// format of source data
1410 u32 offsetInBytes /// Offset of first element in bytes from base of vertex
1411}
1412
1413class VkPipelineVertexInputStateCreateInfo {
1414 VkStructureType sType /// Should be VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO
1415 const void* pNext /// Pointer to next structure
1416 u32 bindingCount /// number of bindings
1417 const VkVertexInputBindingDescription* pVertexBindingDescriptions
1418 u32 attributeCount /// number of attributes
1419 const VkVertexInputAttributeDescription* pVertexAttributeDescriptions
1420}
1421
1422class VkPipelineInputAssemblyStateCreateInfo {
1423 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO
1424 const void* pNext /// Pointer to next structure
1425 VkPrimitiveTopology topology
1426 platform.VkBool32 primitiveRestartEnable
1427}
1428
1429class VkPipelineTessellationStateCreateInfo {
1430 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO
1431 const void* pNext /// Pointer to next structure
1432 u32 patchControlPoints
1433}
1434
1435class VkPipelineViewportStateCreateInfo {
1436 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO
1437 const void* pNext /// Pointer to next structure
1438 u32 viewportCount
1439}
1440
1441class VkPipelineRasterStateCreateInfo {
1442 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_PIPELINE_RASTER_STATE_CREATE_INFO
1443 const void* pNext /// Pointer to next structure
1444 platform.VkBool32 depthClipEnable
1445 platform.VkBool32 rasterizerDiscardEnable
1446 VkFillMode fillMode /// optional (GL45)
1447 VkCullMode cullMode
1448 VkFrontFace frontFace
1449}
1450
1451class VkPipelineMultisampleStateCreateInfo {
1452 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO
1453 const void* pNext /// Pointer to next structure
1454 u32 rasterSamples /// Number of samples used for rasterization
1455 platform.VkBool32 sampleShadingEnable /// optional (GL45)
1456 f32 minSampleShading /// optional (GL45)
1457 platform.VkSampleMask sampleMask
1458}
1459
1460class VkPipelineColorBlendAttachmentState {
1461 platform.VkBool32 blendEnable
1462 VkBlend srcBlendColor
1463 VkBlend destBlendColor
1464 VkBlendOp blendOpColor
1465 VkBlend srcBlendAlpha
1466 VkBlend destBlendAlpha
1467 VkBlendOp blendOpAlpha
1468 VkChannelFlags channelWriteMask
1469}
1470
1471class VkPipelineColorBlendStateCreateInfo {
1472 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO
1473 const void* pNext /// Pointer to next structure
1474 platform.VkBool32 alphaToCoverageEnable
1475 platform.VkBool32 logicOpEnable
1476 VkLogicOp logicOp
1477 u32 attachmentCount /// # of pAttachments
1478 const VkPipelineColorBlendAttachmentState* pAttachments
1479}
1480
1481class VkStencilOpState {
1482 VkStencilOp stencilFailOp
1483 VkStencilOp stencilPassOp
1484 VkStencilOp stencilDepthFailOp
1485 VkCompareOp stencilCompareOp
1486}
1487
1488class VkPipelineDepthStencilStateCreateInfo {
1489 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO
1490 const void* pNext /// Pointer to next structure
1491 platform.VkBool32 depthTestEnable
1492 platform.VkBool32 depthWriteEnable
1493 VkCompareOp depthCompareOp
1494 platform.VkBool32 depthBoundsEnable /// optional (depth_bounds_test)
1495 platform.VkBool32 stencilTestEnable
1496 VkStencilOpState front
1497 VkStencilOpState back
1498}
1499
1500class VkGraphicsPipelineCreateInfo {
1501 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO
1502 const void* pNext /// Pointer to next structure
1503 u32 stageCount
1504 const VkPipelineShaderStageCreateInfo* pStages /// One entry for each active shader stage
1505 const VkPipelineVertexInputStateCreateInfo* pVertexInputState
1506 const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState
1507 const VkPipelineTessellationStateCreateInfo* pTessellationState
1508 const VkPipelineViewportStateCreateInfo* pViewportState
1509 const VkPipelineRasterStateCreateInfo* pRasterState
1510 const VkPipelineMultisampleStateCreateInfo* pMultisampleState
1511 const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState
1512 const VkPipelineColorBlendStateCreateInfo* pColorBlendState
1513 VkPipelineCreateFlags flags /// Pipeline creation flags
1514 VkPipelineLayout layout /// Interface layout of the pipeline
1515 VkRenderPass renderPass
1516 u32 subpass
1517 VkPipeline basePipelineHandle /// If VK_PIPELINE_CREATE_DERIVATIVE_BIT is set and this value is nonzero, it specifies the handle of the base pipeline this is a derivative of
1518 s32 basePipelineIndex /// If VK_PIPELINE_CREATE_DERIVATIVE_BIT is set and this value is not -1, it specifies an index into pCreateInfos of the base pipeline this is a derivative of
1519}
1520
1521class VkPipelineCacheCreateInfo {
1522 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO
1523 const void* pNext /// Pointer to next structure
1524 platform.size_t initialSize /// Size of initial data to populate cache, in bytes
1525 const void* initialData /// Initial data to populate cache
1526 platform.size_t maxSize /// Maximum size cache can grow to, in bytes. If zero, then the cache may grow without bound.
1527}
1528
1529class VkPushConstantRange {
1530 VkShaderStageFlags stageFlags /// Which stages use the range
1531 u32 start /// Start of the range, in bytes
1532 u32 length /// Length of the range, in bytes
1533}
1534
1535class VkPipelineLayoutCreateInfo {
1536 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
1537 const void* pNext /// Pointer to next structure
1538 u32 descriptorSetCount /// Number of descriptor sets interfaced by the pipeline
1539 const VkDescriptorSetLayout* pSetLayouts /// Array of <setCount> number of descriptor set layout objects defining the layout of the
1540 u32 pushConstantRangeCount /// Number of push-constant ranges used by the pipeline
1541 const VkPushConstantRange* pPushConstantRanges /// Array of pushConstantRangeCount number of ranges used by various shader stages
1542}
1543
1544class VkSamplerCreateInfo {
1545 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO
1546 const void* pNext /// Pointer to next structure
1547 VkTexFilter magFilter /// Filter mode for magnification
1548 VkTexFilter minFilter /// Filter mode for minifiation
1549 VkTexMipmapMode mipMode /// Mipmap selection mode
1550 VkTexAddress addressU
1551 VkTexAddress addressV
1552 VkTexAddress addressW
1553 f32 mipLodBias
1554 f32 maxAnisotropy
1555 platform.VkBool32 compareEnable
1556 VkCompareOp compareOp
1557 f32 minLod
1558 f32 maxLod
1559 VkBorderColor borderColor
1560}
1561
1562class VkDynamicViewportStateCreateInfo {
1563 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_DYNAMIC_VIEWPORT_STATE_CREATE_INFO
1564 const void* pNext /// Pointer to next structure
1565 u32 viewportAndScissorCount /// number of entries in pViewports and pScissors
1566 const VkViewport* pViewports
1567 const VkRect2D* pScissors
1568}
1569
1570class VkDynamicRasterStateCreateInfo {
1571 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_DYNAMIC_RASTER_STATE_CREATE_INFO
1572 const void* pNext /// Pointer to next structure
1573 f32 depthBias
1574 f32 depthBiasClamp
1575 f32 slopeScaledDepthBias
1576 f32 lineWidth /// optional (GL45) - Width of lines
1577}
1578
1579class VkDynamicColorBlendStateCreateInfo {
1580 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_DYNAMIC_COLOR_BLEND_STATE_CREATE_INFO
1581 const void* pNext /// Pointer to next structure
1582 f32[4] blendConst
1583}
1584
1585class VkDynamicDepthStencilStateCreateInfo {
1586 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_DYNAMIC_DEPTH_STENCIL_STATE_CREATE_INFO
1587 const void* pNext /// Pointer to next structure
1588 f32 minDepthBounds /// optional (depth_bounds_test)
1589 f32 maxDepthBounds /// optional (depth_bounds_test)
1590 u32 stencilReadMask
1591 u32 stencilWriteMask
1592 u32 stencilFrontRef
1593 u32 stencilBackRef
1594}
1595
1596class VkCmdPoolCreateInfo {
1597 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO
1598 const void* pNext /// Pointer to next structure
1599 u32 queueFamilyIndex
1600 VkCmdPoolCreateFlags flags /// Command pool creation flags
1601}
1602
1603class VkCmdBufferCreateInfo {
1604 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO
1605 const void* pNext /// Pointer to next structure
1606 VkCmdPool cmdPool
1607 VkCmdBufferLevel level
1608 VkCmdBufferCreateFlags flags /// Command buffer creation flags
1609}
1610
1611class VkCmdBufferBeginInfo {
1612 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO
1613 const void* pNext /// Pointer to next structure
1614 VkCmdBufferOptimizeFlags flags /// Command buffer optimization flags
1615 VkRenderPass renderPass /// Render pass for secondary command buffers
1616 VkFramebuffer framebuffer /// Framebuffer for secondary command buffers
1617}
1618
1619class VkRenderPassBeginInfo {
1620 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO
1621 const void* pNext /// Pointer to next structure
1622 VkRenderPass renderPass
1623 VkFramebuffer framebuffer
1624 VkRect2D renderArea
1625 u32 attachmentCount
1626 const VkClearValue* pAttachmentClearValues
1627}
1628
1629@union
1630/// Union allowing specification of floating point, integer, or unsigned integer color data. Actual value selected is based on image/attachment being cleared.
1631class VkClearColorValue {
1632 f32[4] f32
1633 s32[4] s32
1634 u32[4] u32
1635}
1636
1637class VkClearDepthStencilValue {
1638 f32 depth
1639 u32 stencil
1640}
1641
1642@union
1643/// Union allowing specification of color, depth, and stencil color values. Actual value selected is based on attachment being cleared.
1644class VkClearValue {
1645 VkClearColorValue color
1646 VkClearDepthStencilValue ds
1647}
1648
1649class VkAttachmentDescription {
1650 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION
1651 const void* pNext /// Pointer to next structure
1652 VkFormat format
1653 u32 samples
1654 VkAttachmentLoadOp loadOp /// Load op for color or depth data
1655 VkAttachmentStoreOp storeOp /// Store op for color or depth data
1656 VkAttachmentLoadOp stencilLoadOp /// Load op for stencil data
1657 VkAttachmentStoreOp stencilStoreOp /// Store op for stencil data
1658 VkImageLayout initialLayout
1659 VkImageLayout finalLayout
1660}
1661
1662class VkAttachmentReference {
1663 u32 attachment
1664 VkImageLayout layout
1665}
1666
1667class VkSubpassDescription {
1668 VkStructureType sType /// Must be VK_STRUCTURE_SUBPASS_DESCRIPTION
1669 const void* pNext /// Pointer to next structure
1670 VkPipelineBindPoint pipelineBindPoint /// Must be VK_PIPELINE_BIND_POINT_GRAPHICS for now
1671 VkSubpassDescriptionFlags flags
1672 u32 inputCount
1673 const VkAttachmentReference* inputAttachments
1674 u32 colorCount
1675 const VkAttachmentReference* colorAttachments
1676 const VkAttachmentReference* resolveAttachments
1677 VkAttachmentReference depthStencilAttachment
1678 u32 preserveCount
1679 const VkAttachmentReference* preserveAttachments
1680}
1681
1682class VkSubpassDependency {
1683 VkStructureType sType /// Must be VK_STRUCTURE_SUBPASS_DEPENDENCY
1684 const void* pNext /// Pointer to next structure
1685 u32 srcSubpass
1686 u32 destSubpass
1687 VkPipelineStageFlags srcStageMask
1688 VkPipelineStageFlags destStageMask
1689 VkMemoryOutputFlags outputMask
1690 VkMemoryInputFlags inputMask
1691 platform.VkBool32 byRegion
1692}
1693
1694class VkRenderPassCreateInfo {
1695 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO
1696 const void* pNext /// Pointer to next structure
1697 u32 attachmentCount
1698 const VkAttachmentDescription* pAttachments
1699 u32 subpassCount
1700 const VkSubpassDescription* pSubpasses
1701 u32 dependencyCount
1702 const VkSubpassDependency* pDependencies
1703}
1704
1705class VkEventCreateInfo {
1706 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_EVENT_CREATE_INFO
1707 const void* pNext /// Pointer to next structure
1708 VkEventCreateFlags flags /// Event creation flags
1709}
1710
1711class VkFenceCreateInfo {
1712 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_FENCE_CREATE_INFO
1713 const void* pNext /// Pointer to next structure
1714 VkFenceCreateFlags flags /// Fence creation flags
1715}
1716
1717class VkPhysicalDeviceFeatures {
1718 platform.VkBool32 robustBufferAccess /// out of bounds buffer accesses are well defined
1719 platform.VkBool32 fullDrawIndexUint32 /// full 32-bit range of indices for indexed draw calls
1720 platform.VkBool32 imageCubeArray /// image views which are arrays of cube maps
1721 platform.VkBool32 independentBlend /// blending operations are controlled per-attachment
1722 platform.VkBool32 geometryShader /// geometry stage
1723 platform.VkBool32 tessellationShader /// tessellation control and evaluation stage
1724 platform.VkBool32 sampleRateShading /// per-sample shading and interpolation
1725 platform.VkBool32 dualSourceBlend /// blend operations which take two sources
1726 platform.VkBool32 logicOp /// logic operations
1727 platform.VkBool32 instancedDrawIndirect /// multi draw indirect
1728 platform.VkBool32 depthClip /// depth clipping
1729 platform.VkBool32 depthBiasClamp /// depth bias clamping
1730 platform.VkBool32 fillModeNonSolid /// point and wireframe fill modes
1731 platform.VkBool32 depthBounds /// depth bounds test
1732 platform.VkBool32 wideLines /// lines with width greater than 1
1733 platform.VkBool32 largePoints /// points with size greater than 1
1734 platform.VkBool32 textureCompressionETC2 /// ETC texture compression formats
1735 platform.VkBool32 textureCompressionASTC_LDR /// ASTC LDR texture compression formats
1736 platform.VkBool32 textureCompressionBC /// BC1-7 texture compressed formats
1737 platform.VkBool32 pipelineStatisticsQuery /// pipeline statistics query
1738 platform.VkBool32 vertexSideEffects /// storage buffers and images in vertex stage
1739 platform.VkBool32 tessellationSideEffects /// storage buffers and images in tessellation stage
1740 platform.VkBool32 geometrySideEffects /// storage buffers and images in geometry stage
1741 platform.VkBool32 fragmentSideEffects /// storage buffers and images in fragment stage
1742 platform.VkBool32 shaderTessellationPointSize /// tessellation stage can export point size
1743 platform.VkBool32 shaderGeometryPointSize /// geometry stage can export point size
1744 platform.VkBool32 shaderTextureGatherExtended /// texture gather with run-time values and independent offsets
1745 platform.VkBool32 shaderStorageImageExtendedFormats /// the extended set of formats can be used for storage images
1746 platform.VkBool32 shaderStorageImageMultisample /// multisample images can be used for storage images
1747 platform.VkBool32 shaderStorageBufferArrayConstantIndexing /// arrays of storage buffers can be accessed with constant indices
1748 platform.VkBool32 shaderStorageImageArrayConstantIndexing /// arrays of storage images can be accessed with constant indices
1749 platform.VkBool32 shaderUniformBufferArrayDynamicIndexing /// arrays of uniform buffers can be accessed with dynamically uniform indices
1750 platform.VkBool32 shaderSampledImageArrayDynamicIndexing /// arrays of sampled images can be accessed with dynamically uniform indices
1751 platform.VkBool32 shaderStorageBufferArrayDynamicIndexing /// arrays of storage buffers can be accessed with dynamically uniform indices
1752 platform.VkBool32 shaderStorageImageArrayDynamicIndexing /// arrays of storage images can be accessed with dynamically uniform indices
1753 platform.VkBool32 shaderClipDistance /// clip distance in shaders
1754 platform.VkBool32 shaderCullDistance /// cull distance in shaders
1755 platform.VkBool32 shaderFloat64 /// 64-bit floats (doubles) in shaders
1756 platform.VkBool32 shaderInt64 /// 64-bit integers in shaders
1757 platform.VkBool32 shaderFloat16 /// 16-bit floats in shaders
1758 platform.VkBool32 shaderInt16 /// 16-bit integers in shaders
1759 platform.VkBool32 shaderResourceResidency /// shader can use texture operations that return resource residency information (requires sparseNonResident support)
1760 platform.VkBool32 shaderResourceMinLOD /// shader can use texture operations that specify minimum resource LOD
1761 platform.VkBool32 sparse /// Sparse resources support: Resource memory can be managed at opaque page level rather than object level
1762 platform.VkBool32 sparseResidencyBuffer /// Sparse resources support: GPU can access partially resident buffers
1763 platform.VkBool32 sparseResidencyImage2D /// Sparse resources support: GPU can access partially resident 2D (non-MSAA non-DepthStencil) images
1764 platform.VkBool32 sparseResidencyImage3D /// Sparse resources support: GPU can access partially resident 3D images
1765 platform.VkBool32 sparseResidency2Samples /// Sparse resources support: GPU can access partially resident MSAA 2D images with 2 samples
1766 platform.VkBool32 sparseResidency4Samples /// Sparse resources support: GPU can access partially resident MSAA 2D images with 4 samples
1767 platform.VkBool32 sparseResidency8Samples /// Sparse resources support: GPU can access partially resident MSAA 2D images with 8 samples
1768 platform.VkBool32 sparseResidency16Samples /// Sparse resources support: GPU can access partially resident MSAA 2D images with 16 samples
1769 platform.VkBool32 sparseResidencyStandard2DBlockShape /// Sparse resources support: GPU will access all 2D (single sample) sparse resources using the standard block shapes (based on pixel format)
1770 platform.VkBool32 sparseResidencyStandard2DMSBlockShape /// Sparse resources support: GPU will access all 2D (multisample) sparse resources using the standard block shapes (based on pixel format)
1771 platform.VkBool32 sparseResidencyStandard3DBlockShape /// Sparse resources support: GPU will access all 3D sparse resources using the standard block shapes (based on pixel format)
1772 platform.VkBool32 sparseResidencyAlignedMipSize /// Sparse resources support: Images with mip-level dimensions that are NOT a multiple of the block size will be placed in the mip tail
1773 platform.VkBool32 sparseResidencyNonResident /// Sparse resources support: GPU can safely access non-resident regions of a resource, read values from read-write resources are undefined
1774 platform.VkBool32 sparseResidencyNonResidentStrict /// Sparse resources support: GPU can safely access non-resident regions of a resource, all reads return as if data is 0, writes are discarded
1775 platform.VkBool32 sparseResidencyAliased /// Sparse resources support: GPU can correctly access data aliased into multiple locations (opt-in)
1776}
1777
1778class VkPhysicalDeviceLimits {
1779 /// resource maximum sizes
1780 u32 maxImageDimension1D /// max 1D image dimension
1781 u32 maxImageDimension2D /// max 2D image dimension
1782 u32 maxImageDimension3D /// max 3D image dimension
1783 u32 maxImageDimensionCube /// max cubemap image dimension
1784 u32 maxImageArrayLayers /// max layers for image arrays
1785 u32 maxTexelBufferSize /// max texel buffer size (bytes)
1786 u32 maxUniformBufferSize /// max uniform buffer size (bytes)
1787 u32 maxStorageBufferSize /// max storage buffer size (bytes)
1788 u32 maxPushConstantsSize /// max size of the push constants pool (bytes)
1789 /// memory limits
1790 u32 maxMemoryAllocationCount /// max number of device memory allocations supported
1791 platform.VkDeviceSize bufferImageGranularity /// Granularity (in bytes) at which buffers and images can be bound to adjacent memory for simultaneous usage
1792 /// descriptor set limits
1793 u32 maxBoundDescriptorSets /// max number of descriptors sets that can be bound to a pipeline
1794 u32 maxDescriptorSets /// max number of allocated descriptor sets
1795 u32 maxPerStageDescriptorSamplers /// max num of samplers allowed per-stage in a descriptor set
1796 u32 maxPerStageDescriptorUniformBuffers /// max num of uniform buffers allowed per-stage in a descriptor set
1797 u32 maxPerStageDescriptorStorageBuffers /// max num of storage buffers allowed per-stage in a descriptor set
1798 u32 maxPerStageDescriptorSampledImages /// max num of sampled images allowed per-stage in a descriptor set
1799 u32 maxPerStageDescriptorStorageImages /// max num of storage images allowed per-stage in a descriptor set
1800 u32 maxDescriptorSetSamplers /// max num of samplers allowed in all stages in a descriptor set
1801 u32 maxDescriptorSetUniformBuffers /// max num of uniform buffers allowed in all stages in a descriptor set
1802 u32 maxDescriptorSetStorageBuffers /// max num of storage buffers allowed in all stages in a descriptor set
1803 u32 maxDescriptorSetSampledImages /// max num of sampled images allowed in all stages in a descriptor set
1804 u32 maxDescriptorSetStorageImages /// max num of storage images allowed in all stages in a descriptor set
1805 /// vertex stage limits
1806 u32 maxVertexInputAttributes /// max num of vertex input attribute slots
1807 u32 maxVertexInputAttributeOffset /// max vertex input attribute offset added to vertex buffer offset
1808 u32 maxVertexInputBindingStride /// max vertex input binding stride
1809 u32 maxVertexOutputComponents /// max num of output components written by vertex shader
1810 /// tessellation control stage limits
1811 u32 maxTessGenLevel /// max level supported by tess primitive generator
1812 u32 maxTessPatchSize /// max patch size (vertices)
1813 u32 maxTessControlPerVertexInputComponents /// max num of input components per-vertex in TCS
1814 u32 maxTessControlPerVertexOutputComponents /// max num of output components per-vertex in TCS
1815 u32 maxTessControlPerPatchOutputComponents /// max num of output components per-patch in TCS
1816 u32 maxTessControlTotalOutputComponents /// max total num of per-vertex and per-patch output components in TCS
1817 u32 maxTessEvaluationInputComponents /// max num of input components per vertex in TES
1818 u32 maxTessEvaluationOutputComponents /// max num of output components per vertex in TES
1819 /// geometry stage limits
1820 u32 maxGeometryShaderInvocations /// max invocation count supported in geometry shader
1821 u32 maxGeometryInputComponents /// max num of input components read in geometry stage
1822 u32 maxGeometryOutputComponents /// max num of output components written in geometry stage
1823 u32 maxGeometryOutputVertices /// max num of vertices that can be emitted in geometry stage
1824 u32 maxGeometryTotalOutputComponents /// max total num of components (all vertices) written in geometry stage
1825 /// fragment stage limits
1826 u32 maxFragmentInputComponents /// max num of input compontents read in fragment stage
1827 u32 maxFragmentOutputBuffers /// max num of output buffers written in fragment stage
1828 u32 maxFragmentDualSourceBuffers /// max num of output buffers written when using dual source blending
1829 u32 maxFragmentCombinedOutputResources /// max total num of storage buffers, storage images and output buffers
1830 /// compute stage limits
1831 u32 maxComputeSharedMemorySize /// max total storage size of work group local storage (bytes)
1832 u32[3] maxComputeWorkGroupCount /// max num of compute work groups that may be dispatched by a single command (x,y,z)
1833 u32 maxComputeWorkGroupInvocations /// max total compute invocations in a single local work group
1834 u32[3] maxComputeWorkGroupSize /// max local size of a compute work group (x,y,z)
1835
1836 u32 subPixelPrecisionBits /// num bits of subpixel precision in screen x and y
1837 u32 subTexelPrecisionBits /// num bits of subtexel precision
1838 u32 mipmapPrecisionBits /// num bits of mipmap precision
1839
1840 u32 maxDrawIndexedIndexValue /// max index value for indexed draw calls (for 32-bit indices)
1841 u32 maxDrawIndirectInstanceCount /// max instance count for indirect draw calls
1842 platform.VkBool32 primitiveRestartForPatches /// is primitive restart supported for PATCHES
1843
1844 f32 maxSamplerLodBias /// max absolute sampler level of detail bias
1845 f32 maxSamplerAnisotropy /// max degree of sampler anisotropy
1846
1847 u32 maxViewports /// max number of active viewports
1848 u32 maxDynamicViewportStates /// max number of dynamic viewport state objects
1849 u32[2] maxViewportDimensions /// max viewport dimensions (x,y)
1850 f32[2] viewportBoundsRange /// viewport bounds range (min,max)
1851 u32 viewportSubPixelBits /// num bits of subpixel precision for viewport
1852
1853 u32 minMemoryMapAlignment /// min required alignment of pointers returned by MapMemory (bytes)
Jesse Hallf09c6b12015-08-15 19:54:28 -07001854 u32 minTexelBufferOffsetAlignment /// min required alignment for texel buffer offsets (bytes)
Jesse Halld27f6aa2015-08-15 17:58:48 -07001855 u32 minUniformBufferOffsetAlignment /// min required alignment for uniform buffer sizes and offsets (bytes)
1856 u32 minStorageBufferOffsetAlignment /// min required alignment for storage buffer offsets (bytes)
1857
1858 u32 minTexelOffset /// min texel offset for OpTextureSampleOffset
1859 u32 maxTexelOffset /// max texel offset for OpTextureSampleOffset
1860 u32 minTexelGatherOffset /// min texel offset for OpTextureGatherOffset
1861 u32 maxTexelGatherOffset /// max texel offset for OpTextureGatherOffset
1862 f32 minInterpolationOffset /// furthest negative offset for interpolateAtOffset
1863 f32 maxInterpolationOffset /// furthest positive offset for interpolateAtOffset
1864 u32 subPixelInterpolationOffsetBits /// num of subpixel bits for interpolateAtOffset
1865
1866 u32 maxFramebufferWidth /// max width for a framebuffer
1867 u32 maxFramebufferHeight /// max height for a framebuffer
1868 u32 maxFramebufferLayers /// max layer count for a layered framebuffer
1869 u32 maxFramebufferColorSamples /// max color sample count for a framebuffer
1870 u32 maxFramebufferDepthSamples /// max depth sample count for a framebuffer
1871 u32 maxFramebufferStencilSamples /// max stencil sample count for a framebuffer
1872 u32 maxColorAttachments /// max num of framebuffer color attachments
1873
1874 u32 maxSampledImageColorSamples /// max num of color samples for a non-integer sampled image
1875 u32 maxSampledImageDepthSamples /// max num of depth/stencil samples for a sampled image
1876 u32 maxSampledImageIntegerSamples /// max num of samples supported for an integer image
1877 u32 maxStorageImageSamples /// max num of samples for a storage image
1878 u32 maxSampleMaskWords /// max num of sample mask words
1879
1880 u64 timestampFrequency /// 1/clock_tick_granularity for timestamp queries
1881
1882 u32 maxClipDistances /// max number of clip distances
1883 u32 maxCullDistances /// max number of cull distances
1884 u32 maxCombinedClipAndCullDistances /// max combined number of user clipping
1885
1886 f32[2] pointSizeRange /// range (min,max) of supported point sizes
1887 f32[2] lineWidthRange /// range (min,max) of supported line widths
1888 f32 pointSizeGranularity /// granularity of supported point sizes
1889 f32 lineWidthGranularity /// granularity of supported line widths
1890}
1891
1892class VkSemaphoreCreateInfo {
1893 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO
1894 const void* pNext /// Pointer to next structure
1895 VkSemaphoreCreateFlags flags /// Semaphore creation flags
1896}
1897
1898class VkQueryPoolCreateInfo {
1899 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO
1900 const void* pNext /// Pointer to next structure
1901 VkQueryType queryType
1902 u32 slots
1903 VkQueryPipelineStatisticFlags pipelineStatistics /// Optional
1904}
1905
1906class VkFramebufferCreateInfo {
1907 VkStructureType sType /// Must be VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO
1908 const void* pNext /// Pointer to next structure
1909 VkRenderPass renderPass
1910 u32 attachmentCount
1911 const VkAttachmentBindInfo* pAttachments
1912 u32 width
1913 u32 height
1914 u32 layers
1915}
1916
1917class VkDrawIndirectCmd {
1918 u32 vertexCount
1919 u32 instanceCount
1920 u32 firstVertex
1921 u32 firstInstance
1922}
1923
1924class VkDrawIndexedIndirectCmd {
1925 u32 indexCount
1926 u32 instanceCount
1927 u32 firstIndex
1928 s32 vertexOffset
1929 u32 firstInstance
1930}
1931
1932class VkDispatchIndirectCmd {
1933 u32 x
1934 u32 y
1935 u32 z
1936}
1937
1938
1939////////////////
1940// Commands //
1941////////////////
1942
1943// Function pointers. TODO: add support for function pointers.
1944
1945@external type void* PFN_vkVoidFunction
1946@pfn cmd void vkVoidFunction() {
1947}
1948
1949@external type void* PFN_vkAllocFunction
1950@pfn cmd void* vkAllocFunction(
1951 void* pUserData,
1952 platform.size_t size,
1953 platform.size_t alignment,
1954 VkSystemAllocType allocType) {
1955 return ?
1956}
1957
1958@external type void* PFN_vkFreeFunction
1959@pfn cmd void vkFreeFunction(
1960 void* pUserData,
1961 void* pMem) {
1962}
1963
1964
1965// Global functions
1966
1967@threadSafety("system")
1968cmd VkResult vkCreateInstance(
1969 const VkInstanceCreateInfo* pCreateInfo,
1970 VkInstance* pInstance) {
1971 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO)
1972
1973 instance := ?
1974 pInstance[0] = instance
1975 State.Instances[instance] = new!InstanceObject()
1976
1977 layers := pCreateInfo.ppEnabledLayerNames[0:pCreateInfo.layerCount]
1978 extensions := pCreateInfo.ppEnabledExtensionNames[0:pCreateInfo.extensionCount]
1979
1980 return ?
1981}
1982
1983@threadSafety("system")
1984cmd VkResult vkDestroyInstance(
1985 VkInstance instance) {
1986 instanceObject := GetInstance(instance)
1987
1988 State.Instances[instance] = null
1989
1990 return ?
1991}
1992
1993@threadSafety("system")
1994cmd VkResult vkEnumeratePhysicalDevices(
1995 VkInstance instance,
1996 u32* pPhysicalDeviceCount,
1997 VkPhysicalDevice* pPhysicalDevices) {
1998 instanceObject := GetInstance(instance)
1999
2000 physicalDeviceCount := as!u32(?)
2001 pPhysicalDeviceCount[0] = physicalDeviceCount
2002 physicalDevices := pPhysicalDevices[0:physicalDeviceCount]
2003
2004 for i in (0 .. physicalDeviceCount) {
2005 physicalDevice := ?
2006 physicalDevices[i] = physicalDevice
2007 if !(physicalDevice in State.PhysicalDevices) {
2008 State.PhysicalDevices[physicalDevice] = new!PhysicalDeviceObject(instance: instance)
2009 }
2010 }
2011
2012 return ?
2013}
2014
2015cmd PFN_vkVoidFunction vkGetDeviceProcAddr(
2016 VkDevice device,
2017 const char* pName) {
2018 if device != VK_NULL_HANDLE {
2019 device := GetDevice(device)
2020 }
2021
2022 return ?
2023}
2024
2025cmd PFN_vkVoidFunction vkGetInstanceProcAddr(
2026 VkInstance instance,
2027 const char* pName) {
2028 if instance != VK_NULL_HANDLE {
2029 instanceObject := GetInstance(instance)
2030 }
2031
2032 return ?
2033}
2034
2035cmd VkResult vkGetPhysicalDeviceProperties(
2036 VkPhysicalDevice physicalDevice,
2037 VkPhysicalDeviceProperties* pProperties) {
2038 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2039
2040 properties := ?
2041 pProperties[0] = properties
2042
2043 return ?
2044}
2045
2046cmd VkResult vkGetPhysicalDeviceQueueCount(
2047 VkPhysicalDevice physicalDevice,
2048 u32* pCount) {
2049 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2050
2051 count := ?
2052 pCount[0] = count
2053
2054 return ?
2055}
2056
2057cmd VkResult vkGetPhysicalDeviceQueueProperties(
2058 VkPhysicalDevice physicalDevice,
2059 u32 count,
2060 VkPhysicalDeviceQueueProperties* pQueueProperties) {
2061 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2062 queuesProperties := pQueueProperties[0:count]
2063 for i in (0 .. count) {
2064 queueProperties := as!VkPhysicalDeviceQueueProperties(?)
2065 queuesProperties[i] = queueProperties
2066 }
2067 return ?
2068}
2069
2070cmd VkResult vkGetPhysicalDeviceMemoryProperties(
2071 VkPhysicalDevice physicalDevice,
2072 VkPhysicalDeviceMemoryProperties* pMemoryProperties) {
2073 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2074
2075 memoryProperties := ?
2076 pMemoryProperties[0] = memoryProperties
2077
2078 return ?
2079}
2080
2081cmd VkResult vkGetPhysicalDeviceFeatures(
2082 VkPhysicalDevice physicalDevice,
2083 VkPhysicalDeviceFeatures* pFeatures) {
2084 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2085
2086 features := ?
2087 pFeatures[0] = features
2088
2089 return ?
2090}
2091
2092cmd VkResult vkGetPhysicalDeviceFormatProperties(
2093 VkPhysicalDevice physicalDevice,
2094 VkFormat format,
2095 VkFormatProperties* pFormatProperties) {
2096 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2097
2098 formatProperties := ?
2099 pFormatProperties[0] = formatProperties
2100
2101 return ?
2102}
2103
2104cmd VkResult vkGetPhysicalDeviceImageFormatProperties(
2105 VkPhysicalDevice physicalDevice,
2106 VkFormat format,
2107 VkImageType type,
2108 VkImageTiling tiling,
2109 VkImageUsageFlags usage,
2110 VkImageFormatProperties* pImageFormatProperties) {
2111 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2112
2113 imageFormatProperties := ?
2114 pImageFormatProperties[0] = imageFormatProperties
2115
2116 return ?
2117}
2118
2119cmd VkResult vkGetPhysicalDeviceLimits(
2120 VkPhysicalDevice physicalDevice,
2121 VkPhysicalDeviceLimits* pLimits) {
2122 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2123
2124 limits := ?
2125 pLimits[0] = limits
2126
2127 return ?
2128}
2129
2130
2131// Device functions
2132
2133@threadSafety("system")
2134cmd VkResult vkCreateDevice(
2135 VkPhysicalDevice physicalDevice,
2136 const VkDeviceCreateInfo* pCreateInfo,
2137 VkDevice* pDevice) {
2138 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO)
2139 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2140
2141 device := ?
2142 pDevice[0] = device
2143 State.Devices[device] = new!DeviceObject(physicalDevice: physicalDevice)
2144
2145 return ?
2146}
2147
2148@threadSafety("system")
2149cmd VkResult vkDestroyDevice(
2150 VkDevice device) {
2151 deviceObject := GetDevice(device)
2152
2153 State.Devices[device] = null
2154
2155 return ?
2156}
2157
2158
2159// Extension discovery functions
2160
2161cmd VkResult vkGetGlobalLayerProperties(
2162 u32* pCount,
2163 VkLayerProperties* pProperties) {
2164 count := as!u32(?)
2165 pCount[0] = count
2166
2167 properties := pProperties[0:count]
2168 for i in (0 .. count) {
2169 property := ?
2170 properties[i] = property
2171 }
2172
2173 return ?
2174}
2175
2176cmd VkResult vkGetGlobalExtensionProperties(
2177 const char* pLayerName,
2178 u32* pCount,
2179 VkExtensionProperties* pProperties) {
2180 count := as!u32(?)
2181 pCount[0] = count
2182
2183 properties := pProperties[0:count]
2184 for i in (0 .. count) {
2185 property := ?
2186 properties[i] = property
2187 }
2188
2189 return ?
2190}
2191
2192cmd VkResult vkGetPhysicalDeviceLayerProperties(
2193 VkPhysicalDevice physicalDevice,
2194 u32* pCount,
2195 VkLayerProperties* pProperties) {
2196 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2197 count := as!u32(?)
2198 pCount[0] = count
2199
2200 properties := pProperties[0:count]
2201 for i in (0 .. count) {
2202 property := ?
2203 properties[i] = property
2204 }
2205
2206 return ?
2207}
2208
2209cmd VkResult vkGetPhysicalDeviceExtensionProperties(
2210 VkPhysicalDevice physicalDevice,
2211 const char* pLayerName,
2212 u32* pCount,
2213 VkExtensionProperties* pProperties) {
2214 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2215
2216 count := as!u32(?)
2217 pCount[0] = count
2218
2219 properties := pProperties[0:count]
2220 for i in (0 .. count) {
2221 property := ?
2222 properties[i] = property
2223 }
2224
2225 return ?
2226}
2227
2228
2229// Queue functions
2230
2231@threadSafety("system")
2232cmd VkResult vkGetDeviceQueue(
2233 VkDevice device,
2234 u32 queueFamilyIndex,
2235 u32 queueIndex,
2236 VkQueue* pQueue) {
2237 deviceObject := GetDevice(device)
2238
2239 queue := ?
2240 pQueue[0] = queue
2241
2242 if !(queue in State.Queues) {
2243 State.Queues[queue] = new!QueueObject(device: device)
2244 }
2245
2246 return ?
2247}
2248
2249@threadSafety("app")
2250cmd VkResult vkQueueSubmit(
2251 VkQueue queue,
2252 u32 cmdBufferCount,
2253 const VkCmdBuffer* pCmdBuffers,
2254 VkFence fence) {
2255 queueObject := GetQueue(queue)
2256
2257 if fence != VK_NULL_HANDLE {
2258 fenceObject := GetFence(fence)
2259 assert(fenceObject.device == queueObject.device)
2260 }
2261
2262 cmdBuffers := pCmdBuffers[0:cmdBufferCount]
2263 for i in (0 .. cmdBufferCount) {
2264 cmdBuffer := cmdBuffers[i]
2265 cmdBufferObject := GetCmdBuffer(cmdBuffer)
2266 assert(cmdBufferObject.device == queueObject.device)
2267
2268 validate("QueueCheck", cmdBufferObject.queueFlags in queueObject.flags,
2269 "vkQueueSubmit: enqueued cmdBuffer requires missing queue capabilities.")
2270 }
2271
2272 return ?
2273}
2274
2275@threadSafety("system")
2276cmd VkResult vkQueueWaitIdle(
2277 VkQueue queue) {
2278 queueObject := GetQueue(queue)
2279
2280 return ?
2281}
2282
2283@threadSafety("system")
2284cmd VkResult vkDeviceWaitIdle(
2285 VkDevice device) {
2286 deviceObject := GetDevice(device)
2287
2288 return ?
2289}
2290
2291
2292// Memory functions
2293
2294@threadSafety("system")
2295cmd VkResult vkAllocMemory(
2296 VkDevice device,
2297 const VkMemoryAllocInfo* pAllocInfo,
2298 VkDeviceMemory* pMem) {
2299 assert(pAllocInfo.sType == VK_STRUCTURE_TYPE_MEMORY_ALLOC_INFO)
2300 deviceObject := GetDevice(device)
2301
2302 mem := ?
2303 pMem[0] = mem
2304 State.DeviceMemories[mem] = new!DeviceMemoryObject(
2305 device: device,
2306 allocationSize: pAllocInfo[0].allocationSize)
2307
2308 return ?
2309}
2310
2311@threadSafety("system")
2312cmd VkResult vkFreeMemory(
2313 VkDevice device,
2314 VkDeviceMemory mem) {
2315 deviceObject := GetDevice(device)
2316 memObject := GetDeviceMemory(mem)
2317 assert(memObject.device == device)
2318
2319 // Check that no objects are still bound before freeing.
2320 validate("MemoryCheck", len(memObject.boundObjects) == 0,
2321 "vkFreeMemory: objects still bound")
2322 validate("MemoryCheck", len(memObject.boundCommandBuffers) == 0,
2323 "vkFreeMemory: cmdBuffers still bound")
2324 State.DeviceMemories[mem] = null
2325
2326 return ?
2327}
2328
2329@threadSafety("app")
2330cmd VkResult vkMapMemory(
2331 VkDevice device,
2332 VkDeviceMemory mem,
2333 platform.VkDeviceSize offset,
2334 platform.VkDeviceSize size,
2335 VkMemoryMapFlags flags,
2336 void** ppData) {
2337 deviceObject := GetDevice(device)
2338 memObject := GetDeviceMemory(mem)
2339 assert(memObject.device == device)
2340
2341 assert(flags == as!VkMemoryMapFlags(0))
2342 assert((offset + size) <= memObject.allocationSize)
2343
2344 return ?
2345}
2346
2347@threadSafety("app")
2348cmd VkResult vkUnmapMemory(
2349 VkDevice device,
2350 VkDeviceMemory mem) {
2351 deviceObject := GetDevice(device)
2352 memObject := GetDeviceMemory(mem)
2353 assert(memObject.device == device)
2354
2355 return ?
2356}
2357
2358cmd VkResult vkFlushMappedMemoryRanges(
2359 VkDevice device,
2360 u32 memRangeCount
2361 const VkMappedMemoryRange* pMemRanges) {
2362 deviceObject := GetDevice(device)
2363
2364 memRanges := pMemRanges[0:memRangeCount]
2365 for i in (0 .. memRangeCount) {
2366 memRange := memRanges[i]
2367 memObject := GetDeviceMemory(memRange.mem)
2368 assert(memObject.device == device)
2369 assert((memRange.offset + memRange.size) <= memObject.allocationSize)
2370 }
2371
2372 return ?
2373}
2374
2375cmd VkResult vkInvalidateMappedMemoryRanges(
2376 VkDevice device,
2377 u32 memRangeCount,
2378 const VkMappedMemoryRange* pMemRanges) {
2379 deviceObject := GetDevice(device)
2380
2381 memRanges := pMemRanges[0:memRangeCount]
2382 for i in (0 .. memRangeCount) {
2383 memRange := memRanges[i]
2384 memObject := GetDeviceMemory(memRange.mem)
2385 assert(memObject.device == device)
2386 assert((memRange.offset + memRange.size) <= memObject.allocationSize)
2387 }
2388
2389 return ?
2390}
2391
2392
2393// Memory management API functions
2394
2395cmd VkResult vkGetDeviceMemoryCommitment(
2396 VkDevice device,
2397 VkDeviceMemory memory,
2398 platform.VkDeviceSize* pCommittedMemoryInBytes) {
2399 deviceObject := GetDevice(device)
2400
2401 if memory != VK_NULL_HANDLE {
2402 memoryObject := GetDeviceMemory(memory)
2403 assert(memoryObject.device == device)
2404 }
2405
2406 committedMemoryInBytes := ?
2407 pCommittedMemoryInBytes[0] = committedMemoryInBytes
2408
2409 return ?
2410}
2411
2412cmd VkResult vkGetBufferMemoryRequirements(
2413 VkDevice device,
2414 VkBuffer buffer,
2415 VkMemoryRequirements* pMemoryRequirements) {
2416 deviceObject := GetDevice(device)
2417 bufferObject := GetBuffer(buffer)
2418 assert(bufferObject.device == device)
2419
2420 return ?
2421}
2422
2423cmd VkResult vkBindBufferMemory(
2424 VkDevice device,
2425 VkBuffer buffer,
2426 VkDeviceMemory mem,
2427 platform.VkDeviceSize memOffset) {
2428 deviceObject := GetDevice(device)
2429 bufferObject := GetBuffer(buffer)
2430 assert(bufferObject.device == device)
2431
2432 // Unbind buffer from previous memory object, if not VK_NULL_HANDLE.
2433 if bufferObject.mem != VK_NULL_HANDLE {
2434 memObject := GetDeviceMemory(bufferObject.mem)
2435 memObject.boundObjects[as!u64(buffer)] = null
2436 }
2437
2438 // Bind buffer to given memory object, if not VK_NULL_HANDLE.
2439 if mem != VK_NULL_HANDLE {
2440 memObject := GetDeviceMemory(mem)
2441 assert(memObject.device == device)
2442 memObject.boundObjects[as!u64(buffer)] = memOffset
2443 }
2444 bufferObject.mem = mem
2445 bufferObject.memOffset = memOffset
2446
2447 return ?
2448}
2449
2450cmd VkResult vkGetImageMemoryRequirements(
2451 VkDevice device,
2452 VkImage image,
2453 VkMemoryRequirements* pMemoryRequirements) {
2454 deviceObject := GetDevice(device)
2455 imageObject := GetImage(image)
2456 assert(imageObject.device == device)
2457
2458 return ?
2459}
2460
2461cmd VkResult vkBindImageMemory(
2462 VkDevice device,
2463 VkImage image,
2464 VkDeviceMemory mem,
2465 platform.VkDeviceSize memOffset) {
2466 deviceObject := GetDevice(device)
2467 imageObject := GetImage(image)
2468 assert(imageObject.device == device)
2469
2470 // Unbind image from previous memory object, if not VK_NULL_HANDLE.
2471 if imageObject.mem != VK_NULL_HANDLE {
2472 memObject := GetDeviceMemory(imageObject.mem)
2473 memObject.boundObjects[as!u64(image)] = null
2474 }
2475
2476 // Bind image to given memory object, if not VK_NULL_HANDLE.
2477 if mem != VK_NULL_HANDLE {
2478 memObject := GetDeviceMemory(mem)
2479 assert(memObject.device == device)
2480 memObject.boundObjects[as!u64(image)] = memOffset
2481 }
2482 imageObject.mem = mem
2483 imageObject.memOffset = memOffset
2484
2485 return ?
2486}
2487
2488cmd VkResult vkGetImageSparseMemoryRequirements(
2489 VkDevice device,
2490 VkImage image,
2491 u32* pNumRequirements,
2492 VkSparseImageMemoryRequirements* pSparseMemoryRequirements) {
2493 deviceObject := GetDevice(device)
2494 imageObject := GetImage(image)
2495 assert(imageObject.device == device)
2496
2497 return ?
2498}
2499
2500cmd VkResult vkGetPhysicalDeviceSparseImageFormatProperties(
2501 VkPhysicalDevice physicalDevice,
2502 VkFormat format,
2503 VkImageType type,
2504 u32 samples,
2505 VkImageUsageFlags usage,
2506 VkImageTiling tiling,
2507 u32* pNumProperties,
2508 VkSparseImageFormatProperties* pProperties) {
2509 physicalDeviceObject := GetPhysicalDevice(physicalDevice)
2510
2511 return ?
2512}
2513
2514cmd VkResult vkQueueBindSparseBufferMemory(
2515 VkQueue queue,
2516 VkBuffer buffer,
2517 u32 numBindings,
2518 const VkSparseMemoryBindInfo* pBindInfo) {
2519 queueObject := GetQueue(queue)
2520 bufferObject := GetBuffer(buffer)
2521 assert(bufferObject.device == queueObject.device)
2522
2523 return ?
2524}
2525
2526cmd VkResult vkQueueBindSparseImageOpaqueMemory(
2527 VkQueue queue,
2528 VkImage image,
2529 u32 numBindings,
2530 const VkSparseMemoryBindInfo* pBindInfo) {
2531 queueObject := GetQueue(queue)
2532 imageObject := GetImage(image)
2533 assert(imageObject.device == queueObject.device)
2534
2535 return ?
2536}
2537
2538
2539cmd VkResult vkQueueBindSparseImageMemory(
2540 VkQueue queue,
2541 VkImage image,
2542 u32 numBindings,
2543 const VkSparseImageMemoryBindInfo* pBindInfo) {
2544 queueObject := GetQueue(queue)
2545 imageObject := GetImage(image)
2546
2547 return ?
2548}
2549
2550
2551// Fence functions
2552
2553@threadSafety("system")
2554cmd VkResult vkCreateFence(
2555 VkDevice device,
2556 const VkFenceCreateInfo* pCreateInfo,
2557 VkFence* pFence) {
2558 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_FENCE_CREATE_INFO)
2559 deviceObject := GetDevice(device)
2560
2561 fence := ?
2562 pFence[0] = fence
2563 State.Fences[fence] = new!FenceObject(
2564 device: device, signaled: (pCreateInfo.flags == VK_FENCE_CREATE_SIGNALED_BIT))
2565
2566 return ?
2567}
2568
2569@threadSafety("system")
2570cmd VkResult vkDestroyFence(
2571 VkDevice device,
2572 VkFence fence) {
2573 deviceObject := GetDevice(device)
2574 fenceObject := GetFence(fence)
2575 assert(fenceObject.device == device)
2576
2577 State.Fences[fence] = null
2578
2579 return ?
2580}
2581
2582@threadSafety("system")
2583cmd VkResult vkResetFences(
2584 VkDevice device,
2585 u32 fenceCount,
2586 const VkFence* pFences) {
2587 deviceObject := GetDevice(device)
2588
2589 fences := pFences[0:fenceCount]
2590 for i in (0 .. fenceCount) {
2591 fence := fences[i]
2592 fenceObject := GetFence(fence)
2593 assert(fenceObject.device == device)
2594 fenceObject.signaled = false
2595 }
2596
2597 return ?
2598}
2599
2600@threadSafety("system")
2601cmd VkResult vkGetFenceStatus(
2602 VkDevice device,
2603 VkFence fence) {
2604 deviceObject := GetDevice(device)
2605 fenceObject := GetFence(fence)
2606 assert(fenceObject.device == device)
2607
2608 return ?
2609}
2610
2611@threadSafety("system")
2612cmd VkResult vkWaitForFences(
2613 VkDevice device,
2614 u32 fenceCount,
2615 const VkFence* pFences,
2616 platform.VkBool32 waitAll,
2617 u64 timeout) { /// timeout in nanoseconds
2618 deviceObject := GetDevice(device)
2619
2620 fences := pFences[0:fenceCount]
2621 for i in (0 .. fenceCount) {
2622 fence := fences[i]
2623 fenceObject := GetFence(fence)
2624 assert(fenceObject.device == device)
2625 }
2626
2627 return ?
2628}
2629
2630
2631// Queue semaphore functions
2632
2633@threadSafety("system")
2634cmd VkResult vkCreateSemaphore(
2635 VkDevice device,
2636 const VkSemaphoreCreateInfo* pCreateInfo,
2637 VkSemaphore* pSemaphore) {
2638 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO)
2639 deviceObject := GetDevice(device)
2640
2641 semaphore := ?
2642 pSemaphore[0] = semaphore
2643 State.Semaphores[semaphore] = new!SemaphoreObject(device: device)
2644
2645 return ?
2646}
2647
2648@threadSafety("system")
2649cmd VkResult vkDestroySemaphore(
2650 VkDevice device,
2651 VkSemaphore semaphore) {
2652 deviceObject := GetDevice(device)
2653 semaphoreObject := GetSemaphore(semaphore)
2654 assert(semaphoreObject.device == device)
2655
2656 State.Semaphores[semaphore] = null
2657
2658 return ?
2659}
2660
2661@threadSafety("app")
2662cmd VkResult vkQueueSignalSemaphore(
2663 VkQueue queue,
2664 VkSemaphore semaphore) {
2665 queueObject := GetQueue(queue)
2666 semaphoreObject := GetSemaphore(semaphore)
2667 assert(queueObject.device == semaphoreObject.device)
2668
2669 return ?
2670}
2671
2672@threadSafety("system")
2673cmd VkResult vkQueueWaitSemaphore(
2674 VkQueue queue,
2675 VkSemaphore semaphore) {
2676 queueObject := GetQueue(queue)
2677 semaphoreObject := GetSemaphore(semaphore)
2678 assert(queueObject.device == semaphoreObject.device)
2679
2680 return ?
2681}
2682
2683
2684// Event functions
2685
2686@threadSafety("system")
2687cmd VkResult vkCreateEvent(
2688 VkDevice device,
2689 const VkEventCreateInfo* pCreateInfo,
2690 VkEvent* pEvent) {
2691 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_EVENT_CREATE_INFO)
2692 deviceObject := GetDevice(device)
2693
2694 event := ?
2695 pEvent[0] = event
2696 State.Events[event] = new!EventObject(device: device)
2697
2698 return ?
2699}
2700
2701@threadSafety("system")
2702cmd VkResult vkDestroyEvent(
2703 VkDevice device,
2704 VkEvent event) {
2705 deviceObject := GetDevice(device)
2706 eventObject := GetEvent(event)
2707 assert(eventObject.device == device)
2708
2709 State.Events[event] = null
2710
2711 return ?
2712}
2713
2714@threadSafety("system")
2715cmd VkResult vkGetEventStatus(
2716 VkDevice device,
2717 VkEvent event) {
2718 deviceObject := GetDevice(device)
2719 eventObject := GetEvent(event)
2720 assert(eventObject.device == device)
2721
2722 return ?
2723}
2724
2725@threadSafety("system")
2726cmd VkResult vkSetEvent(
2727 VkDevice device,
2728 VkEvent event) {
2729 deviceObject := GetDevice(device)
2730 eventObject := GetEvent(event)
2731 assert(eventObject.device == device)
2732
2733 return ?
2734}
2735
2736@threadSafety("system")
2737cmd VkResult vkResetEvent(
2738 VkDevice device,
2739 VkEvent event) {
2740 deviceObject := GetDevice(device)
2741 eventObject := GetEvent(event)
2742 assert(eventObject.device == device)
2743
2744 return ?
2745}
2746
2747
2748// Query functions
2749
2750@threadSafety("system")
2751cmd VkResult vkCreateQueryPool(
2752 VkDevice device,
2753 const VkQueryPoolCreateInfo* pCreateInfo,
2754 VkQueryPool* pQueryPool) {
2755 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO)
2756 deviceObject := GetDevice(device)
2757
2758 queryPool := ?
2759 pQueryPool[0] = queryPool
2760 State.QueryPools[queryPool] = new!QueryPoolObject(device: device)
2761
2762 return ?
2763}
2764
2765@threadSafety("system")
2766cmd VkResult vkDestroyQueryPool(
2767 VkDevice device,
2768 VkQueryPool queryPool) {
2769 deviceObject := GetDevice(device)
2770 queryPoolObject := GetQueryPool(queryPool)
2771 assert(queryPoolObject.device == device)
2772
2773 State.QueryPools[queryPool] = null
2774
2775 return ?
2776}
2777
2778@threadSafety("system")
2779cmd VkResult vkGetQueryPoolResults(
2780 VkDevice device,
2781 VkQueryPool queryPool,
2782 u32 startQuery,
2783 u32 queryCount,
2784 platform.size_t* pDataSize,
2785 void* pData,
2786 VkQueryResultFlags flags) {
2787 deviceObject := GetDevice(device)
2788 queryPoolObject := GetQueryPool(queryPool)
2789 assert(queryPoolObject.device == device)
2790
2791 dataSize := ?
2792 pDataSize[0] = dataSize
2793 data := pData[0:dataSize]
2794
2795 return ?
2796}
2797
2798// Buffer functions
2799
2800@threadSafety("system")
2801cmd VkResult vkCreateBuffer(
2802 VkDevice device,
2803 const VkBufferCreateInfo* pCreateInfo,
2804 VkBuffer* pBuffer) {
2805 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO)
2806 deviceObject := GetDevice(device)
2807
2808 buffer := ?
2809 pBuffer[0] = buffer
2810 State.Buffers[buffer] = new!BufferObject(device: device)
2811
2812 return ?
2813}
2814
2815@threadSafety("system")
2816cmd VkResult vkDestroyBuffer(
2817 VkDevice device,
2818 VkBuffer buffer) {
2819 deviceObject := GetDevice(device)
2820 bufferObject := GetBuffer(buffer)
2821 assert(bufferObject.device == device)
2822
2823 assert(bufferObject.mem == 0)
2824 State.Buffers[buffer] = null
2825
2826 return ?
2827}
2828
2829
2830// Buffer view functions
2831
2832@threadSafety("system")
2833cmd VkResult vkCreateBufferView(
2834 VkDevice device,
2835 const VkBufferViewCreateInfo* pCreateInfo,
2836 VkBufferView* pView) {
2837 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO)
2838 deviceObject := GetDevice(device)
2839
2840 bufferObject := GetBuffer(pCreateInfo.buffer)
2841 assert(bufferObject.device == device)
2842
2843 view := ?
2844 pView[0] = view
2845 State.BufferViews[view] = new!BufferViewObject(device: device, buffer: pCreateInfo.buffer)
2846
2847 return ?
2848}
2849
2850@threadSafety("system")
2851cmd VkResult vkDestroyBufferView(
2852 VkDevice device,
2853 VkBufferView bufferView) {
2854 deviceObject := GetDevice(device)
2855 bufferViewObject := GetBufferView(bufferView)
2856 assert(bufferViewObject.device == device)
2857
2858 State.BufferViews[bufferView] = null
2859
2860 return ?
2861}
2862
2863
2864// Image functions
2865
2866@threadSafety("system")
2867cmd VkResult vkCreateImage(
2868 VkDevice device,
2869 const VkImageCreateInfo* pCreateInfo,
2870 VkImage* pImage) {
2871 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO)
2872 deviceObject := GetDevice(device)
2873
2874 image := ?
2875 pImage[0] = image
2876 State.Images[image] = new!ImageObject(device: device)
2877
2878 return ?
2879}
2880
2881@threadSafety("system")
2882cmd VkResult vkDestroyImage(
2883 VkDevice device,
2884 VkImage image) {
2885 deviceObject := GetDevice(device)
2886 imageObject := GetImage(image)
2887 assert(imageObject.device == device)
2888
2889 assert(imageObject.mem == 0)
2890 State.Images[image] = null
2891
2892 return ?
2893}
2894
2895cmd VkResult vkGetImageSubresourceLayout(
2896 VkDevice device,
2897 VkImage image,
2898 const VkImageSubresource* pSubresource,
2899 VkSubresourceLayout* pLayout) {
2900 deviceObject := GetDevice(device)
2901 imageObject := GetImage(image)
2902 assert(imageObject.device == device)
2903
2904 return ?
2905}
2906
2907
2908// Image view functions
2909
2910@threadSafety("system")
2911cmd VkResult vkCreateImageView(
2912 VkDevice device,
2913 const VkImageViewCreateInfo* pCreateInfo,
2914 VkImageView* pView) {
2915 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO)
2916 deviceObject := GetDevice(device)
2917
2918 imageObject := GetImage(pCreateInfo.image)
2919 assert(imageObject.device == device)
2920
2921 view := ?
2922 pView[0] = view
2923 State.ImageViews[view] = new!ImageViewObject(device: device, image: pCreateInfo.image)
2924
2925 return ?
2926}
2927
2928@threadSafety("system")
2929cmd VkResult vkDestroyImageView(
2930 VkDevice device,
2931 VkImageView imageView) {
2932 deviceObject := GetDevice(device)
2933 imageViewObject := GetImageView(imageView)
2934 assert(imageViewObject.device == device)
2935
2936 State.ImageViews[imageView] = null
2937
2938 return ?
2939}
2940
2941@threadSafety("system")
2942cmd VkResult vkCreateAttachmentView(
2943 VkDevice device,
2944 const VkAttachmentViewCreateInfo* pCreateInfo,
2945 VkAttachmentView* pView) {
2946 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_ATTACHMENT_VIEW_CREATE_INFO)
2947 deviceObject := GetDevice(device)
2948
2949 imageObject := GetImage(pCreateInfo.image)
2950 assert(imageObject.device == device)
2951
2952 view := ?
2953 pView[0] = view
2954 State.AttachmentViews[view] = new!AttachmentViewObject(device: device, image: pCreateInfo.image)
2955
2956 return ?
2957}
2958
2959@threadSafety("system")
2960cmd VkResult vkDestroyAttachmentView(
2961 VkDevice device,
2962 VkAttachmentView attachmentView) {
2963 deviceObject := GetDevice(device)
2964 attachmentViewObject := GetAttachmentView(attachmentView)
2965 assert(attachmentViewObject.device == device)
2966
2967 State.AttachmentViews[attachmentView] = null
2968
2969 return ?
2970}
2971
2972
2973// Shader functions
2974
2975cmd VkResult vkCreateShaderModule(
2976 VkDevice device,
2977 const VkShaderModuleCreateInfo* pCreateInfo,
2978 VkShaderModule* pShaderModule) {
2979 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO)
2980 deviceObject := GetDevice(device)
2981
2982 shaderModule := ?
2983 pShaderModule[0] = shaderModule
2984 State.ShaderModules[shaderModule] = new!ShaderModuleObject(device: device)
2985
2986 return ?
2987}
2988
2989cmd VkResult vkDestroyShaderModule(
2990 VkDevice device,
2991 VkShaderModule shaderModule) {
2992 deviceObject := GetDevice(device)
2993 shaderModuleObject := GetShaderModule(shaderModule)
2994 assert(shaderModuleObject.device == device)
2995
2996 State.ShaderModules[shaderModule] = null
2997
2998 return ?
2999}
3000
3001@threadSafety("system")
3002cmd VkResult vkCreateShader(
3003 VkDevice device,
3004 const VkShaderCreateInfo* pCreateInfo,
3005 VkShader* pShader) {
3006 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_SHADER_CREATE_INFO)
3007 deviceObject := GetDevice(device)
3008
3009 shader := ?
3010 pShader[0] = shader
3011 State.Shaders[shader] = new!ShaderObject(device: device)
3012
3013 return ?
3014}
3015
3016@threadSafety("system")
3017cmd VkResult vkDestroyShader(
3018 VkDevice device,
3019 VkShader shader) {
3020 deviceObject := GetDevice(device)
3021 shaderObject := GetShader(shader)
3022 assert(shaderObject.device == device)
3023
3024 State.Shaders[shader] = null
3025
3026 return ?
3027}
3028
3029
3030// Pipeline functions
3031
3032cmd VkResult vkCreatePipelineCache(
3033 VkDevice device,
3034 const VkPipelineCacheCreateInfo* pCreateInfo,
3035 VkPipelineCache* pPipelineCache) {
3036 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO)
3037 deviceObject := GetDevice(device)
3038
3039 pipelineCache := ?
3040 pPipelineCache[0] = pipelineCache
3041 State.PipelineCaches[pipelineCache] = new!PipelineCacheObject(device: device)
3042
3043 return ?
3044}
3045
3046cmd VkResult vkDestroyPipelineCache(
3047 VkDevice device,
3048 VkPipelineCache pipelineCache) {
3049 deviceObject := GetDevice(device)
3050 pipelineCacheObject := GetPipelineCache(pipelineCache)
3051 assert(pipelineCacheObject.device == device)
3052
3053 State.PipelineCaches[pipelineCache] = null
3054
3055 return ?
3056}
3057
3058cmd platform.size_t vkGetPipelineCacheSize(
3059 VkDevice device,
3060 VkPipelineCache pipelineCache) {
3061 deviceObject := GetDevice(device)
3062 pipelineCacheObject := GetPipelineCache(pipelineCache)
3063 assert(pipelineCacheObject.device == device)
3064
3065 return ?
3066}
3067
3068cmd VkResult vkGetPipelineCacheData(
3069 VkDevice device,
3070 VkPipelineCache pipelineCache,
3071 void* pData) {
3072 deviceObject := GetDevice(device)
3073 pipelineCacheObject := GetPipelineCache(pipelineCache)
3074 assert(pipelineCacheObject.device == device)
3075
3076 return ?
3077}
3078
3079cmd VkResult vkMergePipelineCaches(
3080 VkDevice device,
3081 VkPipelineCache destCache,
3082 u32 srcCacheCount,
3083 const VkPipelineCache* pSrcCaches) {
3084 deviceObject := GetDevice(device)
3085 destCacheObject := GetPipelineCache(destCache)
3086 assert(destCacheObject.device == device)
3087
3088 srcCaches := pSrcCaches[0:srcCacheCount]
3089 for i in (0 .. srcCacheCount) {
3090 srcCache := srcCaches[i]
3091 srcCacheObject := GetPipelineCache(srcCache)
3092 assert(srcCacheObject.device == device)
3093 }
3094
3095 return ?
3096}
3097
3098cmd VkResult vkCreateGraphicsPipelines(
3099 VkDevice device,
3100 VkPipelineCache pipelineCache,
3101 u32 count,
3102 const VkGraphicsPipelineCreateInfo* pCreateInfos,
3103 VkPipeline* pPipelines) {
3104 deviceObject := GetDevice(device)
3105 if pipelineCache != VK_NULL_HANDLE {
3106 pipelineCacheObject := GetPipelineCache(pipelineCache)
3107 assert(pipelineCacheObject.device == device)
3108 }
3109
3110 createInfos := pCreateInfos[0:count]
3111 pipelines := pPipelines[0:count]
3112 for i in (0 .. count) {
3113 pipeline := ?
3114 pipelines[i] = pipeline
3115 State.Pipelines[pipeline] = new!PipelineObject(device: device)
3116 }
3117
3118 return ?
3119}
3120
3121cmd VkResult vkCreateComputePipelines(
3122 VkDevice device,
3123 VkPipelineCache pipelineCache,
3124 u32 count,
3125 const VkComputePipelineCreateInfo* pCreateInfos,
3126 VkPipeline* pPipelines) {
3127 deviceObject := GetDevice(device)
3128 if pipelineCache != VK_NULL_HANDLE {
3129 pipelineCacheObject := GetPipelineCache(pipelineCache)
3130 assert(pipelineCacheObject.device == device)
3131 }
3132
3133 createInfos := pCreateInfos[0:count]
3134 pipelines := pPipelines[0:count]
3135 for i in (0 .. count) {
3136 pipeline := ?
3137 pipelines[i] = pipeline
3138 State.Pipelines[pipeline] = new!PipelineObject(device: device)
3139 }
3140
3141 return ?
3142}
3143
3144@threadSafety("system")
3145cmd VkResult vkDestroyPipeline(
3146 VkDevice device,
3147 VkPipeline pipeline) {
3148 deviceObject := GetDevice(device)
3149 pipelineObjects := GetPipeline(pipeline)
3150 assert(pipelineObjects.device == device)
3151
3152 State.Pipelines[pipeline] = null
3153
3154 return ?
3155}
3156
3157
3158// Pipeline layout functions
3159
3160@threadSafety("system")
3161cmd VkResult vkCreatePipelineLayout(
3162 VkDevice device,
3163 const VkPipelineLayoutCreateInfo* pCreateInfo,
3164 VkPipelineLayout* pPipelineLayout) {
3165 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO)
3166 deviceObject := GetDevice(device)
3167
3168 pipelineLayout := ?
3169 pPipelineLayout[0] = pipelineLayout
3170 State.PipelineLayouts[pipelineLayout] = new!PipelineLayoutObject(device: device)
3171
3172 return ?
3173}
3174
3175@threadSafety("system")
3176cmd VkResult vkDestroyPipelineLayout(
3177 VkDevice device,
3178 VkPipelineLayout pipelineLayout) {
3179 deviceObject := GetDevice(device)
3180 pipelineLayoutObjects := GetPipelineLayout(pipelineLayout)
3181 assert(pipelineLayoutObjects.device == device)
3182
3183 State.PipelineLayouts[pipelineLayout] = null
3184
3185 return ?
3186}
3187
3188
3189// Sampler functions
3190
3191@threadSafety("system")
3192cmd VkResult vkCreateSampler(
3193 VkDevice device,
3194 const VkSamplerCreateInfo* pCreateInfo,
3195 VkSampler* pSampler) {
3196 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO)
3197 deviceObject := GetDevice(device)
3198
3199 sampler := ?
3200 pSampler[0] = sampler
3201 State.Samplers[sampler] = new!SamplerObject(device: device)
3202
3203 return ?
3204}
3205
3206@threadSafety("system")
3207cmd VkResult vkDestroySampler(
3208 VkDevice device,
3209 VkSampler sampler) {
3210 deviceObject := GetDevice(device)
3211 samplerObject := GetSampler(sampler)
3212 assert(samplerObject.device == device)
3213
3214 State.Samplers[sampler] = null
3215
3216 return ?
3217}
3218
3219
3220// Descriptor set functions
3221
3222@threadSafety("system")
3223cmd VkResult vkCreateDescriptorSetLayout(
3224 VkDevice device,
3225 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
3226 VkDescriptorSetLayout* pSetLayout) {
3227 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO)
3228 deviceObject := GetDevice(device)
3229
3230 setLayout := ?
3231 pSetLayout[0] = setLayout
3232 State.DescriptorSetLayouts[setLayout] = new!DescriptorSetLayoutObject(device: device)
3233
3234 return ?
3235}
3236
3237@threadSafety("system")
3238cmd VkResult vkDestroyDescriptorSetLayout(
3239 VkDevice device,
3240 VkDescriptorSetLayout descriptorSetLayout) {
3241 deviceObject := GetDevice(device)
3242 descriptorSetLayoutObject := GetDescriptorSetLayout(descriptorSetLayout)
3243 assert(descriptorSetLayoutObject.device == device)
3244
3245 State.DescriptorSetLayouts[descriptorSetLayout] = null
3246
3247 return ?
3248}
3249
3250@threadSafety("system")
3251cmd VkResult vkCreateDescriptorPool(
3252 VkDevice device,
3253 VkDescriptorPoolUsage poolUsage,
3254 u32 maxSets,
3255 const VkDescriptorPoolCreateInfo* pCreateInfo,
3256 VkDescriptorPool* pDescriptorPool) {
3257 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO)
3258 deviceObject := GetDevice(device)
3259
3260 descriptorPool := ?
3261 pDescriptorPool[0] = descriptorPool
3262 State.DescriptorPools[descriptorPool] = new!DescriptorPoolObject(device: device)
3263
3264 return ?
3265}
3266
3267@threadSafety("system")
3268cmd VkResult vkDestroyDescriptorPool(
3269 VkDevice device,
3270 VkDescriptorPool descriptorPool) {
3271 deviceObject := GetDevice(device)
3272 descriptorPoolObject := GetDescriptorPool(descriptorPool)
3273 assert(descriptorPoolObject.device == device)
3274
3275 State.DescriptorPools[descriptorPool] = null
3276
3277 return ?
3278}
3279
3280@threadSafety("app")
3281cmd VkResult vkResetDescriptorPool(
3282 VkDevice device,
3283 VkDescriptorPool descriptorPool) {
3284 deviceObject := GetDevice(device)
3285 descriptorPoolObject := GetDescriptorPool(descriptorPool)
3286 assert(descriptorPoolObject.device == device)
3287
3288 return ?
3289}
3290
3291@threadSafety("app")
3292cmd VkResult vkAllocDescriptorSets(
3293 VkDevice device,
3294 VkDescriptorPool descriptorPool,
3295 VkDescriptorSetUsage setUsage,
3296 u32 count,
3297 const VkDescriptorSetLayout* pSetLayouts,
3298 VkDescriptorSet* pDescriptorSets,
3299 u32* pCount) {
3300 deviceObject := GetDevice(device)
3301 descriptorPoolObject := GetDescriptorPool(descriptorPool)
3302
3303 setLayouts := pSetLayouts[0:count]
3304 for i in (0 .. count) {
3305 setLayout := setLayouts[i]
3306 setLayoutObject := GetDescriptorSetLayout(setLayout)
3307 assert(setLayoutObject.device == device)
3308 }
3309
3310 setsCount := as!u32(?)
3311 pCount[0] = setsCount
3312 descriptorSets := pDescriptorSets[0:setsCount]
3313 for i in (0 .. setsCount) {
3314 descriptorSet := ?
3315 descriptorSets[i] = descriptorSet
3316 State.DescriptorSets[descriptorSet] = new!DescriptorSetObject(device: device)
3317 }
3318
3319 return ?
3320}
3321
Jesse Hallf09c6b12015-08-15 19:54:28 -07003322cmd VkResult vkFreeDescriptorSets(
3323 VkDevice device,
3324 VkDescriptorPool descriptorPool,
3325 u32 count,
3326 const VkDescriptorSet* pDescriptorSets) {
3327 deviceObject := GetDevice(device)
3328 descriptorPoolObject := GetDescriptorPool(descriptorPool)
3329
3330 descriptorSets := pDescriptorSets[0:count]
3331 for i in (0 .. count) {
3332 descriptorSet := descriptorSets[i]
3333 descriptorSetObject := GetDescriptorSet(descriptorSet)
3334 assert(descriptorSetObject.device == device)
3335 State.DescriptorSets[descriptorSet] = null
3336 }
3337
3338 return ?
3339}
3340
Jesse Halld27f6aa2015-08-15 17:58:48 -07003341cmd VkResult vkUpdateDescriptorSets(
3342 VkDevice device,
3343 u32 writeCount,
3344 const VkWriteDescriptorSet* pDescriptorWrites,
3345 u32 copyCount,
3346 const VkCopyDescriptorSet* pDescriptorCopies) {
3347 deviceObject := GetDevice(device)
3348
3349 descriptorWrites := pDescriptorWrites[0:writeCount]
3350 for i in (0 .. writeCount) {
3351 descriptorWrite := descriptorWrites[i]
3352 descriptorWriteObject := GetDescriptorSet(descriptorWrite.destSet)
3353 assert(descriptorWriteObject.device == device)
3354 }
3355
3356 descriptorCopies := pDescriptorCopies[0:copyCount]
3357 for i in (0 .. copyCount) {
3358 descriptorCopy := descriptorCopies[i]
3359 descriptorCopyObject := GetDescriptorSet(descriptorCopy.destSet)
3360 assert(descriptorCopyObject.device == device)
3361 }
3362
3363 return ?
3364}
3365
3366
3367// State object functions
3368
3369@threadSafety("system")
3370cmd VkResult vkCreateDynamicViewportState(
3371 VkDevice device,
3372 const VkDynamicViewportStateCreateInfo* pCreateInfo,
3373 VkDynamicViewportState* pState) {
3374 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DYNAMIC_VIEWPORT_STATE_CREATE_INFO)
3375 deviceObject := GetDevice(device)
3376
3377 state := ?
3378 pState[0] = state
3379 State.DynamicViewportStates[state] = new!DynamicViewportStateObject(device: device)
3380
3381 return ?
3382}
3383
3384@threadSafety("system")
3385cmd VkResult vkDestroyDynamicViewportState(
3386 VkDevice device,
3387 VkDynamicViewportState dynamicViewportState) {
3388 deviceObject := GetDevice(device)
3389 dynamicViewportStateObject := GetDynamicViewportState(dynamicViewportState)
3390 assert(dynamicViewportStateObject.device == device)
3391
3392 State.DynamicViewportStates[dynamicViewportState] = null
3393
3394 return ?
3395}
3396
3397@threadSafety("system")
3398cmd VkResult vkCreateDynamicRasterState(
3399 VkDevice device,
3400 const VkDynamicRasterStateCreateInfo* pCreateInfo,
3401 VkDynamicRasterState* pState) {
3402 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DYNAMIC_RASTER_STATE_CREATE_INFO)
3403 deviceObject := GetDevice(device)
3404
3405 state := ?
3406 pState[0] = state
3407 State.DynamicRasterStates[state] = new!DynamicRasterStateObject(device: device)
3408
3409 return ?
3410}
3411
3412@threadSafety("system")
3413cmd VkResult vkDestroyDynamicRasterState(
3414 VkDevice device,
3415 VkDynamicRasterState dynamicRasterState) {
3416 deviceObject := GetDevice(device)
3417 dynamicRasterStateObject := GetDynamicRasterState(dynamicRasterState)
3418 assert(dynamicRasterStateObject.device == device)
3419
3420 State.DynamicRasterStates[dynamicRasterState] = null
3421
3422 return ?
3423}
3424
3425@threadSafety("system")
3426cmd VkResult vkCreateDynamicColorBlendState(
3427 VkDevice device,
3428 const VkDynamicColorBlendStateCreateInfo* pCreateInfo,
3429 VkDynamicColorBlendState* pState) {
3430 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DYNAMIC_COLOR_BLEND_STATE_CREATE_INFO)
3431 deviceObject := GetDevice(device)
3432
3433 state := ?
3434 pState[0] = state
3435 State.DynamicColorBlendStates[state] = new!DynamicColorBlendStateObject(device: device)
3436
3437 return ?
3438}
3439
3440@threadSafety("system")
3441cmd VkResult vkDestroyDynamicColorBlendState(
3442 VkDevice device,
3443 VkDynamicColorBlendState dynamicColorBlendState) {
3444 deviceObject := GetDevice(device)
3445 dynamicColorBlendStateObject := GetDynamicColorBlendState(dynamicColorBlendState)
3446 assert(dynamicColorBlendStateObject.device == device)
3447
3448 State.DynamicColorBlendStates[dynamicColorBlendState] = null
3449
3450 return ?
3451}
3452
3453@threadSafety("system")
3454cmd VkResult vkCreateDynamicDepthStencilState(
3455 VkDevice device,
3456 const VkDynamicDepthStencilStateCreateInfo* pCreateInfo,
3457 VkDynamicDepthStencilState* pState) {
3458 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_DYNAMIC_DEPTH_STENCIL_STATE_CREATE_INFO)
3459 deviceObject := GetDevice(device)
3460
3461 state := ?
3462 pState[0] = state
3463 State.DynamicDepthStencilStates[state] = new!DynamicDepthStencilStateObject(device: device)
3464
3465 return ?
3466}
3467
3468@threadSafety("system")
3469cmd VkResult vkDestroyDynamicDepthStencilState(
3470 VkDevice device,
3471 VkDynamicDepthStencilState dynamicDepthStencilState) {
3472 deviceObject := GetDevice(device)
3473 dynamicDepthStencilStateObject := GetDynamicDepthStencilState(dynamicDepthStencilState)
3474 assert(dynamicDepthStencilStateObject.device == device)
3475
3476 State.DynamicDepthStencilStates[dynamicDepthStencilState] = null
3477
3478 return ?
3479}
3480
3481
3482// Framebuffer functions
3483
3484@threadSafety("system")
3485cmd VkResult vkCreateFramebuffer(
3486 VkDevice device,
3487 const VkFramebufferCreateInfo* pCreateInfo,
3488 VkFramebuffer* pFramebuffer) {
3489 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO)
3490 deviceObject := GetDevice(device)
3491
3492 framebuffer := ?
3493 pFramebuffer[0] = framebuffer
3494 State.Framebuffers[framebuffer] = new!FramebufferObject(device: device)
3495
3496 return ?
3497}
3498
3499@threadSafety("system")
3500cmd VkResult vkDestroyFramebuffer(
3501 VkDevice device,
3502 VkFramebuffer framebuffer) {
3503 deviceObject := GetDevice(device)
3504 framebufferObject := GetFramebuffer(framebuffer)
3505 assert(framebufferObject.device == device)
3506
3507 State.Framebuffers[framebuffer] = null
3508
3509 return ?
3510}
3511
3512
3513// Renderpass functions
3514
3515@threadSafety("system")
3516cmd VkResult vkCreateRenderPass(
3517 VkDevice device,
3518 const VkRenderPassCreateInfo* pCreateInfo,
3519 VkRenderPass* pRenderPass) {
3520 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO)
3521 deviceObject := GetDevice(device)
3522
3523 renderpass := ?
3524 pRenderPass[0] = renderpass
3525 State.RenderPasses[renderpass] = new!RenderPassObject(device: device)
3526
3527 return ?
3528}
3529
3530@threadSafety("system")
3531cmd VkResult vkDestroyRenderPass(
3532 VkDevice device,
3533 VkRenderPass renderPass) {
3534 deviceObject := GetDevice(device)
3535 renderPassObject := GetRenderPass(renderPass)
3536 assert(renderPassObject.device == device)
3537
3538 State.RenderPasses[renderPass] = null
3539
3540 return ?
3541}
3542
3543cmd VkResult vkGetRenderAreaGranularity(
3544 VkDevice device,
3545 VkRenderPass renderPass,
3546 VkExtent2D* pGranularity) {
3547 deviceObject := GetDevice(device)
3548 renderPassObject := GetRenderPass(renderPass)
3549
3550 granularity := ?
3551 pGranularity[0] = granularity
3552
3553 return ?
3554}
3555
3556// Command pool functions
3557
3558cmd VkResult vkCreateCommandPool(
3559 VkDevice device,
3560 const VkCmdPoolCreateInfo* pCreateInfo,
3561 VkCmdPool* pCmdPool) {
3562 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO)
3563 deviceObject := GetDevice(device)
3564
3565 cmdPool := ?
3566 pCmdPool[0] = cmdPool
3567 State.CmdPools[cmdPool] = new!CmdPoolObject(device: device)
3568
3569 return ?
3570}
3571
3572cmd VkResult vkDestroyCommandPool(
3573 VkDevice device,
3574 VkCmdPool cmdPool) {
3575 deviceObject := GetDevice(device)
3576 cmdPoolObject := GetCmdPool(cmdPool)
3577 assert(cmdPoolObject.device == device)
3578
3579 State.CmdPools[cmdPool] = null
3580
3581 return ?
3582}
3583
3584cmd VkResult vkResetCommandPool(
3585 VkDevice device,
3586 VkCmdPool cmdPool,
3587 VkCmdPoolResetFlags flags) {
3588 deviceObject := GetDevice(device)
3589 cmdPoolObject := GetCmdPool(cmdPool)
3590 assert(cmdPoolObject.device == device)
3591
3592 return ?
3593}
3594
3595// Command buffer functions
3596
3597macro void bindCmdBuffer(VkCmdBuffer cmdBuffer, any obj, VkDeviceMemory mem) {
3598 memoryObject := GetDeviceMemory(mem)
3599 memoryObject.boundCommandBuffers[cmdBuffer] = cmdBuffer
3600
3601 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3602 cmdBufferObject.boundObjects[as!u64(obj)] = mem
3603}
3604
3605macro void unbindCmdBuffer(VkCmdBuffer cmdBuffer, any obj, VkDeviceMemory mem) {
3606 memoryObject := GetDeviceMemory(mem)
3607 memoryObject.boundCommandBuffers[cmdBuffer] = null
3608
3609 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3610 cmdBufferObject.boundObjects[as!u64(obj)] = null
3611}
3612
3613@threadSafety("system")
3614cmd VkResult vkCreateCommandBuffer(
3615 VkDevice device,
3616 const VkCmdBufferCreateInfo* pCreateInfo,
3617 VkCmdBuffer* pCmdBuffer) {
3618 assert(pCreateInfo.sType == VK_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO)
3619
3620 cmdBuffer := ?
3621 pCmdBuffer[0] = cmdBuffer
3622 State.CmdBuffers[cmdBuffer] = new!CmdBufferObject(device: device)
3623
3624 return ?
3625}
3626
3627@threadSafety("system")
3628cmd VkResult vkDestroyCommandBuffer(
3629 VkDevice device,
3630 VkCmdBuffer commandBuffer) {
3631 deviceObject := GetDevice(device)
3632 cmdBufferObject := GetCmdBuffer(commandBuffer)
3633 assert(cmdBufferObject.device == device)
3634
3635 // TODO: iterate over boundObjects and clear memory bindings
3636 State.CmdBuffers[commandBuffer] = null
3637
3638 return ?
3639}
3640
3641@threadSafety("app")
3642cmd VkResult vkBeginCommandBuffer(
3643 VkCmdBuffer cmdBuffer,
3644 const VkCmdBufferBeginInfo* pBeginInfo) {
3645 assert(pBeginInfo.sType == VK_STRUCTURE_TYPE_CMD_BUFFER_BEGIN_INFO)
3646 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3647
3648 // TODO: iterate over boundObjects and clear memory bindings
3649
3650 return ?
3651}
3652
3653@threadSafety("app")
3654cmd VkResult vkEndCommandBuffer(
3655 VkCmdBuffer cmdBuffer) {
3656 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3657
3658 return ?
3659}
3660
3661@threadSafety("app")
3662cmd VkResult vkResetCommandBuffer(
3663 VkCmdBuffer cmdBuffer,
3664 VkCmdBufferResetFlags flags) {
3665 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3666
3667 // TODO: iterate over boundObjects and clear memory bindings
3668
3669 return ?
3670}
3671
3672
3673// Command buffer building functions
3674
3675@threadSafety("app")
3676cmd void vkCmdBindPipeline(
3677 VkCmdBuffer cmdBuffer,
3678 VkPipelineBindPoint pipelineBindPoint,
3679 VkPipeline pipeline) {
3680 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3681 pipelineObject := GetPipeline(pipeline)
3682 assert(cmdBufferObject.device == pipelineObject.device)
3683
3684 queueFlags := cmdBufferObject.queueFlags | switch (pipelineBindPoint) {
3685 case VK_PIPELINE_BIND_POINT_COMPUTE: VK_QUEUE_COMPUTE_BIT
3686 case VK_PIPELINE_BIND_POINT_GRAPHICS: VK_QUEUE_GRAPHICS_BIT
3687 }
3688 cmdBufferObject.queueFlags = queueFlags
3689}
3690
3691@threadSafety("app")
3692cmd void vkCmdBindDynamicViewportState(
3693 VkCmdBuffer cmdBuffer,
3694 VkDynamicViewportState dynamicViewportState) {
3695 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3696 dynamicViewportStateObject := GetDynamicViewportState(dynamicViewportState)
3697 assert(cmdBufferObject.device == dynamicViewportStateObject.device)
3698
3699 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
3700 cmdBufferObject.queueFlags = queueFlags
3701}
3702
3703@threadSafety("app")
3704cmd void vkCmdBindDynamicRasterState(
3705 VkCmdBuffer cmdBuffer,
3706 VkDynamicRasterState dynamicRasterState) {
3707 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3708 dynamicRasterStateObject := GetDynamicRasterState(dynamicRasterState)
3709 assert(cmdBufferObject.device == dynamicRasterStateObject.device)
3710
3711 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
3712 cmdBufferObject.queueFlags = queueFlags
3713}
3714
3715@threadSafety("app")
3716cmd void vkCmdBindDynamicColorBlendState(
3717 VkCmdBuffer cmdBuffer,
3718 VkDynamicColorBlendState dynamicColorBlendState) {
3719 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3720 dynamicColorBlendStateObject := GetDynamicColorBlendState(dynamicColorBlendState)
3721 assert(cmdBufferObject.device == dynamicColorBlendStateObject.device)
3722
3723 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
3724 cmdBufferObject.queueFlags = queueFlags
3725}
3726
3727@threadSafety("app")
3728cmd void vkCmdBindDynamicDepthStencilState(
3729 VkCmdBuffer cmdBuffer,
3730 VkDynamicDepthStencilState dynamicDepthStencilState) {
3731 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3732 dynamicDepthStencilStateObject := GetDynamicDepthStencilState(dynamicDepthStencilState)
3733 assert(cmdBufferObject.device == dynamicDepthStencilStateObject.device)
3734
3735 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
3736 cmdBufferObject.queueFlags = queueFlags
3737}
3738
3739@threadSafety("app")
3740cmd void vkCmdBindDescriptorSets(
3741 VkCmdBuffer cmdBuffer,
3742 VkPipelineBindPoint pipelineBindPoint,
3743 VkPipelineLayout layout,
3744 u32 firstSet,
3745 u32 setCount,
3746 const VkDescriptorSet* pDescriptorSets,
3747 u32 dynamicOffsetCount,
3748 const u32* pDynamicOffsets) {
3749 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3750
3751 descriptorSets := pDescriptorSets[0:setCount]
3752 for i in (0 .. setCount) {
3753 descriptorSet := descriptorSets[i]
3754 descriptorSetObject := GetDescriptorSet(descriptorSet)
3755 assert(cmdBufferObject.device == descriptorSetObject.device)
3756 }
3757
3758 dynamicOffsets := pDynamicOffsets[0:dynamicOffsetCount]
3759 for i in (0 .. dynamicOffsetCount) {
3760 dynamicOffset := dynamicOffsets[i]
3761 }
3762
3763 queueFlags := cmdBufferObject.queueFlags | switch (pipelineBindPoint) {
3764 case VK_PIPELINE_BIND_POINT_COMPUTE: VK_QUEUE_COMPUTE_BIT
3765 case VK_PIPELINE_BIND_POINT_GRAPHICS: VK_QUEUE_GRAPHICS_BIT
3766 }
3767 cmdBufferObject.queueFlags = queueFlags
3768}
3769
3770@threadSafety("app")
3771cmd void vkCmdBindIndexBuffer(
3772 VkCmdBuffer cmdBuffer,
3773 VkBuffer buffer,
3774 platform.VkDeviceSize offset,
3775 VkIndexType indexType) {
3776 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3777 bufferObject := GetBuffer(buffer)
3778 assert(cmdBufferObject.device == bufferObject.device)
3779
3780 bindCmdBuffer(cmdBuffer, buffer, bufferObject.mem)
3781
3782 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
3783 cmdBufferObject.queueFlags = queueFlags
3784}
3785
3786@threadSafety("app")
3787cmd void vkCmdBindVertexBuffers(
3788 VkCmdBuffer cmdBuffer,
3789 u32 startBinding,
3790 u32 bindingCount,
3791 const VkBuffer* pBuffers,
3792 const platform.VkDeviceSize* pOffsets) {
3793 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3794
3795 // TODO: check if not [startBinding:startBinding+bindingCount]
3796 buffers := pBuffers[0:bindingCount]
3797 offsets := pOffsets[0:bindingCount]
3798 for i in (0 .. bindingCount) {
3799 buffer := buffers[i]
3800 offset := offsets[i]
3801 bufferObject := GetBuffer(buffer)
3802 assert(cmdBufferObject.device == bufferObject.device)
3803
3804 bindCmdBuffer(cmdBuffer, buffer, bufferObject.mem)
3805 }
3806
3807 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
3808 cmdBufferObject.queueFlags = queueFlags
3809}
3810
3811@threadSafety("app")
3812cmd void vkCmdDraw(
3813 VkCmdBuffer cmdBuffer,
3814 u32 firstVertex,
3815 u32 vertexCount,
3816 u32 firstInstance,
3817 u32 instanceCount) {
3818 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3819
3820 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
3821 cmdBufferObject.queueFlags = queueFlags
3822}
3823
3824@threadSafety("app")
3825cmd void vkCmdDrawIndexed(
3826 VkCmdBuffer cmdBuffer,
3827 u32 firstIndex,
3828 u32 indexCount,
3829 s32 vertexOffset,
3830 u32 firstInstance,
3831 u32 instanceCount) {
3832 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3833
3834 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
3835 cmdBufferObject.queueFlags = queueFlags
3836}
3837
3838@threadSafety("app")
3839cmd void vkCmdDrawIndirect(
3840 VkCmdBuffer cmdBuffer,
3841 VkBuffer buffer,
3842 platform.VkDeviceSize offset,
3843 u32 count,
3844 u32 stride) {
3845 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3846 bufferObject := GetBuffer(buffer)
3847 assert(cmdBufferObject.device == bufferObject.device)
3848
3849 bindCmdBuffer(cmdBuffer, buffer, bufferObject.mem)
3850
3851 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
3852 cmdBufferObject.queueFlags = queueFlags
3853}
3854
3855@threadSafety("app")
3856cmd void vkCmdDrawIndexedIndirect(
3857 VkCmdBuffer cmdBuffer,
3858 VkBuffer buffer,
3859 platform.VkDeviceSize offset,
3860 u32 count,
3861 u32 stride) {
3862 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3863 bufferObject := GetBuffer(buffer)
3864 assert(cmdBufferObject.device == bufferObject.device)
3865
3866 bindCmdBuffer(cmdBuffer, buffer, bufferObject.mem)
3867
3868 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
3869 cmdBufferObject.queueFlags = queueFlags
3870}
3871
3872@threadSafety("app")
3873cmd void vkCmdDispatch(
3874 VkCmdBuffer cmdBuffer,
3875 u32 x,
3876 u32 y,
3877 u32 z) {
3878 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3879
3880 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_COMPUTE_BIT
3881 cmdBufferObject.queueFlags = queueFlags
3882}
3883
3884@threadSafety("app")
3885cmd void vkCmdDispatchIndirect(
3886 VkCmdBuffer cmdBuffer,
3887 VkBuffer buffer,
3888 platform.VkDeviceSize offset) {
3889 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3890 bufferObject := GetBuffer(buffer)
3891 assert(cmdBufferObject.device == bufferObject.device)
3892
3893 bindCmdBuffer(cmdBuffer, buffer, bufferObject.mem)
3894
3895 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_COMPUTE_BIT
3896 cmdBufferObject.queueFlags = queueFlags
3897}
3898
3899@threadSafety("app")
3900cmd void vkCmdCopyBuffer(
3901 VkCmdBuffer cmdBuffer,
3902 VkBuffer srcBuffer,
3903 VkBuffer destBuffer,
3904 u32 regionCount,
3905 const VkBufferCopy* pRegions) {
3906 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3907 srcBufferObject := GetBuffer(srcBuffer)
3908 destBufferObject := GetBuffer(destBuffer)
3909 assert(cmdBufferObject.device == srcBufferObject.device)
3910 assert(cmdBufferObject.device == destBufferObject.device)
3911
3912 regions := pRegions[0:regionCount]
3913 for i in (0 .. regionCount) {
3914 region := regions[i]
3915 }
3916
3917 bindCmdBuffer(cmdBuffer, srcBuffer, srcBufferObject.mem)
3918 bindCmdBuffer(cmdBuffer, destBuffer, destBufferObject.mem)
3919
3920 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_DMA_BIT
3921 cmdBufferObject.queueFlags = queueFlags
3922}
3923
3924@threadSafety("app")
3925cmd void vkCmdCopyImage(
3926 VkCmdBuffer cmdBuffer,
3927 VkImage srcImage,
3928 VkImageLayout srcImageLayout,
3929 VkImage destImage,
3930 VkImageLayout destImageLayout,
3931 u32 regionCount,
3932 const VkImageCopy* pRegions) {
3933 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3934 srcImageObject := GetImage(srcImage)
3935 destImageObject := GetImage(destImage)
3936 assert(cmdBufferObject.device == srcImageObject.device)
3937 assert(cmdBufferObject.device == destImageObject.device)
3938
3939 regions := pRegions[0:regionCount]
3940 for i in (0 .. regionCount) {
3941 region := regions[i]
3942 }
3943
3944 bindCmdBuffer(cmdBuffer, srcImage, srcImageObject.mem)
3945 bindCmdBuffer(cmdBuffer, destImage, destImageObject.mem)
3946
3947 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_DMA_BIT
3948 cmdBufferObject.queueFlags = queueFlags
3949}
3950
3951@threadSafety("app")
3952cmd void vkCmdBlitImage(
3953 VkCmdBuffer cmdBuffer,
3954 VkImage srcImage,
3955 VkImageLayout srcImageLayout,
3956 VkImage destImage,
3957 VkImageLayout destImageLayout,
3958 u32 regionCount,
3959 const VkImageBlit* pRegions,
3960 VkTexFilter filter) {
3961 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3962 srcImageObject := GetImage(srcImage)
3963 destImageObject := GetImage(destImage)
3964 assert(cmdBufferObject.device == srcImageObject.device)
3965 assert(cmdBufferObject.device == destImageObject.device)
3966
3967 regions := pRegions[0:regionCount]
3968 for i in (0 .. regionCount) {
3969 region := regions[i]
3970 }
3971
3972 bindCmdBuffer(cmdBuffer, srcImage, srcImageObject.mem)
3973 bindCmdBuffer(cmdBuffer, destImage, destImageObject.mem)
3974
3975 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
3976 cmdBufferObject.queueFlags = queueFlags
3977}
3978
3979@threadSafety("app")
3980cmd void vkCmdCopyBufferToImage(
3981 VkCmdBuffer cmdBuffer,
3982 VkBuffer srcBuffer,
3983 VkImage destImage,
3984 VkImageLayout destImageLayout,
3985 u32 regionCount,
3986 const VkBufferImageCopy* pRegions) {
3987 cmdBufferObject := GetCmdBuffer(cmdBuffer)
3988 srcBufferObject := GetBuffer(srcBuffer)
3989 destImageObject := GetImage(destImage)
3990 assert(cmdBufferObject.device == srcBufferObject.device)
3991 assert(cmdBufferObject.device == destImageObject.device)
3992
3993 regions := pRegions[0:regionCount]
3994 for i in (0 .. regionCount) {
3995 region := regions[i]
3996 }
3997
3998 bindCmdBuffer(cmdBuffer, srcBuffer, srcBufferObject.mem)
3999 bindCmdBuffer(cmdBuffer, destImage, destImageObject.mem)
4000
4001 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_DMA_BIT
4002 cmdBufferObject.queueFlags = queueFlags
4003}
4004
4005@threadSafety("app")
4006cmd void vkCmdCopyImageToBuffer(
4007 VkCmdBuffer cmdBuffer,
4008 VkImage srcImage,
4009 VkImageLayout srcImageLayout,
4010 VkBuffer destBuffer,
4011 u32 regionCount,
4012 const VkBufferImageCopy* pRegions) {
4013 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4014 srcImageObject := GetImage(srcImage)
4015 destBufferObject := GetBuffer(destBuffer)
4016 assert(cmdBufferObject.device == srcImageObject.device)
4017 assert(cmdBufferObject.device == destBufferObject.device)
4018
4019 regions := pRegions[0:regionCount]
4020 for i in (0 .. regionCount) {
4021 region := regions[i]
4022 }
4023
4024 bindCmdBuffer(cmdBuffer, srcImage, srcImageObject.mem)
4025 bindCmdBuffer(cmdBuffer, destBuffer, destBufferObject.mem)
4026
4027 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_DMA_BIT
4028 cmdBufferObject.queueFlags = queueFlags
4029}
4030
4031@threadSafety("app")
4032cmd void vkCmdUpdateBuffer(
4033 VkCmdBuffer cmdBuffer,
4034 VkBuffer destBuffer,
4035 platform.VkDeviceSize destOffset,
4036 platform.VkDeviceSize dataSize,
4037 const u32* pData) {
4038 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4039 destBufferObject := GetBuffer(destBuffer)
4040 assert(cmdBufferObject.device == destBufferObject.device)
4041
4042 data := pData[0:dataSize]
4043
4044 bindCmdBuffer(cmdBuffer, destBuffer, destBufferObject.mem)
4045
4046 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_DMA_BIT
4047 cmdBufferObject.queueFlags = queueFlags
4048}
4049
4050@threadSafety("app")
4051cmd void vkCmdFillBuffer(
4052 VkCmdBuffer cmdBuffer,
4053 VkBuffer destBuffer,
4054 platform.VkDeviceSize destOffset,
4055 platform.VkDeviceSize fillSize,
4056 u32 data) {
4057 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4058 destBufferObject := GetBuffer(destBuffer)
4059 assert(cmdBufferObject.device == destBufferObject.device)
4060
4061 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_DMA_BIT
4062 cmdBufferObject.queueFlags = queueFlags
4063}
4064
4065@threadSafety("app")
4066cmd void vkCmdClearColorImage(
4067 VkCmdBuffer cmdBuffer,
4068 VkImage image,
4069 VkImageLayout imageLayout,
4070 const VkClearColorValue* pColor,
4071 u32 rangeCount,
4072 const VkImageSubresourceRange* pRanges) {
4073 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4074 imageObject := GetImage(image)
4075 assert(cmdBufferObject.device == imageObject.device)
4076
4077 ranges := pRanges[0:rangeCount]
4078 for i in (0 .. rangeCount) {
4079 range := ranges[i]
4080 }
4081
4082 bindCmdBuffer(cmdBuffer, image, imageObject.mem)
4083
4084 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
4085 cmdBufferObject.queueFlags = queueFlags
4086}
4087
4088@threadSafety("app")
4089cmd void vkCmdClearDepthStencilImage(
4090 VkCmdBuffer cmdBuffer,
4091 VkImage image,
4092 VkImageLayout imageLayout,
4093 f32 depth,
4094 u32 stencil,
4095 u32 rangeCount,
4096 const VkImageSubresourceRange* pRanges) {
4097 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4098 imageObject := GetImage(image)
4099 assert(cmdBufferObject.device == imageObject.device)
4100
4101 ranges := pRanges[0:rangeCount]
4102 for i in (0 .. rangeCount) {
4103 range := ranges[i]
4104 }
4105
4106 bindCmdBuffer(cmdBuffer, image, imageObject.mem)
4107
4108 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
4109 cmdBufferObject.queueFlags = queueFlags
4110}
4111
4112@threadSafety("app")
4113cmd void vkCmdClearColorAttachment(
4114 VkCmdBuffer cmdBuffer,
4115 u32 colorAttachment,
4116 VkImageLayout imageLayout,
4117 const VkClearColorValue* pColor,
4118 u32 rectCount,
4119 const VkRect3D* pRects) {
4120 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4121
4122 rects := pRects[0:rectCount]
4123 for i in (0 .. rectCount) {
4124 rect := rects[i]
4125 }
4126
4127 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
4128 cmdBufferObject.queueFlags = queueFlags
4129}
4130
4131@threadSafety("app")
4132cmd void vkCmdClearDepthStencilAttachment(
4133 VkCmdBuffer cmdBuffer,
4134 VkImageAspectFlags imageAspectMask,
4135 VkImageLayout imageLayout,
4136 f32 depth,
4137 u32 stencil,
4138 u32 rectCount,
4139 const VkRect3D* pRects) {
4140 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4141
4142 rects := pRects[0:rectCount]
4143 for i in (0 .. rectCount) {
4144 rect := rects[i]
4145 }
4146
4147 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
4148 cmdBufferObject.queueFlags = queueFlags
4149}
4150
4151@threadSafety("app")
4152cmd void vkCmdResolveImage(
4153 VkCmdBuffer cmdBuffer,
4154 VkImage srcImage,
4155 VkImageLayout srcImageLayout,
4156 VkImage destImage,
4157 VkImageLayout destImageLayout,
4158 u32 regionCount,
4159 const VkImageResolve* pRegions) {
4160 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4161 srcImageObject := GetImage(srcImage)
4162 destImageObject := GetImage(destImage)
4163 assert(cmdBufferObject.device == srcImageObject.device)
4164 assert(cmdBufferObject.device == destImageObject.device)
4165
4166 regions := pRegions[0:regionCount]
4167 for i in (0 .. regionCount) {
4168 region := regions[i]
4169 }
4170
4171 bindCmdBuffer(cmdBuffer, srcImage, srcImageObject.mem)
4172 bindCmdBuffer(cmdBuffer, destImage, destImageObject.mem)
4173
4174 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
4175 cmdBufferObject.queueFlags = queueFlags
4176}
4177
4178@threadSafety("app")
4179cmd void vkCmdSetEvent(
4180 VkCmdBuffer cmdBuffer,
4181 VkEvent event,
4182 VkPipelineStageFlags stageMask) {
4183 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4184 eventObject := GetEvent(event)
4185 assert(cmdBufferObject.device == eventObject.device)
4186}
4187
4188@threadSafety("app")
4189cmd void vkCmdResetEvent(
4190 VkCmdBuffer cmdBuffer,
4191 VkEvent event,
4192 VkPipelineStageFlags stageMask) {
4193 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4194 eventObject := GetEvent(event)
4195 assert(cmdBufferObject.device == eventObject.device)
4196}
4197
4198@threadSafety("app")
4199cmd void vkCmdWaitEvents(
4200 VkCmdBuffer cmdBuffer,
4201 u32 eventCount,
4202 const VkEvent* pEvents,
4203 VkPipelineStageFlags srcStageMask,
4204 VkPipelineStageFlags destStageMask,
4205 u32 memBarrierCount,
4206 const void* const* ppMemBarriers) {
4207 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4208
4209 events := pEvents[0:eventCount]
4210 for i in (0 .. eventCount) {
4211 event := events[i]
4212 eventObject := GetEvent(event)
4213 assert(cmdBufferObject.device == eventObject.device)
4214 }
4215
4216 pMemBarriers := ppMemBarriers[0:memBarrierCount]
4217 for i in (0 .. memBarrierCount) {
4218 switch as!VkMemoryBarrier const*(pMemBarriers[i])[0].sType {
4219 case VK_STRUCTURE_TYPE_MEMORY_BARRIER: {
4220 memBarrier := as!VkMemoryBarrier const*(pMemBarriers[i])[0]
4221 }
4222 case VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER: {
4223 imageMemBarrier := as!VkImageMemoryBarrier const*(pMemBarriers[i])[0]
4224 imageObject := GetImage(imageMemBarrier.image)
4225 assert(imageObject.device == cmdBufferObject.device)
4226 }
4227 case VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER: {
4228 bufferMemBarrier := as!VkBufferMemoryBarrier const*(pMemBarriers[i])[0]
4229 bufferObject := GetBuffer(bufferMemBarrier.buffer)
4230 assert(bufferObject.device == cmdBufferObject.device)
4231 }
4232 }
4233 }
4234}
4235
4236@threadSafety("app")
4237cmd void vkCmdPipelineBarrier(
4238 VkCmdBuffer cmdBuffer,
4239 VkPipelineStageFlags srcStageMask,
4240 VkPipelineStageFlags destStageMask,
4241 platform.VkBool32 byRegion,
4242 u32 memBarrierCount,
4243 const void* const* ppMemBarriers) {
4244 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4245
4246 pMemBarriers := ppMemBarriers[0:memBarrierCount]
4247 for i in (0 .. memBarrierCount) {
4248 switch as!VkMemoryBarrier const*(pMemBarriers[i])[0].sType {
4249 case VK_STRUCTURE_TYPE_MEMORY_BARRIER: {
4250 memBarrier := as!VkMemoryBarrier const*(pMemBarriers[i])[0]
4251 }
4252 case VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER: {
4253 imageMemBarrier := as!VkImageMemoryBarrier const*(pMemBarriers[i])[0]
4254 imageObject := GetImage(imageMemBarrier.image)
4255 assert(imageObject.device == cmdBufferObject.device)
4256 }
4257 case VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER: {
4258 bufferMemBarrier := as!VkBufferMemoryBarrier const*(pMemBarriers[i])[0]
4259 bufferObject := GetBuffer(bufferMemBarrier.buffer)
4260 assert(bufferObject.device == cmdBufferObject.device)
4261 }
4262 }
4263 }
4264}
4265
4266@threadSafety("app")
4267cmd void vkCmdBeginQuery(
4268 VkCmdBuffer cmdBuffer,
4269 VkQueryPool queryPool,
4270 u32 slot,
4271 VkQueryControlFlags flags) {
4272 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4273 queryPoolObject := GetQueryPool(queryPool)
4274 assert(cmdBufferObject.device == queryPoolObject.device)
4275}
4276
4277@threadSafety("app")
4278cmd void vkCmdEndQuery(
4279 VkCmdBuffer cmdBuffer,
4280 VkQueryPool queryPool,
4281 u32 slot) {
4282 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4283 queryPoolObject := GetQueryPool(queryPool)
4284 assert(cmdBufferObject.device == queryPoolObject.device)
4285}
4286
4287@threadSafety("app")
4288cmd void vkCmdResetQueryPool(
4289 VkCmdBuffer cmdBuffer,
4290 VkQueryPool queryPool,
4291 u32 startQuery,
4292 u32 queryCount) {
4293 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4294 queryPoolObject := GetQueryPool(queryPool)
4295 assert(cmdBufferObject.device == queryPoolObject.device)
4296}
4297
4298@threadSafety("app")
4299cmd void vkCmdWriteTimestamp(
4300 VkCmdBuffer cmdBuffer,
4301 VkTimestampType timestampType,
4302 VkBuffer destBuffer,
4303 platform.VkDeviceSize destOffset) {
4304 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4305 destBufferObject := GetBuffer(destBuffer)
4306 assert(cmdBufferObject.device == destBufferObject.device)
4307}
4308
4309@threadSafety("app")
4310cmd void vkCmdCopyQueryPoolResults(
4311 VkCmdBuffer cmdBuffer,
4312 VkQueryPool queryPool,
4313 u32 startQuery,
4314 u32 queryCount,
4315 VkBuffer destBuffer,
4316 platform.VkDeviceSize destOffset,
4317 platform.VkDeviceSize destStride,
4318 VkQueryResultFlags flags) {
4319 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4320 queryPoolObject := GetQueryPool(queryPool)
4321 destBufferObject := GetBuffer(destBuffer)
4322 assert(cmdBufferObject.device == queryPoolObject.device)
4323 assert(cmdBufferObject.device == destBufferObject.device)
4324}
4325
4326cmd void vkCmdPushConstants(
4327 VkCmdBuffer cmdBuffer,
4328 VkPipelineLayout layout,
4329 VkShaderStageFlags stageFlags,
4330 u32 start,
4331 u32 length,
4332 const void* values) {
4333 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4334 layoutObject := GetPipelineLayout(layout)
4335 assert(cmdBufferObject.device == layoutObject.device)
4336}
4337
4338@threadSafety("app")
4339cmd void vkCmdBeginRenderPass(
4340 VkCmdBuffer cmdBuffer,
4341 const VkRenderPassBeginInfo* pRenderPassBegin,
4342 VkRenderPassContents contents) {
4343 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4344 renderPassObject := GetRenderPass(pRenderPassBegin.renderPass)
4345 framebufferObject := GetFramebuffer(pRenderPassBegin.framebuffer)
4346 assert(cmdBufferObject.device == renderPassObject.device)
4347 assert(cmdBufferObject.device == framebufferObject.device)
4348
4349 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
4350 cmdBufferObject.queueFlags = queueFlags
4351}
4352
4353cmd void vkCmdNextSubpass(
4354 VkCmdBuffer cmdBuffer,
4355 VkRenderPassContents contents) {
4356 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4357}
4358
4359@threadSafety("app")
4360cmd void vkCmdEndRenderPass(
4361 VkCmdBuffer cmdBuffer) {
4362 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4363
4364 queueFlags := cmdBufferObject.queueFlags | VK_QUEUE_GRAPHICS_BIT
4365 cmdBufferObject.queueFlags = queueFlags
4366}
4367
4368cmd void vkCmdExecuteCommands(
4369 VkCmdBuffer cmdBuffer,
4370 u32 cmdBuffersCount,
4371 const VkCmdBuffer* pCmdBuffers) {
4372 cmdBufferObject := GetCmdBuffer(cmdBuffer)
4373
4374 cmdBuffers := pCmdBuffers[0:cmdBuffersCount]
4375 for i in (0 .. cmdBuffersCount) {
4376 secondaryCmdBuffer := cmdBuffers[i]
4377 secondaryCmdBufferObject := GetCmdBuffer(secondaryCmdBuffer)
4378 assert(cmdBufferObject.device == secondaryCmdBufferObject.device)
4379 }
4380}
4381
4382
4383////////////////
4384// Validation //
4385////////////////
4386
4387extern void validate(string layerName, bool condition, string message)
4388
4389
4390/////////////////////////////
4391// Internal State Tracking //
4392/////////////////////////////
4393
4394StateObject State
4395
4396@internal class StateObject {
4397 // Dispatchable objects.
4398 map!(VkInstance, ref!InstanceObject) Instances
4399 map!(VkPhysicalDevice, ref!PhysicalDeviceObject) PhysicalDevices
4400 map!(VkDevice, ref!DeviceObject) Devices
4401 map!(VkQueue, ref!QueueObject) Queues
4402 map!(VkCmdBuffer, ref!CmdBufferObject) CmdBuffers
4403
4404 // Non-dispatchable objects.
4405 map!(VkDeviceMemory, ref!DeviceMemoryObject) DeviceMemories
4406 map!(VkBuffer, ref!BufferObject) Buffers
4407 map!(VkBufferView, ref!BufferViewObject) BufferViews
4408 map!(VkImage, ref!ImageObject) Images
4409 map!(VkImageView, ref!ImageViewObject) ImageViews
4410 map!(VkAttachmentView, ref!AttachmentViewObject) AttachmentViews
4411 map!(VkShaderModule, ref!ShaderModuleObject) ShaderModules
4412 map!(VkShader, ref!ShaderObject) Shaders
4413 map!(VkPipeline, ref!PipelineObject) Pipelines
4414 map!(VkPipelineLayout, ref!PipelineLayoutObject) PipelineLayouts
4415 map!(VkSampler, ref!SamplerObject) Samplers
4416 map!(VkDescriptorSet, ref!DescriptorSetObject) DescriptorSets
4417 map!(VkDescriptorSetLayout, ref!DescriptorSetLayoutObject) DescriptorSetLayouts
4418 map!(VkDescriptorPool, ref!DescriptorPoolObject) DescriptorPools
4419 map!(VkDynamicViewportState, ref!DynamicViewportStateObject) DynamicViewportStates
4420 map!(VkDynamicRasterState, ref!DynamicRasterStateObject) DynamicRasterStates
4421 map!(VkDynamicColorBlendState, ref!DynamicColorBlendStateObject) DynamicColorBlendStates
4422 map!(VkDynamicDepthStencilState, ref!DynamicDepthStencilStateObject) DynamicDepthStencilStates
4423 map!(VkFence, ref!FenceObject) Fences
4424 map!(VkSemaphore, ref!SemaphoreObject) Semaphores
4425 map!(VkEvent, ref!EventObject) Events
4426 map!(VkQueryPool, ref!QueryPoolObject) QueryPools
4427 map!(VkFramebuffer, ref!FramebufferObject) Framebuffers
4428 map!(VkRenderPass, ref!RenderPassObject) RenderPasses
4429 map!(VkPipelineCache, ref!PipelineCacheObject) PipelineCaches
4430 map!(VkCmdPool, ref!CmdPoolObject) CmdPools
4431}
4432
4433@internal class InstanceObject {
4434}
4435
4436@internal class PhysicalDeviceObject {
4437 VkInstance instance
4438}
4439
4440@internal class DeviceObject {
4441 VkPhysicalDevice physicalDevice
4442}
4443
4444@internal class QueueObject {
4445 VkDevice device
4446 VkQueueFlags flags
4447}
4448
4449@internal class CmdBufferObject {
4450 VkDevice device
4451 map!(u64, VkDeviceMemory) boundObjects
4452 VkQueueFlags queueFlags
4453}
4454
4455@internal class DeviceMemoryObject {
4456 VkDevice device
4457 platform.VkDeviceSize allocationSize
4458 map!(u64, platform.VkDeviceSize) boundObjects
4459 map!(VkCmdBuffer, VkCmdBuffer) boundCommandBuffers
4460}
4461
4462@internal class BufferObject {
4463 VkDevice device
4464 VkDeviceMemory mem
4465 platform.VkDeviceSize memOffset
4466}
4467
4468@internal class BufferViewObject {
4469 VkDevice device
4470 VkBuffer buffer
4471}
4472
4473@internal class ImageObject {
4474 VkDevice device
4475 VkDeviceMemory mem
4476 platform.VkDeviceSize memOffset
4477}
4478
4479@internal class ImageViewObject {
4480 VkDevice device
4481 VkImage image
4482}
4483
4484@internal class AttachmentViewObject {
4485 VkDevice device
4486 VkImage image
4487}
4488
4489@internal class ShaderObject {
4490 VkDevice device
4491}
4492
4493@internal class ShaderModuleObject {
4494 VkDevice device
4495}
4496
4497@internal class PipelineObject {
4498 VkDevice device
4499}
4500
4501@internal class PipelineLayoutObject {
4502 VkDevice device
4503}
4504
4505@internal class SamplerObject {
4506 VkDevice device
4507}
4508
4509@internal class DescriptorSetObject {
4510 VkDevice device
4511}
4512
4513@internal class DescriptorSetLayoutObject {
4514 VkDevice device
4515}
4516
4517@internal class DescriptorPoolObject {
4518 VkDevice device
4519}
4520
4521@internal class DynamicViewportStateObject {
4522 VkDevice device
4523}
4524
4525@internal class DynamicRasterStateObject {
4526 VkDevice device
4527}
4528
4529@internal class DynamicColorBlendStateObject {
4530 VkDevice device
4531}
4532
4533@internal class DynamicDepthStencilStateObject {
4534 VkDevice device
4535}
4536
4537@internal class FenceObject {
4538 VkDevice device
4539 bool signaled
4540}
4541
4542@internal class SemaphoreObject {
4543 VkDevice device
4544}
4545
4546@internal class EventObject {
4547 VkDevice device
4548}
4549
4550@internal class QueryPoolObject {
4551 VkDevice device
4552}
4553
4554@internal class FramebufferObject {
4555 VkDevice device
4556}
4557
4558@internal class RenderPassObject {
4559 VkDevice device
4560}
4561
4562@internal class PipelineCacheObject {
4563 VkDevice device
4564}
4565
4566@internal class CmdPoolObject {
4567 VkDevice device
4568}
4569
4570macro ref!InstanceObject GetInstance(VkInstance instance) {
4571 assert(instance in State.Instances)
4572 return State.Instances[instance]
4573}
4574
4575macro ref!PhysicalDeviceObject GetPhysicalDevice(VkPhysicalDevice physicalDevice) {
4576 assert(physicalDevice in State.PhysicalDevices)
4577 return State.PhysicalDevices[physicalDevice]
4578}
4579
4580macro ref!DeviceObject GetDevice(VkDevice device) {
4581 assert(device in State.Devices)
4582 return State.Devices[device]
4583}
4584
4585macro ref!QueueObject GetQueue(VkQueue queue) {
4586 assert(queue in State.Queues)
4587 return State.Queues[queue]
4588}
4589
4590macro ref!CmdBufferObject GetCmdBuffer(VkCmdBuffer cmdBuffer) {
4591 assert(cmdBuffer in State.CmdBuffers)
4592 return State.CmdBuffers[cmdBuffer]
4593}
4594
4595macro ref!DeviceMemoryObject GetDeviceMemory(VkDeviceMemory mem) {
4596 assert(mem in State.DeviceMemories)
4597 return State.DeviceMemories[mem]
4598}
4599
4600macro ref!BufferObject GetBuffer(VkBuffer buffer) {
4601 assert(buffer in State.Buffers)
4602 return State.Buffers[buffer]
4603}
4604
4605macro ref!BufferViewObject GetBufferView(VkBufferView bufferView) {
4606 assert(bufferView in State.BufferViews)
4607 return State.BufferViews[bufferView]
4608}
4609
4610macro ref!ImageObject GetImage(VkImage image) {
4611 assert(image in State.Images)
4612 return State.Images[image]
4613}
4614
4615macro ref!ImageViewObject GetImageView(VkImageView imageView) {
4616 assert(imageView in State.ImageViews)
4617 return State.ImageViews[imageView]
4618}
4619
4620macro ref!AttachmentViewObject GetAttachmentView(VkAttachmentView attachmentView) {
4621 assert(attachmentView in State.AttachmentViews)
4622 return State.AttachmentViews[attachmentView]
4623}
4624
4625macro ref!ShaderObject GetShader(VkShader shader) {
4626 assert(shader in State.Shaders)
4627 return State.Shaders[shader]
4628}
4629
4630macro ref!ShaderModuleObject GetShaderModule(VkShaderModule shaderModule) {
4631 assert(shaderModule in State.ShaderModules)
4632 return State.ShaderModules[shaderModule]
4633}
4634
4635macro ref!PipelineObject GetPipeline(VkPipeline pipeline) {
4636 assert(pipeline in State.Pipelines)
4637 return State.Pipelines[pipeline]
4638}
4639
4640macro ref!PipelineLayoutObject GetPipelineLayout(VkPipelineLayout pipelineLayout) {
4641 assert(pipelineLayout in State.PipelineLayouts)
4642 return State.PipelineLayouts[pipelineLayout]
4643}
4644
4645macro ref!SamplerObject GetSampler(VkSampler sampler) {
4646 assert(sampler in State.Samplers)
4647 return State.Samplers[sampler]
4648}
4649
4650macro ref!DescriptorSetObject GetDescriptorSet(VkDescriptorSet descriptorSet) {
4651 assert(descriptorSet in State.DescriptorSets)
4652 return State.DescriptorSets[descriptorSet]
4653}
4654
4655macro ref!DescriptorSetLayoutObject GetDescriptorSetLayout(VkDescriptorSetLayout descriptorSetLayout) {
4656 assert(descriptorSetLayout in State.DescriptorSetLayouts)
4657 return State.DescriptorSetLayouts[descriptorSetLayout]
4658}
4659
4660macro ref!DescriptorPoolObject GetDescriptorPool(VkDescriptorPool descriptorPool) {
4661 assert(descriptorPool in State.DescriptorPools)
4662 return State.DescriptorPools[descriptorPool]
4663}
4664
4665macro ref!DynamicViewportStateObject GetDynamicViewportState(VkDynamicViewportState dynamicViewportState) {
4666 assert(dynamicViewportState in State.DynamicViewportStates)
4667 return State.DynamicViewportStates[dynamicViewportState]
4668}
4669
4670macro ref!DynamicRasterStateObject GetDynamicRasterState(VkDynamicRasterState dynamicRasterState) {
4671 assert(dynamicRasterState in State.DynamicRasterStates)
4672 return State.DynamicRasterStates[dynamicRasterState]
4673}
4674
4675macro ref!DynamicColorBlendStateObject GetDynamicColorBlendState(VkDynamicColorBlendState dynamicColorBlendState) {
4676 assert(dynamicColorBlendState in State.DynamicColorBlendStates)
4677 return State.DynamicColorBlendStates[dynamicColorBlendState]
4678}
4679
4680macro ref!DynamicDepthStencilStateObject GetDynamicDepthStencilState(VkDynamicDepthStencilState dynamicDepthStencilState) {
4681 assert(dynamicDepthStencilState in State.DynamicDepthStencilStates)
4682 return State.DynamicDepthStencilStates[dynamicDepthStencilState]
4683}
4684
4685macro ref!FenceObject GetFence(VkFence fence) {
4686 assert(fence in State.Fences)
4687 return State.Fences[fence]
4688}
4689
4690macro ref!SemaphoreObject GetSemaphore(VkSemaphore semaphore) {
4691 assert(semaphore in State.Semaphores)
4692 return State.Semaphores[semaphore]
4693}
4694
4695macro ref!EventObject GetEvent(VkEvent event) {
4696 assert(event in State.Events)
4697 return State.Events[event]
4698}
4699
4700macro ref!QueryPoolObject GetQueryPool(VkQueryPool queryPool) {
4701 assert(queryPool in State.QueryPools)
4702 return State.QueryPools[queryPool]
4703}
4704
4705macro ref!FramebufferObject GetFramebuffer(VkFramebuffer framebuffer) {
4706 assert(framebuffer in State.Framebuffers)
4707 return State.Framebuffers[framebuffer]
4708}
4709
4710macro ref!RenderPassObject GetRenderPass(VkRenderPass renderPass) {
4711 assert(renderPass in State.RenderPasses)
4712 return State.RenderPasses[renderPass]
4713}
4714
4715macro ref!PipelineCacheObject GetPipelineCache(VkPipelineCache pipelineCache) {
4716 assert(pipelineCache in State.PipelineCaches)
4717 return State.PipelineCaches[pipelineCache]
4718}
4719
4720macro ref!CmdPoolObject GetCmdPool(VkCmdPool cmdPool) {
4721 assert(cmdPool in State.CmdPools)
4722 return State.CmdPools[cmdPool]
Jesse Hallf09c6b12015-08-15 19:54:28 -07004723}