xref: /aosp_15_r20/external/mesa3d/src/gfxstream/guest/vulkan_enc/VkEncoder.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 // Copyright (C) 2018 The Android Open Source Project
2 // Copyright (C) 2018 Google Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 
16 // Autogenerated module VkEncoder
17 //
18 // (impl) generated by scripts/genvk.py -registry ../../vulkan/registry/vk.xml -registryGfxstream
19 // xml/vk_gfxstream.xml cereal -o /tmp/
20 //
21 // Please do not modify directly;
22 // re-run mesa3d/src/gfxstream/codegen/generate-gfxstream-vulkan.sh,
23 // or directly from Python by defining:
24 // VULKAN_REGISTRY_XML_DIR : Directory containing vk.xml
25 // VULKAN_REGISTRY_SCRIPTS_DIR : Directory containing genvk.py
26 // CEREAL_OUTPUT_DIR: Where to put the generated sources.
27 //
28 // python3 $VULKAN_REGISTRY_SCRIPTS_DIR/genvk.py -registry $VULKAN_REGISTRY_XML_DIR/vk.xml cereal -o
29 // $CEREAL_OUTPUT_DIR
30 //
31 
32 #include "VkEncoder.h"
33 
34 #include <memory>
35 #include <optional>
36 #include <string>
37 #include <unordered_map>
38 #include <vector>
39 
40 #include "AlignedBuf.h"
41 #include "BumpPool.h"
42 #include "ResourceTracker.h"
43 #include "Resources.h"
44 #include "Validation.h"
45 #include "VulkanStreamGuest.h"
46 #include "gfxstream/guest/IOStream.h"
47 #include "goldfish_vk_counting_guest.h"
48 #include "goldfish_vk_deepcopy_guest.h"
49 #include "goldfish_vk_marshaling_guest.h"
50 #include "goldfish_vk_private_defs.h"
51 #include "goldfish_vk_reserved_marshaling_guest.h"
52 #include "goldfish_vk_transform_guest.h"
53 
54 namespace gfxstream {
55 namespace vk {
56 
57 using namespace gfxstream::vk;
58 
59 using gfxstream::aemu::BumpPool;
60 
61 #include "VkEncoder.cpp.inl"
62 
63 #define VALIDATE_RET(retType, success, validate)   \
64     retType goldfish_vk_validateResult = validate; \
65     if (goldfish_vk_validateResult != success) return goldfish_vk_validateResult;
66 
67 #define VALIDATE_VOID(validate)                     \
68     VkResult goldfish_vk_validateResult = validate; \
69     if (goldfish_vk_validateResult != VK_SUCCESS) return;
70 
71 #ifdef VK_VERSION_1_0
vkCreateInstance(const VkInstanceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkInstance * pInstance,uint32_t doLock)72 VkResult VkEncoder::vkCreateInstance(const VkInstanceCreateInfo* pCreateInfo,
73                                      const VkAllocationCallbacks* pAllocator, VkInstance* pInstance,
74                                      uint32_t doLock) {
75     (void)doLock;
76     bool queueSubmitWithCommandsEnabled =
77         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
78     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
79     auto stream = mImpl->stream();
80     auto pool = mImpl->pool();
81     VkInstanceCreateInfo* local_pCreateInfo;
82     VkAllocationCallbacks* local_pAllocator;
83     local_pCreateInfo = nullptr;
84     if (pCreateInfo) {
85         local_pCreateInfo = (VkInstanceCreateInfo*)pool->alloc(sizeof(const VkInstanceCreateInfo));
86         deepcopy_VkInstanceCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
87                                       (VkInstanceCreateInfo*)(local_pCreateInfo));
88     }
89     local_pAllocator = nullptr;
90     if (pAllocator) {
91         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
92         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
93                                        (VkAllocationCallbacks*)(local_pAllocator));
94     }
95     local_pAllocator = nullptr;
96     if (local_pCreateInfo) {
97         transform_tohost_VkInstanceCreateInfo(sResourceTracker,
98                                               (VkInstanceCreateInfo*)(local_pCreateInfo));
99     }
100     if (local_pAllocator) {
101         transform_tohost_VkAllocationCallbacks(sResourceTracker,
102                                                (VkAllocationCallbacks*)(local_pAllocator));
103     }
104     size_t count = 0;
105     size_t* countPtr = &count;
106     {
107         count_VkInstanceCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
108                                    (VkInstanceCreateInfo*)(local_pCreateInfo), countPtr);
109         // WARNING PTR CHECK
110         *countPtr += 8;
111         if (local_pAllocator) {
112             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
113                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
114         }
115         uint64_t cgen_var_0;
116         *countPtr += 8;
117     }
118     uint32_t packetSize_vkCreateInstance = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
119     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateInstance);
120     uint8_t* packetBeginPtr = streamPtr;
121     uint8_t** streamPtrPtr = &streamPtr;
122     uint32_t opcode_vkCreateInstance = OP_vkCreateInstance;
123     uint32_t seqno;
124     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
125     memcpy(streamPtr, &opcode_vkCreateInstance, sizeof(uint32_t));
126     streamPtr += sizeof(uint32_t);
127     memcpy(streamPtr, &packetSize_vkCreateInstance, sizeof(uint32_t));
128     streamPtr += sizeof(uint32_t);
129     if (queueSubmitWithCommandsEnabled) {
130         memcpy(streamPtr, &seqno, sizeof(uint32_t));
131         streamPtr += sizeof(uint32_t);
132     }
133     reservedmarshal_VkInstanceCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
134                                          (VkInstanceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
135     // WARNING PTR CHECK
136     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)local_pAllocator;
137     memcpy((*streamPtrPtr), &cgen_var_0, 8);
138     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
139     *streamPtrPtr += 8;
140     if (local_pAllocator) {
141         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
142                                               (VkAllocationCallbacks*)(local_pAllocator),
143                                               streamPtrPtr);
144     }
145     /* is handle, possibly out */;
146     uint64_t cgen_var_1;
147     *&cgen_var_1 = (uint64_t)((*pInstance));
148     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 8);
149     *streamPtrPtr += 8;
150     /* is handle, possibly out */;
151     stream->setHandleMapping(sResourceTracker->createMapping());
152     uint64_t cgen_var_2;
153     stream->read((uint64_t*)&cgen_var_2, 8);
154     stream->handleMapping()->mapHandles_u64_VkInstance(&cgen_var_2, (VkInstance*)pInstance, 1);
155     stream->unsetHandleMapping();
156     VkResult vkCreateInstance_VkResult_return = (VkResult)0;
157     stream->read(&vkCreateInstance_VkResult_return, sizeof(VkResult));
158     sResourceTracker->on_vkCreateInstance(this, vkCreateInstance_VkResult_return, pCreateInfo,
159                                           pAllocator, pInstance);
160     ++encodeCount;
161     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
162         pool->freeAll();
163         stream->clearPool();
164     }
165     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
166     return vkCreateInstance_VkResult_return;
167 }
168 
vkDestroyInstance(VkInstance instance,const VkAllocationCallbacks * pAllocator,uint32_t doLock)169 void VkEncoder::vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks* pAllocator,
170                                   uint32_t doLock) {
171     (void)doLock;
172     bool queueSubmitWithCommandsEnabled =
173         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
174     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
175     auto stream = mImpl->stream();
176     auto pool = mImpl->pool();
177     VkInstance local_instance;
178     VkAllocationCallbacks* local_pAllocator;
179     local_instance = instance;
180     local_pAllocator = nullptr;
181     if (pAllocator) {
182         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
183         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
184                                        (VkAllocationCallbacks*)(local_pAllocator));
185     }
186     local_pAllocator = nullptr;
187     if (local_pAllocator) {
188         transform_tohost_VkAllocationCallbacks(sResourceTracker,
189                                                (VkAllocationCallbacks*)(local_pAllocator));
190     }
191     size_t count = 0;
192     size_t* countPtr = &count;
193     {
194         uint64_t cgen_var_0;
195         *countPtr += 1 * 8;
196         // WARNING PTR CHECK
197         *countPtr += 8;
198         if (local_pAllocator) {
199             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
200                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
201         }
202     }
203     uint32_t packetSize_vkDestroyInstance =
204         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
205     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyInstance);
206     uint8_t* packetBeginPtr = streamPtr;
207     uint8_t** streamPtrPtr = &streamPtr;
208     uint32_t opcode_vkDestroyInstance = OP_vkDestroyInstance;
209     uint32_t seqno;
210     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
211     memcpy(streamPtr, &opcode_vkDestroyInstance, sizeof(uint32_t));
212     streamPtr += sizeof(uint32_t);
213     memcpy(streamPtr, &packetSize_vkDestroyInstance, sizeof(uint32_t));
214     streamPtr += sizeof(uint32_t);
215     if (queueSubmitWithCommandsEnabled) {
216         memcpy(streamPtr, &seqno, sizeof(uint32_t));
217         streamPtr += sizeof(uint32_t);
218     }
219     uint64_t cgen_var_0;
220     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
221     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
222     *streamPtrPtr += 1 * 8;
223     // WARNING PTR CHECK
224     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
225     memcpy((*streamPtrPtr), &cgen_var_1, 8);
226     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
227     *streamPtrPtr += 8;
228     if (local_pAllocator) {
229         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
230                                               (VkAllocationCallbacks*)(local_pAllocator),
231                                               streamPtrPtr);
232     }
233     sResourceTracker->destroyMapping()->mapHandles_VkInstance((VkInstance*)&instance);
234     stream->flush();
235     ++encodeCount;
236     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
237         pool->freeAll();
238         stream->clearPool();
239     }
240     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
241 }
242 
vkEnumeratePhysicalDevices(VkInstance instance,uint32_t * pPhysicalDeviceCount,VkPhysicalDevice * pPhysicalDevices,uint32_t doLock)243 VkResult VkEncoder::vkEnumeratePhysicalDevices(VkInstance instance, uint32_t* pPhysicalDeviceCount,
244                                                VkPhysicalDevice* pPhysicalDevices,
245                                                uint32_t doLock) {
246     (void)doLock;
247     bool queueSubmitWithCommandsEnabled =
248         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
249     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
250     auto stream = mImpl->stream();
251     auto pool = mImpl->pool();
252     VkInstance local_instance;
253     local_instance = instance;
254     size_t count = 0;
255     size_t* countPtr = &count;
256     {
257         uint64_t cgen_var_0;
258         *countPtr += 1 * 8;
259         // WARNING PTR CHECK
260         *countPtr += 8;
261         if (pPhysicalDeviceCount) {
262             *countPtr += sizeof(uint32_t);
263         }
264         // WARNING PTR CHECK
265         *countPtr += 8;
266         if (pPhysicalDevices) {
267             if ((*(pPhysicalDeviceCount))) {
268                 *countPtr += (*(pPhysicalDeviceCount)) * 8;
269             }
270         }
271     }
272     uint32_t packetSize_vkEnumeratePhysicalDevices =
273         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
274     uint8_t* streamPtr = stream->reserve(packetSize_vkEnumeratePhysicalDevices);
275     uint8_t* packetBeginPtr = streamPtr;
276     uint8_t** streamPtrPtr = &streamPtr;
277     uint32_t opcode_vkEnumeratePhysicalDevices = OP_vkEnumeratePhysicalDevices;
278     uint32_t seqno;
279     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
280     memcpy(streamPtr, &opcode_vkEnumeratePhysicalDevices, sizeof(uint32_t));
281     streamPtr += sizeof(uint32_t);
282     memcpy(streamPtr, &packetSize_vkEnumeratePhysicalDevices, sizeof(uint32_t));
283     streamPtr += sizeof(uint32_t);
284     if (queueSubmitWithCommandsEnabled) {
285         memcpy(streamPtr, &seqno, sizeof(uint32_t));
286         streamPtr += sizeof(uint32_t);
287     }
288     uint64_t cgen_var_0;
289     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
290     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
291     *streamPtrPtr += 1 * 8;
292     // WARNING PTR CHECK
293     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pPhysicalDeviceCount;
294     memcpy((*streamPtrPtr), &cgen_var_1, 8);
295     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
296     *streamPtrPtr += 8;
297     if (pPhysicalDeviceCount) {
298         memcpy(*streamPtrPtr, (uint32_t*)pPhysicalDeviceCount, sizeof(uint32_t));
299         *streamPtrPtr += sizeof(uint32_t);
300     }
301     /* is handle, possibly out */;
302     // WARNING PTR CHECK
303     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pPhysicalDevices;
304     memcpy((*streamPtrPtr), &cgen_var_2, 8);
305     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
306     *streamPtrPtr += 8;
307     if (pPhysicalDevices) {
308         if ((*(pPhysicalDeviceCount))) {
309             uint8_t* cgen_var_2_0_ptr = (uint8_t*)(*streamPtrPtr);
310             if (pPhysicalDeviceCount) {
311                 for (uint32_t k = 0; k < (*(pPhysicalDeviceCount)); ++k) {
312                     uint64_t tmpval = (uint64_t)(pPhysicalDevices[k]);
313                     memcpy(cgen_var_2_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
314                 }
315             }
316             *streamPtrPtr += 8 * (*(pPhysicalDeviceCount));
317         }
318     }
319     /* is handle, possibly out */;
320     // WARNING PTR CHECK
321     uint32_t* check_pPhysicalDeviceCount;
322     check_pPhysicalDeviceCount = (uint32_t*)(uintptr_t)stream->getBe64();
323     if (pPhysicalDeviceCount) {
324         if (!(check_pPhysicalDeviceCount)) {
325             fprintf(stderr, "fatal: pPhysicalDeviceCount inconsistent between guest and host\n");
326         }
327         stream->read((uint32_t*)pPhysicalDeviceCount, sizeof(uint32_t));
328     }
329     stream->setHandleMapping(sResourceTracker->createMapping());
330     // WARNING PTR CHECK
331     VkPhysicalDevice* check_pPhysicalDevices;
332     check_pPhysicalDevices = (VkPhysicalDevice*)(uintptr_t)stream->getBe64();
333     if (pPhysicalDevices) {
334         if (!(check_pPhysicalDevices)) {
335             fprintf(stderr, "fatal: pPhysicalDevices inconsistent between guest and host\n");
336         }
337         if ((*(pPhysicalDeviceCount))) {
338             uint64_t* cgen_var_4_0;
339             stream->alloc((void**)&cgen_var_4_0, (*(pPhysicalDeviceCount)) * 8);
340             stream->read((uint64_t*)cgen_var_4_0, (*(pPhysicalDeviceCount)) * 8);
341             stream->handleMapping()->mapHandles_u64_VkPhysicalDevice(
342                 cgen_var_4_0, (VkPhysicalDevice*)pPhysicalDevices, (*(pPhysicalDeviceCount)));
343         }
344     }
345     stream->unsetHandleMapping();
346     VkResult vkEnumeratePhysicalDevices_VkResult_return = (VkResult)0;
347     stream->read(&vkEnumeratePhysicalDevices_VkResult_return, sizeof(VkResult));
348     ++encodeCount;
349     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
350         pool->freeAll();
351         stream->clearPool();
352     }
353     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
354     return vkEnumeratePhysicalDevices_VkResult_return;
355 }
356 
vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice,VkPhysicalDeviceFeatures * pFeatures,uint32_t doLock)357 void VkEncoder::vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice,
358                                             VkPhysicalDeviceFeatures* pFeatures, uint32_t doLock) {
359     (void)doLock;
360     bool queueSubmitWithCommandsEnabled =
361         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
362     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
363     auto stream = mImpl->stream();
364     auto pool = mImpl->pool();
365     VkPhysicalDevice local_physicalDevice;
366     local_physicalDevice = physicalDevice;
367     size_t count = 0;
368     size_t* countPtr = &count;
369     {
370         uint64_t cgen_var_0;
371         *countPtr += 1 * 8;
372         count_VkPhysicalDeviceFeatures(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
373                                        (VkPhysicalDeviceFeatures*)(pFeatures), countPtr);
374     }
375     uint32_t packetSize_vkGetPhysicalDeviceFeatures =
376         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
377     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFeatures);
378     uint8_t* packetBeginPtr = streamPtr;
379     uint8_t** streamPtrPtr = &streamPtr;
380     uint32_t opcode_vkGetPhysicalDeviceFeatures = OP_vkGetPhysicalDeviceFeatures;
381     uint32_t seqno;
382     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
383     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFeatures, sizeof(uint32_t));
384     streamPtr += sizeof(uint32_t);
385     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFeatures, sizeof(uint32_t));
386     streamPtr += sizeof(uint32_t);
387     if (queueSubmitWithCommandsEnabled) {
388         memcpy(streamPtr, &seqno, sizeof(uint32_t));
389         streamPtr += sizeof(uint32_t);
390     }
391     uint64_t cgen_var_0;
392     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
393     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
394     *streamPtrPtr += 1 * 8;
395     reservedmarshal_VkPhysicalDeviceFeatures(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
396                                              (VkPhysicalDeviceFeatures*)(pFeatures), streamPtrPtr);
397     unmarshal_VkPhysicalDeviceFeatures(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
398                                        (VkPhysicalDeviceFeatures*)(pFeatures));
399     if (pFeatures) {
400         transform_fromhost_VkPhysicalDeviceFeatures(sResourceTracker,
401                                                     (VkPhysicalDeviceFeatures*)(pFeatures));
402     }
403     ++encodeCount;
404     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
405         pool->freeAll();
406         stream->clearPool();
407     }
408     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
409 }
410 
vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice,VkFormat format,VkFormatProperties * pFormatProperties,uint32_t doLock)411 void VkEncoder::vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice,
412                                                     VkFormat format,
413                                                     VkFormatProperties* pFormatProperties,
414                                                     uint32_t doLock) {
415     (void)doLock;
416     bool queueSubmitWithCommandsEnabled =
417         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
418     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
419     auto stream = mImpl->stream();
420     auto pool = mImpl->pool();
421     VkPhysicalDevice local_physicalDevice;
422     VkFormat local_format;
423     local_physicalDevice = physicalDevice;
424     local_format = format;
425     size_t count = 0;
426     size_t* countPtr = &count;
427     {
428         uint64_t cgen_var_0;
429         *countPtr += 1 * 8;
430         *countPtr += sizeof(VkFormat);
431         count_VkFormatProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
432                                  (VkFormatProperties*)(pFormatProperties), countPtr);
433     }
434     uint32_t packetSize_vkGetPhysicalDeviceFormatProperties =
435         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
436     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFormatProperties);
437     uint8_t* packetBeginPtr = streamPtr;
438     uint8_t** streamPtrPtr = &streamPtr;
439     uint32_t opcode_vkGetPhysicalDeviceFormatProperties = OP_vkGetPhysicalDeviceFormatProperties;
440     uint32_t seqno;
441     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
442     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFormatProperties, sizeof(uint32_t));
443     streamPtr += sizeof(uint32_t);
444     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFormatProperties, sizeof(uint32_t));
445     streamPtr += sizeof(uint32_t);
446     if (queueSubmitWithCommandsEnabled) {
447         memcpy(streamPtr, &seqno, sizeof(uint32_t));
448         streamPtr += sizeof(uint32_t);
449     }
450     uint64_t cgen_var_0;
451     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
452     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
453     *streamPtrPtr += 1 * 8;
454     memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
455     *streamPtrPtr += sizeof(VkFormat);
456     reservedmarshal_VkFormatProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
457                                        (VkFormatProperties*)(pFormatProperties), streamPtrPtr);
458     unmarshal_VkFormatProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
459                                  (VkFormatProperties*)(pFormatProperties));
460     if (pFormatProperties) {
461         transform_fromhost_VkFormatProperties(sResourceTracker,
462                                               (VkFormatProperties*)(pFormatProperties));
463     }
464     ++encodeCount;
465     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
466         pool->freeAll();
467         stream->clearPool();
468     }
469     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
470 }
471 
vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice,VkFormat format,VkImageType type,VkImageTiling tiling,VkImageUsageFlags usage,VkImageCreateFlags flags,VkImageFormatProperties * pImageFormatProperties,uint32_t doLock)472 VkResult VkEncoder::vkGetPhysicalDeviceImageFormatProperties(
473     VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling,
474     VkImageUsageFlags usage, VkImageCreateFlags flags,
475     VkImageFormatProperties* pImageFormatProperties, uint32_t doLock) {
476     (void)doLock;
477     bool queueSubmitWithCommandsEnabled =
478         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
479     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
480     auto stream = mImpl->stream();
481     auto pool = mImpl->pool();
482     VkPhysicalDevice local_physicalDevice;
483     VkFormat local_format;
484     VkImageType local_type;
485     VkImageTiling local_tiling;
486     VkImageUsageFlags local_usage;
487     VkImageCreateFlags local_flags;
488     local_physicalDevice = physicalDevice;
489     local_format = format;
490     local_type = type;
491     local_tiling = tiling;
492     local_usage = usage;
493     local_flags = flags;
494     size_t count = 0;
495     size_t* countPtr = &count;
496     {
497         uint64_t cgen_var_0;
498         *countPtr += 1 * 8;
499         *countPtr += sizeof(VkFormat);
500         *countPtr += sizeof(VkImageType);
501         *countPtr += sizeof(VkImageTiling);
502         *countPtr += sizeof(VkImageUsageFlags);
503         *countPtr += sizeof(VkImageCreateFlags);
504         count_VkImageFormatProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
505                                       (VkImageFormatProperties*)(pImageFormatProperties), countPtr);
506     }
507     uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties =
508         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
509     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceImageFormatProperties);
510     uint8_t* packetBeginPtr = streamPtr;
511     uint8_t** streamPtrPtr = &streamPtr;
512     uint32_t opcode_vkGetPhysicalDeviceImageFormatProperties =
513         OP_vkGetPhysicalDeviceImageFormatProperties;
514     uint32_t seqno;
515     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
516     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceImageFormatProperties, sizeof(uint32_t));
517     streamPtr += sizeof(uint32_t);
518     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceImageFormatProperties, sizeof(uint32_t));
519     streamPtr += sizeof(uint32_t);
520     if (queueSubmitWithCommandsEnabled) {
521         memcpy(streamPtr, &seqno, sizeof(uint32_t));
522         streamPtr += sizeof(uint32_t);
523     }
524     uint64_t cgen_var_0;
525     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
526     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
527     *streamPtrPtr += 1 * 8;
528     memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
529     *streamPtrPtr += sizeof(VkFormat);
530     memcpy(*streamPtrPtr, (VkImageType*)&local_type, sizeof(VkImageType));
531     *streamPtrPtr += sizeof(VkImageType);
532     memcpy(*streamPtrPtr, (VkImageTiling*)&local_tiling, sizeof(VkImageTiling));
533     *streamPtrPtr += sizeof(VkImageTiling);
534     memcpy(*streamPtrPtr, (VkImageUsageFlags*)&local_usage, sizeof(VkImageUsageFlags));
535     *streamPtrPtr += sizeof(VkImageUsageFlags);
536     memcpy(*streamPtrPtr, (VkImageCreateFlags*)&local_flags, sizeof(VkImageCreateFlags));
537     *streamPtrPtr += sizeof(VkImageCreateFlags);
538     reservedmarshal_VkImageFormatProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
539                                             (VkImageFormatProperties*)(pImageFormatProperties),
540                                             streamPtrPtr);
541     unmarshal_VkImageFormatProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
542                                       (VkImageFormatProperties*)(pImageFormatProperties));
543     if (pImageFormatProperties) {
544         transform_fromhost_VkImageFormatProperties(
545             sResourceTracker, (VkImageFormatProperties*)(pImageFormatProperties));
546     }
547     VkResult vkGetPhysicalDeviceImageFormatProperties_VkResult_return = (VkResult)0;
548     stream->read(&vkGetPhysicalDeviceImageFormatProperties_VkResult_return, sizeof(VkResult));
549     ++encodeCount;
550     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
551         pool->freeAll();
552         stream->clearPool();
553     }
554     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
555     return vkGetPhysicalDeviceImageFormatProperties_VkResult_return;
556 }
557 
vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,VkPhysicalDeviceProperties * pProperties,uint32_t doLock)558 void VkEncoder::vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,
559                                               VkPhysicalDeviceProperties* pProperties,
560                                               uint32_t doLock) {
561     (void)doLock;
562     bool queueSubmitWithCommandsEnabled =
563         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
564     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
565     auto stream = mImpl->stream();
566     auto pool = mImpl->pool();
567     VkPhysicalDevice local_physicalDevice;
568     local_physicalDevice = physicalDevice;
569     size_t count = 0;
570     size_t* countPtr = &count;
571     {
572         uint64_t cgen_var_0;
573         *countPtr += 1 * 8;
574         count_VkPhysicalDeviceProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
575                                          (VkPhysicalDeviceProperties*)(pProperties), countPtr);
576     }
577     uint32_t packetSize_vkGetPhysicalDeviceProperties =
578         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
579     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceProperties);
580     uint8_t* packetBeginPtr = streamPtr;
581     uint8_t** streamPtrPtr = &streamPtr;
582     uint32_t opcode_vkGetPhysicalDeviceProperties = OP_vkGetPhysicalDeviceProperties;
583     uint32_t seqno;
584     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
585     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceProperties, sizeof(uint32_t));
586     streamPtr += sizeof(uint32_t);
587     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceProperties, sizeof(uint32_t));
588     streamPtr += sizeof(uint32_t);
589     if (queueSubmitWithCommandsEnabled) {
590         memcpy(streamPtr, &seqno, sizeof(uint32_t));
591         streamPtr += sizeof(uint32_t);
592     }
593     uint64_t cgen_var_0;
594     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
595     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
596     *streamPtrPtr += 1 * 8;
597     reservedmarshal_VkPhysicalDeviceProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
598                                                (VkPhysicalDeviceProperties*)(pProperties),
599                                                streamPtrPtr);
600     unmarshal_VkPhysicalDeviceProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
601                                          (VkPhysicalDeviceProperties*)(pProperties));
602     if (pProperties) {
603         transform_fromhost_VkPhysicalDeviceProperties(sResourceTracker,
604                                                       (VkPhysicalDeviceProperties*)(pProperties));
605     }
606     sResourceTracker->on_vkGetPhysicalDeviceProperties(this, physicalDevice, pProperties);
607     ++encodeCount;
608     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
609         pool->freeAll();
610         stream->clearPool();
611     }
612     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
613 }
614 
vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice,uint32_t * pQueueFamilyPropertyCount,VkQueueFamilyProperties * pQueueFamilyProperties,uint32_t doLock)615 void VkEncoder::vkGetPhysicalDeviceQueueFamilyProperties(
616     VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount,
617     VkQueueFamilyProperties* pQueueFamilyProperties, uint32_t doLock) {
618     (void)doLock;
619     bool queueSubmitWithCommandsEnabled =
620         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
621     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
622     auto stream = mImpl->stream();
623     auto pool = mImpl->pool();
624     VkPhysicalDevice local_physicalDevice;
625     local_physicalDevice = physicalDevice;
626     size_t count = 0;
627     size_t* countPtr = &count;
628     {
629         uint64_t cgen_var_0;
630         *countPtr += 1 * 8;
631         // WARNING PTR CHECK
632         *countPtr += 8;
633         if (pQueueFamilyPropertyCount) {
634             *countPtr += sizeof(uint32_t);
635         }
636         // WARNING PTR CHECK
637         *countPtr += 8;
638         if (pQueueFamilyProperties) {
639             if (pQueueFamilyPropertyCount) {
640                 for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
641                     count_VkQueueFamilyProperties(
642                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
643                         (VkQueueFamilyProperties*)(pQueueFamilyProperties + i), countPtr);
644                 }
645             }
646         }
647     }
648     uint32_t packetSize_vkGetPhysicalDeviceQueueFamilyProperties =
649         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
650     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceQueueFamilyProperties);
651     uint8_t* packetBeginPtr = streamPtr;
652     uint8_t** streamPtrPtr = &streamPtr;
653     uint32_t opcode_vkGetPhysicalDeviceQueueFamilyProperties =
654         OP_vkGetPhysicalDeviceQueueFamilyProperties;
655     uint32_t seqno;
656     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
657     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceQueueFamilyProperties, sizeof(uint32_t));
658     streamPtr += sizeof(uint32_t);
659     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceQueueFamilyProperties, sizeof(uint32_t));
660     streamPtr += sizeof(uint32_t);
661     if (queueSubmitWithCommandsEnabled) {
662         memcpy(streamPtr, &seqno, sizeof(uint32_t));
663         streamPtr += sizeof(uint32_t);
664     }
665     uint64_t cgen_var_0;
666     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
667     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
668     *streamPtrPtr += 1 * 8;
669     // WARNING PTR CHECK
670     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
671     memcpy((*streamPtrPtr), &cgen_var_1, 8);
672     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
673     *streamPtrPtr += 8;
674     if (pQueueFamilyPropertyCount) {
675         memcpy(*streamPtrPtr, (uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
676         *streamPtrPtr += sizeof(uint32_t);
677     }
678     // WARNING PTR CHECK
679     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
680     memcpy((*streamPtrPtr), &cgen_var_2, 8);
681     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
682     *streamPtrPtr += 8;
683     if (pQueueFamilyProperties) {
684         for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
685             reservedmarshal_VkQueueFamilyProperties(
686                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
687                 (VkQueueFamilyProperties*)(pQueueFamilyProperties + i), streamPtrPtr);
688         }
689     }
690     // WARNING PTR CHECK
691     uint32_t* check_pQueueFamilyPropertyCount;
692     check_pQueueFamilyPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
693     if (pQueueFamilyPropertyCount) {
694         if (!(check_pQueueFamilyPropertyCount)) {
695             fprintf(stderr,
696                     "fatal: pQueueFamilyPropertyCount inconsistent between guest and host\n");
697         }
698         stream->read((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
699     }
700     // WARNING PTR CHECK
701     VkQueueFamilyProperties* check_pQueueFamilyProperties;
702     check_pQueueFamilyProperties = (VkQueueFamilyProperties*)(uintptr_t)stream->getBe64();
703     if (pQueueFamilyProperties) {
704         if (!(check_pQueueFamilyProperties)) {
705             fprintf(stderr, "fatal: pQueueFamilyProperties inconsistent between guest and host\n");
706         }
707         if (pQueueFamilyPropertyCount) {
708             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
709                 unmarshal_VkQueueFamilyProperties(
710                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
711                     (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
712             }
713         }
714     }
715     if (pQueueFamilyPropertyCount) {
716         if (pQueueFamilyProperties) {
717             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
718                 transform_fromhost_VkQueueFamilyProperties(
719                     sResourceTracker, (VkQueueFamilyProperties*)(pQueueFamilyProperties + i));
720             }
721         }
722     }
723     ++encodeCount;
724     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
725         pool->freeAll();
726         stream->clearPool();
727     }
728     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
729 }
730 
vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice,VkPhysicalDeviceMemoryProperties * pMemoryProperties,uint32_t doLock)731 void VkEncoder::vkGetPhysicalDeviceMemoryProperties(
732     VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties* pMemoryProperties,
733     uint32_t doLock) {
734     (void)doLock;
735     bool queueSubmitWithCommandsEnabled =
736         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
737     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
738     auto stream = mImpl->stream();
739     auto pool = mImpl->pool();
740     VkPhysicalDevice local_physicalDevice;
741     local_physicalDevice = physicalDevice;
742     size_t count = 0;
743     size_t* countPtr = &count;
744     {
745         uint64_t cgen_var_0;
746         *countPtr += 1 * 8;
747         count_VkPhysicalDeviceMemoryProperties(
748             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
749             (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties), countPtr);
750     }
751     uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties =
752         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
753     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMemoryProperties);
754     uint8_t* packetBeginPtr = streamPtr;
755     uint8_t** streamPtrPtr = &streamPtr;
756     uint32_t opcode_vkGetPhysicalDeviceMemoryProperties = OP_vkGetPhysicalDeviceMemoryProperties;
757     uint32_t seqno;
758     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
759     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceMemoryProperties, sizeof(uint32_t));
760     streamPtr += sizeof(uint32_t);
761     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceMemoryProperties, sizeof(uint32_t));
762     streamPtr += sizeof(uint32_t);
763     if (queueSubmitWithCommandsEnabled) {
764         memcpy(streamPtr, &seqno, sizeof(uint32_t));
765         streamPtr += sizeof(uint32_t);
766     }
767     uint64_t cgen_var_0;
768     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
769     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
770     *streamPtrPtr += 1 * 8;
771     reservedmarshal_VkPhysicalDeviceMemoryProperties(
772         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties),
773         streamPtrPtr);
774     unmarshal_VkPhysicalDeviceMemoryProperties(
775         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
776     if (pMemoryProperties) {
777         transform_fromhost_VkPhysicalDeviceMemoryProperties(
778             sResourceTracker, (VkPhysicalDeviceMemoryProperties*)(pMemoryProperties));
779     }
780     ++encodeCount;
781     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
782         pool->freeAll();
783         stream->clearPool();
784     }
785     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
786 }
787 
vkGetInstanceProcAddr(VkInstance instance,const char * pName,uint32_t doLock)788 PFN_vkVoidFunction VkEncoder::vkGetInstanceProcAddr(VkInstance instance, const char* pName,
789                                                     uint32_t doLock) {
790     (void)doLock;
791     bool queueSubmitWithCommandsEnabled =
792         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
793     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
794     auto stream = mImpl->stream();
795     auto pool = mImpl->pool();
796     VkInstance local_instance;
797     char* local_pName;
798     local_instance = instance;
799     // Avoiding deepcopy for pName
800     local_pName = (char*)pName;
801     size_t count = 0;
802     size_t* countPtr = &count;
803     {
804         uint64_t cgen_var_0;
805         *countPtr += 1 * 8;
806         *countPtr += sizeof(uint32_t) + (local_pName ? strlen(local_pName) : 0);
807     }
808     uint32_t packetSize_vkGetInstanceProcAddr =
809         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
810     uint8_t* streamPtr = stream->reserve(packetSize_vkGetInstanceProcAddr);
811     uint8_t* packetBeginPtr = streamPtr;
812     uint8_t** streamPtrPtr = &streamPtr;
813     uint32_t opcode_vkGetInstanceProcAddr = OP_vkGetInstanceProcAddr;
814     uint32_t seqno;
815     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
816     memcpy(streamPtr, &opcode_vkGetInstanceProcAddr, sizeof(uint32_t));
817     streamPtr += sizeof(uint32_t);
818     memcpy(streamPtr, &packetSize_vkGetInstanceProcAddr, sizeof(uint32_t));
819     streamPtr += sizeof(uint32_t);
820     if (queueSubmitWithCommandsEnabled) {
821         memcpy(streamPtr, &seqno, sizeof(uint32_t));
822         streamPtr += sizeof(uint32_t);
823     }
824     uint64_t cgen_var_0;
825     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
826     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
827     *streamPtrPtr += 1 * 8;
828     {
829         uint32_t l = local_pName ? strlen(local_pName) : 0;
830         memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
831         gfxstream::aemu::Stream::toBe32((uint8_t*)*streamPtrPtr);
832         *streamPtrPtr += sizeof(uint32_t);
833         memcpy(*streamPtrPtr, (char*)local_pName, l);
834         *streamPtrPtr += l;
835     }
836     PFN_vkVoidFunction vkGetInstanceProcAddr_PFN_vkVoidFunction_return = (PFN_vkVoidFunction)0;
837     stream->read(&vkGetInstanceProcAddr_PFN_vkVoidFunction_return, sizeof(PFN_vkVoidFunction));
838     ++encodeCount;
839     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
840         pool->freeAll();
841         stream->clearPool();
842     }
843     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
844     return vkGetInstanceProcAddr_PFN_vkVoidFunction_return;
845 }
846 
vkGetDeviceProcAddr(VkDevice device,const char * pName,uint32_t doLock)847 PFN_vkVoidFunction VkEncoder::vkGetDeviceProcAddr(VkDevice device, const char* pName,
848                                                   uint32_t doLock) {
849     (void)doLock;
850     bool queueSubmitWithCommandsEnabled =
851         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
852     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
853     auto stream = mImpl->stream();
854     auto pool = mImpl->pool();
855     VkDevice local_device;
856     char* local_pName;
857     local_device = device;
858     // Avoiding deepcopy for pName
859     local_pName = (char*)pName;
860     size_t count = 0;
861     size_t* countPtr = &count;
862     {
863         uint64_t cgen_var_0;
864         *countPtr += 1 * 8;
865         *countPtr += sizeof(uint32_t) + (local_pName ? strlen(local_pName) : 0);
866     }
867     uint32_t packetSize_vkGetDeviceProcAddr =
868         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
869     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceProcAddr);
870     uint8_t* packetBeginPtr = streamPtr;
871     uint8_t** streamPtrPtr = &streamPtr;
872     uint32_t opcode_vkGetDeviceProcAddr = OP_vkGetDeviceProcAddr;
873     uint32_t seqno;
874     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
875     memcpy(streamPtr, &opcode_vkGetDeviceProcAddr, sizeof(uint32_t));
876     streamPtr += sizeof(uint32_t);
877     memcpy(streamPtr, &packetSize_vkGetDeviceProcAddr, sizeof(uint32_t));
878     streamPtr += sizeof(uint32_t);
879     if (queueSubmitWithCommandsEnabled) {
880         memcpy(streamPtr, &seqno, sizeof(uint32_t));
881         streamPtr += sizeof(uint32_t);
882     }
883     uint64_t cgen_var_0;
884     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
885     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
886     *streamPtrPtr += 1 * 8;
887     {
888         uint32_t l = local_pName ? strlen(local_pName) : 0;
889         memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
890         gfxstream::aemu::Stream::toBe32((uint8_t*)*streamPtrPtr);
891         *streamPtrPtr += sizeof(uint32_t);
892         memcpy(*streamPtrPtr, (char*)local_pName, l);
893         *streamPtrPtr += l;
894     }
895     PFN_vkVoidFunction vkGetDeviceProcAddr_PFN_vkVoidFunction_return = (PFN_vkVoidFunction)0;
896     stream->read(&vkGetDeviceProcAddr_PFN_vkVoidFunction_return, sizeof(PFN_vkVoidFunction));
897     ++encodeCount;
898     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
899         pool->freeAll();
900         stream->clearPool();
901     }
902     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
903     return vkGetDeviceProcAddr_PFN_vkVoidFunction_return;
904 }
905 
vkCreateDevice(VkPhysicalDevice physicalDevice,const VkDeviceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDevice * pDevice,uint32_t doLock)906 VkResult VkEncoder::vkCreateDevice(VkPhysicalDevice physicalDevice,
907                                    const VkDeviceCreateInfo* pCreateInfo,
908                                    const VkAllocationCallbacks* pAllocator, VkDevice* pDevice,
909                                    uint32_t doLock) {
910     (void)doLock;
911     bool queueSubmitWithCommandsEnabled =
912         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
913     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
914     auto stream = mImpl->stream();
915     auto pool = mImpl->pool();
916     VkPhysicalDevice local_physicalDevice;
917     VkDeviceCreateInfo* local_pCreateInfo;
918     VkAllocationCallbacks* local_pAllocator;
919     local_physicalDevice = physicalDevice;
920     local_pCreateInfo = nullptr;
921     if (pCreateInfo) {
922         local_pCreateInfo = (VkDeviceCreateInfo*)pool->alloc(sizeof(const VkDeviceCreateInfo));
923         deepcopy_VkDeviceCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
924                                     (VkDeviceCreateInfo*)(local_pCreateInfo));
925     }
926     local_pAllocator = nullptr;
927     if (pAllocator) {
928         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
929         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
930                                        (VkAllocationCallbacks*)(local_pAllocator));
931     }
932     local_pAllocator = nullptr;
933     if (local_pCreateInfo) {
934         transform_tohost_VkDeviceCreateInfo(sResourceTracker,
935                                             (VkDeviceCreateInfo*)(local_pCreateInfo));
936     }
937     if (local_pAllocator) {
938         transform_tohost_VkAllocationCallbacks(sResourceTracker,
939                                                (VkAllocationCallbacks*)(local_pAllocator));
940     }
941     size_t count = 0;
942     size_t* countPtr = &count;
943     {
944         uint64_t cgen_var_0;
945         *countPtr += 1 * 8;
946         count_VkDeviceCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
947                                  (VkDeviceCreateInfo*)(local_pCreateInfo), countPtr);
948         // WARNING PTR CHECK
949         *countPtr += 8;
950         if (local_pAllocator) {
951             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
952                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
953         }
954         uint64_t cgen_var_1;
955         *countPtr += 8;
956     }
957     uint32_t packetSize_vkCreateDevice = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
958     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDevice);
959     uint8_t* packetBeginPtr = streamPtr;
960     uint8_t** streamPtrPtr = &streamPtr;
961     uint32_t opcode_vkCreateDevice = OP_vkCreateDevice;
962     uint32_t seqno;
963     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
964     memcpy(streamPtr, &opcode_vkCreateDevice, sizeof(uint32_t));
965     streamPtr += sizeof(uint32_t);
966     memcpy(streamPtr, &packetSize_vkCreateDevice, sizeof(uint32_t));
967     streamPtr += sizeof(uint32_t);
968     if (queueSubmitWithCommandsEnabled) {
969         memcpy(streamPtr, &seqno, sizeof(uint32_t));
970         streamPtr += sizeof(uint32_t);
971     }
972     uint64_t cgen_var_0;
973     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
974     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
975     *streamPtrPtr += 1 * 8;
976     reservedmarshal_VkDeviceCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
977                                        (VkDeviceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
978     // WARNING PTR CHECK
979     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
980     memcpy((*streamPtrPtr), &cgen_var_1, 8);
981     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
982     *streamPtrPtr += 8;
983     if (local_pAllocator) {
984         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
985                                               (VkAllocationCallbacks*)(local_pAllocator),
986                                               streamPtrPtr);
987     }
988     /* is handle, possibly out */;
989     uint64_t cgen_var_2;
990     *&cgen_var_2 = (uint64_t)((*pDevice));
991     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
992     *streamPtrPtr += 8;
993     /* is handle, possibly out */;
994     stream->setHandleMapping(sResourceTracker->createMapping());
995     uint64_t cgen_var_3;
996     stream->read((uint64_t*)&cgen_var_3, 8);
997     stream->handleMapping()->mapHandles_u64_VkDevice(&cgen_var_3, (VkDevice*)pDevice, 1);
998     stream->unsetHandleMapping();
999     VkResult vkCreateDevice_VkResult_return = (VkResult)0;
1000     stream->read(&vkCreateDevice_VkResult_return, sizeof(VkResult));
1001     sResourceTracker->on_vkCreateDevice(this, vkCreateDevice_VkResult_return, physicalDevice,
1002                                         pCreateInfo, pAllocator, pDevice);
1003     ++encodeCount;
1004     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
1005         pool->freeAll();
1006         stream->clearPool();
1007     }
1008     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
1009     return vkCreateDevice_VkResult_return;
1010 }
1011 
vkDestroyDevice(VkDevice device,const VkAllocationCallbacks * pAllocator,uint32_t doLock)1012 void VkEncoder::vkDestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator,
1013                                 uint32_t doLock) {
1014     (void)doLock;
1015     bool queueSubmitWithCommandsEnabled =
1016         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
1017     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
1018     sResourceTracker->on_vkDestroyDevice_pre(this, device, pAllocator);
1019     auto stream = mImpl->stream();
1020     auto pool = mImpl->pool();
1021     VkDevice local_device;
1022     VkAllocationCallbacks* local_pAllocator;
1023     local_device = device;
1024     local_pAllocator = nullptr;
1025     if (pAllocator) {
1026         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
1027         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
1028                                        (VkAllocationCallbacks*)(local_pAllocator));
1029     }
1030     local_pAllocator = nullptr;
1031     if (local_pAllocator) {
1032         transform_tohost_VkAllocationCallbacks(sResourceTracker,
1033                                                (VkAllocationCallbacks*)(local_pAllocator));
1034     }
1035     size_t count = 0;
1036     size_t* countPtr = &count;
1037     {
1038         uint64_t cgen_var_0;
1039         *countPtr += 1 * 8;
1040         // WARNING PTR CHECK
1041         *countPtr += 8;
1042         if (local_pAllocator) {
1043             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
1044                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
1045         }
1046     }
1047     uint32_t packetSize_vkDestroyDevice = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
1048     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDevice);
1049     uint8_t* packetBeginPtr = streamPtr;
1050     uint8_t** streamPtrPtr = &streamPtr;
1051     uint32_t opcode_vkDestroyDevice = OP_vkDestroyDevice;
1052     uint32_t seqno;
1053     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
1054     memcpy(streamPtr, &opcode_vkDestroyDevice, sizeof(uint32_t));
1055     streamPtr += sizeof(uint32_t);
1056     memcpy(streamPtr, &packetSize_vkDestroyDevice, sizeof(uint32_t));
1057     streamPtr += sizeof(uint32_t);
1058     if (queueSubmitWithCommandsEnabled) {
1059         memcpy(streamPtr, &seqno, sizeof(uint32_t));
1060         streamPtr += sizeof(uint32_t);
1061     }
1062     uint64_t cgen_var_0;
1063     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
1064     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
1065     *streamPtrPtr += 1 * 8;
1066     // WARNING PTR CHECK
1067     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
1068     memcpy((*streamPtrPtr), &cgen_var_1, 8);
1069     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1070     *streamPtrPtr += 8;
1071     if (local_pAllocator) {
1072         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1073                                               (VkAllocationCallbacks*)(local_pAllocator),
1074                                               streamPtrPtr);
1075     }
1076     sResourceTracker->destroyMapping()->mapHandles_VkDevice((VkDevice*)&device);
1077     stream->flush();
1078     ++encodeCount;
1079     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
1080         pool->freeAll();
1081         stream->clearPool();
1082     }
1083     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
1084 }
1085 
vkEnumerateInstanceExtensionProperties(const char * pLayerName,uint32_t * pPropertyCount,VkExtensionProperties * pProperties,uint32_t doLock)1086 VkResult VkEncoder::vkEnumerateInstanceExtensionProperties(const char* pLayerName,
1087                                                            uint32_t* pPropertyCount,
1088                                                            VkExtensionProperties* pProperties,
1089                                                            uint32_t doLock) {
1090     (void)doLock;
1091     bool queueSubmitWithCommandsEnabled =
1092         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
1093     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
1094     auto stream = mImpl->stream();
1095     auto pool = mImpl->pool();
1096     char* local_pLayerName;
1097     // Avoiding deepcopy for pLayerName
1098     local_pLayerName = (char*)pLayerName;
1099     size_t count = 0;
1100     size_t* countPtr = &count;
1101     {
1102         if (sFeatureBits & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
1103             // WARNING PTR CHECK
1104             *countPtr += 8;
1105             if (local_pLayerName) {
1106                 *countPtr += sizeof(uint32_t) + (local_pLayerName ? strlen(local_pLayerName) : 0);
1107             }
1108         } else {
1109             *countPtr += sizeof(uint32_t) + (local_pLayerName ? strlen(local_pLayerName) : 0);
1110         }
1111         // WARNING PTR CHECK
1112         *countPtr += 8;
1113         if (pPropertyCount) {
1114             *countPtr += sizeof(uint32_t);
1115         }
1116         // WARNING PTR CHECK
1117         *countPtr += 8;
1118         if (pProperties) {
1119             if (pPropertyCount) {
1120                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1121                     count_VkExtensionProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
1122                                                 (VkExtensionProperties*)(pProperties + i),
1123                                                 countPtr);
1124                 }
1125             }
1126         }
1127     }
1128     uint32_t packetSize_vkEnumerateInstanceExtensionProperties =
1129         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
1130     uint8_t* streamPtr = stream->reserve(packetSize_vkEnumerateInstanceExtensionProperties);
1131     uint8_t* packetBeginPtr = streamPtr;
1132     uint8_t** streamPtrPtr = &streamPtr;
1133     uint32_t opcode_vkEnumerateInstanceExtensionProperties =
1134         OP_vkEnumerateInstanceExtensionProperties;
1135     uint32_t seqno;
1136     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
1137     memcpy(streamPtr, &opcode_vkEnumerateInstanceExtensionProperties, sizeof(uint32_t));
1138     streamPtr += sizeof(uint32_t);
1139     memcpy(streamPtr, &packetSize_vkEnumerateInstanceExtensionProperties, sizeof(uint32_t));
1140     streamPtr += sizeof(uint32_t);
1141     if (queueSubmitWithCommandsEnabled) {
1142         memcpy(streamPtr, &seqno, sizeof(uint32_t));
1143         streamPtr += sizeof(uint32_t);
1144     }
1145     if (stream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
1146         // WARNING PTR CHECK
1147         uint64_t cgen_var_0 = (uint64_t)(uintptr_t)local_pLayerName;
1148         memcpy((*streamPtrPtr), &cgen_var_0, 8);
1149         gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1150         *streamPtrPtr += 8;
1151         if (local_pLayerName) {
1152             {
1153                 uint32_t l = local_pLayerName ? strlen(local_pLayerName) : 0;
1154                 memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
1155                 gfxstream::aemu::Stream::toBe32((uint8_t*)*streamPtrPtr);
1156                 *streamPtrPtr += sizeof(uint32_t);
1157                 memcpy(*streamPtrPtr, (char*)local_pLayerName, l);
1158                 *streamPtrPtr += l;
1159             }
1160         }
1161     } else {
1162         {
1163             uint32_t l = local_pLayerName ? strlen(local_pLayerName) : 0;
1164             memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
1165             gfxstream::aemu::Stream::toBe32((uint8_t*)*streamPtrPtr);
1166             *streamPtrPtr += sizeof(uint32_t);
1167             memcpy(*streamPtrPtr, (char*)local_pLayerName, l);
1168             *streamPtrPtr += l;
1169         }
1170     }
1171     // WARNING PTR CHECK
1172     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)pPropertyCount;
1173     memcpy((*streamPtrPtr), &cgen_var_0, 8);
1174     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1175     *streamPtrPtr += 8;
1176     if (pPropertyCount) {
1177         memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
1178         *streamPtrPtr += sizeof(uint32_t);
1179     }
1180     // WARNING PTR CHECK
1181     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pProperties;
1182     memcpy((*streamPtrPtr), &cgen_var_1, 8);
1183     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1184     *streamPtrPtr += 8;
1185     if (pProperties) {
1186         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1187             reservedmarshal_VkExtensionProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1188                                                   (VkExtensionProperties*)(pProperties + i),
1189                                                   streamPtrPtr);
1190         }
1191     }
1192     // WARNING PTR CHECK
1193     uint32_t* check_pPropertyCount;
1194     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
1195     if (pPropertyCount) {
1196         if (!(check_pPropertyCount)) {
1197             fprintf(stderr, "fatal: pPropertyCount inconsistent between guest and host\n");
1198         }
1199         stream->read((uint32_t*)pPropertyCount, sizeof(uint32_t));
1200     }
1201     // WARNING PTR CHECK
1202     VkExtensionProperties* check_pProperties;
1203     check_pProperties = (VkExtensionProperties*)(uintptr_t)stream->getBe64();
1204     if (pProperties) {
1205         if (!(check_pProperties)) {
1206             fprintf(stderr, "fatal: pProperties inconsistent between guest and host\n");
1207         }
1208         if (pPropertyCount) {
1209             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1210                 unmarshal_VkExtensionProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1211                                                 (VkExtensionProperties*)(pProperties + i));
1212             }
1213         }
1214     }
1215     if (pPropertyCount) {
1216         if (pProperties) {
1217             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1218                 transform_fromhost_VkExtensionProperties(sResourceTracker,
1219                                                          (VkExtensionProperties*)(pProperties + i));
1220             }
1221         }
1222     }
1223     VkResult vkEnumerateInstanceExtensionProperties_VkResult_return = (VkResult)0;
1224     stream->read(&vkEnumerateInstanceExtensionProperties_VkResult_return, sizeof(VkResult));
1225     ++encodeCount;
1226     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
1227         pool->freeAll();
1228         stream->clearPool();
1229     }
1230     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
1231     return vkEnumerateInstanceExtensionProperties_VkResult_return;
1232 }
1233 
vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,const char * pLayerName,uint32_t * pPropertyCount,VkExtensionProperties * pProperties,uint32_t doLock)1234 VkResult VkEncoder::vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,
1235                                                          const char* pLayerName,
1236                                                          uint32_t* pPropertyCount,
1237                                                          VkExtensionProperties* pProperties,
1238                                                          uint32_t doLock) {
1239     (void)doLock;
1240     bool queueSubmitWithCommandsEnabled =
1241         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
1242     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
1243     auto stream = mImpl->stream();
1244     auto pool = mImpl->pool();
1245     VkPhysicalDevice local_physicalDevice;
1246     char* local_pLayerName;
1247     local_physicalDevice = physicalDevice;
1248     // Avoiding deepcopy for pLayerName
1249     local_pLayerName = (char*)pLayerName;
1250     size_t count = 0;
1251     size_t* countPtr = &count;
1252     {
1253         uint64_t cgen_var_0;
1254         *countPtr += 1 * 8;
1255         if (sFeatureBits & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
1256             // WARNING PTR CHECK
1257             *countPtr += 8;
1258             if (local_pLayerName) {
1259                 *countPtr += sizeof(uint32_t) + (local_pLayerName ? strlen(local_pLayerName) : 0);
1260             }
1261         } else {
1262             *countPtr += sizeof(uint32_t) + (local_pLayerName ? strlen(local_pLayerName) : 0);
1263         }
1264         // WARNING PTR CHECK
1265         *countPtr += 8;
1266         if (pPropertyCount) {
1267             *countPtr += sizeof(uint32_t);
1268         }
1269         // WARNING PTR CHECK
1270         *countPtr += 8;
1271         if (pProperties) {
1272             if (pPropertyCount) {
1273                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1274                     count_VkExtensionProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
1275                                                 (VkExtensionProperties*)(pProperties + i),
1276                                                 countPtr);
1277                 }
1278             }
1279         }
1280     }
1281     uint32_t packetSize_vkEnumerateDeviceExtensionProperties =
1282         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
1283     uint8_t* streamPtr = stream->reserve(packetSize_vkEnumerateDeviceExtensionProperties);
1284     uint8_t* packetBeginPtr = streamPtr;
1285     uint8_t** streamPtrPtr = &streamPtr;
1286     uint32_t opcode_vkEnumerateDeviceExtensionProperties = OP_vkEnumerateDeviceExtensionProperties;
1287     uint32_t seqno;
1288     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
1289     memcpy(streamPtr, &opcode_vkEnumerateDeviceExtensionProperties, sizeof(uint32_t));
1290     streamPtr += sizeof(uint32_t);
1291     memcpy(streamPtr, &packetSize_vkEnumerateDeviceExtensionProperties, sizeof(uint32_t));
1292     streamPtr += sizeof(uint32_t);
1293     if (queueSubmitWithCommandsEnabled) {
1294         memcpy(streamPtr, &seqno, sizeof(uint32_t));
1295         streamPtr += sizeof(uint32_t);
1296     }
1297     uint64_t cgen_var_0;
1298     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
1299     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
1300     *streamPtrPtr += 1 * 8;
1301     if (stream->getFeatureBits() & VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT) {
1302         // WARNING PTR CHECK
1303         uint64_t cgen_var_0_0 = (uint64_t)(uintptr_t)local_pLayerName;
1304         memcpy((*streamPtrPtr), &cgen_var_0_0, 8);
1305         gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1306         *streamPtrPtr += 8;
1307         if (local_pLayerName) {
1308             {
1309                 uint32_t l = local_pLayerName ? strlen(local_pLayerName) : 0;
1310                 memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
1311                 gfxstream::aemu::Stream::toBe32((uint8_t*)*streamPtrPtr);
1312                 *streamPtrPtr += sizeof(uint32_t);
1313                 memcpy(*streamPtrPtr, (char*)local_pLayerName, l);
1314                 *streamPtrPtr += l;
1315             }
1316         }
1317     } else {
1318         {
1319             uint32_t l = local_pLayerName ? strlen(local_pLayerName) : 0;
1320             memcpy(*streamPtrPtr, (uint32_t*)&l, sizeof(uint32_t));
1321             gfxstream::aemu::Stream::toBe32((uint8_t*)*streamPtrPtr);
1322             *streamPtrPtr += sizeof(uint32_t);
1323             memcpy(*streamPtrPtr, (char*)local_pLayerName, l);
1324             *streamPtrPtr += l;
1325         }
1326     }
1327     // WARNING PTR CHECK
1328     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pPropertyCount;
1329     memcpy((*streamPtrPtr), &cgen_var_1, 8);
1330     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1331     *streamPtrPtr += 8;
1332     if (pPropertyCount) {
1333         memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
1334         *streamPtrPtr += sizeof(uint32_t);
1335     }
1336     // WARNING PTR CHECK
1337     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pProperties;
1338     memcpy((*streamPtrPtr), &cgen_var_2, 8);
1339     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1340     *streamPtrPtr += 8;
1341     if (pProperties) {
1342         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1343             reservedmarshal_VkExtensionProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1344                                                   (VkExtensionProperties*)(pProperties + i),
1345                                                   streamPtrPtr);
1346         }
1347     }
1348     // WARNING PTR CHECK
1349     uint32_t* check_pPropertyCount;
1350     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
1351     if (pPropertyCount) {
1352         if (!(check_pPropertyCount)) {
1353             fprintf(stderr, "fatal: pPropertyCount inconsistent between guest and host\n");
1354         }
1355         stream->read((uint32_t*)pPropertyCount, sizeof(uint32_t));
1356     }
1357     // WARNING PTR CHECK
1358     VkExtensionProperties* check_pProperties;
1359     check_pProperties = (VkExtensionProperties*)(uintptr_t)stream->getBe64();
1360     if (pProperties) {
1361         if (!(check_pProperties)) {
1362             fprintf(stderr, "fatal: pProperties inconsistent between guest and host\n");
1363         }
1364         if (pPropertyCount) {
1365             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1366                 unmarshal_VkExtensionProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1367                                                 (VkExtensionProperties*)(pProperties + i));
1368             }
1369         }
1370     }
1371     if (pPropertyCount) {
1372         if (pProperties) {
1373             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1374                 transform_fromhost_VkExtensionProperties(sResourceTracker,
1375                                                          (VkExtensionProperties*)(pProperties + i));
1376             }
1377         }
1378     }
1379     VkResult vkEnumerateDeviceExtensionProperties_VkResult_return = (VkResult)0;
1380     stream->read(&vkEnumerateDeviceExtensionProperties_VkResult_return, sizeof(VkResult));
1381     ++encodeCount;
1382     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
1383         pool->freeAll();
1384         stream->clearPool();
1385     }
1386     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
1387     return vkEnumerateDeviceExtensionProperties_VkResult_return;
1388 }
1389 
vkEnumerateInstanceLayerProperties(uint32_t * pPropertyCount,VkLayerProperties * pProperties,uint32_t doLock)1390 VkResult VkEncoder::vkEnumerateInstanceLayerProperties(uint32_t* pPropertyCount,
1391                                                        VkLayerProperties* pProperties,
1392                                                        uint32_t doLock) {
1393     (void)doLock;
1394     bool queueSubmitWithCommandsEnabled =
1395         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
1396     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
1397     auto stream = mImpl->stream();
1398     auto pool = mImpl->pool();
1399     size_t count = 0;
1400     size_t* countPtr = &count;
1401     {
1402         // WARNING PTR CHECK
1403         *countPtr += 8;
1404         if (pPropertyCount) {
1405             *countPtr += sizeof(uint32_t);
1406         }
1407         // WARNING PTR CHECK
1408         *countPtr += 8;
1409         if (pProperties) {
1410             if (pPropertyCount) {
1411                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1412                     count_VkLayerProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
1413                                             (VkLayerProperties*)(pProperties + i), countPtr);
1414                 }
1415             }
1416         }
1417     }
1418     uint32_t packetSize_vkEnumerateInstanceLayerProperties =
1419         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
1420     uint8_t* streamPtr = stream->reserve(packetSize_vkEnumerateInstanceLayerProperties);
1421     uint8_t* packetBeginPtr = streamPtr;
1422     uint8_t** streamPtrPtr = &streamPtr;
1423     uint32_t opcode_vkEnumerateInstanceLayerProperties = OP_vkEnumerateInstanceLayerProperties;
1424     uint32_t seqno;
1425     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
1426     memcpy(streamPtr, &opcode_vkEnumerateInstanceLayerProperties, sizeof(uint32_t));
1427     streamPtr += sizeof(uint32_t);
1428     memcpy(streamPtr, &packetSize_vkEnumerateInstanceLayerProperties, sizeof(uint32_t));
1429     streamPtr += sizeof(uint32_t);
1430     if (queueSubmitWithCommandsEnabled) {
1431         memcpy(streamPtr, &seqno, sizeof(uint32_t));
1432         streamPtr += sizeof(uint32_t);
1433     }
1434     // WARNING PTR CHECK
1435     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)pPropertyCount;
1436     memcpy((*streamPtrPtr), &cgen_var_0, 8);
1437     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1438     *streamPtrPtr += 8;
1439     if (pPropertyCount) {
1440         memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
1441         *streamPtrPtr += sizeof(uint32_t);
1442     }
1443     // WARNING PTR CHECK
1444     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pProperties;
1445     memcpy((*streamPtrPtr), &cgen_var_1, 8);
1446     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1447     *streamPtrPtr += 8;
1448     if (pProperties) {
1449         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1450             reservedmarshal_VkLayerProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1451                                               (VkLayerProperties*)(pProperties + i), streamPtrPtr);
1452         }
1453     }
1454     // WARNING PTR CHECK
1455     uint32_t* check_pPropertyCount;
1456     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
1457     if (pPropertyCount) {
1458         if (!(check_pPropertyCount)) {
1459             fprintf(stderr, "fatal: pPropertyCount inconsistent between guest and host\n");
1460         }
1461         stream->read((uint32_t*)pPropertyCount, sizeof(uint32_t));
1462     }
1463     // WARNING PTR CHECK
1464     VkLayerProperties* check_pProperties;
1465     check_pProperties = (VkLayerProperties*)(uintptr_t)stream->getBe64();
1466     if (pProperties) {
1467         if (!(check_pProperties)) {
1468             fprintf(stderr, "fatal: pProperties inconsistent between guest and host\n");
1469         }
1470         if (pPropertyCount) {
1471             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1472                 unmarshal_VkLayerProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1473                                             (VkLayerProperties*)(pProperties + i));
1474             }
1475         }
1476     }
1477     if (pPropertyCount) {
1478         if (pProperties) {
1479             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1480                 transform_fromhost_VkLayerProperties(sResourceTracker,
1481                                                      (VkLayerProperties*)(pProperties + i));
1482             }
1483         }
1484     }
1485     VkResult vkEnumerateInstanceLayerProperties_VkResult_return = (VkResult)0;
1486     stream->read(&vkEnumerateInstanceLayerProperties_VkResult_return, sizeof(VkResult));
1487     ++encodeCount;
1488     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
1489         pool->freeAll();
1490         stream->clearPool();
1491     }
1492     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
1493     return vkEnumerateInstanceLayerProperties_VkResult_return;
1494 }
1495 
vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice,uint32_t * pPropertyCount,VkLayerProperties * pProperties,uint32_t doLock)1496 VkResult VkEncoder::vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice,
1497                                                      uint32_t* pPropertyCount,
1498                                                      VkLayerProperties* pProperties,
1499                                                      uint32_t doLock) {
1500     (void)doLock;
1501     bool queueSubmitWithCommandsEnabled =
1502         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
1503     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
1504     auto stream = mImpl->stream();
1505     auto pool = mImpl->pool();
1506     VkPhysicalDevice local_physicalDevice;
1507     local_physicalDevice = physicalDevice;
1508     size_t count = 0;
1509     size_t* countPtr = &count;
1510     {
1511         uint64_t cgen_var_0;
1512         *countPtr += 1 * 8;
1513         // WARNING PTR CHECK
1514         *countPtr += 8;
1515         if (pPropertyCount) {
1516             *countPtr += sizeof(uint32_t);
1517         }
1518         // WARNING PTR CHECK
1519         *countPtr += 8;
1520         if (pProperties) {
1521             if (pPropertyCount) {
1522                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1523                     count_VkLayerProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
1524                                             (VkLayerProperties*)(pProperties + i), countPtr);
1525                 }
1526             }
1527         }
1528     }
1529     uint32_t packetSize_vkEnumerateDeviceLayerProperties =
1530         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
1531     uint8_t* streamPtr = stream->reserve(packetSize_vkEnumerateDeviceLayerProperties);
1532     uint8_t* packetBeginPtr = streamPtr;
1533     uint8_t** streamPtrPtr = &streamPtr;
1534     uint32_t opcode_vkEnumerateDeviceLayerProperties = OP_vkEnumerateDeviceLayerProperties;
1535     uint32_t seqno;
1536     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
1537     memcpy(streamPtr, &opcode_vkEnumerateDeviceLayerProperties, sizeof(uint32_t));
1538     streamPtr += sizeof(uint32_t);
1539     memcpy(streamPtr, &packetSize_vkEnumerateDeviceLayerProperties, sizeof(uint32_t));
1540     streamPtr += sizeof(uint32_t);
1541     if (queueSubmitWithCommandsEnabled) {
1542         memcpy(streamPtr, &seqno, sizeof(uint32_t));
1543         streamPtr += sizeof(uint32_t);
1544     }
1545     uint64_t cgen_var_0;
1546     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
1547     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
1548     *streamPtrPtr += 1 * 8;
1549     // WARNING PTR CHECK
1550     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pPropertyCount;
1551     memcpy((*streamPtrPtr), &cgen_var_1, 8);
1552     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1553     *streamPtrPtr += 8;
1554     if (pPropertyCount) {
1555         memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
1556         *streamPtrPtr += sizeof(uint32_t);
1557     }
1558     // WARNING PTR CHECK
1559     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pProperties;
1560     memcpy((*streamPtrPtr), &cgen_var_2, 8);
1561     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1562     *streamPtrPtr += 8;
1563     if (pProperties) {
1564         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1565             reservedmarshal_VkLayerProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1566                                               (VkLayerProperties*)(pProperties + i), streamPtrPtr);
1567         }
1568     }
1569     // WARNING PTR CHECK
1570     uint32_t* check_pPropertyCount;
1571     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
1572     if (pPropertyCount) {
1573         if (!(check_pPropertyCount)) {
1574             fprintf(stderr, "fatal: pPropertyCount inconsistent between guest and host\n");
1575         }
1576         stream->read((uint32_t*)pPropertyCount, sizeof(uint32_t));
1577     }
1578     // WARNING PTR CHECK
1579     VkLayerProperties* check_pProperties;
1580     check_pProperties = (VkLayerProperties*)(uintptr_t)stream->getBe64();
1581     if (pProperties) {
1582         if (!(check_pProperties)) {
1583             fprintf(stderr, "fatal: pProperties inconsistent between guest and host\n");
1584         }
1585         if (pPropertyCount) {
1586             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1587                 unmarshal_VkLayerProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1588                                             (VkLayerProperties*)(pProperties + i));
1589             }
1590         }
1591     }
1592     if (pPropertyCount) {
1593         if (pProperties) {
1594             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
1595                 transform_fromhost_VkLayerProperties(sResourceTracker,
1596                                                      (VkLayerProperties*)(pProperties + i));
1597             }
1598         }
1599     }
1600     VkResult vkEnumerateDeviceLayerProperties_VkResult_return = (VkResult)0;
1601     stream->read(&vkEnumerateDeviceLayerProperties_VkResult_return, sizeof(VkResult));
1602     ++encodeCount;
1603     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
1604         pool->freeAll();
1605         stream->clearPool();
1606     }
1607     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
1608     return vkEnumerateDeviceLayerProperties_VkResult_return;
1609 }
1610 
vkGetDeviceQueue(VkDevice device,uint32_t queueFamilyIndex,uint32_t queueIndex,VkQueue * pQueue,uint32_t doLock)1611 void VkEncoder::vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex,
1612                                  VkQueue* pQueue, uint32_t doLock) {
1613     (void)doLock;
1614     bool queueSubmitWithCommandsEnabled =
1615         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
1616     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
1617     auto stream = mImpl->stream();
1618     auto pool = mImpl->pool();
1619     VkDevice local_device;
1620     uint32_t local_queueFamilyIndex;
1621     uint32_t local_queueIndex;
1622     local_device = device;
1623     local_queueFamilyIndex = queueFamilyIndex;
1624     local_queueIndex = queueIndex;
1625     size_t count = 0;
1626     size_t* countPtr = &count;
1627     {
1628         uint64_t cgen_var_0;
1629         *countPtr += 1 * 8;
1630         *countPtr += sizeof(uint32_t);
1631         *countPtr += sizeof(uint32_t);
1632         uint64_t cgen_var_1;
1633         *countPtr += 8;
1634     }
1635     uint32_t packetSize_vkGetDeviceQueue = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
1636     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceQueue);
1637     uint8_t* packetBeginPtr = streamPtr;
1638     uint8_t** streamPtrPtr = &streamPtr;
1639     uint32_t opcode_vkGetDeviceQueue = OP_vkGetDeviceQueue;
1640     uint32_t seqno;
1641     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
1642     memcpy(streamPtr, &opcode_vkGetDeviceQueue, sizeof(uint32_t));
1643     streamPtr += sizeof(uint32_t);
1644     memcpy(streamPtr, &packetSize_vkGetDeviceQueue, sizeof(uint32_t));
1645     streamPtr += sizeof(uint32_t);
1646     if (queueSubmitWithCommandsEnabled) {
1647         memcpy(streamPtr, &seqno, sizeof(uint32_t));
1648         streamPtr += sizeof(uint32_t);
1649     }
1650     uint64_t cgen_var_0;
1651     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
1652     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
1653     *streamPtrPtr += 1 * 8;
1654     memcpy(*streamPtrPtr, (uint32_t*)&local_queueFamilyIndex, sizeof(uint32_t));
1655     *streamPtrPtr += sizeof(uint32_t);
1656     memcpy(*streamPtrPtr, (uint32_t*)&local_queueIndex, sizeof(uint32_t));
1657     *streamPtrPtr += sizeof(uint32_t);
1658     /* is handle, possibly out */;
1659     uint64_t cgen_var_1;
1660     *&cgen_var_1 = (uint64_t)((*pQueue));
1661     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 8);
1662     *streamPtrPtr += 8;
1663     /* is handle, possibly out */;
1664     stream->setHandleMapping(sResourceTracker->createMapping());
1665     uint64_t cgen_var_2;
1666     stream->read((uint64_t*)&cgen_var_2, 8);
1667     stream->handleMapping()->mapHandles_u64_VkQueue(&cgen_var_2, (VkQueue*)pQueue, 1);
1668     stream->unsetHandleMapping();
1669     sResourceTracker->on_vkGetDeviceQueue(this, device, queueFamilyIndex, queueIndex, pQueue);
1670     ++encodeCount;
1671     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
1672         pool->freeAll();
1673         stream->clearPool();
1674     }
1675     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
1676 }
1677 
vkQueueSubmit(VkQueue queue,uint32_t submitCount,const VkSubmitInfo * pSubmits,VkFence fence,uint32_t doLock)1678 VkResult VkEncoder::vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits,
1679                                   VkFence fence, uint32_t doLock) {
1680     (void)doLock;
1681     bool queueSubmitWithCommandsEnabled =
1682         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
1683     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
1684     auto stream = mImpl->stream();
1685     auto pool = mImpl->pool();
1686     VkQueue local_queue;
1687     uint32_t local_submitCount;
1688     VkSubmitInfo* local_pSubmits;
1689     VkFence local_fence;
1690     local_queue = queue;
1691     local_submitCount = submitCount;
1692     local_pSubmits = nullptr;
1693     if (pSubmits) {
1694         local_pSubmits = (VkSubmitInfo*)pool->alloc(((submitCount)) * sizeof(const VkSubmitInfo));
1695         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
1696             deepcopy_VkSubmitInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubmits + i,
1697                                   (VkSubmitInfo*)(local_pSubmits + i));
1698         }
1699     }
1700     local_fence = fence;
1701     if (local_pSubmits) {
1702         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
1703             transform_tohost_VkSubmitInfo(sResourceTracker, (VkSubmitInfo*)(local_pSubmits + i));
1704         }
1705     }
1706     size_t count = 0;
1707     size_t* countPtr = &count;
1708     {
1709         uint64_t cgen_var_0;
1710         *countPtr += 1 * 8;
1711         *countPtr += sizeof(uint32_t);
1712         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
1713             count_VkSubmitInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
1714                                (VkSubmitInfo*)(local_pSubmits + i), countPtr);
1715         }
1716         uint64_t cgen_var_1;
1717         *countPtr += 1 * 8;
1718     }
1719     uint32_t packetSize_vkQueueSubmit = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
1720     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSubmit);
1721     uint8_t* packetBeginPtr = streamPtr;
1722     uint8_t** streamPtrPtr = &streamPtr;
1723     uint32_t opcode_vkQueueSubmit = OP_vkQueueSubmit;
1724     uint32_t seqno;
1725     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
1726     memcpy(streamPtr, &opcode_vkQueueSubmit, sizeof(uint32_t));
1727     streamPtr += sizeof(uint32_t);
1728     memcpy(streamPtr, &packetSize_vkQueueSubmit, sizeof(uint32_t));
1729     streamPtr += sizeof(uint32_t);
1730     if (queueSubmitWithCommandsEnabled) {
1731         memcpy(streamPtr, &seqno, sizeof(uint32_t));
1732         streamPtr += sizeof(uint32_t);
1733     }
1734     uint64_t cgen_var_0;
1735     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
1736     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
1737     *streamPtrPtr += 1 * 8;
1738     memcpy(*streamPtrPtr, (uint32_t*)&local_submitCount, sizeof(uint32_t));
1739     *streamPtrPtr += sizeof(uint32_t);
1740     for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
1741         reservedmarshal_VkSubmitInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1742                                      (VkSubmitInfo*)(local_pSubmits + i), streamPtrPtr);
1743     }
1744     uint64_t cgen_var_1;
1745     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
1746     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
1747     *streamPtrPtr += 1 * 8;
1748     VkResult vkQueueSubmit_VkResult_return = (VkResult)0;
1749     stream->read(&vkQueueSubmit_VkResult_return, sizeof(VkResult));
1750     ++encodeCount;
1751     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
1752         pool->freeAll();
1753         stream->clearPool();
1754     }
1755     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
1756     return vkQueueSubmit_VkResult_return;
1757 }
1758 
vkQueueWaitIdle(VkQueue queue,uint32_t doLock)1759 VkResult VkEncoder::vkQueueWaitIdle(VkQueue queue, uint32_t doLock) {
1760     (void)doLock;
1761     bool queueSubmitWithCommandsEnabled =
1762         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
1763     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
1764     auto stream = mImpl->stream();
1765     auto pool = mImpl->pool();
1766     VkQueue local_queue;
1767     local_queue = queue;
1768     size_t count = 0;
1769     size_t* countPtr = &count;
1770     {
1771         uint64_t cgen_var_0;
1772         *countPtr += 1 * 8;
1773     }
1774     uint32_t packetSize_vkQueueWaitIdle = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
1775     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueWaitIdle);
1776     uint8_t* packetBeginPtr = streamPtr;
1777     uint8_t** streamPtrPtr = &streamPtr;
1778     uint32_t opcode_vkQueueWaitIdle = OP_vkQueueWaitIdle;
1779     uint32_t seqno;
1780     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
1781     memcpy(streamPtr, &opcode_vkQueueWaitIdle, sizeof(uint32_t));
1782     streamPtr += sizeof(uint32_t);
1783     memcpy(streamPtr, &packetSize_vkQueueWaitIdle, sizeof(uint32_t));
1784     streamPtr += sizeof(uint32_t);
1785     if (queueSubmitWithCommandsEnabled) {
1786         memcpy(streamPtr, &seqno, sizeof(uint32_t));
1787         streamPtr += sizeof(uint32_t);
1788     }
1789     uint64_t cgen_var_0;
1790     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
1791     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
1792     *streamPtrPtr += 1 * 8;
1793     VkResult vkQueueWaitIdle_VkResult_return = (VkResult)0;
1794     stream->read(&vkQueueWaitIdle_VkResult_return, sizeof(VkResult));
1795     ++encodeCount;
1796     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
1797         pool->freeAll();
1798         stream->clearPool();
1799     }
1800     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
1801     return vkQueueWaitIdle_VkResult_return;
1802 }
1803 
vkDeviceWaitIdle(VkDevice device,uint32_t doLock)1804 VkResult VkEncoder::vkDeviceWaitIdle(VkDevice device, uint32_t doLock) {
1805     (void)doLock;
1806     bool queueSubmitWithCommandsEnabled =
1807         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
1808     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
1809     auto stream = mImpl->stream();
1810     auto pool = mImpl->pool();
1811     VkDevice local_device;
1812     local_device = device;
1813     size_t count = 0;
1814     size_t* countPtr = &count;
1815     {
1816         uint64_t cgen_var_0;
1817         *countPtr += 1 * 8;
1818     }
1819     uint32_t packetSize_vkDeviceWaitIdle = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
1820     uint8_t* streamPtr = stream->reserve(packetSize_vkDeviceWaitIdle);
1821     uint8_t* packetBeginPtr = streamPtr;
1822     uint8_t** streamPtrPtr = &streamPtr;
1823     uint32_t opcode_vkDeviceWaitIdle = OP_vkDeviceWaitIdle;
1824     uint32_t seqno;
1825     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
1826     memcpy(streamPtr, &opcode_vkDeviceWaitIdle, sizeof(uint32_t));
1827     streamPtr += sizeof(uint32_t);
1828     memcpy(streamPtr, &packetSize_vkDeviceWaitIdle, sizeof(uint32_t));
1829     streamPtr += sizeof(uint32_t);
1830     if (queueSubmitWithCommandsEnabled) {
1831         memcpy(streamPtr, &seqno, sizeof(uint32_t));
1832         streamPtr += sizeof(uint32_t);
1833     }
1834     uint64_t cgen_var_0;
1835     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
1836     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
1837     *streamPtrPtr += 1 * 8;
1838     VkResult vkDeviceWaitIdle_VkResult_return = (VkResult)0;
1839     stream->read(&vkDeviceWaitIdle_VkResult_return, sizeof(VkResult));
1840     ++encodeCount;
1841     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
1842         pool->freeAll();
1843         stream->clearPool();
1844     }
1845     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
1846     return vkDeviceWaitIdle_VkResult_return;
1847 }
1848 
vkAllocateMemory(VkDevice device,const VkMemoryAllocateInfo * pAllocateInfo,const VkAllocationCallbacks * pAllocator,VkDeviceMemory * pMemory,uint32_t doLock)1849 VkResult VkEncoder::vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo,
1850                                      const VkAllocationCallbacks* pAllocator,
1851                                      VkDeviceMemory* pMemory, uint32_t doLock) {
1852     (void)doLock;
1853     bool queueSubmitWithCommandsEnabled =
1854         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
1855     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
1856     auto stream = mImpl->stream();
1857     auto pool = mImpl->pool();
1858     VkDevice local_device;
1859     VkMemoryAllocateInfo* local_pAllocateInfo;
1860     VkAllocationCallbacks* local_pAllocator;
1861     local_device = device;
1862     local_pAllocateInfo = nullptr;
1863     if (pAllocateInfo) {
1864         local_pAllocateInfo =
1865             (VkMemoryAllocateInfo*)pool->alloc(sizeof(const VkMemoryAllocateInfo));
1866         deepcopy_VkMemoryAllocateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocateInfo,
1867                                       (VkMemoryAllocateInfo*)(local_pAllocateInfo));
1868     }
1869     local_pAllocator = nullptr;
1870     if (pAllocator) {
1871         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
1872         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
1873                                        (VkAllocationCallbacks*)(local_pAllocator));
1874     }
1875     local_pAllocator = nullptr;
1876     if (local_pAllocateInfo) {
1877         transform_tohost_VkMemoryAllocateInfo(sResourceTracker,
1878                                               (VkMemoryAllocateInfo*)(local_pAllocateInfo));
1879     }
1880     if (local_pAllocator) {
1881         transform_tohost_VkAllocationCallbacks(sResourceTracker,
1882                                                (VkAllocationCallbacks*)(local_pAllocator));
1883     }
1884     size_t count = 0;
1885     size_t* countPtr = &count;
1886     {
1887         uint64_t cgen_var_0;
1888         *countPtr += 1 * 8;
1889         count_VkMemoryAllocateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
1890                                    (VkMemoryAllocateInfo*)(local_pAllocateInfo), countPtr);
1891         // WARNING PTR CHECK
1892         *countPtr += 8;
1893         if (local_pAllocator) {
1894             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
1895                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
1896         }
1897         uint64_t cgen_var_1;
1898         *countPtr += 8;
1899     }
1900     uint32_t packetSize_vkAllocateMemory = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
1901     uint8_t* streamPtr = stream->reserve(packetSize_vkAllocateMemory);
1902     uint8_t* packetBeginPtr = streamPtr;
1903     uint8_t** streamPtrPtr = &streamPtr;
1904     uint32_t opcode_vkAllocateMemory = OP_vkAllocateMemory;
1905     uint32_t seqno;
1906     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
1907     memcpy(streamPtr, &opcode_vkAllocateMemory, sizeof(uint32_t));
1908     streamPtr += sizeof(uint32_t);
1909     memcpy(streamPtr, &packetSize_vkAllocateMemory, sizeof(uint32_t));
1910     streamPtr += sizeof(uint32_t);
1911     if (queueSubmitWithCommandsEnabled) {
1912         memcpy(streamPtr, &seqno, sizeof(uint32_t));
1913         streamPtr += sizeof(uint32_t);
1914     }
1915     uint64_t cgen_var_0;
1916     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
1917     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
1918     *streamPtrPtr += 1 * 8;
1919     reservedmarshal_VkMemoryAllocateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1920                                          (VkMemoryAllocateInfo*)(local_pAllocateInfo),
1921                                          streamPtrPtr);
1922     // WARNING PTR CHECK
1923     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
1924     memcpy((*streamPtrPtr), &cgen_var_1, 8);
1925     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
1926     *streamPtrPtr += 8;
1927     if (local_pAllocator) {
1928         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
1929                                               (VkAllocationCallbacks*)(local_pAllocator),
1930                                               streamPtrPtr);
1931     }
1932     /* is handle, possibly out */;
1933     uint64_t cgen_var_2;
1934     *&cgen_var_2 = (uint64_t)((*pMemory));
1935     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
1936     *streamPtrPtr += 8;
1937     /* is handle, possibly out */;
1938     stream->setHandleMapping(sResourceTracker->createMapping());
1939     uint64_t cgen_var_3;
1940     stream->read((uint64_t*)&cgen_var_3, 8);
1941     stream->handleMapping()->mapHandles_u64_VkDeviceMemory(&cgen_var_3, (VkDeviceMemory*)pMemory,
1942                                                            1);
1943     stream->unsetHandleMapping();
1944     VkResult vkAllocateMemory_VkResult_return = (VkResult)0;
1945     stream->read(&vkAllocateMemory_VkResult_return, sizeof(VkResult));
1946     ++encodeCount;
1947     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
1948         pool->freeAll();
1949         stream->clearPool();
1950     }
1951     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
1952     return vkAllocateMemory_VkResult_return;
1953 }
1954 
vkFreeMemory(VkDevice device,VkDeviceMemory memory,const VkAllocationCallbacks * pAllocator,uint32_t doLock)1955 void VkEncoder::vkFreeMemory(VkDevice device, VkDeviceMemory memory,
1956                              const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
1957     (void)doLock;
1958     bool queueSubmitWithCommandsEnabled =
1959         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
1960     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
1961     auto stream = mImpl->stream();
1962     auto pool = mImpl->pool();
1963     VkDevice local_device;
1964     VkDeviceMemory local_memory;
1965     VkAllocationCallbacks* local_pAllocator;
1966     local_device = device;
1967     local_memory = memory;
1968     local_pAllocator = nullptr;
1969     if (pAllocator) {
1970         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
1971         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
1972                                        (VkAllocationCallbacks*)(local_pAllocator));
1973     }
1974     local_pAllocator = nullptr;
1975     sResourceTracker->deviceMemoryTransform_tohost(
1976         (VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
1977         (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
1978     size_t count = 0;
1979     size_t* countPtr = &count;
1980     {
1981         uint64_t cgen_var_0;
1982         *countPtr += 1 * 8;
1983         uint64_t cgen_var_1;
1984         *countPtr += 1 * 8;
1985         // WARNING PTR CHECK
1986         *countPtr += 8;
1987         if (local_pAllocator) {
1988             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
1989                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
1990         }
1991     }
1992     uint32_t packetSize_vkFreeMemory = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
1993     uint8_t* streamPtr = stream->reserve(packetSize_vkFreeMemory);
1994     uint8_t* packetBeginPtr = streamPtr;
1995     uint8_t** streamPtrPtr = &streamPtr;
1996     uint32_t opcode_vkFreeMemory = OP_vkFreeMemory;
1997     uint32_t seqno;
1998     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
1999     memcpy(streamPtr, &opcode_vkFreeMemory, sizeof(uint32_t));
2000     streamPtr += sizeof(uint32_t);
2001     memcpy(streamPtr, &packetSize_vkFreeMemory, sizeof(uint32_t));
2002     streamPtr += sizeof(uint32_t);
2003     if (queueSubmitWithCommandsEnabled) {
2004         memcpy(streamPtr, &seqno, sizeof(uint32_t));
2005         streamPtr += sizeof(uint32_t);
2006     }
2007     uint64_t cgen_var_0;
2008     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
2009     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
2010     *streamPtrPtr += 1 * 8;
2011     uint64_t cgen_var_1;
2012     *&cgen_var_1 = get_host_u64_VkDeviceMemory((*&local_memory));
2013     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
2014     *streamPtrPtr += 1 * 8;
2015     // WARNING PTR CHECK
2016     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
2017     memcpy((*streamPtrPtr), &cgen_var_2, 8);
2018     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
2019     *streamPtrPtr += 8;
2020     if (local_pAllocator) {
2021         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2022                                               (VkAllocationCallbacks*)(local_pAllocator),
2023                                               streamPtrPtr);
2024     }
2025     sResourceTracker->destroyMapping()->mapHandles_VkDeviceMemory((VkDeviceMemory*)&memory);
2026     stream->flush();
2027     ++encodeCount;
2028     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
2029         pool->freeAll();
2030         stream->clearPool();
2031     }
2032     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
2033 }
2034 
vkMapMemory(VkDevice device,VkDeviceMemory memory,VkDeviceSize offset,VkDeviceSize size,VkMemoryMapFlags flags,void ** ppData,uint32_t doLock)2035 VkResult VkEncoder::vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset,
2036                                 VkDeviceSize size, VkMemoryMapFlags flags, void** ppData,
2037                                 uint32_t doLock) {
2038     (void)doLock;
2039     VkResult vkMapMemory_VkResult_return = (VkResult)0;
2040     vkMapMemory_VkResult_return = sResourceTracker->on_vkMapMemory(this, VK_SUCCESS, device, memory,
2041                                                                    offset, size, flags, ppData);
2042     return vkMapMemory_VkResult_return;
2043 }
2044 
vkUnmapMemory(VkDevice device,VkDeviceMemory memory,uint32_t doLock)2045 void VkEncoder::vkUnmapMemory(VkDevice device, VkDeviceMemory memory, uint32_t doLock) {
2046     (void)doLock;
2047     sResourceTracker->on_vkUnmapMemory(this, device, memory);
2048 }
2049 
vkFlushMappedMemoryRanges(VkDevice device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges,uint32_t doLock)2050 VkResult VkEncoder::vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
2051                                               const VkMappedMemoryRange* pMemoryRanges,
2052                                               uint32_t doLock) {
2053     (void)doLock;
2054     bool queueSubmitWithCommandsEnabled =
2055         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
2056     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
2057     VALIDATE_RET(VkResult, VK_SUCCESS,
2058                  mImpl->validation()->on_vkFlushMappedMemoryRanges(
2059                      this, VK_SUCCESS, device, memoryRangeCount, pMemoryRanges));
2060     auto stream = mImpl->stream();
2061     auto pool = mImpl->pool();
2062     VkDevice local_device;
2063     uint32_t local_memoryRangeCount;
2064     VkMappedMemoryRange* local_pMemoryRanges;
2065     local_device = device;
2066     local_memoryRangeCount = memoryRangeCount;
2067     local_pMemoryRanges = nullptr;
2068     if (pMemoryRanges) {
2069         local_pMemoryRanges = (VkMappedMemoryRange*)pool->alloc(((memoryRangeCount)) *
2070                                                                 sizeof(const VkMappedMemoryRange));
2071         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
2072             deepcopy_VkMappedMemoryRange(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMemoryRanges + i,
2073                                          (VkMappedMemoryRange*)(local_pMemoryRanges + i));
2074         }
2075     }
2076     if (local_pMemoryRanges) {
2077         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
2078             transform_tohost_VkMappedMemoryRange(sResourceTracker,
2079                                                  (VkMappedMemoryRange*)(local_pMemoryRanges + i));
2080         }
2081     }
2082     size_t count = 0;
2083     size_t* countPtr = &count;
2084     {
2085         uint64_t cgen_var_0;
2086         *countPtr += 1 * 8;
2087         *countPtr += sizeof(uint32_t);
2088         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
2089             count_VkMappedMemoryRange(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
2090                                       (VkMappedMemoryRange*)(local_pMemoryRanges + i), countPtr);
2091         }
2092     }
2093     uint32_t packetSize_vkFlushMappedMemoryRanges =
2094         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
2095     uint8_t* streamPtr = stream->reserve(packetSize_vkFlushMappedMemoryRanges);
2096     uint8_t* packetBeginPtr = streamPtr;
2097     uint8_t** streamPtrPtr = &streamPtr;
2098     uint32_t opcode_vkFlushMappedMemoryRanges = OP_vkFlushMappedMemoryRanges;
2099     uint32_t seqno;
2100     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
2101     memcpy(streamPtr, &opcode_vkFlushMappedMemoryRanges, sizeof(uint32_t));
2102     streamPtr += sizeof(uint32_t);
2103     memcpy(streamPtr, &packetSize_vkFlushMappedMemoryRanges, sizeof(uint32_t));
2104     streamPtr += sizeof(uint32_t);
2105     if (queueSubmitWithCommandsEnabled) {
2106         memcpy(streamPtr, &seqno, sizeof(uint32_t));
2107         streamPtr += sizeof(uint32_t);
2108     }
2109     uint64_t cgen_var_0;
2110     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
2111     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
2112     *streamPtrPtr += 1 * 8;
2113     memcpy(*streamPtrPtr, (uint32_t*)&local_memoryRangeCount, sizeof(uint32_t));
2114     *streamPtrPtr += sizeof(uint32_t);
2115     for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
2116         reservedmarshal_VkMappedMemoryRange(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2117                                             (VkMappedMemoryRange*)(local_pMemoryRanges + i),
2118                                             streamPtrPtr);
2119     }
2120     if (!sResourceTracker->usingDirectMapping()) {
2121         for (uint32_t i = 0; i < memoryRangeCount; ++i) {
2122             auto range = pMemoryRanges[i];
2123             auto memory = pMemoryRanges[i].memory;
2124             auto size = pMemoryRanges[i].size;
2125             auto offset = pMemoryRanges[i].offset;
2126             uint64_t streamSize = 0;
2127             if (!memory) {
2128                 stream->write(&streamSize, sizeof(uint64_t));
2129                 continue;
2130             };
2131             auto hostPtr = sResourceTracker->getMappedPointer(memory);
2132             auto actualSize =
2133                 size == VK_WHOLE_SIZE ? sResourceTracker->getMappedSize(memory) : size;
2134             if (!hostPtr) {
2135                 stream->write(&streamSize, sizeof(uint64_t));
2136                 continue;
2137             };
2138             streamSize = actualSize;
2139             stream->write(&streamSize, sizeof(uint64_t));
2140             uint8_t* targetRange = hostPtr + offset;
2141             stream->write(targetRange, actualSize);
2142         }
2143     }
2144     VkResult vkFlushMappedMemoryRanges_VkResult_return = (VkResult)0;
2145     stream->read(&vkFlushMappedMemoryRanges_VkResult_return, sizeof(VkResult));
2146     ++encodeCount;
2147     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
2148         pool->freeAll();
2149         stream->clearPool();
2150     }
2151     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
2152     return vkFlushMappedMemoryRanges_VkResult_return;
2153 }
2154 
vkInvalidateMappedMemoryRanges(VkDevice device,uint32_t memoryRangeCount,const VkMappedMemoryRange * pMemoryRanges,uint32_t doLock)2155 VkResult VkEncoder::vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount,
2156                                                    const VkMappedMemoryRange* pMemoryRanges,
2157                                                    uint32_t doLock) {
2158     (void)doLock;
2159     bool queueSubmitWithCommandsEnabled =
2160         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
2161     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
2162     VALIDATE_RET(VkResult, VK_SUCCESS,
2163                  mImpl->validation()->on_vkInvalidateMappedMemoryRanges(
2164                      this, VK_SUCCESS, device, memoryRangeCount, pMemoryRanges));
2165     auto stream = mImpl->stream();
2166     auto pool = mImpl->pool();
2167     VkDevice local_device;
2168     uint32_t local_memoryRangeCount;
2169     VkMappedMemoryRange* local_pMemoryRanges;
2170     local_device = device;
2171     local_memoryRangeCount = memoryRangeCount;
2172     local_pMemoryRanges = nullptr;
2173     if (pMemoryRanges) {
2174         local_pMemoryRanges = (VkMappedMemoryRange*)pool->alloc(((memoryRangeCount)) *
2175                                                                 sizeof(const VkMappedMemoryRange));
2176         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
2177             deepcopy_VkMappedMemoryRange(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMemoryRanges + i,
2178                                          (VkMappedMemoryRange*)(local_pMemoryRanges + i));
2179         }
2180     }
2181     if (local_pMemoryRanges) {
2182         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
2183             transform_tohost_VkMappedMemoryRange(sResourceTracker,
2184                                                  (VkMappedMemoryRange*)(local_pMemoryRanges + i));
2185         }
2186     }
2187     size_t count = 0;
2188     size_t* countPtr = &count;
2189     {
2190         uint64_t cgen_var_0;
2191         *countPtr += 1 * 8;
2192         *countPtr += sizeof(uint32_t);
2193         for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
2194             count_VkMappedMemoryRange(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
2195                                       (VkMappedMemoryRange*)(local_pMemoryRanges + i), countPtr);
2196         }
2197     }
2198     uint32_t packetSize_vkInvalidateMappedMemoryRanges =
2199         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
2200     uint8_t* streamPtr = stream->reserve(packetSize_vkInvalidateMappedMemoryRanges);
2201     uint8_t* packetBeginPtr = streamPtr;
2202     uint8_t** streamPtrPtr = &streamPtr;
2203     uint32_t opcode_vkInvalidateMappedMemoryRanges = OP_vkInvalidateMappedMemoryRanges;
2204     uint32_t seqno;
2205     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
2206     memcpy(streamPtr, &opcode_vkInvalidateMappedMemoryRanges, sizeof(uint32_t));
2207     streamPtr += sizeof(uint32_t);
2208     memcpy(streamPtr, &packetSize_vkInvalidateMappedMemoryRanges, sizeof(uint32_t));
2209     streamPtr += sizeof(uint32_t);
2210     if (queueSubmitWithCommandsEnabled) {
2211         memcpy(streamPtr, &seqno, sizeof(uint32_t));
2212         streamPtr += sizeof(uint32_t);
2213     }
2214     uint64_t cgen_var_0;
2215     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
2216     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
2217     *streamPtrPtr += 1 * 8;
2218     memcpy(*streamPtrPtr, (uint32_t*)&local_memoryRangeCount, sizeof(uint32_t));
2219     *streamPtrPtr += sizeof(uint32_t);
2220     for (uint32_t i = 0; i < (uint32_t)((memoryRangeCount)); ++i) {
2221         reservedmarshal_VkMappedMemoryRange(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2222                                             (VkMappedMemoryRange*)(local_pMemoryRanges + i),
2223                                             streamPtrPtr);
2224     }
2225     VkResult vkInvalidateMappedMemoryRanges_VkResult_return = (VkResult)0;
2226     stream->read(&vkInvalidateMappedMemoryRanges_VkResult_return, sizeof(VkResult));
2227     if (!sResourceTracker->usingDirectMapping()) {
2228         for (uint32_t i = 0; i < memoryRangeCount; ++i) {
2229             auto range = pMemoryRanges[i];
2230             auto memory = pMemoryRanges[i].memory;
2231             auto size = pMemoryRanges[i].size;
2232             auto offset = pMemoryRanges[i].offset;
2233             uint64_t streamSize = 0;
2234             if (!memory) {
2235                 stream->read(&streamSize, sizeof(uint64_t));
2236                 continue;
2237             };
2238             auto hostPtr = sResourceTracker->getMappedPointer(memory);
2239             auto actualSize =
2240                 size == VK_WHOLE_SIZE ? sResourceTracker->getMappedSize(memory) : size;
2241             if (!hostPtr) {
2242                 stream->read(&streamSize, sizeof(uint64_t));
2243                 continue;
2244             };
2245             streamSize = actualSize;
2246             stream->read(&streamSize, sizeof(uint64_t));
2247             uint8_t* targetRange = hostPtr + offset;
2248             stream->read(targetRange, actualSize);
2249         }
2250     }
2251     ++encodeCount;
2252     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
2253         pool->freeAll();
2254         stream->clearPool();
2255     }
2256     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
2257     return vkInvalidateMappedMemoryRanges_VkResult_return;
2258 }
2259 
vkGetDeviceMemoryCommitment(VkDevice device,VkDeviceMemory memory,VkDeviceSize * pCommittedMemoryInBytes,uint32_t doLock)2260 void VkEncoder::vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory,
2261                                             VkDeviceSize* pCommittedMemoryInBytes,
2262                                             uint32_t doLock) {
2263     (void)doLock;
2264     bool queueSubmitWithCommandsEnabled =
2265         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
2266     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
2267     auto stream = mImpl->stream();
2268     auto pool = mImpl->pool();
2269     VkDevice local_device;
2270     VkDeviceMemory local_memory;
2271     local_device = device;
2272     local_memory = memory;
2273     sResourceTracker->deviceMemoryTransform_tohost(
2274         (VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
2275         (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
2276     size_t count = 0;
2277     size_t* countPtr = &count;
2278     {
2279         uint64_t cgen_var_0;
2280         *countPtr += 1 * 8;
2281         uint64_t cgen_var_1;
2282         *countPtr += 1 * 8;
2283         *countPtr += sizeof(VkDeviceSize);
2284     }
2285     uint32_t packetSize_vkGetDeviceMemoryCommitment =
2286         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
2287     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceMemoryCommitment);
2288     uint8_t* packetBeginPtr = streamPtr;
2289     uint8_t** streamPtrPtr = &streamPtr;
2290     uint32_t opcode_vkGetDeviceMemoryCommitment = OP_vkGetDeviceMemoryCommitment;
2291     uint32_t seqno;
2292     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
2293     memcpy(streamPtr, &opcode_vkGetDeviceMemoryCommitment, sizeof(uint32_t));
2294     streamPtr += sizeof(uint32_t);
2295     memcpy(streamPtr, &packetSize_vkGetDeviceMemoryCommitment, sizeof(uint32_t));
2296     streamPtr += sizeof(uint32_t);
2297     if (queueSubmitWithCommandsEnabled) {
2298         memcpy(streamPtr, &seqno, sizeof(uint32_t));
2299         streamPtr += sizeof(uint32_t);
2300     }
2301     uint64_t cgen_var_0;
2302     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
2303     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
2304     *streamPtrPtr += 1 * 8;
2305     uint64_t cgen_var_1;
2306     *&cgen_var_1 = get_host_u64_VkDeviceMemory((*&local_memory));
2307     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
2308     *streamPtrPtr += 1 * 8;
2309     memcpy(*streamPtrPtr, (VkDeviceSize*)pCommittedMemoryInBytes, sizeof(VkDeviceSize));
2310     *streamPtrPtr += sizeof(VkDeviceSize);
2311     stream->read((VkDeviceSize*)pCommittedMemoryInBytes, sizeof(VkDeviceSize));
2312     ++encodeCount;
2313     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
2314         pool->freeAll();
2315         stream->clearPool();
2316     }
2317     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
2318 }
2319 
vkBindBufferMemory(VkDevice device,VkBuffer buffer,VkDeviceMemory memory,VkDeviceSize memoryOffset,uint32_t doLock)2320 VkResult VkEncoder::vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory,
2321                                        VkDeviceSize memoryOffset, uint32_t doLock) {
2322     (void)doLock;
2323     bool queueSubmitWithCommandsEnabled =
2324         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
2325     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
2326     auto stream = mImpl->stream();
2327     auto pool = mImpl->pool();
2328     VkDevice local_device;
2329     VkBuffer local_buffer;
2330     VkDeviceMemory local_memory;
2331     VkDeviceSize local_memoryOffset;
2332     local_device = device;
2333     local_buffer = buffer;
2334     local_memory = memory;
2335     local_memoryOffset = memoryOffset;
2336     sResourceTracker->deviceMemoryTransform_tohost(
2337         (VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)&local_memoryOffset, 1,
2338         (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
2339     size_t count = 0;
2340     size_t* countPtr = &count;
2341     {
2342         uint64_t cgen_var_0;
2343         *countPtr += 1 * 8;
2344         uint64_t cgen_var_1;
2345         *countPtr += 1 * 8;
2346         uint64_t cgen_var_2;
2347         *countPtr += 1 * 8;
2348         *countPtr += sizeof(VkDeviceSize);
2349     }
2350     uint32_t packetSize_vkBindBufferMemory =
2351         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
2352     uint8_t* streamPtr = stream->reserve(packetSize_vkBindBufferMemory);
2353     uint8_t* packetBeginPtr = streamPtr;
2354     uint8_t** streamPtrPtr = &streamPtr;
2355     uint32_t opcode_vkBindBufferMemory = OP_vkBindBufferMemory;
2356     uint32_t seqno;
2357     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
2358     memcpy(streamPtr, &opcode_vkBindBufferMemory, sizeof(uint32_t));
2359     streamPtr += sizeof(uint32_t);
2360     memcpy(streamPtr, &packetSize_vkBindBufferMemory, sizeof(uint32_t));
2361     streamPtr += sizeof(uint32_t);
2362     if (queueSubmitWithCommandsEnabled) {
2363         memcpy(streamPtr, &seqno, sizeof(uint32_t));
2364         streamPtr += sizeof(uint32_t);
2365     }
2366     uint64_t cgen_var_0;
2367     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
2368     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
2369     *streamPtrPtr += 1 * 8;
2370     uint64_t cgen_var_1;
2371     *&cgen_var_1 = get_host_u64_VkBuffer((*&local_buffer));
2372     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
2373     *streamPtrPtr += 1 * 8;
2374     uint64_t cgen_var_2;
2375     *&cgen_var_2 = get_host_u64_VkDeviceMemory((*&local_memory));
2376     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
2377     *streamPtrPtr += 1 * 8;
2378     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_memoryOffset, sizeof(VkDeviceSize));
2379     *streamPtrPtr += sizeof(VkDeviceSize);
2380     VkResult vkBindBufferMemory_VkResult_return = (VkResult)0;
2381     stream->read(&vkBindBufferMemory_VkResult_return, sizeof(VkResult));
2382     ++encodeCount;
2383     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
2384         pool->freeAll();
2385         stream->clearPool();
2386     }
2387     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
2388     return vkBindBufferMemory_VkResult_return;
2389 }
2390 
vkBindImageMemory(VkDevice device,VkImage image,VkDeviceMemory memory,VkDeviceSize memoryOffset,uint32_t doLock)2391 VkResult VkEncoder::vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory,
2392                                       VkDeviceSize memoryOffset, uint32_t doLock) {
2393     (void)doLock;
2394     bool queueSubmitWithCommandsEnabled =
2395         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
2396     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
2397     auto stream = mImpl->stream();
2398     auto pool = mImpl->pool();
2399     VkDevice local_device;
2400     VkImage local_image;
2401     VkDeviceMemory local_memory;
2402     VkDeviceSize local_memoryOffset;
2403     local_device = device;
2404     local_image = image;
2405     local_memory = memory;
2406     local_memoryOffset = memoryOffset;
2407     sResourceTracker->deviceMemoryTransform_tohost(
2408         (VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)&local_memoryOffset, 1,
2409         (VkDeviceSize*)nullptr, 0, (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
2410     size_t count = 0;
2411     size_t* countPtr = &count;
2412     {
2413         uint64_t cgen_var_0;
2414         *countPtr += 1 * 8;
2415         uint64_t cgen_var_1;
2416         *countPtr += 1 * 8;
2417         uint64_t cgen_var_2;
2418         *countPtr += 1 * 8;
2419         *countPtr += sizeof(VkDeviceSize);
2420     }
2421     uint32_t packetSize_vkBindImageMemory =
2422         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
2423     uint8_t* streamPtr = stream->reserve(packetSize_vkBindImageMemory);
2424     uint8_t* packetBeginPtr = streamPtr;
2425     uint8_t** streamPtrPtr = &streamPtr;
2426     uint32_t opcode_vkBindImageMemory = OP_vkBindImageMemory;
2427     uint32_t seqno;
2428     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
2429     memcpy(streamPtr, &opcode_vkBindImageMemory, sizeof(uint32_t));
2430     streamPtr += sizeof(uint32_t);
2431     memcpy(streamPtr, &packetSize_vkBindImageMemory, sizeof(uint32_t));
2432     streamPtr += sizeof(uint32_t);
2433     if (queueSubmitWithCommandsEnabled) {
2434         memcpy(streamPtr, &seqno, sizeof(uint32_t));
2435         streamPtr += sizeof(uint32_t);
2436     }
2437     uint64_t cgen_var_0;
2438     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
2439     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
2440     *streamPtrPtr += 1 * 8;
2441     uint64_t cgen_var_1;
2442     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
2443     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
2444     *streamPtrPtr += 1 * 8;
2445     uint64_t cgen_var_2;
2446     *&cgen_var_2 = get_host_u64_VkDeviceMemory((*&local_memory));
2447     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
2448     *streamPtrPtr += 1 * 8;
2449     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_memoryOffset, sizeof(VkDeviceSize));
2450     *streamPtrPtr += sizeof(VkDeviceSize);
2451     VkResult vkBindImageMemory_VkResult_return = (VkResult)0;
2452     stream->read(&vkBindImageMemory_VkResult_return, sizeof(VkResult));
2453     ++encodeCount;
2454     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
2455         pool->freeAll();
2456         stream->clearPool();
2457     }
2458     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
2459     return vkBindImageMemory_VkResult_return;
2460 }
2461 
vkGetBufferMemoryRequirements(VkDevice device,VkBuffer buffer,VkMemoryRequirements * pMemoryRequirements,uint32_t doLock)2462 void VkEncoder::vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
2463                                               VkMemoryRequirements* pMemoryRequirements,
2464                                               uint32_t doLock) {
2465     (void)doLock;
2466     bool queueSubmitWithCommandsEnabled =
2467         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
2468     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
2469     auto stream = mImpl->stream();
2470     auto pool = mImpl->pool();
2471     VkDevice local_device;
2472     VkBuffer local_buffer;
2473     local_device = device;
2474     local_buffer = buffer;
2475     size_t count = 0;
2476     size_t* countPtr = &count;
2477     {
2478         uint64_t cgen_var_0;
2479         *countPtr += 1 * 8;
2480         uint64_t cgen_var_1;
2481         *countPtr += 1 * 8;
2482         count_VkMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
2483                                    (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
2484     }
2485     uint32_t packetSize_vkGetBufferMemoryRequirements =
2486         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
2487     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferMemoryRequirements);
2488     uint8_t* packetBeginPtr = streamPtr;
2489     uint8_t** streamPtrPtr = &streamPtr;
2490     uint32_t opcode_vkGetBufferMemoryRequirements = OP_vkGetBufferMemoryRequirements;
2491     uint32_t seqno;
2492     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
2493     memcpy(streamPtr, &opcode_vkGetBufferMemoryRequirements, sizeof(uint32_t));
2494     streamPtr += sizeof(uint32_t);
2495     memcpy(streamPtr, &packetSize_vkGetBufferMemoryRequirements, sizeof(uint32_t));
2496     streamPtr += sizeof(uint32_t);
2497     if (queueSubmitWithCommandsEnabled) {
2498         memcpy(streamPtr, &seqno, sizeof(uint32_t));
2499         streamPtr += sizeof(uint32_t);
2500     }
2501     uint64_t cgen_var_0;
2502     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
2503     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
2504     *streamPtrPtr += 1 * 8;
2505     uint64_t cgen_var_1;
2506     *&cgen_var_1 = get_host_u64_VkBuffer((*&local_buffer));
2507     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
2508     *streamPtrPtr += 1 * 8;
2509     reservedmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2510                                          (VkMemoryRequirements*)(pMemoryRequirements),
2511                                          streamPtrPtr);
2512     unmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2513                                    (VkMemoryRequirements*)(pMemoryRequirements));
2514     if (pMemoryRequirements) {
2515         transform_fromhost_VkMemoryRequirements(sResourceTracker,
2516                                                 (VkMemoryRequirements*)(pMemoryRequirements));
2517     }
2518     ++encodeCount;
2519     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
2520         pool->freeAll();
2521         stream->clearPool();
2522     }
2523     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
2524 }
2525 
vkGetImageMemoryRequirements(VkDevice device,VkImage image,VkMemoryRequirements * pMemoryRequirements,uint32_t doLock)2526 void VkEncoder::vkGetImageMemoryRequirements(VkDevice device, VkImage image,
2527                                              VkMemoryRequirements* pMemoryRequirements,
2528                                              uint32_t doLock) {
2529     (void)doLock;
2530     bool queueSubmitWithCommandsEnabled =
2531         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
2532     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
2533     auto stream = mImpl->stream();
2534     auto pool = mImpl->pool();
2535     VkDevice local_device;
2536     VkImage local_image;
2537     local_device = device;
2538     local_image = image;
2539     size_t count = 0;
2540     size_t* countPtr = &count;
2541     {
2542         uint64_t cgen_var_0;
2543         *countPtr += 1 * 8;
2544         uint64_t cgen_var_1;
2545         *countPtr += 1 * 8;
2546         count_VkMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
2547                                    (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
2548     }
2549     uint32_t packetSize_vkGetImageMemoryRequirements =
2550         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
2551     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageMemoryRequirements);
2552     uint8_t* packetBeginPtr = streamPtr;
2553     uint8_t** streamPtrPtr = &streamPtr;
2554     uint32_t opcode_vkGetImageMemoryRequirements = OP_vkGetImageMemoryRequirements;
2555     uint32_t seqno;
2556     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
2557     memcpy(streamPtr, &opcode_vkGetImageMemoryRequirements, sizeof(uint32_t));
2558     streamPtr += sizeof(uint32_t);
2559     memcpy(streamPtr, &packetSize_vkGetImageMemoryRequirements, sizeof(uint32_t));
2560     streamPtr += sizeof(uint32_t);
2561     if (queueSubmitWithCommandsEnabled) {
2562         memcpy(streamPtr, &seqno, sizeof(uint32_t));
2563         streamPtr += sizeof(uint32_t);
2564     }
2565     uint64_t cgen_var_0;
2566     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
2567     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
2568     *streamPtrPtr += 1 * 8;
2569     uint64_t cgen_var_1;
2570     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
2571     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
2572     *streamPtrPtr += 1 * 8;
2573     reservedmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2574                                          (VkMemoryRequirements*)(pMemoryRequirements),
2575                                          streamPtrPtr);
2576     unmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2577                                    (VkMemoryRequirements*)(pMemoryRequirements));
2578     if (pMemoryRequirements) {
2579         transform_fromhost_VkMemoryRequirements(sResourceTracker,
2580                                                 (VkMemoryRequirements*)(pMemoryRequirements));
2581     }
2582     ++encodeCount;
2583     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
2584         pool->freeAll();
2585         stream->clearPool();
2586     }
2587     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
2588 }
2589 
vkGetImageSparseMemoryRequirements(VkDevice device,VkImage image,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements * pSparseMemoryRequirements,uint32_t doLock)2590 void VkEncoder::vkGetImageSparseMemoryRequirements(
2591     VkDevice device, VkImage image, uint32_t* pSparseMemoryRequirementCount,
2592     VkSparseImageMemoryRequirements* pSparseMemoryRequirements, uint32_t doLock) {
2593     (void)doLock;
2594     bool queueSubmitWithCommandsEnabled =
2595         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
2596     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
2597     auto stream = mImpl->stream();
2598     auto pool = mImpl->pool();
2599     VkDevice local_device;
2600     VkImage local_image;
2601     local_device = device;
2602     local_image = image;
2603     size_t count = 0;
2604     size_t* countPtr = &count;
2605     {
2606         uint64_t cgen_var_0;
2607         *countPtr += 1 * 8;
2608         uint64_t cgen_var_1;
2609         *countPtr += 1 * 8;
2610         // WARNING PTR CHECK
2611         *countPtr += 8;
2612         if (pSparseMemoryRequirementCount) {
2613             *countPtr += sizeof(uint32_t);
2614         }
2615         // WARNING PTR CHECK
2616         *countPtr += 8;
2617         if (pSparseMemoryRequirements) {
2618             if (pSparseMemoryRequirementCount) {
2619                 for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
2620                     count_VkSparseImageMemoryRequirements(
2621                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
2622                         (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i),
2623                         countPtr);
2624                 }
2625             }
2626         }
2627     }
2628     uint32_t packetSize_vkGetImageSparseMemoryRequirements =
2629         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
2630     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageSparseMemoryRequirements);
2631     uint8_t* packetBeginPtr = streamPtr;
2632     uint8_t** streamPtrPtr = &streamPtr;
2633     uint32_t opcode_vkGetImageSparseMemoryRequirements = OP_vkGetImageSparseMemoryRequirements;
2634     uint32_t seqno;
2635     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
2636     memcpy(streamPtr, &opcode_vkGetImageSparseMemoryRequirements, sizeof(uint32_t));
2637     streamPtr += sizeof(uint32_t);
2638     memcpy(streamPtr, &packetSize_vkGetImageSparseMemoryRequirements, sizeof(uint32_t));
2639     streamPtr += sizeof(uint32_t);
2640     if (queueSubmitWithCommandsEnabled) {
2641         memcpy(streamPtr, &seqno, sizeof(uint32_t));
2642         streamPtr += sizeof(uint32_t);
2643     }
2644     uint64_t cgen_var_0;
2645     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
2646     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
2647     *streamPtrPtr += 1 * 8;
2648     uint64_t cgen_var_1;
2649     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
2650     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
2651     *streamPtrPtr += 1 * 8;
2652     // WARNING PTR CHECK
2653     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
2654     memcpy((*streamPtrPtr), &cgen_var_2, 8);
2655     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
2656     *streamPtrPtr += 8;
2657     if (pSparseMemoryRequirementCount) {
2658         memcpy(*streamPtrPtr, (uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
2659         *streamPtrPtr += sizeof(uint32_t);
2660     }
2661     // WARNING PTR CHECK
2662     uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
2663     memcpy((*streamPtrPtr), &cgen_var_3, 8);
2664     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
2665     *streamPtrPtr += 8;
2666     if (pSparseMemoryRequirements) {
2667         for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
2668             reservedmarshal_VkSparseImageMemoryRequirements(
2669                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2670                 (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i), streamPtrPtr);
2671         }
2672     }
2673     // WARNING PTR CHECK
2674     uint32_t* check_pSparseMemoryRequirementCount;
2675     check_pSparseMemoryRequirementCount = (uint32_t*)(uintptr_t)stream->getBe64();
2676     if (pSparseMemoryRequirementCount) {
2677         if (!(check_pSparseMemoryRequirementCount)) {
2678             fprintf(stderr,
2679                     "fatal: pSparseMemoryRequirementCount inconsistent between guest and host\n");
2680         }
2681         stream->read((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
2682     }
2683     // WARNING PTR CHECK
2684     VkSparseImageMemoryRequirements* check_pSparseMemoryRequirements;
2685     check_pSparseMemoryRequirements =
2686         (VkSparseImageMemoryRequirements*)(uintptr_t)stream->getBe64();
2687     if (pSparseMemoryRequirements) {
2688         if (!(check_pSparseMemoryRequirements)) {
2689             fprintf(stderr,
2690                     "fatal: pSparseMemoryRequirements inconsistent between guest and host\n");
2691         }
2692         if (pSparseMemoryRequirementCount) {
2693             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
2694                 unmarshal_VkSparseImageMemoryRequirements(
2695                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2696                     (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
2697             }
2698         }
2699     }
2700     if (pSparseMemoryRequirementCount) {
2701         if (pSparseMemoryRequirements) {
2702             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
2703                 transform_fromhost_VkSparseImageMemoryRequirements(
2704                     sResourceTracker,
2705                     (VkSparseImageMemoryRequirements*)(pSparseMemoryRequirements + i));
2706             }
2707         }
2708     }
2709     ++encodeCount;
2710     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
2711         pool->freeAll();
2712         stream->clearPool();
2713     }
2714     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
2715 }
2716 
vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice,VkFormat format,VkImageType type,VkSampleCountFlagBits samples,VkImageUsageFlags usage,VkImageTiling tiling,uint32_t * pPropertyCount,VkSparseImageFormatProperties * pProperties,uint32_t doLock)2717 void VkEncoder::vkGetPhysicalDeviceSparseImageFormatProperties(
2718     VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type,
2719     VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling,
2720     uint32_t* pPropertyCount, VkSparseImageFormatProperties* pProperties, uint32_t doLock) {
2721     (void)doLock;
2722     bool queueSubmitWithCommandsEnabled =
2723         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
2724     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
2725     auto stream = mImpl->stream();
2726     auto pool = mImpl->pool();
2727     VkPhysicalDevice local_physicalDevice;
2728     VkFormat local_format;
2729     VkImageType local_type;
2730     VkSampleCountFlagBits local_samples;
2731     VkImageUsageFlags local_usage;
2732     VkImageTiling local_tiling;
2733     local_physicalDevice = physicalDevice;
2734     local_format = format;
2735     local_type = type;
2736     local_samples = samples;
2737     local_usage = usage;
2738     local_tiling = tiling;
2739     size_t count = 0;
2740     size_t* countPtr = &count;
2741     {
2742         uint64_t cgen_var_0;
2743         *countPtr += 1 * 8;
2744         *countPtr += sizeof(VkFormat);
2745         *countPtr += sizeof(VkImageType);
2746         *countPtr += sizeof(VkSampleCountFlagBits);
2747         *countPtr += sizeof(VkImageUsageFlags);
2748         *countPtr += sizeof(VkImageTiling);
2749         // WARNING PTR CHECK
2750         *countPtr += 8;
2751         if (pPropertyCount) {
2752             *countPtr += sizeof(uint32_t);
2753         }
2754         // WARNING PTR CHECK
2755         *countPtr += 8;
2756         if (pProperties) {
2757             if (pPropertyCount) {
2758                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
2759                     count_VkSparseImageFormatProperties(
2760                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
2761                         (VkSparseImageFormatProperties*)(pProperties + i), countPtr);
2762                 }
2763             }
2764         }
2765     }
2766     uint32_t packetSize_vkGetPhysicalDeviceSparseImageFormatProperties =
2767         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
2768     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceSparseImageFormatProperties);
2769     uint8_t* packetBeginPtr = streamPtr;
2770     uint8_t** streamPtrPtr = &streamPtr;
2771     uint32_t opcode_vkGetPhysicalDeviceSparseImageFormatProperties =
2772         OP_vkGetPhysicalDeviceSparseImageFormatProperties;
2773     uint32_t seqno;
2774     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
2775     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSparseImageFormatProperties, sizeof(uint32_t));
2776     streamPtr += sizeof(uint32_t);
2777     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSparseImageFormatProperties, sizeof(uint32_t));
2778     streamPtr += sizeof(uint32_t);
2779     if (queueSubmitWithCommandsEnabled) {
2780         memcpy(streamPtr, &seqno, sizeof(uint32_t));
2781         streamPtr += sizeof(uint32_t);
2782     }
2783     uint64_t cgen_var_0;
2784     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
2785     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
2786     *streamPtrPtr += 1 * 8;
2787     memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
2788     *streamPtrPtr += sizeof(VkFormat);
2789     memcpy(*streamPtrPtr, (VkImageType*)&local_type, sizeof(VkImageType));
2790     *streamPtrPtr += sizeof(VkImageType);
2791     memcpy(*streamPtrPtr, (VkSampleCountFlagBits*)&local_samples, sizeof(VkSampleCountFlagBits));
2792     *streamPtrPtr += sizeof(VkSampleCountFlagBits);
2793     memcpy(*streamPtrPtr, (VkImageUsageFlags*)&local_usage, sizeof(VkImageUsageFlags));
2794     *streamPtrPtr += sizeof(VkImageUsageFlags);
2795     memcpy(*streamPtrPtr, (VkImageTiling*)&local_tiling, sizeof(VkImageTiling));
2796     *streamPtrPtr += sizeof(VkImageTiling);
2797     // WARNING PTR CHECK
2798     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pPropertyCount;
2799     memcpy((*streamPtrPtr), &cgen_var_1, 8);
2800     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
2801     *streamPtrPtr += 8;
2802     if (pPropertyCount) {
2803         memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
2804         *streamPtrPtr += sizeof(uint32_t);
2805     }
2806     // WARNING PTR CHECK
2807     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pProperties;
2808     memcpy((*streamPtrPtr), &cgen_var_2, 8);
2809     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
2810     *streamPtrPtr += 8;
2811     if (pProperties) {
2812         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
2813             reservedmarshal_VkSparseImageFormatProperties(
2814                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2815                 (VkSparseImageFormatProperties*)(pProperties + i), streamPtrPtr);
2816         }
2817     }
2818     // WARNING PTR CHECK
2819     uint32_t* check_pPropertyCount;
2820     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
2821     if (pPropertyCount) {
2822         if (!(check_pPropertyCount)) {
2823             fprintf(stderr, "fatal: pPropertyCount inconsistent between guest and host\n");
2824         }
2825         stream->read((uint32_t*)pPropertyCount, sizeof(uint32_t));
2826     }
2827     // WARNING PTR CHECK
2828     VkSparseImageFormatProperties* check_pProperties;
2829     check_pProperties = (VkSparseImageFormatProperties*)(uintptr_t)stream->getBe64();
2830     if (pProperties) {
2831         if (!(check_pProperties)) {
2832             fprintf(stderr, "fatal: pProperties inconsistent between guest and host\n");
2833         }
2834         if (pPropertyCount) {
2835             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
2836                 unmarshal_VkSparseImageFormatProperties(
2837                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2838                     (VkSparseImageFormatProperties*)(pProperties + i));
2839             }
2840         }
2841     }
2842     if (pPropertyCount) {
2843         if (pProperties) {
2844             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
2845                 transform_fromhost_VkSparseImageFormatProperties(
2846                     sResourceTracker, (VkSparseImageFormatProperties*)(pProperties + i));
2847             }
2848         }
2849     }
2850     ++encodeCount;
2851     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
2852         pool->freeAll();
2853         stream->clearPool();
2854     }
2855     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
2856 }
2857 
vkQueueBindSparse(VkQueue queue,uint32_t bindInfoCount,const VkBindSparseInfo * pBindInfo,VkFence fence,uint32_t doLock)2858 VkResult VkEncoder::vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount,
2859                                       const VkBindSparseInfo* pBindInfo, VkFence fence,
2860                                       uint32_t doLock) {
2861     (void)doLock;
2862     bool queueSubmitWithCommandsEnabled =
2863         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
2864     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
2865     auto stream = mImpl->stream();
2866     auto pool = mImpl->pool();
2867     VkQueue local_queue;
2868     uint32_t local_bindInfoCount;
2869     VkBindSparseInfo* local_pBindInfo;
2870     VkFence local_fence;
2871     local_queue = queue;
2872     local_bindInfoCount = bindInfoCount;
2873     local_pBindInfo = nullptr;
2874     if (pBindInfo) {
2875         local_pBindInfo =
2876             (VkBindSparseInfo*)pool->alloc(((bindInfoCount)) * sizeof(const VkBindSparseInfo));
2877         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
2878             deepcopy_VkBindSparseInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfo + i,
2879                                       (VkBindSparseInfo*)(local_pBindInfo + i));
2880         }
2881     }
2882     local_fence = fence;
2883     if (local_pBindInfo) {
2884         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
2885             transform_tohost_VkBindSparseInfo(sResourceTracker,
2886                                               (VkBindSparseInfo*)(local_pBindInfo + i));
2887         }
2888     }
2889     size_t count = 0;
2890     size_t* countPtr = &count;
2891     {
2892         uint64_t cgen_var_0;
2893         *countPtr += 1 * 8;
2894         *countPtr += sizeof(uint32_t);
2895         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
2896             count_VkBindSparseInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
2897                                    (VkBindSparseInfo*)(local_pBindInfo + i), countPtr);
2898         }
2899         uint64_t cgen_var_1;
2900         *countPtr += 1 * 8;
2901     }
2902     uint32_t packetSize_vkQueueBindSparse =
2903         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
2904     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueBindSparse);
2905     uint8_t* packetBeginPtr = streamPtr;
2906     uint8_t** streamPtrPtr = &streamPtr;
2907     uint32_t opcode_vkQueueBindSparse = OP_vkQueueBindSparse;
2908     uint32_t seqno;
2909     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
2910     memcpy(streamPtr, &opcode_vkQueueBindSparse, sizeof(uint32_t));
2911     streamPtr += sizeof(uint32_t);
2912     memcpy(streamPtr, &packetSize_vkQueueBindSparse, sizeof(uint32_t));
2913     streamPtr += sizeof(uint32_t);
2914     if (queueSubmitWithCommandsEnabled) {
2915         memcpy(streamPtr, &seqno, sizeof(uint32_t));
2916         streamPtr += sizeof(uint32_t);
2917     }
2918     uint64_t cgen_var_0;
2919     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
2920     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
2921     *streamPtrPtr += 1 * 8;
2922     memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
2923     *streamPtrPtr += sizeof(uint32_t);
2924     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
2925         reservedmarshal_VkBindSparseInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
2926                                          (VkBindSparseInfo*)(local_pBindInfo + i), streamPtrPtr);
2927     }
2928     uint64_t cgen_var_1;
2929     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
2930     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
2931     *streamPtrPtr += 1 * 8;
2932     VkResult vkQueueBindSparse_VkResult_return = (VkResult)0;
2933     stream->read(&vkQueueBindSparse_VkResult_return, sizeof(VkResult));
2934     ++encodeCount;
2935     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
2936         pool->freeAll();
2937         stream->clearPool();
2938     }
2939     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
2940     return vkQueueBindSparse_VkResult_return;
2941 }
2942 
vkCreateFence(VkDevice device,const VkFenceCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkFence * pFence,uint32_t doLock)2943 VkResult VkEncoder::vkCreateFence(VkDevice device, const VkFenceCreateInfo* pCreateInfo,
2944                                   const VkAllocationCallbacks* pAllocator, VkFence* pFence,
2945                                   uint32_t doLock) {
2946     (void)doLock;
2947     bool queueSubmitWithCommandsEnabled =
2948         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
2949     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
2950     auto stream = mImpl->stream();
2951     auto pool = mImpl->pool();
2952     VkDevice local_device;
2953     VkFenceCreateInfo* local_pCreateInfo;
2954     VkAllocationCallbacks* local_pAllocator;
2955     local_device = device;
2956     local_pCreateInfo = nullptr;
2957     if (pCreateInfo) {
2958         local_pCreateInfo = (VkFenceCreateInfo*)pool->alloc(sizeof(const VkFenceCreateInfo));
2959         deepcopy_VkFenceCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
2960                                    (VkFenceCreateInfo*)(local_pCreateInfo));
2961     }
2962     local_pAllocator = nullptr;
2963     if (pAllocator) {
2964         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
2965         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
2966                                        (VkAllocationCallbacks*)(local_pAllocator));
2967     }
2968     local_pAllocator = nullptr;
2969     if (local_pCreateInfo) {
2970         transform_tohost_VkFenceCreateInfo(sResourceTracker,
2971                                            (VkFenceCreateInfo*)(local_pCreateInfo));
2972     }
2973     if (local_pAllocator) {
2974         transform_tohost_VkAllocationCallbacks(sResourceTracker,
2975                                                (VkAllocationCallbacks*)(local_pAllocator));
2976     }
2977     size_t count = 0;
2978     size_t* countPtr = &count;
2979     {
2980         uint64_t cgen_var_0;
2981         *countPtr += 1 * 8;
2982         count_VkFenceCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
2983                                 (VkFenceCreateInfo*)(local_pCreateInfo), countPtr);
2984         // WARNING PTR CHECK
2985         *countPtr += 8;
2986         if (local_pAllocator) {
2987             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
2988                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
2989         }
2990         uint64_t cgen_var_1;
2991         *countPtr += 8;
2992     }
2993     uint32_t packetSize_vkCreateFence = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
2994     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateFence);
2995     uint8_t* packetBeginPtr = streamPtr;
2996     uint8_t** streamPtrPtr = &streamPtr;
2997     uint32_t opcode_vkCreateFence = OP_vkCreateFence;
2998     uint32_t seqno;
2999     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3000     memcpy(streamPtr, &opcode_vkCreateFence, sizeof(uint32_t));
3001     streamPtr += sizeof(uint32_t);
3002     memcpy(streamPtr, &packetSize_vkCreateFence, sizeof(uint32_t));
3003     streamPtr += sizeof(uint32_t);
3004     if (queueSubmitWithCommandsEnabled) {
3005         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3006         streamPtr += sizeof(uint32_t);
3007     }
3008     uint64_t cgen_var_0;
3009     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3010     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3011     *streamPtrPtr += 1 * 8;
3012     reservedmarshal_VkFenceCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
3013                                       (VkFenceCreateInfo*)(local_pCreateInfo), streamPtrPtr);
3014     // WARNING PTR CHECK
3015     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
3016     memcpy((*streamPtrPtr), &cgen_var_1, 8);
3017     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
3018     *streamPtrPtr += 8;
3019     if (local_pAllocator) {
3020         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
3021                                               (VkAllocationCallbacks*)(local_pAllocator),
3022                                               streamPtrPtr);
3023     }
3024     /* is handle, possibly out */;
3025     uint64_t cgen_var_2;
3026     *&cgen_var_2 = (uint64_t)((*pFence));
3027     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
3028     *streamPtrPtr += 8;
3029     /* is handle, possibly out */;
3030     stream->setHandleMapping(sResourceTracker->createMapping());
3031     uint64_t cgen_var_3;
3032     stream->read((uint64_t*)&cgen_var_3, 8);
3033     stream->handleMapping()->mapHandles_u64_VkFence(&cgen_var_3, (VkFence*)pFence, 1);
3034     stream->unsetHandleMapping();
3035     VkResult vkCreateFence_VkResult_return = (VkResult)0;
3036     stream->read(&vkCreateFence_VkResult_return, sizeof(VkResult));
3037     ++encodeCount;
3038     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3039         pool->freeAll();
3040         stream->clearPool();
3041     }
3042     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3043     return vkCreateFence_VkResult_return;
3044 }
3045 
vkDestroyFence(VkDevice device,VkFence fence,const VkAllocationCallbacks * pAllocator,uint32_t doLock)3046 void VkEncoder::vkDestroyFence(VkDevice device, VkFence fence,
3047                                const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
3048     (void)doLock;
3049     bool queueSubmitWithCommandsEnabled =
3050         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3051     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3052     auto stream = mImpl->stream();
3053     auto pool = mImpl->pool();
3054     VkDevice local_device;
3055     VkFence local_fence;
3056     VkAllocationCallbacks* local_pAllocator;
3057     local_device = device;
3058     local_fence = fence;
3059     local_pAllocator = nullptr;
3060     if (pAllocator) {
3061         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
3062         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
3063                                        (VkAllocationCallbacks*)(local_pAllocator));
3064     }
3065     local_pAllocator = nullptr;
3066     if (local_pAllocator) {
3067         transform_tohost_VkAllocationCallbacks(sResourceTracker,
3068                                                (VkAllocationCallbacks*)(local_pAllocator));
3069     }
3070     size_t count = 0;
3071     size_t* countPtr = &count;
3072     {
3073         uint64_t cgen_var_0;
3074         *countPtr += 1 * 8;
3075         uint64_t cgen_var_1;
3076         *countPtr += 1 * 8;
3077         // WARNING PTR CHECK
3078         *countPtr += 8;
3079         if (local_pAllocator) {
3080             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
3081                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
3082         }
3083     }
3084     uint32_t packetSize_vkDestroyFence = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3085     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyFence);
3086     uint8_t* packetBeginPtr = streamPtr;
3087     uint8_t** streamPtrPtr = &streamPtr;
3088     uint32_t opcode_vkDestroyFence = OP_vkDestroyFence;
3089     uint32_t seqno;
3090     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3091     memcpy(streamPtr, &opcode_vkDestroyFence, sizeof(uint32_t));
3092     streamPtr += sizeof(uint32_t);
3093     memcpy(streamPtr, &packetSize_vkDestroyFence, sizeof(uint32_t));
3094     streamPtr += sizeof(uint32_t);
3095     if (queueSubmitWithCommandsEnabled) {
3096         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3097         streamPtr += sizeof(uint32_t);
3098     }
3099     uint64_t cgen_var_0;
3100     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3101     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3102     *streamPtrPtr += 1 * 8;
3103     uint64_t cgen_var_1;
3104     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
3105     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
3106     *streamPtrPtr += 1 * 8;
3107     // WARNING PTR CHECK
3108     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
3109     memcpy((*streamPtrPtr), &cgen_var_2, 8);
3110     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
3111     *streamPtrPtr += 8;
3112     if (local_pAllocator) {
3113         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
3114                                               (VkAllocationCallbacks*)(local_pAllocator),
3115                                               streamPtrPtr);
3116     }
3117     sResourceTracker->destroyMapping()->mapHandles_VkFence((VkFence*)&fence);
3118     stream->flush();
3119     ++encodeCount;
3120     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3121         pool->freeAll();
3122         stream->clearPool();
3123     }
3124     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3125 }
3126 
vkResetFences(VkDevice device,uint32_t fenceCount,const VkFence * pFences,uint32_t doLock)3127 VkResult VkEncoder::vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences,
3128                                   uint32_t doLock) {
3129     (void)doLock;
3130     bool queueSubmitWithCommandsEnabled =
3131         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3132     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3133     auto stream = mImpl->stream();
3134     auto pool = mImpl->pool();
3135     VkDevice local_device;
3136     uint32_t local_fenceCount;
3137     VkFence* local_pFences;
3138     local_device = device;
3139     local_fenceCount = fenceCount;
3140     // Avoiding deepcopy for pFences
3141     local_pFences = (VkFence*)pFences;
3142     size_t count = 0;
3143     size_t* countPtr = &count;
3144     {
3145         uint64_t cgen_var_0;
3146         *countPtr += 1 * 8;
3147         *countPtr += sizeof(uint32_t);
3148         if (((fenceCount))) {
3149             *countPtr += ((fenceCount)) * 8;
3150         }
3151     }
3152     uint32_t packetSize_vkResetFences = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3153     uint8_t* streamPtr = stream->reserve(packetSize_vkResetFences);
3154     uint8_t* packetBeginPtr = streamPtr;
3155     uint8_t** streamPtrPtr = &streamPtr;
3156     uint32_t opcode_vkResetFences = OP_vkResetFences;
3157     uint32_t seqno;
3158     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3159     memcpy(streamPtr, &opcode_vkResetFences, sizeof(uint32_t));
3160     streamPtr += sizeof(uint32_t);
3161     memcpy(streamPtr, &packetSize_vkResetFences, sizeof(uint32_t));
3162     streamPtr += sizeof(uint32_t);
3163     if (queueSubmitWithCommandsEnabled) {
3164         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3165         streamPtr += sizeof(uint32_t);
3166     }
3167     uint64_t cgen_var_0;
3168     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3169     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3170     *streamPtrPtr += 1 * 8;
3171     memcpy(*streamPtrPtr, (uint32_t*)&local_fenceCount, sizeof(uint32_t));
3172     *streamPtrPtr += sizeof(uint32_t);
3173     if (((fenceCount))) {
3174         uint8_t* cgen_var_1_ptr = (uint8_t*)(*streamPtrPtr);
3175         for (uint32_t k = 0; k < ((fenceCount)); ++k) {
3176             uint64_t tmpval = get_host_u64_VkFence(local_pFences[k]);
3177             memcpy(cgen_var_1_ptr + k * 8, &tmpval, sizeof(uint64_t));
3178         }
3179         *streamPtrPtr += 8 * ((fenceCount));
3180     }
3181     VkResult vkResetFences_VkResult_return = (VkResult)0;
3182     stream->read(&vkResetFences_VkResult_return, sizeof(VkResult));
3183     ++encodeCount;
3184     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3185         pool->freeAll();
3186         stream->clearPool();
3187     }
3188     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3189     return vkResetFences_VkResult_return;
3190 }
3191 
vkGetFenceStatus(VkDevice device,VkFence fence,uint32_t doLock)3192 VkResult VkEncoder::vkGetFenceStatus(VkDevice device, VkFence fence, uint32_t doLock) {
3193     (void)doLock;
3194     bool queueSubmitWithCommandsEnabled =
3195         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3196     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3197     auto stream = mImpl->stream();
3198     auto pool = mImpl->pool();
3199     VkDevice local_device;
3200     VkFence local_fence;
3201     local_device = device;
3202     local_fence = fence;
3203     size_t count = 0;
3204     size_t* countPtr = &count;
3205     {
3206         uint64_t cgen_var_0;
3207         *countPtr += 1 * 8;
3208         uint64_t cgen_var_1;
3209         *countPtr += 1 * 8;
3210     }
3211     uint32_t packetSize_vkGetFenceStatus = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3212     uint8_t* streamPtr = stream->reserve(packetSize_vkGetFenceStatus);
3213     uint8_t* packetBeginPtr = streamPtr;
3214     uint8_t** streamPtrPtr = &streamPtr;
3215     uint32_t opcode_vkGetFenceStatus = OP_vkGetFenceStatus;
3216     uint32_t seqno;
3217     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3218     memcpy(streamPtr, &opcode_vkGetFenceStatus, sizeof(uint32_t));
3219     streamPtr += sizeof(uint32_t);
3220     memcpy(streamPtr, &packetSize_vkGetFenceStatus, sizeof(uint32_t));
3221     streamPtr += sizeof(uint32_t);
3222     if (queueSubmitWithCommandsEnabled) {
3223         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3224         streamPtr += sizeof(uint32_t);
3225     }
3226     uint64_t cgen_var_0;
3227     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3228     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3229     *streamPtrPtr += 1 * 8;
3230     uint64_t cgen_var_1;
3231     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
3232     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
3233     *streamPtrPtr += 1 * 8;
3234     VkResult vkGetFenceStatus_VkResult_return = (VkResult)0;
3235     stream->read(&vkGetFenceStatus_VkResult_return, sizeof(VkResult));
3236     ++encodeCount;
3237     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3238         pool->freeAll();
3239         stream->clearPool();
3240     }
3241     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3242     return vkGetFenceStatus_VkResult_return;
3243 }
3244 
vkWaitForFences(VkDevice device,uint32_t fenceCount,const VkFence * pFences,VkBool32 waitAll,uint64_t timeout,uint32_t doLock)3245 VkResult VkEncoder::vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences,
3246                                     VkBool32 waitAll, uint64_t timeout, uint32_t doLock) {
3247     (void)doLock;
3248     bool queueSubmitWithCommandsEnabled =
3249         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3250     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3251     auto stream = mImpl->stream();
3252     auto pool = mImpl->pool();
3253     VkDevice local_device;
3254     uint32_t local_fenceCount;
3255     VkFence* local_pFences;
3256     VkBool32 local_waitAll;
3257     uint64_t local_timeout;
3258     local_device = device;
3259     local_fenceCount = fenceCount;
3260     // Avoiding deepcopy for pFences
3261     local_pFences = (VkFence*)pFences;
3262     local_waitAll = waitAll;
3263     local_timeout = timeout;
3264     size_t count = 0;
3265     size_t* countPtr = &count;
3266     {
3267         uint64_t cgen_var_0;
3268         *countPtr += 1 * 8;
3269         *countPtr += sizeof(uint32_t);
3270         if (((fenceCount))) {
3271             *countPtr += ((fenceCount)) * 8;
3272         }
3273         *countPtr += sizeof(VkBool32);
3274         *countPtr += sizeof(uint64_t);
3275     }
3276     uint32_t packetSize_vkWaitForFences = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3277     uint8_t* streamPtr = stream->reserve(packetSize_vkWaitForFences);
3278     uint8_t* packetBeginPtr = streamPtr;
3279     uint8_t** streamPtrPtr = &streamPtr;
3280     uint32_t opcode_vkWaitForFences = OP_vkWaitForFences;
3281     uint32_t seqno;
3282     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3283     memcpy(streamPtr, &opcode_vkWaitForFences, sizeof(uint32_t));
3284     streamPtr += sizeof(uint32_t);
3285     memcpy(streamPtr, &packetSize_vkWaitForFences, sizeof(uint32_t));
3286     streamPtr += sizeof(uint32_t);
3287     if (queueSubmitWithCommandsEnabled) {
3288         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3289         streamPtr += sizeof(uint32_t);
3290     }
3291     uint64_t cgen_var_0;
3292     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3293     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3294     *streamPtrPtr += 1 * 8;
3295     memcpy(*streamPtrPtr, (uint32_t*)&local_fenceCount, sizeof(uint32_t));
3296     *streamPtrPtr += sizeof(uint32_t);
3297     if (((fenceCount))) {
3298         uint8_t* cgen_var_1_ptr = (uint8_t*)(*streamPtrPtr);
3299         for (uint32_t k = 0; k < ((fenceCount)); ++k) {
3300             uint64_t tmpval = get_host_u64_VkFence(local_pFences[k]);
3301             memcpy(cgen_var_1_ptr + k * 8, &tmpval, sizeof(uint64_t));
3302         }
3303         *streamPtrPtr += 8 * ((fenceCount));
3304     }
3305     memcpy(*streamPtrPtr, (VkBool32*)&local_waitAll, sizeof(VkBool32));
3306     *streamPtrPtr += sizeof(VkBool32);
3307     memcpy(*streamPtrPtr, (uint64_t*)&local_timeout, sizeof(uint64_t));
3308     *streamPtrPtr += sizeof(uint64_t);
3309     VkResult vkWaitForFences_VkResult_return = (VkResult)0;
3310     stream->read(&vkWaitForFences_VkResult_return, sizeof(VkResult));
3311     ++encodeCount;
3312     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3313         pool->freeAll();
3314         stream->clearPool();
3315     }
3316     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3317     return vkWaitForFences_VkResult_return;
3318 }
3319 
vkCreateSemaphore(VkDevice device,const VkSemaphoreCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSemaphore * pSemaphore,uint32_t doLock)3320 VkResult VkEncoder::vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo,
3321                                       const VkAllocationCallbacks* pAllocator,
3322                                       VkSemaphore* pSemaphore, uint32_t doLock) {
3323     (void)doLock;
3324     bool queueSubmitWithCommandsEnabled =
3325         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3326     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3327     auto stream = mImpl->stream();
3328     auto pool = mImpl->pool();
3329     VkDevice local_device;
3330     VkSemaphoreCreateInfo* local_pCreateInfo;
3331     VkAllocationCallbacks* local_pAllocator;
3332     local_device = device;
3333     local_pCreateInfo = nullptr;
3334     if (pCreateInfo) {
3335         local_pCreateInfo =
3336             (VkSemaphoreCreateInfo*)pool->alloc(sizeof(const VkSemaphoreCreateInfo));
3337         deepcopy_VkSemaphoreCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
3338                                        (VkSemaphoreCreateInfo*)(local_pCreateInfo));
3339     }
3340     local_pAllocator = nullptr;
3341     if (pAllocator) {
3342         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
3343         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
3344                                        (VkAllocationCallbacks*)(local_pAllocator));
3345     }
3346     local_pAllocator = nullptr;
3347     if (local_pCreateInfo) {
3348         transform_tohost_VkSemaphoreCreateInfo(sResourceTracker,
3349                                                (VkSemaphoreCreateInfo*)(local_pCreateInfo));
3350     }
3351     if (local_pAllocator) {
3352         transform_tohost_VkAllocationCallbacks(sResourceTracker,
3353                                                (VkAllocationCallbacks*)(local_pAllocator));
3354     }
3355     size_t count = 0;
3356     size_t* countPtr = &count;
3357     {
3358         uint64_t cgen_var_0;
3359         *countPtr += 1 * 8;
3360         count_VkSemaphoreCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
3361                                     (VkSemaphoreCreateInfo*)(local_pCreateInfo), countPtr);
3362         // WARNING PTR CHECK
3363         *countPtr += 8;
3364         if (local_pAllocator) {
3365             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
3366                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
3367         }
3368         uint64_t cgen_var_1;
3369         *countPtr += 8;
3370     }
3371     uint32_t packetSize_vkCreateSemaphore =
3372         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3373     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateSemaphore);
3374     uint8_t* packetBeginPtr = streamPtr;
3375     uint8_t** streamPtrPtr = &streamPtr;
3376     uint32_t opcode_vkCreateSemaphore = OP_vkCreateSemaphore;
3377     uint32_t seqno;
3378     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3379     memcpy(streamPtr, &opcode_vkCreateSemaphore, sizeof(uint32_t));
3380     streamPtr += sizeof(uint32_t);
3381     memcpy(streamPtr, &packetSize_vkCreateSemaphore, sizeof(uint32_t));
3382     streamPtr += sizeof(uint32_t);
3383     if (queueSubmitWithCommandsEnabled) {
3384         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3385         streamPtr += sizeof(uint32_t);
3386     }
3387     uint64_t cgen_var_0;
3388     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3389     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3390     *streamPtrPtr += 1 * 8;
3391     reservedmarshal_VkSemaphoreCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
3392                                           (VkSemaphoreCreateInfo*)(local_pCreateInfo),
3393                                           streamPtrPtr);
3394     // WARNING PTR CHECK
3395     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
3396     memcpy((*streamPtrPtr), &cgen_var_1, 8);
3397     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
3398     *streamPtrPtr += 8;
3399     if (local_pAllocator) {
3400         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
3401                                               (VkAllocationCallbacks*)(local_pAllocator),
3402                                               streamPtrPtr);
3403     }
3404     /* is handle, possibly out */;
3405     uint64_t cgen_var_2;
3406     *&cgen_var_2 = (uint64_t)((*pSemaphore));
3407     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
3408     *streamPtrPtr += 8;
3409     /* is handle, possibly out */;
3410     stream->setHandleMapping(sResourceTracker->createMapping());
3411     uint64_t cgen_var_3;
3412     stream->read((uint64_t*)&cgen_var_3, 8);
3413     stream->handleMapping()->mapHandles_u64_VkSemaphore(&cgen_var_3, (VkSemaphore*)pSemaphore, 1);
3414     stream->unsetHandleMapping();
3415     VkResult vkCreateSemaphore_VkResult_return = (VkResult)0;
3416     stream->read(&vkCreateSemaphore_VkResult_return, sizeof(VkResult));
3417     ++encodeCount;
3418     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3419         pool->freeAll();
3420         stream->clearPool();
3421     }
3422     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3423     return vkCreateSemaphore_VkResult_return;
3424 }
3425 
vkDestroySemaphore(VkDevice device,VkSemaphore semaphore,const VkAllocationCallbacks * pAllocator,uint32_t doLock)3426 void VkEncoder::vkDestroySemaphore(VkDevice device, VkSemaphore semaphore,
3427                                    const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
3428     (void)doLock;
3429     bool queueSubmitWithCommandsEnabled =
3430         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3431     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3432     auto stream = mImpl->stream();
3433     auto pool = mImpl->pool();
3434     VkDevice local_device;
3435     VkSemaphore local_semaphore;
3436     VkAllocationCallbacks* local_pAllocator;
3437     local_device = device;
3438     local_semaphore = semaphore;
3439     local_pAllocator = nullptr;
3440     if (pAllocator) {
3441         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
3442         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
3443                                        (VkAllocationCallbacks*)(local_pAllocator));
3444     }
3445     local_pAllocator = nullptr;
3446     if (local_pAllocator) {
3447         transform_tohost_VkAllocationCallbacks(sResourceTracker,
3448                                                (VkAllocationCallbacks*)(local_pAllocator));
3449     }
3450     size_t count = 0;
3451     size_t* countPtr = &count;
3452     {
3453         uint64_t cgen_var_0;
3454         *countPtr += 1 * 8;
3455         uint64_t cgen_var_1;
3456         *countPtr += 1 * 8;
3457         // WARNING PTR CHECK
3458         *countPtr += 8;
3459         if (local_pAllocator) {
3460             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
3461                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
3462         }
3463     }
3464     uint32_t packetSize_vkDestroySemaphore =
3465         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3466     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroySemaphore);
3467     uint8_t* packetBeginPtr = streamPtr;
3468     uint8_t** streamPtrPtr = &streamPtr;
3469     uint32_t opcode_vkDestroySemaphore = OP_vkDestroySemaphore;
3470     uint32_t seqno;
3471     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3472     memcpy(streamPtr, &opcode_vkDestroySemaphore, sizeof(uint32_t));
3473     streamPtr += sizeof(uint32_t);
3474     memcpy(streamPtr, &packetSize_vkDestroySemaphore, sizeof(uint32_t));
3475     streamPtr += sizeof(uint32_t);
3476     if (queueSubmitWithCommandsEnabled) {
3477         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3478         streamPtr += sizeof(uint32_t);
3479     }
3480     uint64_t cgen_var_0;
3481     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3482     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3483     *streamPtrPtr += 1 * 8;
3484     uint64_t cgen_var_1;
3485     *&cgen_var_1 = get_host_u64_VkSemaphore((*&local_semaphore));
3486     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
3487     *streamPtrPtr += 1 * 8;
3488     // WARNING PTR CHECK
3489     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
3490     memcpy((*streamPtrPtr), &cgen_var_2, 8);
3491     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
3492     *streamPtrPtr += 8;
3493     if (local_pAllocator) {
3494         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
3495                                               (VkAllocationCallbacks*)(local_pAllocator),
3496                                               streamPtrPtr);
3497     }
3498     sResourceTracker->destroyMapping()->mapHandles_VkSemaphore((VkSemaphore*)&semaphore);
3499     stream->flush();
3500     ++encodeCount;
3501     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3502         pool->freeAll();
3503         stream->clearPool();
3504     }
3505     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3506 }
3507 
vkCreateEvent(VkDevice device,const VkEventCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkEvent * pEvent,uint32_t doLock)3508 VkResult VkEncoder::vkCreateEvent(VkDevice device, const VkEventCreateInfo* pCreateInfo,
3509                                   const VkAllocationCallbacks* pAllocator, VkEvent* pEvent,
3510                                   uint32_t doLock) {
3511     (void)doLock;
3512     bool queueSubmitWithCommandsEnabled =
3513         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3514     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3515     auto stream = mImpl->stream();
3516     auto pool = mImpl->pool();
3517     VkDevice local_device;
3518     VkEventCreateInfo* local_pCreateInfo;
3519     VkAllocationCallbacks* local_pAllocator;
3520     local_device = device;
3521     local_pCreateInfo = nullptr;
3522     if (pCreateInfo) {
3523         local_pCreateInfo = (VkEventCreateInfo*)pool->alloc(sizeof(const VkEventCreateInfo));
3524         deepcopy_VkEventCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
3525                                    (VkEventCreateInfo*)(local_pCreateInfo));
3526     }
3527     local_pAllocator = nullptr;
3528     if (pAllocator) {
3529         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
3530         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
3531                                        (VkAllocationCallbacks*)(local_pAllocator));
3532     }
3533     local_pAllocator = nullptr;
3534     if (local_pCreateInfo) {
3535         transform_tohost_VkEventCreateInfo(sResourceTracker,
3536                                            (VkEventCreateInfo*)(local_pCreateInfo));
3537     }
3538     if (local_pAllocator) {
3539         transform_tohost_VkAllocationCallbacks(sResourceTracker,
3540                                                (VkAllocationCallbacks*)(local_pAllocator));
3541     }
3542     size_t count = 0;
3543     size_t* countPtr = &count;
3544     {
3545         uint64_t cgen_var_0;
3546         *countPtr += 1 * 8;
3547         count_VkEventCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
3548                                 (VkEventCreateInfo*)(local_pCreateInfo), countPtr);
3549         // WARNING PTR CHECK
3550         *countPtr += 8;
3551         if (local_pAllocator) {
3552             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
3553                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
3554         }
3555         uint64_t cgen_var_1;
3556         *countPtr += 8;
3557     }
3558     uint32_t packetSize_vkCreateEvent = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3559     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateEvent);
3560     uint8_t* packetBeginPtr = streamPtr;
3561     uint8_t** streamPtrPtr = &streamPtr;
3562     uint32_t opcode_vkCreateEvent = OP_vkCreateEvent;
3563     uint32_t seqno;
3564     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3565     memcpy(streamPtr, &opcode_vkCreateEvent, sizeof(uint32_t));
3566     streamPtr += sizeof(uint32_t);
3567     memcpy(streamPtr, &packetSize_vkCreateEvent, sizeof(uint32_t));
3568     streamPtr += sizeof(uint32_t);
3569     if (queueSubmitWithCommandsEnabled) {
3570         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3571         streamPtr += sizeof(uint32_t);
3572     }
3573     uint64_t cgen_var_0;
3574     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3575     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3576     *streamPtrPtr += 1 * 8;
3577     reservedmarshal_VkEventCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
3578                                       (VkEventCreateInfo*)(local_pCreateInfo), streamPtrPtr);
3579     // WARNING PTR CHECK
3580     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
3581     memcpy((*streamPtrPtr), &cgen_var_1, 8);
3582     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
3583     *streamPtrPtr += 8;
3584     if (local_pAllocator) {
3585         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
3586                                               (VkAllocationCallbacks*)(local_pAllocator),
3587                                               streamPtrPtr);
3588     }
3589     /* is handle, possibly out */;
3590     uint64_t cgen_var_2;
3591     *&cgen_var_2 = (uint64_t)((*pEvent));
3592     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
3593     *streamPtrPtr += 8;
3594     /* is handle, possibly out */;
3595     stream->setHandleMapping(sResourceTracker->createMapping());
3596     uint64_t cgen_var_3;
3597     stream->read((uint64_t*)&cgen_var_3, 8);
3598     stream->handleMapping()->mapHandles_u64_VkEvent(&cgen_var_3, (VkEvent*)pEvent, 1);
3599     stream->unsetHandleMapping();
3600     VkResult vkCreateEvent_VkResult_return = (VkResult)0;
3601     stream->read(&vkCreateEvent_VkResult_return, sizeof(VkResult));
3602     ++encodeCount;
3603     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3604         pool->freeAll();
3605         stream->clearPool();
3606     }
3607     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3608     return vkCreateEvent_VkResult_return;
3609 }
3610 
vkDestroyEvent(VkDevice device,VkEvent event,const VkAllocationCallbacks * pAllocator,uint32_t doLock)3611 void VkEncoder::vkDestroyEvent(VkDevice device, VkEvent event,
3612                                const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
3613     (void)doLock;
3614     bool queueSubmitWithCommandsEnabled =
3615         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3616     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3617     auto stream = mImpl->stream();
3618     auto pool = mImpl->pool();
3619     VkDevice local_device;
3620     VkEvent local_event;
3621     VkAllocationCallbacks* local_pAllocator;
3622     local_device = device;
3623     local_event = event;
3624     local_pAllocator = nullptr;
3625     if (pAllocator) {
3626         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
3627         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
3628                                        (VkAllocationCallbacks*)(local_pAllocator));
3629     }
3630     local_pAllocator = nullptr;
3631     if (local_pAllocator) {
3632         transform_tohost_VkAllocationCallbacks(sResourceTracker,
3633                                                (VkAllocationCallbacks*)(local_pAllocator));
3634     }
3635     size_t count = 0;
3636     size_t* countPtr = &count;
3637     {
3638         uint64_t cgen_var_0;
3639         *countPtr += 1 * 8;
3640         uint64_t cgen_var_1;
3641         *countPtr += 1 * 8;
3642         // WARNING PTR CHECK
3643         *countPtr += 8;
3644         if (local_pAllocator) {
3645             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
3646                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
3647         }
3648     }
3649     uint32_t packetSize_vkDestroyEvent = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3650     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyEvent);
3651     uint8_t* packetBeginPtr = streamPtr;
3652     uint8_t** streamPtrPtr = &streamPtr;
3653     uint32_t opcode_vkDestroyEvent = OP_vkDestroyEvent;
3654     uint32_t seqno;
3655     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3656     memcpy(streamPtr, &opcode_vkDestroyEvent, sizeof(uint32_t));
3657     streamPtr += sizeof(uint32_t);
3658     memcpy(streamPtr, &packetSize_vkDestroyEvent, sizeof(uint32_t));
3659     streamPtr += sizeof(uint32_t);
3660     if (queueSubmitWithCommandsEnabled) {
3661         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3662         streamPtr += sizeof(uint32_t);
3663     }
3664     uint64_t cgen_var_0;
3665     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3666     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3667     *streamPtrPtr += 1 * 8;
3668     uint64_t cgen_var_1;
3669     *&cgen_var_1 = get_host_u64_VkEvent((*&local_event));
3670     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
3671     *streamPtrPtr += 1 * 8;
3672     // WARNING PTR CHECK
3673     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
3674     memcpy((*streamPtrPtr), &cgen_var_2, 8);
3675     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
3676     *streamPtrPtr += 8;
3677     if (local_pAllocator) {
3678         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
3679                                               (VkAllocationCallbacks*)(local_pAllocator),
3680                                               streamPtrPtr);
3681     }
3682     sResourceTracker->destroyMapping()->mapHandles_VkEvent((VkEvent*)&event);
3683     stream->flush();
3684     ++encodeCount;
3685     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3686         pool->freeAll();
3687         stream->clearPool();
3688     }
3689     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3690 }
3691 
vkGetEventStatus(VkDevice device,VkEvent event,uint32_t doLock)3692 VkResult VkEncoder::vkGetEventStatus(VkDevice device, VkEvent event, uint32_t doLock) {
3693     (void)doLock;
3694     bool queueSubmitWithCommandsEnabled =
3695         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3696     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3697     auto stream = mImpl->stream();
3698     auto pool = mImpl->pool();
3699     VkDevice local_device;
3700     VkEvent local_event;
3701     local_device = device;
3702     local_event = event;
3703     size_t count = 0;
3704     size_t* countPtr = &count;
3705     {
3706         uint64_t cgen_var_0;
3707         *countPtr += 1 * 8;
3708         uint64_t cgen_var_1;
3709         *countPtr += 1 * 8;
3710     }
3711     uint32_t packetSize_vkGetEventStatus = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3712     uint8_t* streamPtr = stream->reserve(packetSize_vkGetEventStatus);
3713     uint8_t* packetBeginPtr = streamPtr;
3714     uint8_t** streamPtrPtr = &streamPtr;
3715     uint32_t opcode_vkGetEventStatus = OP_vkGetEventStatus;
3716     uint32_t seqno;
3717     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3718     memcpy(streamPtr, &opcode_vkGetEventStatus, sizeof(uint32_t));
3719     streamPtr += sizeof(uint32_t);
3720     memcpy(streamPtr, &packetSize_vkGetEventStatus, sizeof(uint32_t));
3721     streamPtr += sizeof(uint32_t);
3722     if (queueSubmitWithCommandsEnabled) {
3723         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3724         streamPtr += sizeof(uint32_t);
3725     }
3726     uint64_t cgen_var_0;
3727     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3728     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3729     *streamPtrPtr += 1 * 8;
3730     uint64_t cgen_var_1;
3731     *&cgen_var_1 = get_host_u64_VkEvent((*&local_event));
3732     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
3733     *streamPtrPtr += 1 * 8;
3734     VkResult vkGetEventStatus_VkResult_return = (VkResult)0;
3735     stream->read(&vkGetEventStatus_VkResult_return, sizeof(VkResult));
3736     ++encodeCount;
3737     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3738         pool->freeAll();
3739         stream->clearPool();
3740     }
3741     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3742     return vkGetEventStatus_VkResult_return;
3743 }
3744 
vkSetEvent(VkDevice device,VkEvent event,uint32_t doLock)3745 VkResult VkEncoder::vkSetEvent(VkDevice device, VkEvent event, uint32_t doLock) {
3746     (void)doLock;
3747     bool queueSubmitWithCommandsEnabled =
3748         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3749     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3750     auto stream = mImpl->stream();
3751     auto pool = mImpl->pool();
3752     VkDevice local_device;
3753     VkEvent local_event;
3754     local_device = device;
3755     local_event = event;
3756     size_t count = 0;
3757     size_t* countPtr = &count;
3758     {
3759         uint64_t cgen_var_0;
3760         *countPtr += 1 * 8;
3761         uint64_t cgen_var_1;
3762         *countPtr += 1 * 8;
3763     }
3764     uint32_t packetSize_vkSetEvent = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3765     uint8_t* streamPtr = stream->reserve(packetSize_vkSetEvent);
3766     uint8_t* packetBeginPtr = streamPtr;
3767     uint8_t** streamPtrPtr = &streamPtr;
3768     uint32_t opcode_vkSetEvent = OP_vkSetEvent;
3769     uint32_t seqno;
3770     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3771     memcpy(streamPtr, &opcode_vkSetEvent, sizeof(uint32_t));
3772     streamPtr += sizeof(uint32_t);
3773     memcpy(streamPtr, &packetSize_vkSetEvent, sizeof(uint32_t));
3774     streamPtr += sizeof(uint32_t);
3775     if (queueSubmitWithCommandsEnabled) {
3776         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3777         streamPtr += sizeof(uint32_t);
3778     }
3779     uint64_t cgen_var_0;
3780     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3781     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3782     *streamPtrPtr += 1 * 8;
3783     uint64_t cgen_var_1;
3784     *&cgen_var_1 = get_host_u64_VkEvent((*&local_event));
3785     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
3786     *streamPtrPtr += 1 * 8;
3787     VkResult vkSetEvent_VkResult_return = (VkResult)0;
3788     stream->read(&vkSetEvent_VkResult_return, sizeof(VkResult));
3789     ++encodeCount;
3790     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3791         pool->freeAll();
3792         stream->clearPool();
3793     }
3794     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3795     return vkSetEvent_VkResult_return;
3796 }
3797 
vkResetEvent(VkDevice device,VkEvent event,uint32_t doLock)3798 VkResult VkEncoder::vkResetEvent(VkDevice device, VkEvent event, uint32_t doLock) {
3799     (void)doLock;
3800     bool queueSubmitWithCommandsEnabled =
3801         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3802     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3803     auto stream = mImpl->stream();
3804     auto pool = mImpl->pool();
3805     VkDevice local_device;
3806     VkEvent local_event;
3807     local_device = device;
3808     local_event = event;
3809     size_t count = 0;
3810     size_t* countPtr = &count;
3811     {
3812         uint64_t cgen_var_0;
3813         *countPtr += 1 * 8;
3814         uint64_t cgen_var_1;
3815         *countPtr += 1 * 8;
3816     }
3817     uint32_t packetSize_vkResetEvent = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3818     uint8_t* streamPtr = stream->reserve(packetSize_vkResetEvent);
3819     uint8_t* packetBeginPtr = streamPtr;
3820     uint8_t** streamPtrPtr = &streamPtr;
3821     uint32_t opcode_vkResetEvent = OP_vkResetEvent;
3822     uint32_t seqno;
3823     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3824     memcpy(streamPtr, &opcode_vkResetEvent, sizeof(uint32_t));
3825     streamPtr += sizeof(uint32_t);
3826     memcpy(streamPtr, &packetSize_vkResetEvent, sizeof(uint32_t));
3827     streamPtr += sizeof(uint32_t);
3828     if (queueSubmitWithCommandsEnabled) {
3829         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3830         streamPtr += sizeof(uint32_t);
3831     }
3832     uint64_t cgen_var_0;
3833     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3834     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3835     *streamPtrPtr += 1 * 8;
3836     uint64_t cgen_var_1;
3837     *&cgen_var_1 = get_host_u64_VkEvent((*&local_event));
3838     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
3839     *streamPtrPtr += 1 * 8;
3840     VkResult vkResetEvent_VkResult_return = (VkResult)0;
3841     stream->read(&vkResetEvent_VkResult_return, sizeof(VkResult));
3842     ++encodeCount;
3843     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3844         pool->freeAll();
3845         stream->clearPool();
3846     }
3847     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3848     return vkResetEvent_VkResult_return;
3849 }
3850 
vkCreateQueryPool(VkDevice device,const VkQueryPoolCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkQueryPool * pQueryPool,uint32_t doLock)3851 VkResult VkEncoder::vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo,
3852                                       const VkAllocationCallbacks* pAllocator,
3853                                       VkQueryPool* pQueryPool, uint32_t doLock) {
3854     (void)doLock;
3855     bool queueSubmitWithCommandsEnabled =
3856         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3857     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3858     auto stream = mImpl->stream();
3859     auto pool = mImpl->pool();
3860     VkDevice local_device;
3861     VkQueryPoolCreateInfo* local_pCreateInfo;
3862     VkAllocationCallbacks* local_pAllocator;
3863     local_device = device;
3864     local_pCreateInfo = nullptr;
3865     if (pCreateInfo) {
3866         local_pCreateInfo =
3867             (VkQueryPoolCreateInfo*)pool->alloc(sizeof(const VkQueryPoolCreateInfo));
3868         deepcopy_VkQueryPoolCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
3869                                        (VkQueryPoolCreateInfo*)(local_pCreateInfo));
3870     }
3871     local_pAllocator = nullptr;
3872     if (pAllocator) {
3873         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
3874         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
3875                                        (VkAllocationCallbacks*)(local_pAllocator));
3876     }
3877     local_pAllocator = nullptr;
3878     if (local_pCreateInfo) {
3879         transform_tohost_VkQueryPoolCreateInfo(sResourceTracker,
3880                                                (VkQueryPoolCreateInfo*)(local_pCreateInfo));
3881     }
3882     if (local_pAllocator) {
3883         transform_tohost_VkAllocationCallbacks(sResourceTracker,
3884                                                (VkAllocationCallbacks*)(local_pAllocator));
3885     }
3886     size_t count = 0;
3887     size_t* countPtr = &count;
3888     {
3889         uint64_t cgen_var_0;
3890         *countPtr += 1 * 8;
3891         count_VkQueryPoolCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
3892                                     (VkQueryPoolCreateInfo*)(local_pCreateInfo), countPtr);
3893         // WARNING PTR CHECK
3894         *countPtr += 8;
3895         if (local_pAllocator) {
3896             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
3897                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
3898         }
3899         uint64_t cgen_var_1;
3900         *countPtr += 8;
3901     }
3902     uint32_t packetSize_vkCreateQueryPool =
3903         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3904     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateQueryPool);
3905     uint8_t* packetBeginPtr = streamPtr;
3906     uint8_t** streamPtrPtr = &streamPtr;
3907     uint32_t opcode_vkCreateQueryPool = OP_vkCreateQueryPool;
3908     uint32_t seqno;
3909     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
3910     memcpy(streamPtr, &opcode_vkCreateQueryPool, sizeof(uint32_t));
3911     streamPtr += sizeof(uint32_t);
3912     memcpy(streamPtr, &packetSize_vkCreateQueryPool, sizeof(uint32_t));
3913     streamPtr += sizeof(uint32_t);
3914     if (queueSubmitWithCommandsEnabled) {
3915         memcpy(streamPtr, &seqno, sizeof(uint32_t));
3916         streamPtr += sizeof(uint32_t);
3917     }
3918     uint64_t cgen_var_0;
3919     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
3920     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
3921     *streamPtrPtr += 1 * 8;
3922     reservedmarshal_VkQueryPoolCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
3923                                           (VkQueryPoolCreateInfo*)(local_pCreateInfo),
3924                                           streamPtrPtr);
3925     // WARNING PTR CHECK
3926     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
3927     memcpy((*streamPtrPtr), &cgen_var_1, 8);
3928     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
3929     *streamPtrPtr += 8;
3930     if (local_pAllocator) {
3931         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
3932                                               (VkAllocationCallbacks*)(local_pAllocator),
3933                                               streamPtrPtr);
3934     }
3935     /* is handle, possibly out */;
3936     uint64_t cgen_var_2;
3937     *&cgen_var_2 = (uint64_t)((*pQueryPool));
3938     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
3939     *streamPtrPtr += 8;
3940     /* is handle, possibly out */;
3941     stream->setHandleMapping(sResourceTracker->createMapping());
3942     uint64_t cgen_var_3;
3943     stream->read((uint64_t*)&cgen_var_3, 8);
3944     stream->handleMapping()->mapHandles_u64_VkQueryPool(&cgen_var_3, (VkQueryPool*)pQueryPool, 1);
3945     stream->unsetHandleMapping();
3946     VkResult vkCreateQueryPool_VkResult_return = (VkResult)0;
3947     stream->read(&vkCreateQueryPool_VkResult_return, sizeof(VkResult));
3948     ++encodeCount;
3949     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
3950         pool->freeAll();
3951         stream->clearPool();
3952     }
3953     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
3954     return vkCreateQueryPool_VkResult_return;
3955 }
3956 
vkDestroyQueryPool(VkDevice device,VkQueryPool queryPool,const VkAllocationCallbacks * pAllocator,uint32_t doLock)3957 void VkEncoder::vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
3958                                    const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
3959     (void)doLock;
3960     bool queueSubmitWithCommandsEnabled =
3961         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
3962     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
3963     auto stream = mImpl->stream();
3964     auto pool = mImpl->pool();
3965     VkDevice local_device;
3966     VkQueryPool local_queryPool;
3967     VkAllocationCallbacks* local_pAllocator;
3968     local_device = device;
3969     local_queryPool = queryPool;
3970     local_pAllocator = nullptr;
3971     if (pAllocator) {
3972         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
3973         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
3974                                        (VkAllocationCallbacks*)(local_pAllocator));
3975     }
3976     local_pAllocator = nullptr;
3977     if (local_pAllocator) {
3978         transform_tohost_VkAllocationCallbacks(sResourceTracker,
3979                                                (VkAllocationCallbacks*)(local_pAllocator));
3980     }
3981     size_t count = 0;
3982     size_t* countPtr = &count;
3983     {
3984         uint64_t cgen_var_0;
3985         *countPtr += 1 * 8;
3986         uint64_t cgen_var_1;
3987         *countPtr += 1 * 8;
3988         // WARNING PTR CHECK
3989         *countPtr += 8;
3990         if (local_pAllocator) {
3991             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
3992                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
3993         }
3994     }
3995     uint32_t packetSize_vkDestroyQueryPool =
3996         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
3997     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyQueryPool);
3998     uint8_t* packetBeginPtr = streamPtr;
3999     uint8_t** streamPtrPtr = &streamPtr;
4000     uint32_t opcode_vkDestroyQueryPool = OP_vkDestroyQueryPool;
4001     uint32_t seqno;
4002     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
4003     memcpy(streamPtr, &opcode_vkDestroyQueryPool, sizeof(uint32_t));
4004     streamPtr += sizeof(uint32_t);
4005     memcpy(streamPtr, &packetSize_vkDestroyQueryPool, sizeof(uint32_t));
4006     streamPtr += sizeof(uint32_t);
4007     if (queueSubmitWithCommandsEnabled) {
4008         memcpy(streamPtr, &seqno, sizeof(uint32_t));
4009         streamPtr += sizeof(uint32_t);
4010     }
4011     uint64_t cgen_var_0;
4012     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
4013     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
4014     *streamPtrPtr += 1 * 8;
4015     uint64_t cgen_var_1;
4016     *&cgen_var_1 = get_host_u64_VkQueryPool((*&local_queryPool));
4017     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
4018     *streamPtrPtr += 1 * 8;
4019     // WARNING PTR CHECK
4020     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
4021     memcpy((*streamPtrPtr), &cgen_var_2, 8);
4022     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
4023     *streamPtrPtr += 8;
4024     if (local_pAllocator) {
4025         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4026                                               (VkAllocationCallbacks*)(local_pAllocator),
4027                                               streamPtrPtr);
4028     }
4029     sResourceTracker->destroyMapping()->mapHandles_VkQueryPool((VkQueryPool*)&queryPool);
4030     stream->flush();
4031     ++encodeCount;
4032     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
4033         pool->freeAll();
4034         stream->clearPool();
4035     }
4036     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
4037 }
4038 
vkGetQueryPoolResults(VkDevice device,VkQueryPool queryPool,uint32_t firstQuery,uint32_t queryCount,size_t dataSize,void * pData,VkDeviceSize stride,VkQueryResultFlags flags,uint32_t doLock)4039 VkResult VkEncoder::vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool,
4040                                           uint32_t firstQuery, uint32_t queryCount, size_t dataSize,
4041                                           void* pData, VkDeviceSize stride,
4042                                           VkQueryResultFlags flags, uint32_t doLock) {
4043     (void)doLock;
4044     bool queueSubmitWithCommandsEnabled =
4045         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
4046     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
4047     auto stream = mImpl->stream();
4048     auto pool = mImpl->pool();
4049     VkDevice local_device;
4050     VkQueryPool local_queryPool;
4051     uint32_t local_firstQuery;
4052     uint32_t local_queryCount;
4053     size_t local_dataSize;
4054     VkDeviceSize local_stride;
4055     VkQueryResultFlags local_flags;
4056     local_device = device;
4057     local_queryPool = queryPool;
4058     local_firstQuery = firstQuery;
4059     local_queryCount = queryCount;
4060     local_dataSize = dataSize;
4061     local_stride = stride;
4062     local_flags = flags;
4063     size_t count = 0;
4064     size_t* countPtr = &count;
4065     {
4066         uint64_t cgen_var_0;
4067         *countPtr += 1 * 8;
4068         uint64_t cgen_var_1;
4069         *countPtr += 1 * 8;
4070         *countPtr += sizeof(uint32_t);
4071         *countPtr += sizeof(uint32_t);
4072         *countPtr += 8;
4073         *countPtr += ((dataSize)) * sizeof(uint8_t);
4074         *countPtr += sizeof(VkDeviceSize);
4075         *countPtr += sizeof(VkQueryResultFlags);
4076     }
4077     uint32_t packetSize_vkGetQueryPoolResults =
4078         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
4079     uint8_t* streamPtr = stream->reserve(packetSize_vkGetQueryPoolResults);
4080     uint8_t* packetBeginPtr = streamPtr;
4081     uint8_t** streamPtrPtr = &streamPtr;
4082     uint32_t opcode_vkGetQueryPoolResults = OP_vkGetQueryPoolResults;
4083     uint32_t seqno;
4084     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
4085     memcpy(streamPtr, &opcode_vkGetQueryPoolResults, sizeof(uint32_t));
4086     streamPtr += sizeof(uint32_t);
4087     memcpy(streamPtr, &packetSize_vkGetQueryPoolResults, sizeof(uint32_t));
4088     streamPtr += sizeof(uint32_t);
4089     if (queueSubmitWithCommandsEnabled) {
4090         memcpy(streamPtr, &seqno, sizeof(uint32_t));
4091         streamPtr += sizeof(uint32_t);
4092     }
4093     uint64_t cgen_var_0;
4094     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
4095     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
4096     *streamPtrPtr += 1 * 8;
4097     uint64_t cgen_var_1;
4098     *&cgen_var_1 = get_host_u64_VkQueryPool((*&local_queryPool));
4099     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
4100     *streamPtrPtr += 1 * 8;
4101     memcpy(*streamPtrPtr, (uint32_t*)&local_firstQuery, sizeof(uint32_t));
4102     *streamPtrPtr += sizeof(uint32_t);
4103     memcpy(*streamPtrPtr, (uint32_t*)&local_queryCount, sizeof(uint32_t));
4104     *streamPtrPtr += sizeof(uint32_t);
4105     uint64_t cgen_var_2 = (uint64_t)local_dataSize;
4106     memcpy((*streamPtrPtr), &cgen_var_2, 8);
4107     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
4108     *streamPtrPtr += 8;
4109     memcpy(*streamPtrPtr, (void*)pData, ((dataSize)) * sizeof(uint8_t));
4110     *streamPtrPtr += ((dataSize)) * sizeof(uint8_t);
4111     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_stride, sizeof(VkDeviceSize));
4112     *streamPtrPtr += sizeof(VkDeviceSize);
4113     memcpy(*streamPtrPtr, (VkQueryResultFlags*)&local_flags, sizeof(VkQueryResultFlags));
4114     *streamPtrPtr += sizeof(VkQueryResultFlags);
4115     stream->read((void*)pData, ((dataSize)) * sizeof(uint8_t));
4116     VkResult vkGetQueryPoolResults_VkResult_return = (VkResult)0;
4117     stream->read(&vkGetQueryPoolResults_VkResult_return, sizeof(VkResult));
4118     ++encodeCount;
4119     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
4120         pool->freeAll();
4121         stream->clearPool();
4122     }
4123     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
4124     return vkGetQueryPoolResults_VkResult_return;
4125 }
4126 
vkCreateBuffer(VkDevice device,const VkBufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBuffer * pBuffer,uint32_t doLock)4127 VkResult VkEncoder::vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo,
4128                                    const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer,
4129                                    uint32_t doLock) {
4130     (void)doLock;
4131     bool queueSubmitWithCommandsEnabled =
4132         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
4133     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
4134     auto stream = mImpl->stream();
4135     auto pool = mImpl->pool();
4136     VkDevice local_device;
4137     VkBufferCreateInfo* local_pCreateInfo;
4138     VkAllocationCallbacks* local_pAllocator;
4139     local_device = device;
4140     local_pCreateInfo = nullptr;
4141     if (pCreateInfo) {
4142         local_pCreateInfo = (VkBufferCreateInfo*)pool->alloc(sizeof(const VkBufferCreateInfo));
4143         deepcopy_VkBufferCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
4144                                     (VkBufferCreateInfo*)(local_pCreateInfo));
4145     }
4146     local_pAllocator = nullptr;
4147     if (pAllocator) {
4148         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
4149         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
4150                                        (VkAllocationCallbacks*)(local_pAllocator));
4151     }
4152     local_pAllocator = nullptr;
4153     if (local_pCreateInfo) {
4154         transform_tohost_VkBufferCreateInfo(sResourceTracker,
4155                                             (VkBufferCreateInfo*)(local_pCreateInfo));
4156     }
4157     if (local_pAllocator) {
4158         transform_tohost_VkAllocationCallbacks(sResourceTracker,
4159                                                (VkAllocationCallbacks*)(local_pAllocator));
4160     }
4161     size_t count = 0;
4162     size_t* countPtr = &count;
4163     {
4164         uint64_t cgen_var_0;
4165         *countPtr += 1 * 8;
4166         count_VkBufferCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4167                                  (VkBufferCreateInfo*)(local_pCreateInfo), countPtr);
4168         // WARNING PTR CHECK
4169         *countPtr += 8;
4170         if (local_pAllocator) {
4171             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4172                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
4173         }
4174         uint64_t cgen_var_1;
4175         *countPtr += 8;
4176     }
4177     uint32_t packetSize_vkCreateBuffer = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
4178     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateBuffer);
4179     uint8_t* packetBeginPtr = streamPtr;
4180     uint8_t** streamPtrPtr = &streamPtr;
4181     uint32_t opcode_vkCreateBuffer = OP_vkCreateBuffer;
4182     uint32_t seqno;
4183     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
4184     memcpy(streamPtr, &opcode_vkCreateBuffer, sizeof(uint32_t));
4185     streamPtr += sizeof(uint32_t);
4186     memcpy(streamPtr, &packetSize_vkCreateBuffer, sizeof(uint32_t));
4187     streamPtr += sizeof(uint32_t);
4188     if (queueSubmitWithCommandsEnabled) {
4189         memcpy(streamPtr, &seqno, sizeof(uint32_t));
4190         streamPtr += sizeof(uint32_t);
4191     }
4192     uint64_t cgen_var_0;
4193     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
4194     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
4195     *streamPtrPtr += 1 * 8;
4196     reservedmarshal_VkBufferCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4197                                        (VkBufferCreateInfo*)(local_pCreateInfo), streamPtrPtr);
4198     // WARNING PTR CHECK
4199     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
4200     memcpy((*streamPtrPtr), &cgen_var_1, 8);
4201     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
4202     *streamPtrPtr += 8;
4203     if (local_pAllocator) {
4204         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4205                                               (VkAllocationCallbacks*)(local_pAllocator),
4206                                               streamPtrPtr);
4207     }
4208     /* is handle, possibly out */;
4209     uint64_t cgen_var_2;
4210     *&cgen_var_2 = (uint64_t)((*pBuffer));
4211     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
4212     *streamPtrPtr += 8;
4213     /* is handle, possibly out */;
4214     stream->setHandleMapping(sResourceTracker->createMapping());
4215     uint64_t cgen_var_3;
4216     stream->read((uint64_t*)&cgen_var_3, 8);
4217     stream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_3, (VkBuffer*)pBuffer, 1);
4218     stream->unsetHandleMapping();
4219     VkResult vkCreateBuffer_VkResult_return = (VkResult)0;
4220     stream->read(&vkCreateBuffer_VkResult_return, sizeof(VkResult));
4221     ++encodeCount;
4222     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
4223         pool->freeAll();
4224         stream->clearPool();
4225     }
4226     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
4227     return vkCreateBuffer_VkResult_return;
4228 }
4229 
vkDestroyBuffer(VkDevice device,VkBuffer buffer,const VkAllocationCallbacks * pAllocator,uint32_t doLock)4230 void VkEncoder::vkDestroyBuffer(VkDevice device, VkBuffer buffer,
4231                                 const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
4232     (void)doLock;
4233     bool queueSubmitWithCommandsEnabled =
4234         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
4235     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
4236     auto stream = mImpl->stream();
4237     auto pool = mImpl->pool();
4238     VkDevice local_device;
4239     VkBuffer local_buffer;
4240     VkAllocationCallbacks* local_pAllocator;
4241     local_device = device;
4242     local_buffer = buffer;
4243     local_pAllocator = nullptr;
4244     if (pAllocator) {
4245         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
4246         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
4247                                        (VkAllocationCallbacks*)(local_pAllocator));
4248     }
4249     local_pAllocator = nullptr;
4250     if (local_pAllocator) {
4251         transform_tohost_VkAllocationCallbacks(sResourceTracker,
4252                                                (VkAllocationCallbacks*)(local_pAllocator));
4253     }
4254     size_t count = 0;
4255     size_t* countPtr = &count;
4256     {
4257         uint64_t cgen_var_0;
4258         *countPtr += 1 * 8;
4259         uint64_t cgen_var_1;
4260         *countPtr += 1 * 8;
4261         // WARNING PTR CHECK
4262         *countPtr += 8;
4263         if (local_pAllocator) {
4264             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4265                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
4266         }
4267     }
4268     uint32_t packetSize_vkDestroyBuffer = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
4269     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyBuffer);
4270     uint8_t* packetBeginPtr = streamPtr;
4271     uint8_t** streamPtrPtr = &streamPtr;
4272     uint32_t opcode_vkDestroyBuffer = OP_vkDestroyBuffer;
4273     uint32_t seqno;
4274     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
4275     memcpy(streamPtr, &opcode_vkDestroyBuffer, sizeof(uint32_t));
4276     streamPtr += sizeof(uint32_t);
4277     memcpy(streamPtr, &packetSize_vkDestroyBuffer, sizeof(uint32_t));
4278     streamPtr += sizeof(uint32_t);
4279     if (queueSubmitWithCommandsEnabled) {
4280         memcpy(streamPtr, &seqno, sizeof(uint32_t));
4281         streamPtr += sizeof(uint32_t);
4282     }
4283     uint64_t cgen_var_0;
4284     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
4285     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
4286     *streamPtrPtr += 1 * 8;
4287     uint64_t cgen_var_1;
4288     *&cgen_var_1 = get_host_u64_VkBuffer((*&local_buffer));
4289     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
4290     *streamPtrPtr += 1 * 8;
4291     // WARNING PTR CHECK
4292     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
4293     memcpy((*streamPtrPtr), &cgen_var_2, 8);
4294     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
4295     *streamPtrPtr += 8;
4296     if (local_pAllocator) {
4297         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4298                                               (VkAllocationCallbacks*)(local_pAllocator),
4299                                               streamPtrPtr);
4300     }
4301     sResourceTracker->destroyMapping()->mapHandles_VkBuffer((VkBuffer*)&buffer);
4302     stream->flush();
4303     ++encodeCount;
4304     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
4305         pool->freeAll();
4306         stream->clearPool();
4307     }
4308     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
4309 }
4310 
vkCreateBufferView(VkDevice device,const VkBufferViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBufferView * pView,uint32_t doLock)4311 VkResult VkEncoder::vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo,
4312                                        const VkAllocationCallbacks* pAllocator, VkBufferView* pView,
4313                                        uint32_t doLock) {
4314     (void)doLock;
4315     bool queueSubmitWithCommandsEnabled =
4316         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
4317     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
4318     auto stream = mImpl->stream();
4319     auto pool = mImpl->pool();
4320     VkDevice local_device;
4321     VkBufferViewCreateInfo* local_pCreateInfo;
4322     VkAllocationCallbacks* local_pAllocator;
4323     local_device = device;
4324     local_pCreateInfo = nullptr;
4325     if (pCreateInfo) {
4326         local_pCreateInfo =
4327             (VkBufferViewCreateInfo*)pool->alloc(sizeof(const VkBufferViewCreateInfo));
4328         deepcopy_VkBufferViewCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
4329                                         (VkBufferViewCreateInfo*)(local_pCreateInfo));
4330     }
4331     local_pAllocator = nullptr;
4332     if (pAllocator) {
4333         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
4334         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
4335                                        (VkAllocationCallbacks*)(local_pAllocator));
4336     }
4337     local_pAllocator = nullptr;
4338     if (local_pCreateInfo) {
4339         transform_tohost_VkBufferViewCreateInfo(sResourceTracker,
4340                                                 (VkBufferViewCreateInfo*)(local_pCreateInfo));
4341     }
4342     if (local_pAllocator) {
4343         transform_tohost_VkAllocationCallbacks(sResourceTracker,
4344                                                (VkAllocationCallbacks*)(local_pAllocator));
4345     }
4346     size_t count = 0;
4347     size_t* countPtr = &count;
4348     {
4349         uint64_t cgen_var_0;
4350         *countPtr += 1 * 8;
4351         count_VkBufferViewCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4352                                      (VkBufferViewCreateInfo*)(local_pCreateInfo), countPtr);
4353         // WARNING PTR CHECK
4354         *countPtr += 8;
4355         if (local_pAllocator) {
4356             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4357                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
4358         }
4359         uint64_t cgen_var_1;
4360         *countPtr += 8;
4361     }
4362     uint32_t packetSize_vkCreateBufferView =
4363         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
4364     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateBufferView);
4365     uint8_t* packetBeginPtr = streamPtr;
4366     uint8_t** streamPtrPtr = &streamPtr;
4367     uint32_t opcode_vkCreateBufferView = OP_vkCreateBufferView;
4368     uint32_t seqno;
4369     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
4370     memcpy(streamPtr, &opcode_vkCreateBufferView, sizeof(uint32_t));
4371     streamPtr += sizeof(uint32_t);
4372     memcpy(streamPtr, &packetSize_vkCreateBufferView, sizeof(uint32_t));
4373     streamPtr += sizeof(uint32_t);
4374     if (queueSubmitWithCommandsEnabled) {
4375         memcpy(streamPtr, &seqno, sizeof(uint32_t));
4376         streamPtr += sizeof(uint32_t);
4377     }
4378     uint64_t cgen_var_0;
4379     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
4380     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
4381     *streamPtrPtr += 1 * 8;
4382     reservedmarshal_VkBufferViewCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4383                                            (VkBufferViewCreateInfo*)(local_pCreateInfo),
4384                                            streamPtrPtr);
4385     // WARNING PTR CHECK
4386     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
4387     memcpy((*streamPtrPtr), &cgen_var_1, 8);
4388     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
4389     *streamPtrPtr += 8;
4390     if (local_pAllocator) {
4391         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4392                                               (VkAllocationCallbacks*)(local_pAllocator),
4393                                               streamPtrPtr);
4394     }
4395     /* is handle, possibly out */;
4396     uint64_t cgen_var_2;
4397     *&cgen_var_2 = (uint64_t)((*pView));
4398     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
4399     *streamPtrPtr += 8;
4400     /* is handle, possibly out */;
4401     stream->setHandleMapping(sResourceTracker->createMapping());
4402     uint64_t cgen_var_3;
4403     stream->read((uint64_t*)&cgen_var_3, 8);
4404     stream->handleMapping()->mapHandles_u64_VkBufferView(&cgen_var_3, (VkBufferView*)pView, 1);
4405     stream->unsetHandleMapping();
4406     VkResult vkCreateBufferView_VkResult_return = (VkResult)0;
4407     stream->read(&vkCreateBufferView_VkResult_return, sizeof(VkResult));
4408     ++encodeCount;
4409     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
4410         pool->freeAll();
4411         stream->clearPool();
4412     }
4413     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
4414     return vkCreateBufferView_VkResult_return;
4415 }
4416 
vkDestroyBufferView(VkDevice device,VkBufferView bufferView,const VkAllocationCallbacks * pAllocator,uint32_t doLock)4417 void VkEncoder::vkDestroyBufferView(VkDevice device, VkBufferView bufferView,
4418                                     const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
4419     (void)doLock;
4420     bool queueSubmitWithCommandsEnabled =
4421         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
4422     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
4423     auto stream = mImpl->stream();
4424     auto pool = mImpl->pool();
4425     VkDevice local_device;
4426     VkBufferView local_bufferView;
4427     VkAllocationCallbacks* local_pAllocator;
4428     local_device = device;
4429     local_bufferView = bufferView;
4430     local_pAllocator = nullptr;
4431     if (pAllocator) {
4432         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
4433         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
4434                                        (VkAllocationCallbacks*)(local_pAllocator));
4435     }
4436     local_pAllocator = nullptr;
4437     if (local_pAllocator) {
4438         transform_tohost_VkAllocationCallbacks(sResourceTracker,
4439                                                (VkAllocationCallbacks*)(local_pAllocator));
4440     }
4441     size_t count = 0;
4442     size_t* countPtr = &count;
4443     {
4444         uint64_t cgen_var_0;
4445         *countPtr += 1 * 8;
4446         uint64_t cgen_var_1;
4447         *countPtr += 1 * 8;
4448         // WARNING PTR CHECK
4449         *countPtr += 8;
4450         if (local_pAllocator) {
4451             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4452                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
4453         }
4454     }
4455     uint32_t packetSize_vkDestroyBufferView =
4456         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
4457     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyBufferView);
4458     uint8_t* packetBeginPtr = streamPtr;
4459     uint8_t** streamPtrPtr = &streamPtr;
4460     uint32_t opcode_vkDestroyBufferView = OP_vkDestroyBufferView;
4461     uint32_t seqno;
4462     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
4463     memcpy(streamPtr, &opcode_vkDestroyBufferView, sizeof(uint32_t));
4464     streamPtr += sizeof(uint32_t);
4465     memcpy(streamPtr, &packetSize_vkDestroyBufferView, sizeof(uint32_t));
4466     streamPtr += sizeof(uint32_t);
4467     if (queueSubmitWithCommandsEnabled) {
4468         memcpy(streamPtr, &seqno, sizeof(uint32_t));
4469         streamPtr += sizeof(uint32_t);
4470     }
4471     uint64_t cgen_var_0;
4472     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
4473     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
4474     *streamPtrPtr += 1 * 8;
4475     uint64_t cgen_var_1;
4476     *&cgen_var_1 = get_host_u64_VkBufferView((*&local_bufferView));
4477     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
4478     *streamPtrPtr += 1 * 8;
4479     // WARNING PTR CHECK
4480     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
4481     memcpy((*streamPtrPtr), &cgen_var_2, 8);
4482     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
4483     *streamPtrPtr += 8;
4484     if (local_pAllocator) {
4485         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4486                                               (VkAllocationCallbacks*)(local_pAllocator),
4487                                               streamPtrPtr);
4488     }
4489     sResourceTracker->destroyMapping()->mapHandles_VkBufferView((VkBufferView*)&bufferView);
4490     stream->flush();
4491     ++encodeCount;
4492     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
4493         pool->freeAll();
4494         stream->clearPool();
4495     }
4496     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
4497 }
4498 
vkCreateImage(VkDevice device,const VkImageCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkImage * pImage,uint32_t doLock)4499 VkResult VkEncoder::vkCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo,
4500                                   const VkAllocationCallbacks* pAllocator, VkImage* pImage,
4501                                   uint32_t doLock) {
4502     (void)doLock;
4503     bool queueSubmitWithCommandsEnabled =
4504         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
4505     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
4506     auto stream = mImpl->stream();
4507     auto pool = mImpl->pool();
4508     VkDevice local_device;
4509     VkImageCreateInfo* local_pCreateInfo;
4510     VkAllocationCallbacks* local_pAllocator;
4511     local_device = device;
4512     local_pCreateInfo = nullptr;
4513     if (pCreateInfo) {
4514         local_pCreateInfo = (VkImageCreateInfo*)pool->alloc(sizeof(const VkImageCreateInfo));
4515         deepcopy_VkImageCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
4516                                    (VkImageCreateInfo*)(local_pCreateInfo));
4517     }
4518     local_pAllocator = nullptr;
4519     if (pAllocator) {
4520         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
4521         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
4522                                        (VkAllocationCallbacks*)(local_pAllocator));
4523     }
4524     sResourceTracker->unwrap_vkCreateImage_pCreateInfo(pCreateInfo, local_pCreateInfo);
4525     local_pAllocator = nullptr;
4526     if (local_pCreateInfo) {
4527         sResourceTracker->transformImpl_VkImageCreateInfo_tohost(local_pCreateInfo, 1);
4528         transform_tohost_VkImageCreateInfo(sResourceTracker,
4529                                            (VkImageCreateInfo*)(local_pCreateInfo));
4530     }
4531     if (local_pAllocator) {
4532         transform_tohost_VkAllocationCallbacks(sResourceTracker,
4533                                                (VkAllocationCallbacks*)(local_pAllocator));
4534     }
4535     size_t count = 0;
4536     size_t* countPtr = &count;
4537     {
4538         uint64_t cgen_var_0;
4539         *countPtr += 1 * 8;
4540         count_VkImageCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4541                                 (VkImageCreateInfo*)(local_pCreateInfo), countPtr);
4542         // WARNING PTR CHECK
4543         *countPtr += 8;
4544         if (local_pAllocator) {
4545             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4546                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
4547         }
4548         uint64_t cgen_var_1;
4549         *countPtr += 8;
4550     }
4551     uint32_t packetSize_vkCreateImage = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
4552     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateImage);
4553     uint8_t* packetBeginPtr = streamPtr;
4554     uint8_t** streamPtrPtr = &streamPtr;
4555     uint32_t opcode_vkCreateImage = OP_vkCreateImage;
4556     uint32_t seqno;
4557     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
4558     memcpy(streamPtr, &opcode_vkCreateImage, sizeof(uint32_t));
4559     streamPtr += sizeof(uint32_t);
4560     memcpy(streamPtr, &packetSize_vkCreateImage, sizeof(uint32_t));
4561     streamPtr += sizeof(uint32_t);
4562     if (queueSubmitWithCommandsEnabled) {
4563         memcpy(streamPtr, &seqno, sizeof(uint32_t));
4564         streamPtr += sizeof(uint32_t);
4565     }
4566     uint64_t cgen_var_0;
4567     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
4568     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
4569     *streamPtrPtr += 1 * 8;
4570     reservedmarshal_VkImageCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4571                                       (VkImageCreateInfo*)(local_pCreateInfo), streamPtrPtr);
4572     // WARNING PTR CHECK
4573     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
4574     memcpy((*streamPtrPtr), &cgen_var_1, 8);
4575     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
4576     *streamPtrPtr += 8;
4577     if (local_pAllocator) {
4578         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4579                                               (VkAllocationCallbacks*)(local_pAllocator),
4580                                               streamPtrPtr);
4581     }
4582     /* is handle, possibly out */;
4583     uint64_t cgen_var_2;
4584     *&cgen_var_2 = (uint64_t)((*pImage));
4585     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
4586     *streamPtrPtr += 8;
4587     /* is handle, possibly out */;
4588     stream->setHandleMapping(sResourceTracker->createMapping());
4589     uint64_t cgen_var_3;
4590     stream->read((uint64_t*)&cgen_var_3, 8);
4591     stream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_3, (VkImage*)pImage, 1);
4592     stream->unsetHandleMapping();
4593     VkResult vkCreateImage_VkResult_return = (VkResult)0;
4594     stream->read(&vkCreateImage_VkResult_return, sizeof(VkResult));
4595     ++encodeCount;
4596     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
4597         pool->freeAll();
4598         stream->clearPool();
4599     }
4600     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
4601     return vkCreateImage_VkResult_return;
4602 }
4603 
vkDestroyImage(VkDevice device,VkImage image,const VkAllocationCallbacks * pAllocator,uint32_t doLock)4604 void VkEncoder::vkDestroyImage(VkDevice device, VkImage image,
4605                                const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
4606     (void)doLock;
4607     bool queueSubmitWithCommandsEnabled =
4608         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
4609     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
4610     auto stream = mImpl->stream();
4611     auto pool = mImpl->pool();
4612     VkDevice local_device;
4613     VkImage local_image;
4614     VkAllocationCallbacks* local_pAllocator;
4615     local_device = device;
4616     local_image = image;
4617     local_pAllocator = nullptr;
4618     if (pAllocator) {
4619         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
4620         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
4621                                        (VkAllocationCallbacks*)(local_pAllocator));
4622     }
4623     local_pAllocator = nullptr;
4624     if (local_pAllocator) {
4625         transform_tohost_VkAllocationCallbacks(sResourceTracker,
4626                                                (VkAllocationCallbacks*)(local_pAllocator));
4627     }
4628     size_t count = 0;
4629     size_t* countPtr = &count;
4630     {
4631         uint64_t cgen_var_0;
4632         *countPtr += 1 * 8;
4633         uint64_t cgen_var_1;
4634         *countPtr += 1 * 8;
4635         // WARNING PTR CHECK
4636         *countPtr += 8;
4637         if (local_pAllocator) {
4638             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4639                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
4640         }
4641     }
4642     uint32_t packetSize_vkDestroyImage = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
4643     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyImage);
4644     uint8_t* packetBeginPtr = streamPtr;
4645     uint8_t** streamPtrPtr = &streamPtr;
4646     uint32_t opcode_vkDestroyImage = OP_vkDestroyImage;
4647     uint32_t seqno;
4648     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
4649     memcpy(streamPtr, &opcode_vkDestroyImage, sizeof(uint32_t));
4650     streamPtr += sizeof(uint32_t);
4651     memcpy(streamPtr, &packetSize_vkDestroyImage, sizeof(uint32_t));
4652     streamPtr += sizeof(uint32_t);
4653     if (queueSubmitWithCommandsEnabled) {
4654         memcpy(streamPtr, &seqno, sizeof(uint32_t));
4655         streamPtr += sizeof(uint32_t);
4656     }
4657     uint64_t cgen_var_0;
4658     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
4659     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
4660     *streamPtrPtr += 1 * 8;
4661     uint64_t cgen_var_1;
4662     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
4663     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
4664     *streamPtrPtr += 1 * 8;
4665     // WARNING PTR CHECK
4666     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
4667     memcpy((*streamPtrPtr), &cgen_var_2, 8);
4668     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
4669     *streamPtrPtr += 8;
4670     if (local_pAllocator) {
4671         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4672                                               (VkAllocationCallbacks*)(local_pAllocator),
4673                                               streamPtrPtr);
4674     }
4675     sResourceTracker->destroyMapping()->mapHandles_VkImage((VkImage*)&image);
4676     stream->flush();
4677     ++encodeCount;
4678     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
4679         pool->freeAll();
4680         stream->clearPool();
4681     }
4682     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
4683 }
4684 
vkGetImageSubresourceLayout(VkDevice device,VkImage image,const VkImageSubresource * pSubresource,VkSubresourceLayout * pLayout,uint32_t doLock)4685 void VkEncoder::vkGetImageSubresourceLayout(VkDevice device, VkImage image,
4686                                             const VkImageSubresource* pSubresource,
4687                                             VkSubresourceLayout* pLayout, uint32_t doLock) {
4688     (void)doLock;
4689     bool queueSubmitWithCommandsEnabled =
4690         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
4691     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
4692     auto stream = mImpl->stream();
4693     auto pool = mImpl->pool();
4694     VkDevice local_device;
4695     VkImage local_image;
4696     VkImageSubresource* local_pSubresource;
4697     local_device = device;
4698     local_image = image;
4699     local_pSubresource = nullptr;
4700     if (pSubresource) {
4701         local_pSubresource = (VkImageSubresource*)pool->alloc(sizeof(const VkImageSubresource));
4702         deepcopy_VkImageSubresource(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubresource,
4703                                     (VkImageSubresource*)(local_pSubresource));
4704     }
4705     if (local_pSubresource) {
4706         transform_tohost_VkImageSubresource(sResourceTracker,
4707                                             (VkImageSubresource*)(local_pSubresource));
4708     }
4709     size_t count = 0;
4710     size_t* countPtr = &count;
4711     {
4712         uint64_t cgen_var_0;
4713         *countPtr += 1 * 8;
4714         uint64_t cgen_var_1;
4715         *countPtr += 1 * 8;
4716         count_VkImageSubresource(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4717                                  (VkImageSubresource*)(local_pSubresource), countPtr);
4718         count_VkSubresourceLayout(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4719                                   (VkSubresourceLayout*)(pLayout), countPtr);
4720     }
4721     uint32_t packetSize_vkGetImageSubresourceLayout =
4722         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
4723     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageSubresourceLayout);
4724     uint8_t* packetBeginPtr = streamPtr;
4725     uint8_t** streamPtrPtr = &streamPtr;
4726     uint32_t opcode_vkGetImageSubresourceLayout = OP_vkGetImageSubresourceLayout;
4727     uint32_t seqno;
4728     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
4729     memcpy(streamPtr, &opcode_vkGetImageSubresourceLayout, sizeof(uint32_t));
4730     streamPtr += sizeof(uint32_t);
4731     memcpy(streamPtr, &packetSize_vkGetImageSubresourceLayout, sizeof(uint32_t));
4732     streamPtr += sizeof(uint32_t);
4733     if (queueSubmitWithCommandsEnabled) {
4734         memcpy(streamPtr, &seqno, sizeof(uint32_t));
4735         streamPtr += sizeof(uint32_t);
4736     }
4737     uint64_t cgen_var_0;
4738     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
4739     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
4740     *streamPtrPtr += 1 * 8;
4741     uint64_t cgen_var_1;
4742     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
4743     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
4744     *streamPtrPtr += 1 * 8;
4745     reservedmarshal_VkImageSubresource(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4746                                        (VkImageSubresource*)(local_pSubresource), streamPtrPtr);
4747     reservedmarshal_VkSubresourceLayout(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4748                                         (VkSubresourceLayout*)(pLayout), streamPtrPtr);
4749     unmarshal_VkSubresourceLayout(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4750                                   (VkSubresourceLayout*)(pLayout));
4751     if (pLayout) {
4752         transform_fromhost_VkSubresourceLayout(sResourceTracker, (VkSubresourceLayout*)(pLayout));
4753     }
4754     ++encodeCount;
4755     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
4756         pool->freeAll();
4757         stream->clearPool();
4758     }
4759     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
4760 }
4761 
vkCreateImageView(VkDevice device,const VkImageViewCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkImageView * pView,uint32_t doLock)4762 VkResult VkEncoder::vkCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo,
4763                                       const VkAllocationCallbacks* pAllocator, VkImageView* pView,
4764                                       uint32_t doLock) {
4765     (void)doLock;
4766     bool queueSubmitWithCommandsEnabled =
4767         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
4768     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
4769     auto stream = mImpl->stream();
4770     auto pool = mImpl->pool();
4771     VkDevice local_device;
4772     VkImageViewCreateInfo* local_pCreateInfo;
4773     VkAllocationCallbacks* local_pAllocator;
4774     local_device = device;
4775     local_pCreateInfo = nullptr;
4776     if (pCreateInfo) {
4777         local_pCreateInfo =
4778             (VkImageViewCreateInfo*)pool->alloc(sizeof(const VkImageViewCreateInfo));
4779         deepcopy_VkImageViewCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
4780                                        (VkImageViewCreateInfo*)(local_pCreateInfo));
4781     }
4782     local_pAllocator = nullptr;
4783     if (pAllocator) {
4784         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
4785         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
4786                                        (VkAllocationCallbacks*)(local_pAllocator));
4787     }
4788     local_pAllocator = nullptr;
4789     if (local_pCreateInfo) {
4790         transform_tohost_VkImageViewCreateInfo(sResourceTracker,
4791                                                (VkImageViewCreateInfo*)(local_pCreateInfo));
4792     }
4793     if (local_pAllocator) {
4794         transform_tohost_VkAllocationCallbacks(sResourceTracker,
4795                                                (VkAllocationCallbacks*)(local_pAllocator));
4796     }
4797     size_t count = 0;
4798     size_t* countPtr = &count;
4799     {
4800         uint64_t cgen_var_0;
4801         *countPtr += 1 * 8;
4802         count_VkImageViewCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4803                                     (VkImageViewCreateInfo*)(local_pCreateInfo), countPtr);
4804         // WARNING PTR CHECK
4805         *countPtr += 8;
4806         if (local_pAllocator) {
4807             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4808                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
4809         }
4810         uint64_t cgen_var_1;
4811         *countPtr += 8;
4812     }
4813     uint32_t packetSize_vkCreateImageView =
4814         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
4815     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateImageView);
4816     uint8_t* packetBeginPtr = streamPtr;
4817     uint8_t** streamPtrPtr = &streamPtr;
4818     uint32_t opcode_vkCreateImageView = OP_vkCreateImageView;
4819     uint32_t seqno;
4820     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
4821     memcpy(streamPtr, &opcode_vkCreateImageView, sizeof(uint32_t));
4822     streamPtr += sizeof(uint32_t);
4823     memcpy(streamPtr, &packetSize_vkCreateImageView, sizeof(uint32_t));
4824     streamPtr += sizeof(uint32_t);
4825     if (queueSubmitWithCommandsEnabled) {
4826         memcpy(streamPtr, &seqno, sizeof(uint32_t));
4827         streamPtr += sizeof(uint32_t);
4828     }
4829     uint64_t cgen_var_0;
4830     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
4831     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
4832     *streamPtrPtr += 1 * 8;
4833     reservedmarshal_VkImageViewCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4834                                           (VkImageViewCreateInfo*)(local_pCreateInfo),
4835                                           streamPtrPtr);
4836     // WARNING PTR CHECK
4837     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
4838     memcpy((*streamPtrPtr), &cgen_var_1, 8);
4839     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
4840     *streamPtrPtr += 8;
4841     if (local_pAllocator) {
4842         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4843                                               (VkAllocationCallbacks*)(local_pAllocator),
4844                                               streamPtrPtr);
4845     }
4846     /* is handle, possibly out */;
4847     uint64_t cgen_var_2;
4848     *&cgen_var_2 = (uint64_t)((*pView));
4849     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
4850     *streamPtrPtr += 8;
4851     /* is handle, possibly out */;
4852     stream->setHandleMapping(sResourceTracker->createMapping());
4853     uint64_t cgen_var_3;
4854     stream->read((uint64_t*)&cgen_var_3, 8);
4855     stream->handleMapping()->mapHandles_u64_VkImageView(&cgen_var_3, (VkImageView*)pView, 1);
4856     stream->unsetHandleMapping();
4857     VkResult vkCreateImageView_VkResult_return = (VkResult)0;
4858     stream->read(&vkCreateImageView_VkResult_return, sizeof(VkResult));
4859     ++encodeCount;
4860     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
4861         pool->freeAll();
4862         stream->clearPool();
4863     }
4864     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
4865     return vkCreateImageView_VkResult_return;
4866 }
4867 
vkDestroyImageView(VkDevice device,VkImageView imageView,const VkAllocationCallbacks * pAllocator,uint32_t doLock)4868 void VkEncoder::vkDestroyImageView(VkDevice device, VkImageView imageView,
4869                                    const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
4870     (void)doLock;
4871     bool queueSubmitWithCommandsEnabled =
4872         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
4873     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
4874     auto stream = mImpl->stream();
4875     auto pool = mImpl->pool();
4876     VkDevice local_device;
4877     VkImageView local_imageView;
4878     VkAllocationCallbacks* local_pAllocator;
4879     local_device = device;
4880     local_imageView = imageView;
4881     local_pAllocator = nullptr;
4882     if (pAllocator) {
4883         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
4884         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
4885                                        (VkAllocationCallbacks*)(local_pAllocator));
4886     }
4887     local_pAllocator = nullptr;
4888     if (local_pAllocator) {
4889         transform_tohost_VkAllocationCallbacks(sResourceTracker,
4890                                                (VkAllocationCallbacks*)(local_pAllocator));
4891     }
4892     size_t count = 0;
4893     size_t* countPtr = &count;
4894     {
4895         uint64_t cgen_var_0;
4896         *countPtr += 1 * 8;
4897         uint64_t cgen_var_1;
4898         *countPtr += 1 * 8;
4899         // WARNING PTR CHECK
4900         *countPtr += 8;
4901         if (local_pAllocator) {
4902             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4903                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
4904         }
4905     }
4906     uint32_t packetSize_vkDestroyImageView =
4907         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
4908     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyImageView);
4909     uint8_t* packetBeginPtr = streamPtr;
4910     uint8_t** streamPtrPtr = &streamPtr;
4911     uint32_t opcode_vkDestroyImageView = OP_vkDestroyImageView;
4912     uint32_t seqno;
4913     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
4914     memcpy(streamPtr, &opcode_vkDestroyImageView, sizeof(uint32_t));
4915     streamPtr += sizeof(uint32_t);
4916     memcpy(streamPtr, &packetSize_vkDestroyImageView, sizeof(uint32_t));
4917     streamPtr += sizeof(uint32_t);
4918     if (queueSubmitWithCommandsEnabled) {
4919         memcpy(streamPtr, &seqno, sizeof(uint32_t));
4920         streamPtr += sizeof(uint32_t);
4921     }
4922     uint64_t cgen_var_0;
4923     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
4924     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
4925     *streamPtrPtr += 1 * 8;
4926     uint64_t cgen_var_1;
4927     *&cgen_var_1 = get_host_u64_VkImageView((*&local_imageView));
4928     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
4929     *streamPtrPtr += 1 * 8;
4930     // WARNING PTR CHECK
4931     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
4932     memcpy((*streamPtrPtr), &cgen_var_2, 8);
4933     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
4934     *streamPtrPtr += 8;
4935     if (local_pAllocator) {
4936         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
4937                                               (VkAllocationCallbacks*)(local_pAllocator),
4938                                               streamPtrPtr);
4939     }
4940     sResourceTracker->destroyMapping()->mapHandles_VkImageView((VkImageView*)&imageView);
4941     stream->flush();
4942     ++encodeCount;
4943     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
4944         pool->freeAll();
4945         stream->clearPool();
4946     }
4947     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
4948 }
4949 
vkCreateShaderModule(VkDevice device,const VkShaderModuleCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkShaderModule * pShaderModule,uint32_t doLock)4950 VkResult VkEncoder::vkCreateShaderModule(VkDevice device,
4951                                          const VkShaderModuleCreateInfo* pCreateInfo,
4952                                          const VkAllocationCallbacks* pAllocator,
4953                                          VkShaderModule* pShaderModule, uint32_t doLock) {
4954     (void)doLock;
4955     bool queueSubmitWithCommandsEnabled =
4956         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
4957     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
4958     auto stream = mImpl->stream();
4959     auto pool = mImpl->pool();
4960     VkDevice local_device;
4961     VkShaderModuleCreateInfo* local_pCreateInfo;
4962     VkAllocationCallbacks* local_pAllocator;
4963     local_device = device;
4964     local_pCreateInfo = nullptr;
4965     if (pCreateInfo) {
4966         local_pCreateInfo =
4967             (VkShaderModuleCreateInfo*)pool->alloc(sizeof(const VkShaderModuleCreateInfo));
4968         deepcopy_VkShaderModuleCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
4969                                           (VkShaderModuleCreateInfo*)(local_pCreateInfo));
4970     }
4971     local_pAllocator = nullptr;
4972     if (pAllocator) {
4973         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
4974         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
4975                                        (VkAllocationCallbacks*)(local_pAllocator));
4976     }
4977     local_pAllocator = nullptr;
4978     if (local_pCreateInfo) {
4979         transform_tohost_VkShaderModuleCreateInfo(sResourceTracker,
4980                                                   (VkShaderModuleCreateInfo*)(local_pCreateInfo));
4981     }
4982     if (local_pAllocator) {
4983         transform_tohost_VkAllocationCallbacks(sResourceTracker,
4984                                                (VkAllocationCallbacks*)(local_pAllocator));
4985     }
4986     size_t count = 0;
4987     size_t* countPtr = &count;
4988     {
4989         uint64_t cgen_var_0;
4990         *countPtr += 1 * 8;
4991         count_VkShaderModuleCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4992                                        (VkShaderModuleCreateInfo*)(local_pCreateInfo), countPtr);
4993         // WARNING PTR CHECK
4994         *countPtr += 8;
4995         if (local_pAllocator) {
4996             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
4997                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
4998         }
4999         uint64_t cgen_var_1;
5000         *countPtr += 8;
5001     }
5002     uint32_t packetSize_vkCreateShaderModule =
5003         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
5004     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateShaderModule);
5005     uint8_t* packetBeginPtr = streamPtr;
5006     uint8_t** streamPtrPtr = &streamPtr;
5007     uint32_t opcode_vkCreateShaderModule = OP_vkCreateShaderModule;
5008     uint32_t seqno;
5009     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
5010     memcpy(streamPtr, &opcode_vkCreateShaderModule, sizeof(uint32_t));
5011     streamPtr += sizeof(uint32_t);
5012     memcpy(streamPtr, &packetSize_vkCreateShaderModule, sizeof(uint32_t));
5013     streamPtr += sizeof(uint32_t);
5014     if (queueSubmitWithCommandsEnabled) {
5015         memcpy(streamPtr, &seqno, sizeof(uint32_t));
5016         streamPtr += sizeof(uint32_t);
5017     }
5018     uint64_t cgen_var_0;
5019     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
5020     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
5021     *streamPtrPtr += 1 * 8;
5022     reservedmarshal_VkShaderModuleCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5023                                              (VkShaderModuleCreateInfo*)(local_pCreateInfo),
5024                                              streamPtrPtr);
5025     // WARNING PTR CHECK
5026     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
5027     memcpy((*streamPtrPtr), &cgen_var_1, 8);
5028     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
5029     *streamPtrPtr += 8;
5030     if (local_pAllocator) {
5031         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5032                                               (VkAllocationCallbacks*)(local_pAllocator),
5033                                               streamPtrPtr);
5034     }
5035     /* is handle, possibly out */;
5036     uint64_t cgen_var_2;
5037     *&cgen_var_2 = (uint64_t)((*pShaderModule));
5038     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
5039     *streamPtrPtr += 8;
5040     /* is handle, possibly out */;
5041     stream->setHandleMapping(sResourceTracker->createMapping());
5042     uint64_t cgen_var_3;
5043     stream->read((uint64_t*)&cgen_var_3, 8);
5044     stream->handleMapping()->mapHandles_u64_VkShaderModule(&cgen_var_3,
5045                                                            (VkShaderModule*)pShaderModule, 1);
5046     stream->unsetHandleMapping();
5047     VkResult vkCreateShaderModule_VkResult_return = (VkResult)0;
5048     stream->read(&vkCreateShaderModule_VkResult_return, sizeof(VkResult));
5049     ++encodeCount;
5050     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
5051         pool->freeAll();
5052         stream->clearPool();
5053     }
5054     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
5055     return vkCreateShaderModule_VkResult_return;
5056 }
5057 
vkDestroyShaderModule(VkDevice device,VkShaderModule shaderModule,const VkAllocationCallbacks * pAllocator,uint32_t doLock)5058 void VkEncoder::vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule,
5059                                       const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
5060     (void)doLock;
5061     bool queueSubmitWithCommandsEnabled =
5062         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
5063     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
5064     auto stream = mImpl->stream();
5065     auto pool = mImpl->pool();
5066     VkDevice local_device;
5067     VkShaderModule local_shaderModule;
5068     VkAllocationCallbacks* local_pAllocator;
5069     local_device = device;
5070     local_shaderModule = shaderModule;
5071     local_pAllocator = nullptr;
5072     if (pAllocator) {
5073         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
5074         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
5075                                        (VkAllocationCallbacks*)(local_pAllocator));
5076     }
5077     local_pAllocator = nullptr;
5078     if (local_pAllocator) {
5079         transform_tohost_VkAllocationCallbacks(sResourceTracker,
5080                                                (VkAllocationCallbacks*)(local_pAllocator));
5081     }
5082     size_t count = 0;
5083     size_t* countPtr = &count;
5084     {
5085         uint64_t cgen_var_0;
5086         *countPtr += 1 * 8;
5087         uint64_t cgen_var_1;
5088         *countPtr += 1 * 8;
5089         // WARNING PTR CHECK
5090         *countPtr += 8;
5091         if (local_pAllocator) {
5092             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
5093                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
5094         }
5095     }
5096     uint32_t packetSize_vkDestroyShaderModule =
5097         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
5098     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyShaderModule);
5099     uint8_t* packetBeginPtr = streamPtr;
5100     uint8_t** streamPtrPtr = &streamPtr;
5101     uint32_t opcode_vkDestroyShaderModule = OP_vkDestroyShaderModule;
5102     uint32_t seqno;
5103     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
5104     memcpy(streamPtr, &opcode_vkDestroyShaderModule, sizeof(uint32_t));
5105     streamPtr += sizeof(uint32_t);
5106     memcpy(streamPtr, &packetSize_vkDestroyShaderModule, sizeof(uint32_t));
5107     streamPtr += sizeof(uint32_t);
5108     if (queueSubmitWithCommandsEnabled) {
5109         memcpy(streamPtr, &seqno, sizeof(uint32_t));
5110         streamPtr += sizeof(uint32_t);
5111     }
5112     uint64_t cgen_var_0;
5113     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
5114     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
5115     *streamPtrPtr += 1 * 8;
5116     uint64_t cgen_var_1;
5117     *&cgen_var_1 = get_host_u64_VkShaderModule((*&local_shaderModule));
5118     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
5119     *streamPtrPtr += 1 * 8;
5120     // WARNING PTR CHECK
5121     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
5122     memcpy((*streamPtrPtr), &cgen_var_2, 8);
5123     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
5124     *streamPtrPtr += 8;
5125     if (local_pAllocator) {
5126         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5127                                               (VkAllocationCallbacks*)(local_pAllocator),
5128                                               streamPtrPtr);
5129     }
5130     sResourceTracker->destroyMapping()->mapHandles_VkShaderModule((VkShaderModule*)&shaderModule);
5131     stream->flush();
5132     ++encodeCount;
5133     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
5134         pool->freeAll();
5135         stream->clearPool();
5136     }
5137     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
5138 }
5139 
vkCreatePipelineCache(VkDevice device,const VkPipelineCacheCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkPipelineCache * pPipelineCache,uint32_t doLock)5140 VkResult VkEncoder::vkCreatePipelineCache(VkDevice device,
5141                                           const VkPipelineCacheCreateInfo* pCreateInfo,
5142                                           const VkAllocationCallbacks* pAllocator,
5143                                           VkPipelineCache* pPipelineCache, uint32_t doLock) {
5144     (void)doLock;
5145     bool queueSubmitWithCommandsEnabled =
5146         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
5147     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
5148     auto stream = mImpl->stream();
5149     auto pool = mImpl->pool();
5150     VkDevice local_device;
5151     VkPipelineCacheCreateInfo* local_pCreateInfo;
5152     VkAllocationCallbacks* local_pAllocator;
5153     local_device = device;
5154     local_pCreateInfo = nullptr;
5155     if (pCreateInfo) {
5156         local_pCreateInfo =
5157             (VkPipelineCacheCreateInfo*)pool->alloc(sizeof(const VkPipelineCacheCreateInfo));
5158         deepcopy_VkPipelineCacheCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
5159                                            (VkPipelineCacheCreateInfo*)(local_pCreateInfo));
5160     }
5161     local_pAllocator = nullptr;
5162     if (pAllocator) {
5163         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
5164         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
5165                                        (VkAllocationCallbacks*)(local_pAllocator));
5166     }
5167     local_pAllocator = nullptr;
5168     if (local_pCreateInfo) {
5169         transform_tohost_VkPipelineCacheCreateInfo(sResourceTracker,
5170                                                    (VkPipelineCacheCreateInfo*)(local_pCreateInfo));
5171     }
5172     if (local_pAllocator) {
5173         transform_tohost_VkAllocationCallbacks(sResourceTracker,
5174                                                (VkAllocationCallbacks*)(local_pAllocator));
5175     }
5176     size_t count = 0;
5177     size_t* countPtr = &count;
5178     {
5179         uint64_t cgen_var_0;
5180         *countPtr += 1 * 8;
5181         count_VkPipelineCacheCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
5182                                         (VkPipelineCacheCreateInfo*)(local_pCreateInfo), countPtr);
5183         // WARNING PTR CHECK
5184         *countPtr += 8;
5185         if (local_pAllocator) {
5186             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
5187                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
5188         }
5189         uint64_t cgen_var_1;
5190         *countPtr += 8;
5191     }
5192     uint32_t packetSize_vkCreatePipelineCache =
5193         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
5194     uint8_t* streamPtr = stream->reserve(packetSize_vkCreatePipelineCache);
5195     uint8_t* packetBeginPtr = streamPtr;
5196     uint8_t** streamPtrPtr = &streamPtr;
5197     uint32_t opcode_vkCreatePipelineCache = OP_vkCreatePipelineCache;
5198     uint32_t seqno;
5199     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
5200     memcpy(streamPtr, &opcode_vkCreatePipelineCache, sizeof(uint32_t));
5201     streamPtr += sizeof(uint32_t);
5202     memcpy(streamPtr, &packetSize_vkCreatePipelineCache, sizeof(uint32_t));
5203     streamPtr += sizeof(uint32_t);
5204     if (queueSubmitWithCommandsEnabled) {
5205         memcpy(streamPtr, &seqno, sizeof(uint32_t));
5206         streamPtr += sizeof(uint32_t);
5207     }
5208     uint64_t cgen_var_0;
5209     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
5210     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
5211     *streamPtrPtr += 1 * 8;
5212     reservedmarshal_VkPipelineCacheCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5213                                               (VkPipelineCacheCreateInfo*)(local_pCreateInfo),
5214                                               streamPtrPtr);
5215     // WARNING PTR CHECK
5216     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
5217     memcpy((*streamPtrPtr), &cgen_var_1, 8);
5218     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
5219     *streamPtrPtr += 8;
5220     if (local_pAllocator) {
5221         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5222                                               (VkAllocationCallbacks*)(local_pAllocator),
5223                                               streamPtrPtr);
5224     }
5225     /* is handle, possibly out */;
5226     uint64_t cgen_var_2;
5227     *&cgen_var_2 = (uint64_t)((*pPipelineCache));
5228     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
5229     *streamPtrPtr += 8;
5230     /* is handle, possibly out */;
5231     stream->setHandleMapping(sResourceTracker->createMapping());
5232     uint64_t cgen_var_3;
5233     stream->read((uint64_t*)&cgen_var_3, 8);
5234     stream->handleMapping()->mapHandles_u64_VkPipelineCache(&cgen_var_3,
5235                                                             (VkPipelineCache*)pPipelineCache, 1);
5236     stream->unsetHandleMapping();
5237     VkResult vkCreatePipelineCache_VkResult_return = (VkResult)0;
5238     stream->read(&vkCreatePipelineCache_VkResult_return, sizeof(VkResult));
5239     ++encodeCount;
5240     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
5241         pool->freeAll();
5242         stream->clearPool();
5243     }
5244     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
5245     return vkCreatePipelineCache_VkResult_return;
5246 }
5247 
vkDestroyPipelineCache(VkDevice device,VkPipelineCache pipelineCache,const VkAllocationCallbacks * pAllocator,uint32_t doLock)5248 void VkEncoder::vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache,
5249                                        const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
5250     (void)doLock;
5251     bool queueSubmitWithCommandsEnabled =
5252         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
5253     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
5254     auto stream = mImpl->stream();
5255     auto pool = mImpl->pool();
5256     VkDevice local_device;
5257     VkPipelineCache local_pipelineCache;
5258     VkAllocationCallbacks* local_pAllocator;
5259     local_device = device;
5260     local_pipelineCache = pipelineCache;
5261     local_pAllocator = nullptr;
5262     if (pAllocator) {
5263         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
5264         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
5265                                        (VkAllocationCallbacks*)(local_pAllocator));
5266     }
5267     local_pAllocator = nullptr;
5268     if (local_pAllocator) {
5269         transform_tohost_VkAllocationCallbacks(sResourceTracker,
5270                                                (VkAllocationCallbacks*)(local_pAllocator));
5271     }
5272     size_t count = 0;
5273     size_t* countPtr = &count;
5274     {
5275         uint64_t cgen_var_0;
5276         *countPtr += 1 * 8;
5277         uint64_t cgen_var_1;
5278         *countPtr += 1 * 8;
5279         // WARNING PTR CHECK
5280         *countPtr += 8;
5281         if (local_pAllocator) {
5282             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
5283                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
5284         }
5285     }
5286     uint32_t packetSize_vkDestroyPipelineCache =
5287         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
5288     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyPipelineCache);
5289     uint8_t* packetBeginPtr = streamPtr;
5290     uint8_t** streamPtrPtr = &streamPtr;
5291     uint32_t opcode_vkDestroyPipelineCache = OP_vkDestroyPipelineCache;
5292     uint32_t seqno;
5293     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
5294     memcpy(streamPtr, &opcode_vkDestroyPipelineCache, sizeof(uint32_t));
5295     streamPtr += sizeof(uint32_t);
5296     memcpy(streamPtr, &packetSize_vkDestroyPipelineCache, sizeof(uint32_t));
5297     streamPtr += sizeof(uint32_t);
5298     if (queueSubmitWithCommandsEnabled) {
5299         memcpy(streamPtr, &seqno, sizeof(uint32_t));
5300         streamPtr += sizeof(uint32_t);
5301     }
5302     uint64_t cgen_var_0;
5303     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
5304     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
5305     *streamPtrPtr += 1 * 8;
5306     uint64_t cgen_var_1;
5307     *&cgen_var_1 = get_host_u64_VkPipelineCache((*&local_pipelineCache));
5308     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
5309     *streamPtrPtr += 1 * 8;
5310     // WARNING PTR CHECK
5311     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
5312     memcpy((*streamPtrPtr), &cgen_var_2, 8);
5313     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
5314     *streamPtrPtr += 8;
5315     if (local_pAllocator) {
5316         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5317                                               (VkAllocationCallbacks*)(local_pAllocator),
5318                                               streamPtrPtr);
5319     }
5320     sResourceTracker->destroyMapping()->mapHandles_VkPipelineCache(
5321         (VkPipelineCache*)&pipelineCache);
5322     stream->flush();
5323     ++encodeCount;
5324     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
5325         pool->freeAll();
5326         stream->clearPool();
5327     }
5328     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
5329 }
5330 
vkGetPipelineCacheData(VkDevice device,VkPipelineCache pipelineCache,size_t * pDataSize,void * pData,uint32_t doLock)5331 VkResult VkEncoder::vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache,
5332                                            size_t* pDataSize, void* pData, uint32_t doLock) {
5333     (void)doLock;
5334     bool queueSubmitWithCommandsEnabled =
5335         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
5336     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
5337     auto stream = mImpl->stream();
5338     auto pool = mImpl->pool();
5339     VkDevice local_device;
5340     VkPipelineCache local_pipelineCache;
5341     local_device = device;
5342     local_pipelineCache = pipelineCache;
5343     size_t count = 0;
5344     size_t* countPtr = &count;
5345     {
5346         uint64_t cgen_var_0;
5347         *countPtr += 1 * 8;
5348         uint64_t cgen_var_1;
5349         *countPtr += 1 * 8;
5350         // WARNING PTR CHECK
5351         *countPtr += 8;
5352         if (pDataSize) {
5353             *countPtr += 8;
5354         }
5355         // WARNING PTR CHECK
5356         *countPtr += 8;
5357         if (pData) {
5358             if (pDataSize) {
5359                 *countPtr += (*(pDataSize)) * sizeof(uint8_t);
5360             }
5361         }
5362     }
5363     uint32_t packetSize_vkGetPipelineCacheData =
5364         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
5365     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPipelineCacheData);
5366     uint8_t* packetBeginPtr = streamPtr;
5367     uint8_t** streamPtrPtr = &streamPtr;
5368     uint32_t opcode_vkGetPipelineCacheData = OP_vkGetPipelineCacheData;
5369     uint32_t seqno;
5370     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
5371     memcpy(streamPtr, &opcode_vkGetPipelineCacheData, sizeof(uint32_t));
5372     streamPtr += sizeof(uint32_t);
5373     memcpy(streamPtr, &packetSize_vkGetPipelineCacheData, sizeof(uint32_t));
5374     streamPtr += sizeof(uint32_t);
5375     if (queueSubmitWithCommandsEnabled) {
5376         memcpy(streamPtr, &seqno, sizeof(uint32_t));
5377         streamPtr += sizeof(uint32_t);
5378     }
5379     uint64_t cgen_var_0;
5380     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
5381     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
5382     *streamPtrPtr += 1 * 8;
5383     uint64_t cgen_var_1;
5384     *&cgen_var_1 = get_host_u64_VkPipelineCache((*&local_pipelineCache));
5385     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
5386     *streamPtrPtr += 1 * 8;
5387     // WARNING PTR CHECK
5388     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pDataSize;
5389     memcpy((*streamPtrPtr), &cgen_var_2, 8);
5390     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
5391     *streamPtrPtr += 8;
5392     if (pDataSize) {
5393         uint64_t cgen_var_2_0 = (uint64_t)(*pDataSize);
5394         memcpy((*streamPtrPtr), &cgen_var_2_0, 8);
5395         gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
5396         *streamPtrPtr += 8;
5397     }
5398     // WARNING PTR CHECK
5399     uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pData;
5400     memcpy((*streamPtrPtr), &cgen_var_3, 8);
5401     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
5402     *streamPtrPtr += 8;
5403     if (pData) {
5404         memcpy(*streamPtrPtr, (void*)pData, (*(pDataSize)) * sizeof(uint8_t));
5405         *streamPtrPtr += (*(pDataSize)) * sizeof(uint8_t);
5406     }
5407     // WARNING PTR CHECK
5408     size_t* check_pDataSize;
5409     check_pDataSize = (size_t*)(uintptr_t)stream->getBe64();
5410     if (pDataSize) {
5411         if (!(check_pDataSize)) {
5412             fprintf(stderr, "fatal: pDataSize inconsistent between guest and host\n");
5413         }
5414         (*pDataSize) = (size_t)stream->getBe64();
5415     }
5416     // WARNING PTR CHECK
5417     void* check_pData;
5418     check_pData = (void*)(uintptr_t)stream->getBe64();
5419     if (pData) {
5420         if (!(check_pData)) {
5421             fprintf(stderr, "fatal: pData inconsistent between guest and host\n");
5422         }
5423         stream->read((void*)pData, (*(pDataSize)) * sizeof(uint8_t));
5424     }
5425     VkResult vkGetPipelineCacheData_VkResult_return = (VkResult)0;
5426     stream->read(&vkGetPipelineCacheData_VkResult_return, sizeof(VkResult));
5427     ++encodeCount;
5428     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
5429         pool->freeAll();
5430         stream->clearPool();
5431     }
5432     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
5433     return vkGetPipelineCacheData_VkResult_return;
5434 }
5435 
vkMergePipelineCaches(VkDevice device,VkPipelineCache dstCache,uint32_t srcCacheCount,const VkPipelineCache * pSrcCaches,uint32_t doLock)5436 VkResult VkEncoder::vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache,
5437                                           uint32_t srcCacheCount, const VkPipelineCache* pSrcCaches,
5438                                           uint32_t doLock) {
5439     (void)doLock;
5440     bool queueSubmitWithCommandsEnabled =
5441         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
5442     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
5443     auto stream = mImpl->stream();
5444     auto pool = mImpl->pool();
5445     VkDevice local_device;
5446     VkPipelineCache local_dstCache;
5447     uint32_t local_srcCacheCount;
5448     VkPipelineCache* local_pSrcCaches;
5449     local_device = device;
5450     local_dstCache = dstCache;
5451     local_srcCacheCount = srcCacheCount;
5452     // Avoiding deepcopy for pSrcCaches
5453     local_pSrcCaches = (VkPipelineCache*)pSrcCaches;
5454     size_t count = 0;
5455     size_t* countPtr = &count;
5456     {
5457         uint64_t cgen_var_0;
5458         *countPtr += 1 * 8;
5459         uint64_t cgen_var_1;
5460         *countPtr += 1 * 8;
5461         *countPtr += sizeof(uint32_t);
5462         if (((srcCacheCount))) {
5463             *countPtr += ((srcCacheCount)) * 8;
5464         }
5465     }
5466     uint32_t packetSize_vkMergePipelineCaches =
5467         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
5468     uint8_t* streamPtr = stream->reserve(packetSize_vkMergePipelineCaches);
5469     uint8_t* packetBeginPtr = streamPtr;
5470     uint8_t** streamPtrPtr = &streamPtr;
5471     uint32_t opcode_vkMergePipelineCaches = OP_vkMergePipelineCaches;
5472     uint32_t seqno;
5473     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
5474     memcpy(streamPtr, &opcode_vkMergePipelineCaches, sizeof(uint32_t));
5475     streamPtr += sizeof(uint32_t);
5476     memcpy(streamPtr, &packetSize_vkMergePipelineCaches, sizeof(uint32_t));
5477     streamPtr += sizeof(uint32_t);
5478     if (queueSubmitWithCommandsEnabled) {
5479         memcpy(streamPtr, &seqno, sizeof(uint32_t));
5480         streamPtr += sizeof(uint32_t);
5481     }
5482     uint64_t cgen_var_0;
5483     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
5484     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
5485     *streamPtrPtr += 1 * 8;
5486     uint64_t cgen_var_1;
5487     *&cgen_var_1 = get_host_u64_VkPipelineCache((*&local_dstCache));
5488     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
5489     *streamPtrPtr += 1 * 8;
5490     memcpy(*streamPtrPtr, (uint32_t*)&local_srcCacheCount, sizeof(uint32_t));
5491     *streamPtrPtr += sizeof(uint32_t);
5492     if (((srcCacheCount))) {
5493         uint8_t* cgen_var_2_ptr = (uint8_t*)(*streamPtrPtr);
5494         for (uint32_t k = 0; k < ((srcCacheCount)); ++k) {
5495             uint64_t tmpval = get_host_u64_VkPipelineCache(local_pSrcCaches[k]);
5496             memcpy(cgen_var_2_ptr + k * 8, &tmpval, sizeof(uint64_t));
5497         }
5498         *streamPtrPtr += 8 * ((srcCacheCount));
5499     }
5500     VkResult vkMergePipelineCaches_VkResult_return = (VkResult)0;
5501     stream->read(&vkMergePipelineCaches_VkResult_return, sizeof(VkResult));
5502     ++encodeCount;
5503     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
5504         pool->freeAll();
5505         stream->clearPool();
5506     }
5507     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
5508     return vkMergePipelineCaches_VkResult_return;
5509 }
5510 
vkCreateGraphicsPipelines(VkDevice device,VkPipelineCache pipelineCache,uint32_t createInfoCount,const VkGraphicsPipelineCreateInfo * pCreateInfos,const VkAllocationCallbacks * pAllocator,VkPipeline * pPipelines,uint32_t doLock)5511 VkResult VkEncoder::vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache,
5512                                               uint32_t createInfoCount,
5513                                               const VkGraphicsPipelineCreateInfo* pCreateInfos,
5514                                               const VkAllocationCallbacks* pAllocator,
5515                                               VkPipeline* pPipelines, uint32_t doLock) {
5516     (void)doLock;
5517     bool queueSubmitWithCommandsEnabled =
5518         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
5519     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
5520     auto stream = mImpl->stream();
5521     auto pool = mImpl->pool();
5522     VkDevice local_device;
5523     VkPipelineCache local_pipelineCache;
5524     uint32_t local_createInfoCount;
5525     VkGraphicsPipelineCreateInfo* local_pCreateInfos;
5526     VkAllocationCallbacks* local_pAllocator;
5527     local_device = device;
5528     local_pipelineCache = pipelineCache;
5529     local_createInfoCount = createInfoCount;
5530     local_pCreateInfos = nullptr;
5531     if (pCreateInfos) {
5532         local_pCreateInfos = (VkGraphicsPipelineCreateInfo*)pool->alloc(
5533             ((createInfoCount)) * sizeof(const VkGraphicsPipelineCreateInfo));
5534         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
5535             deepcopy_VkGraphicsPipelineCreateInfo(
5536                 pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfos + i,
5537                 (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i));
5538         }
5539     }
5540     local_pAllocator = nullptr;
5541     if (pAllocator) {
5542         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
5543         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
5544                                        (VkAllocationCallbacks*)(local_pAllocator));
5545     }
5546     local_pAllocator = nullptr;
5547     if (local_pCreateInfos) {
5548         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
5549             transform_tohost_VkGraphicsPipelineCreateInfo(
5550                 sResourceTracker, (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i));
5551         }
5552     }
5553     if (local_pAllocator) {
5554         transform_tohost_VkAllocationCallbacks(sResourceTracker,
5555                                                (VkAllocationCallbacks*)(local_pAllocator));
5556     }
5557     size_t count = 0;
5558     size_t* countPtr = &count;
5559     {
5560         uint64_t cgen_var_0;
5561         *countPtr += 1 * 8;
5562         uint64_t cgen_var_1;
5563         *countPtr += 1 * 8;
5564         *countPtr += sizeof(uint32_t);
5565         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
5566             count_VkGraphicsPipelineCreateInfo(
5567                 sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
5568                 (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i), countPtr);
5569         }
5570         // WARNING PTR CHECK
5571         *countPtr += 8;
5572         if (local_pAllocator) {
5573             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
5574                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
5575         }
5576         if (((createInfoCount))) {
5577             *countPtr += ((createInfoCount)) * 8;
5578         }
5579     }
5580     uint32_t packetSize_vkCreateGraphicsPipelines =
5581         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
5582     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateGraphicsPipelines);
5583     uint8_t* packetBeginPtr = streamPtr;
5584     uint8_t** streamPtrPtr = &streamPtr;
5585     uint32_t opcode_vkCreateGraphicsPipelines = OP_vkCreateGraphicsPipelines;
5586     uint32_t seqno;
5587     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
5588     memcpy(streamPtr, &opcode_vkCreateGraphicsPipelines, sizeof(uint32_t));
5589     streamPtr += sizeof(uint32_t);
5590     memcpy(streamPtr, &packetSize_vkCreateGraphicsPipelines, sizeof(uint32_t));
5591     streamPtr += sizeof(uint32_t);
5592     if (queueSubmitWithCommandsEnabled) {
5593         memcpy(streamPtr, &seqno, sizeof(uint32_t));
5594         streamPtr += sizeof(uint32_t);
5595     }
5596     uint64_t cgen_var_0;
5597     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
5598     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
5599     *streamPtrPtr += 1 * 8;
5600     uint64_t cgen_var_1;
5601     *&cgen_var_1 = get_host_u64_VkPipelineCache((*&local_pipelineCache));
5602     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
5603     *streamPtrPtr += 1 * 8;
5604     memcpy(*streamPtrPtr, (uint32_t*)&local_createInfoCount, sizeof(uint32_t));
5605     *streamPtrPtr += sizeof(uint32_t);
5606     for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
5607         reservedmarshal_VkGraphicsPipelineCreateInfo(
5608             stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5609             (VkGraphicsPipelineCreateInfo*)(local_pCreateInfos + i), streamPtrPtr);
5610     }
5611     // WARNING PTR CHECK
5612     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
5613     memcpy((*streamPtrPtr), &cgen_var_2, 8);
5614     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
5615     *streamPtrPtr += 8;
5616     if (local_pAllocator) {
5617         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5618                                               (VkAllocationCallbacks*)(local_pAllocator),
5619                                               streamPtrPtr);
5620     }
5621     /* is handle, possibly out */;
5622     if (((createInfoCount))) {
5623         uint8_t* cgen_var_3_ptr = (uint8_t*)(*streamPtrPtr);
5624         for (uint32_t k = 0; k < ((createInfoCount)); ++k) {
5625             uint64_t tmpval = (uint64_t)(pPipelines[k]);
5626             memcpy(cgen_var_3_ptr + k * 8, &tmpval, sizeof(uint64_t));
5627         }
5628         *streamPtrPtr += 8 * ((createInfoCount));
5629     }
5630     /* is handle, possibly out */;
5631     stream->setHandleMapping(sResourceTracker->createMapping());
5632     if (((createInfoCount))) {
5633         uint64_t* cgen_var_4;
5634         stream->alloc((void**)&cgen_var_4, ((createInfoCount)) * 8);
5635         stream->read((uint64_t*)cgen_var_4, ((createInfoCount)) * 8);
5636         stream->handleMapping()->mapHandles_u64_VkPipeline(cgen_var_4, (VkPipeline*)pPipelines,
5637                                                            ((createInfoCount)));
5638     }
5639     stream->unsetHandleMapping();
5640     VkResult vkCreateGraphicsPipelines_VkResult_return = (VkResult)0;
5641     stream->read(&vkCreateGraphicsPipelines_VkResult_return, sizeof(VkResult));
5642     ++encodeCount;
5643     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
5644         pool->freeAll();
5645         stream->clearPool();
5646     }
5647     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
5648     return vkCreateGraphicsPipelines_VkResult_return;
5649 }
5650 
vkCreateComputePipelines(VkDevice device,VkPipelineCache pipelineCache,uint32_t createInfoCount,const VkComputePipelineCreateInfo * pCreateInfos,const VkAllocationCallbacks * pAllocator,VkPipeline * pPipelines,uint32_t doLock)5651 VkResult VkEncoder::vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache,
5652                                              uint32_t createInfoCount,
5653                                              const VkComputePipelineCreateInfo* pCreateInfos,
5654                                              const VkAllocationCallbacks* pAllocator,
5655                                              VkPipeline* pPipelines, uint32_t doLock) {
5656     (void)doLock;
5657     bool queueSubmitWithCommandsEnabled =
5658         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
5659     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
5660     auto stream = mImpl->stream();
5661     auto pool = mImpl->pool();
5662     VkDevice local_device;
5663     VkPipelineCache local_pipelineCache;
5664     uint32_t local_createInfoCount;
5665     VkComputePipelineCreateInfo* local_pCreateInfos;
5666     VkAllocationCallbacks* local_pAllocator;
5667     local_device = device;
5668     local_pipelineCache = pipelineCache;
5669     local_createInfoCount = createInfoCount;
5670     local_pCreateInfos = nullptr;
5671     if (pCreateInfos) {
5672         local_pCreateInfos = (VkComputePipelineCreateInfo*)pool->alloc(
5673             ((createInfoCount)) * sizeof(const VkComputePipelineCreateInfo));
5674         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
5675             deepcopy_VkComputePipelineCreateInfo(
5676                 pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfos + i,
5677                 (VkComputePipelineCreateInfo*)(local_pCreateInfos + i));
5678         }
5679     }
5680     local_pAllocator = nullptr;
5681     if (pAllocator) {
5682         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
5683         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
5684                                        (VkAllocationCallbacks*)(local_pAllocator));
5685     }
5686     local_pAllocator = nullptr;
5687     if (local_pCreateInfos) {
5688         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
5689             transform_tohost_VkComputePipelineCreateInfo(
5690                 sResourceTracker, (VkComputePipelineCreateInfo*)(local_pCreateInfos + i));
5691         }
5692     }
5693     if (local_pAllocator) {
5694         transform_tohost_VkAllocationCallbacks(sResourceTracker,
5695                                                (VkAllocationCallbacks*)(local_pAllocator));
5696     }
5697     size_t count = 0;
5698     size_t* countPtr = &count;
5699     {
5700         uint64_t cgen_var_0;
5701         *countPtr += 1 * 8;
5702         uint64_t cgen_var_1;
5703         *countPtr += 1 * 8;
5704         *countPtr += sizeof(uint32_t);
5705         for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
5706             count_VkComputePipelineCreateInfo(
5707                 sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
5708                 (VkComputePipelineCreateInfo*)(local_pCreateInfos + i), countPtr);
5709         }
5710         // WARNING PTR CHECK
5711         *countPtr += 8;
5712         if (local_pAllocator) {
5713             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
5714                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
5715         }
5716         if (((createInfoCount))) {
5717             *countPtr += ((createInfoCount)) * 8;
5718         }
5719     }
5720     uint32_t packetSize_vkCreateComputePipelines =
5721         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
5722     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateComputePipelines);
5723     uint8_t* packetBeginPtr = streamPtr;
5724     uint8_t** streamPtrPtr = &streamPtr;
5725     uint32_t opcode_vkCreateComputePipelines = OP_vkCreateComputePipelines;
5726     uint32_t seqno;
5727     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
5728     memcpy(streamPtr, &opcode_vkCreateComputePipelines, sizeof(uint32_t));
5729     streamPtr += sizeof(uint32_t);
5730     memcpy(streamPtr, &packetSize_vkCreateComputePipelines, sizeof(uint32_t));
5731     streamPtr += sizeof(uint32_t);
5732     if (queueSubmitWithCommandsEnabled) {
5733         memcpy(streamPtr, &seqno, sizeof(uint32_t));
5734         streamPtr += sizeof(uint32_t);
5735     }
5736     uint64_t cgen_var_0;
5737     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
5738     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
5739     *streamPtrPtr += 1 * 8;
5740     uint64_t cgen_var_1;
5741     *&cgen_var_1 = get_host_u64_VkPipelineCache((*&local_pipelineCache));
5742     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
5743     *streamPtrPtr += 1 * 8;
5744     memcpy(*streamPtrPtr, (uint32_t*)&local_createInfoCount, sizeof(uint32_t));
5745     *streamPtrPtr += sizeof(uint32_t);
5746     for (uint32_t i = 0; i < (uint32_t)((createInfoCount)); ++i) {
5747         reservedmarshal_VkComputePipelineCreateInfo(
5748             stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5749             (VkComputePipelineCreateInfo*)(local_pCreateInfos + i), streamPtrPtr);
5750     }
5751     // WARNING PTR CHECK
5752     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
5753     memcpy((*streamPtrPtr), &cgen_var_2, 8);
5754     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
5755     *streamPtrPtr += 8;
5756     if (local_pAllocator) {
5757         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5758                                               (VkAllocationCallbacks*)(local_pAllocator),
5759                                               streamPtrPtr);
5760     }
5761     /* is handle, possibly out */;
5762     if (((createInfoCount))) {
5763         uint8_t* cgen_var_3_ptr = (uint8_t*)(*streamPtrPtr);
5764         for (uint32_t k = 0; k < ((createInfoCount)); ++k) {
5765             uint64_t tmpval = (uint64_t)(pPipelines[k]);
5766             memcpy(cgen_var_3_ptr + k * 8, &tmpval, sizeof(uint64_t));
5767         }
5768         *streamPtrPtr += 8 * ((createInfoCount));
5769     }
5770     /* is handle, possibly out */;
5771     stream->setHandleMapping(sResourceTracker->createMapping());
5772     if (((createInfoCount))) {
5773         uint64_t* cgen_var_4;
5774         stream->alloc((void**)&cgen_var_4, ((createInfoCount)) * 8);
5775         stream->read((uint64_t*)cgen_var_4, ((createInfoCount)) * 8);
5776         stream->handleMapping()->mapHandles_u64_VkPipeline(cgen_var_4, (VkPipeline*)pPipelines,
5777                                                            ((createInfoCount)));
5778     }
5779     stream->unsetHandleMapping();
5780     VkResult vkCreateComputePipelines_VkResult_return = (VkResult)0;
5781     stream->read(&vkCreateComputePipelines_VkResult_return, sizeof(VkResult));
5782     ++encodeCount;
5783     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
5784         pool->freeAll();
5785         stream->clearPool();
5786     }
5787     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
5788     return vkCreateComputePipelines_VkResult_return;
5789 }
5790 
vkDestroyPipeline(VkDevice device,VkPipeline pipeline,const VkAllocationCallbacks * pAllocator,uint32_t doLock)5791 void VkEncoder::vkDestroyPipeline(VkDevice device, VkPipeline pipeline,
5792                                   const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
5793     (void)doLock;
5794     bool queueSubmitWithCommandsEnabled =
5795         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
5796     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
5797     auto stream = mImpl->stream();
5798     auto pool = mImpl->pool();
5799     VkDevice local_device;
5800     VkPipeline local_pipeline;
5801     VkAllocationCallbacks* local_pAllocator;
5802     local_device = device;
5803     local_pipeline = pipeline;
5804     local_pAllocator = nullptr;
5805     if (pAllocator) {
5806         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
5807         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
5808                                        (VkAllocationCallbacks*)(local_pAllocator));
5809     }
5810     local_pAllocator = nullptr;
5811     if (local_pAllocator) {
5812         transform_tohost_VkAllocationCallbacks(sResourceTracker,
5813                                                (VkAllocationCallbacks*)(local_pAllocator));
5814     }
5815     size_t count = 0;
5816     size_t* countPtr = &count;
5817     {
5818         uint64_t cgen_var_0;
5819         *countPtr += 1 * 8;
5820         uint64_t cgen_var_1;
5821         *countPtr += 1 * 8;
5822         // WARNING PTR CHECK
5823         *countPtr += 8;
5824         if (local_pAllocator) {
5825             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
5826                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
5827         }
5828     }
5829     uint32_t packetSize_vkDestroyPipeline =
5830         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
5831     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyPipeline);
5832     uint8_t* packetBeginPtr = streamPtr;
5833     uint8_t** streamPtrPtr = &streamPtr;
5834     uint32_t opcode_vkDestroyPipeline = OP_vkDestroyPipeline;
5835     uint32_t seqno;
5836     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
5837     memcpy(streamPtr, &opcode_vkDestroyPipeline, sizeof(uint32_t));
5838     streamPtr += sizeof(uint32_t);
5839     memcpy(streamPtr, &packetSize_vkDestroyPipeline, sizeof(uint32_t));
5840     streamPtr += sizeof(uint32_t);
5841     if (queueSubmitWithCommandsEnabled) {
5842         memcpy(streamPtr, &seqno, sizeof(uint32_t));
5843         streamPtr += sizeof(uint32_t);
5844     }
5845     uint64_t cgen_var_0;
5846     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
5847     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
5848     *streamPtrPtr += 1 * 8;
5849     uint64_t cgen_var_1;
5850     *&cgen_var_1 = get_host_u64_VkPipeline((*&local_pipeline));
5851     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
5852     *streamPtrPtr += 1 * 8;
5853     // WARNING PTR CHECK
5854     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
5855     memcpy((*streamPtrPtr), &cgen_var_2, 8);
5856     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
5857     *streamPtrPtr += 8;
5858     if (local_pAllocator) {
5859         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5860                                               (VkAllocationCallbacks*)(local_pAllocator),
5861                                               streamPtrPtr);
5862     }
5863     sResourceTracker->destroyMapping()->mapHandles_VkPipeline((VkPipeline*)&pipeline);
5864     stream->flush();
5865     ++encodeCount;
5866     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
5867         pool->freeAll();
5868         stream->clearPool();
5869     }
5870     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
5871 }
5872 
vkCreatePipelineLayout(VkDevice device,const VkPipelineLayoutCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkPipelineLayout * pPipelineLayout,uint32_t doLock)5873 VkResult VkEncoder::vkCreatePipelineLayout(VkDevice device,
5874                                            const VkPipelineLayoutCreateInfo* pCreateInfo,
5875                                            const VkAllocationCallbacks* pAllocator,
5876                                            VkPipelineLayout* pPipelineLayout, uint32_t doLock) {
5877     (void)doLock;
5878     bool queueSubmitWithCommandsEnabled =
5879         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
5880     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
5881     auto stream = mImpl->stream();
5882     auto pool = mImpl->pool();
5883     VkDevice local_device;
5884     VkPipelineLayoutCreateInfo* local_pCreateInfo;
5885     VkAllocationCallbacks* local_pAllocator;
5886     local_device = device;
5887     local_pCreateInfo = nullptr;
5888     if (pCreateInfo) {
5889         local_pCreateInfo =
5890             (VkPipelineLayoutCreateInfo*)pool->alloc(sizeof(const VkPipelineLayoutCreateInfo));
5891         deepcopy_VkPipelineLayoutCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
5892                                             (VkPipelineLayoutCreateInfo*)(local_pCreateInfo));
5893     }
5894     local_pAllocator = nullptr;
5895     if (pAllocator) {
5896         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
5897         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
5898                                        (VkAllocationCallbacks*)(local_pAllocator));
5899     }
5900     local_pAllocator = nullptr;
5901     if (local_pCreateInfo) {
5902         transform_tohost_VkPipelineLayoutCreateInfo(
5903             sResourceTracker, (VkPipelineLayoutCreateInfo*)(local_pCreateInfo));
5904     }
5905     if (local_pAllocator) {
5906         transform_tohost_VkAllocationCallbacks(sResourceTracker,
5907                                                (VkAllocationCallbacks*)(local_pAllocator));
5908     }
5909     size_t count = 0;
5910     size_t* countPtr = &count;
5911     {
5912         uint64_t cgen_var_0;
5913         *countPtr += 1 * 8;
5914         count_VkPipelineLayoutCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
5915                                          (VkPipelineLayoutCreateInfo*)(local_pCreateInfo),
5916                                          countPtr);
5917         // WARNING PTR CHECK
5918         *countPtr += 8;
5919         if (local_pAllocator) {
5920             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
5921                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
5922         }
5923         uint64_t cgen_var_1;
5924         *countPtr += 8;
5925     }
5926     uint32_t packetSize_vkCreatePipelineLayout =
5927         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
5928     uint8_t* streamPtr = stream->reserve(packetSize_vkCreatePipelineLayout);
5929     uint8_t* packetBeginPtr = streamPtr;
5930     uint8_t** streamPtrPtr = &streamPtr;
5931     uint32_t opcode_vkCreatePipelineLayout = OP_vkCreatePipelineLayout;
5932     uint32_t seqno;
5933     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
5934     memcpy(streamPtr, &opcode_vkCreatePipelineLayout, sizeof(uint32_t));
5935     streamPtr += sizeof(uint32_t);
5936     memcpy(streamPtr, &packetSize_vkCreatePipelineLayout, sizeof(uint32_t));
5937     streamPtr += sizeof(uint32_t);
5938     if (queueSubmitWithCommandsEnabled) {
5939         memcpy(streamPtr, &seqno, sizeof(uint32_t));
5940         streamPtr += sizeof(uint32_t);
5941     }
5942     uint64_t cgen_var_0;
5943     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
5944     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
5945     *streamPtrPtr += 1 * 8;
5946     reservedmarshal_VkPipelineLayoutCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5947                                                (VkPipelineLayoutCreateInfo*)(local_pCreateInfo),
5948                                                streamPtrPtr);
5949     // WARNING PTR CHECK
5950     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
5951     memcpy((*streamPtrPtr), &cgen_var_1, 8);
5952     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
5953     *streamPtrPtr += 8;
5954     if (local_pAllocator) {
5955         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
5956                                               (VkAllocationCallbacks*)(local_pAllocator),
5957                                               streamPtrPtr);
5958     }
5959     /* is handle, possibly out */;
5960     uint64_t cgen_var_2;
5961     *&cgen_var_2 = (uint64_t)((*pPipelineLayout));
5962     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
5963     *streamPtrPtr += 8;
5964     /* is handle, possibly out */;
5965     stream->setHandleMapping(sResourceTracker->createMapping());
5966     uint64_t cgen_var_3;
5967     stream->read((uint64_t*)&cgen_var_3, 8);
5968     stream->handleMapping()->mapHandles_u64_VkPipelineLayout(&cgen_var_3,
5969                                                              (VkPipelineLayout*)pPipelineLayout, 1);
5970     stream->unsetHandleMapping();
5971     VkResult vkCreatePipelineLayout_VkResult_return = (VkResult)0;
5972     stream->read(&vkCreatePipelineLayout_VkResult_return, sizeof(VkResult));
5973     ++encodeCount;
5974     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
5975         pool->freeAll();
5976         stream->clearPool();
5977     }
5978     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
5979     return vkCreatePipelineLayout_VkResult_return;
5980 }
5981 
vkDestroyPipelineLayout(VkDevice device,VkPipelineLayout pipelineLayout,const VkAllocationCallbacks * pAllocator,uint32_t doLock)5982 void VkEncoder::vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout,
5983                                         const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
5984     (void)doLock;
5985     bool queueSubmitWithCommandsEnabled =
5986         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
5987     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
5988     auto stream = mImpl->stream();
5989     auto pool = mImpl->pool();
5990     VkDevice local_device;
5991     VkPipelineLayout local_pipelineLayout;
5992     VkAllocationCallbacks* local_pAllocator;
5993     local_device = device;
5994     local_pipelineLayout = pipelineLayout;
5995     local_pAllocator = nullptr;
5996     if (pAllocator) {
5997         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
5998         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
5999                                        (VkAllocationCallbacks*)(local_pAllocator));
6000     }
6001     local_pAllocator = nullptr;
6002     if (local_pAllocator) {
6003         transform_tohost_VkAllocationCallbacks(sResourceTracker,
6004                                                (VkAllocationCallbacks*)(local_pAllocator));
6005     }
6006     size_t count = 0;
6007     size_t* countPtr = &count;
6008     {
6009         uint64_t cgen_var_0;
6010         *countPtr += 1 * 8;
6011         uint64_t cgen_var_1;
6012         *countPtr += 1 * 8;
6013         // WARNING PTR CHECK
6014         *countPtr += 8;
6015         if (local_pAllocator) {
6016             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6017                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
6018         }
6019     }
6020     uint32_t packetSize_vkDestroyPipelineLayout =
6021         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
6022     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyPipelineLayout);
6023     uint8_t* packetBeginPtr = streamPtr;
6024     uint8_t** streamPtrPtr = &streamPtr;
6025     uint32_t opcode_vkDestroyPipelineLayout = OP_vkDestroyPipelineLayout;
6026     uint32_t seqno;
6027     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
6028     memcpy(streamPtr, &opcode_vkDestroyPipelineLayout, sizeof(uint32_t));
6029     streamPtr += sizeof(uint32_t);
6030     memcpy(streamPtr, &packetSize_vkDestroyPipelineLayout, sizeof(uint32_t));
6031     streamPtr += sizeof(uint32_t);
6032     if (queueSubmitWithCommandsEnabled) {
6033         memcpy(streamPtr, &seqno, sizeof(uint32_t));
6034         streamPtr += sizeof(uint32_t);
6035     }
6036     uint64_t cgen_var_0;
6037     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
6038     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
6039     *streamPtrPtr += 1 * 8;
6040     uint64_t cgen_var_1;
6041     *&cgen_var_1 = get_host_u64_VkPipelineLayout((*&local_pipelineLayout));
6042     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
6043     *streamPtrPtr += 1 * 8;
6044     // WARNING PTR CHECK
6045     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
6046     memcpy((*streamPtrPtr), &cgen_var_2, 8);
6047     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
6048     *streamPtrPtr += 8;
6049     if (local_pAllocator) {
6050         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6051                                               (VkAllocationCallbacks*)(local_pAllocator),
6052                                               streamPtrPtr);
6053     }
6054     sResourceTracker->destroyMapping()->mapHandles_VkPipelineLayout(
6055         (VkPipelineLayout*)&pipelineLayout);
6056     stream->flush();
6057     ++encodeCount;
6058     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
6059         pool->freeAll();
6060         stream->clearPool();
6061     }
6062     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
6063 }
6064 
vkCreateSampler(VkDevice device,const VkSamplerCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSampler * pSampler,uint32_t doLock)6065 VkResult VkEncoder::vkCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo,
6066                                     const VkAllocationCallbacks* pAllocator, VkSampler* pSampler,
6067                                     uint32_t doLock) {
6068     (void)doLock;
6069     bool queueSubmitWithCommandsEnabled =
6070         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
6071     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
6072     auto stream = mImpl->stream();
6073     auto pool = mImpl->pool();
6074     VkDevice local_device;
6075     VkSamplerCreateInfo* local_pCreateInfo;
6076     VkAllocationCallbacks* local_pAllocator;
6077     local_device = device;
6078     local_pCreateInfo = nullptr;
6079     if (pCreateInfo) {
6080         local_pCreateInfo = (VkSamplerCreateInfo*)pool->alloc(sizeof(const VkSamplerCreateInfo));
6081         deepcopy_VkSamplerCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
6082                                      (VkSamplerCreateInfo*)(local_pCreateInfo));
6083     }
6084     local_pAllocator = nullptr;
6085     if (pAllocator) {
6086         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
6087         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
6088                                        (VkAllocationCallbacks*)(local_pAllocator));
6089     }
6090     local_pAllocator = nullptr;
6091     if (local_pCreateInfo) {
6092         transform_tohost_VkSamplerCreateInfo(sResourceTracker,
6093                                              (VkSamplerCreateInfo*)(local_pCreateInfo));
6094     }
6095     if (local_pAllocator) {
6096         transform_tohost_VkAllocationCallbacks(sResourceTracker,
6097                                                (VkAllocationCallbacks*)(local_pAllocator));
6098     }
6099     size_t count = 0;
6100     size_t* countPtr = &count;
6101     {
6102         uint64_t cgen_var_0;
6103         *countPtr += 1 * 8;
6104         count_VkSamplerCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6105                                   (VkSamplerCreateInfo*)(local_pCreateInfo), countPtr);
6106         // WARNING PTR CHECK
6107         *countPtr += 8;
6108         if (local_pAllocator) {
6109             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6110                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
6111         }
6112         uint64_t cgen_var_1;
6113         *countPtr += 8;
6114     }
6115     uint32_t packetSize_vkCreateSampler = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
6116     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateSampler);
6117     uint8_t* packetBeginPtr = streamPtr;
6118     uint8_t** streamPtrPtr = &streamPtr;
6119     uint32_t opcode_vkCreateSampler = OP_vkCreateSampler;
6120     uint32_t seqno;
6121     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
6122     memcpy(streamPtr, &opcode_vkCreateSampler, sizeof(uint32_t));
6123     streamPtr += sizeof(uint32_t);
6124     memcpy(streamPtr, &packetSize_vkCreateSampler, sizeof(uint32_t));
6125     streamPtr += sizeof(uint32_t);
6126     if (queueSubmitWithCommandsEnabled) {
6127         memcpy(streamPtr, &seqno, sizeof(uint32_t));
6128         streamPtr += sizeof(uint32_t);
6129     }
6130     uint64_t cgen_var_0;
6131     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
6132     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
6133     *streamPtrPtr += 1 * 8;
6134     reservedmarshal_VkSamplerCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6135                                         (VkSamplerCreateInfo*)(local_pCreateInfo), streamPtrPtr);
6136     // WARNING PTR CHECK
6137     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
6138     memcpy((*streamPtrPtr), &cgen_var_1, 8);
6139     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
6140     *streamPtrPtr += 8;
6141     if (local_pAllocator) {
6142         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6143                                               (VkAllocationCallbacks*)(local_pAllocator),
6144                                               streamPtrPtr);
6145     }
6146     /* is handle, possibly out */;
6147     uint64_t cgen_var_2;
6148     *&cgen_var_2 = (uint64_t)((*pSampler));
6149     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
6150     *streamPtrPtr += 8;
6151     /* is handle, possibly out */;
6152     stream->setHandleMapping(sResourceTracker->createMapping());
6153     uint64_t cgen_var_3;
6154     stream->read((uint64_t*)&cgen_var_3, 8);
6155     stream->handleMapping()->mapHandles_u64_VkSampler(&cgen_var_3, (VkSampler*)pSampler, 1);
6156     stream->unsetHandleMapping();
6157     VkResult vkCreateSampler_VkResult_return = (VkResult)0;
6158     stream->read(&vkCreateSampler_VkResult_return, sizeof(VkResult));
6159     ++encodeCount;
6160     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
6161         pool->freeAll();
6162         stream->clearPool();
6163     }
6164     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
6165     return vkCreateSampler_VkResult_return;
6166 }
6167 
vkDestroySampler(VkDevice device,VkSampler sampler,const VkAllocationCallbacks * pAllocator,uint32_t doLock)6168 void VkEncoder::vkDestroySampler(VkDevice device, VkSampler sampler,
6169                                  const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
6170     (void)doLock;
6171     bool queueSubmitWithCommandsEnabled =
6172         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
6173     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
6174     auto stream = mImpl->stream();
6175     auto pool = mImpl->pool();
6176     VkDevice local_device;
6177     VkSampler local_sampler;
6178     VkAllocationCallbacks* local_pAllocator;
6179     local_device = device;
6180     local_sampler = sampler;
6181     local_pAllocator = nullptr;
6182     if (pAllocator) {
6183         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
6184         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
6185                                        (VkAllocationCallbacks*)(local_pAllocator));
6186     }
6187     local_pAllocator = nullptr;
6188     if (local_pAllocator) {
6189         transform_tohost_VkAllocationCallbacks(sResourceTracker,
6190                                                (VkAllocationCallbacks*)(local_pAllocator));
6191     }
6192     size_t count = 0;
6193     size_t* countPtr = &count;
6194     {
6195         uint64_t cgen_var_0;
6196         *countPtr += 1 * 8;
6197         uint64_t cgen_var_1;
6198         *countPtr += 1 * 8;
6199         // WARNING PTR CHECK
6200         *countPtr += 8;
6201         if (local_pAllocator) {
6202             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6203                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
6204         }
6205     }
6206     uint32_t packetSize_vkDestroySampler = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
6207     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroySampler);
6208     uint8_t* packetBeginPtr = streamPtr;
6209     uint8_t** streamPtrPtr = &streamPtr;
6210     uint32_t opcode_vkDestroySampler = OP_vkDestroySampler;
6211     uint32_t seqno;
6212     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
6213     memcpy(streamPtr, &opcode_vkDestroySampler, sizeof(uint32_t));
6214     streamPtr += sizeof(uint32_t);
6215     memcpy(streamPtr, &packetSize_vkDestroySampler, sizeof(uint32_t));
6216     streamPtr += sizeof(uint32_t);
6217     if (queueSubmitWithCommandsEnabled) {
6218         memcpy(streamPtr, &seqno, sizeof(uint32_t));
6219         streamPtr += sizeof(uint32_t);
6220     }
6221     uint64_t cgen_var_0;
6222     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
6223     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
6224     *streamPtrPtr += 1 * 8;
6225     uint64_t cgen_var_1;
6226     *&cgen_var_1 = get_host_u64_VkSampler((*&local_sampler));
6227     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
6228     *streamPtrPtr += 1 * 8;
6229     // WARNING PTR CHECK
6230     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
6231     memcpy((*streamPtrPtr), &cgen_var_2, 8);
6232     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
6233     *streamPtrPtr += 8;
6234     if (local_pAllocator) {
6235         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6236                                               (VkAllocationCallbacks*)(local_pAllocator),
6237                                               streamPtrPtr);
6238     }
6239     sResourceTracker->destroyMapping()->mapHandles_VkSampler((VkSampler*)&sampler);
6240     stream->flush();
6241     ++encodeCount;
6242     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
6243         pool->freeAll();
6244         stream->clearPool();
6245     }
6246     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
6247 }
6248 
vkCreateDescriptorSetLayout(VkDevice device,const VkDescriptorSetLayoutCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDescriptorSetLayout * pSetLayout,uint32_t doLock)6249 VkResult VkEncoder::vkCreateDescriptorSetLayout(VkDevice device,
6250                                                 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
6251                                                 const VkAllocationCallbacks* pAllocator,
6252                                                 VkDescriptorSetLayout* pSetLayout,
6253                                                 uint32_t doLock) {
6254     (void)doLock;
6255     bool queueSubmitWithCommandsEnabled =
6256         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
6257     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
6258     auto stream = mImpl->stream();
6259     auto pool = mImpl->pool();
6260     VkDevice local_device;
6261     VkDescriptorSetLayoutCreateInfo* local_pCreateInfo;
6262     VkAllocationCallbacks* local_pAllocator;
6263     local_device = device;
6264     local_pCreateInfo = nullptr;
6265     if (pCreateInfo) {
6266         local_pCreateInfo = (VkDescriptorSetLayoutCreateInfo*)pool->alloc(
6267             sizeof(const VkDescriptorSetLayoutCreateInfo));
6268         deepcopy_VkDescriptorSetLayoutCreateInfo(
6269             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
6270             (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
6271     }
6272     local_pAllocator = nullptr;
6273     if (pAllocator) {
6274         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
6275         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
6276                                        (VkAllocationCallbacks*)(local_pAllocator));
6277     }
6278     local_pAllocator = nullptr;
6279     if (local_pCreateInfo) {
6280         transform_tohost_VkDescriptorSetLayoutCreateInfo(
6281             sResourceTracker, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
6282     }
6283     if (local_pAllocator) {
6284         transform_tohost_VkAllocationCallbacks(sResourceTracker,
6285                                                (VkAllocationCallbacks*)(local_pAllocator));
6286     }
6287     size_t count = 0;
6288     size_t* countPtr = &count;
6289     {
6290         uint64_t cgen_var_0;
6291         *countPtr += 1 * 8;
6292         count_VkDescriptorSetLayoutCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6293                                               (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo),
6294                                               countPtr);
6295         // WARNING PTR CHECK
6296         *countPtr += 8;
6297         if (local_pAllocator) {
6298             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6299                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
6300         }
6301         uint64_t cgen_var_1;
6302         *countPtr += 8;
6303     }
6304     uint32_t packetSize_vkCreateDescriptorSetLayout =
6305         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
6306     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDescriptorSetLayout);
6307     uint8_t* packetBeginPtr = streamPtr;
6308     uint8_t** streamPtrPtr = &streamPtr;
6309     uint32_t opcode_vkCreateDescriptorSetLayout = OP_vkCreateDescriptorSetLayout;
6310     uint32_t seqno;
6311     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
6312     memcpy(streamPtr, &opcode_vkCreateDescriptorSetLayout, sizeof(uint32_t));
6313     streamPtr += sizeof(uint32_t);
6314     memcpy(streamPtr, &packetSize_vkCreateDescriptorSetLayout, sizeof(uint32_t));
6315     streamPtr += sizeof(uint32_t);
6316     if (queueSubmitWithCommandsEnabled) {
6317         memcpy(streamPtr, &seqno, sizeof(uint32_t));
6318         streamPtr += sizeof(uint32_t);
6319     }
6320     uint64_t cgen_var_0;
6321     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
6322     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
6323     *streamPtrPtr += 1 * 8;
6324     reservedmarshal_VkDescriptorSetLayoutCreateInfo(
6325         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo),
6326         streamPtrPtr);
6327     // WARNING PTR CHECK
6328     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
6329     memcpy((*streamPtrPtr), &cgen_var_1, 8);
6330     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
6331     *streamPtrPtr += 8;
6332     if (local_pAllocator) {
6333         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6334                                               (VkAllocationCallbacks*)(local_pAllocator),
6335                                               streamPtrPtr);
6336     }
6337     /* is handle, possibly out */;
6338     uint64_t cgen_var_2;
6339     *&cgen_var_2 = (uint64_t)((*pSetLayout));
6340     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
6341     *streamPtrPtr += 8;
6342     /* is handle, possibly out */;
6343     stream->setHandleMapping(sResourceTracker->createMapping());
6344     uint64_t cgen_var_3;
6345     stream->read((uint64_t*)&cgen_var_3, 8);
6346     stream->handleMapping()->mapHandles_u64_VkDescriptorSetLayout(
6347         &cgen_var_3, (VkDescriptorSetLayout*)pSetLayout, 1);
6348     stream->unsetHandleMapping();
6349     VkResult vkCreateDescriptorSetLayout_VkResult_return = (VkResult)0;
6350     stream->read(&vkCreateDescriptorSetLayout_VkResult_return, sizeof(VkResult));
6351     ++encodeCount;
6352     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
6353         pool->freeAll();
6354         stream->clearPool();
6355     }
6356     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
6357     return vkCreateDescriptorSetLayout_VkResult_return;
6358 }
6359 
vkDestroyDescriptorSetLayout(VkDevice device,VkDescriptorSetLayout descriptorSetLayout,const VkAllocationCallbacks * pAllocator,uint32_t doLock)6360 void VkEncoder::vkDestroyDescriptorSetLayout(VkDevice device,
6361                                              VkDescriptorSetLayout descriptorSetLayout,
6362                                              const VkAllocationCallbacks* pAllocator,
6363                                              uint32_t doLock) {
6364     (void)doLock;
6365     bool queueSubmitWithCommandsEnabled =
6366         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
6367     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
6368     auto stream = mImpl->stream();
6369     auto pool = mImpl->pool();
6370     VkDevice local_device;
6371     VkDescriptorSetLayout local_descriptorSetLayout;
6372     VkAllocationCallbacks* local_pAllocator;
6373     local_device = device;
6374     local_descriptorSetLayout = descriptorSetLayout;
6375     local_pAllocator = nullptr;
6376     if (pAllocator) {
6377         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
6378         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
6379                                        (VkAllocationCallbacks*)(local_pAllocator));
6380     }
6381     local_pAllocator = nullptr;
6382     if (local_pAllocator) {
6383         transform_tohost_VkAllocationCallbacks(sResourceTracker,
6384                                                (VkAllocationCallbacks*)(local_pAllocator));
6385     }
6386     size_t count = 0;
6387     size_t* countPtr = &count;
6388     {
6389         uint64_t cgen_var_0;
6390         *countPtr += 1 * 8;
6391         uint64_t cgen_var_1;
6392         *countPtr += 1 * 8;
6393         // WARNING PTR CHECK
6394         *countPtr += 8;
6395         if (local_pAllocator) {
6396             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6397                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
6398         }
6399     }
6400     uint32_t packetSize_vkDestroyDescriptorSetLayout =
6401         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
6402     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDescriptorSetLayout);
6403     uint8_t* packetBeginPtr = streamPtr;
6404     uint8_t** streamPtrPtr = &streamPtr;
6405     uint32_t opcode_vkDestroyDescriptorSetLayout = OP_vkDestroyDescriptorSetLayout;
6406     uint32_t seqno;
6407     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
6408     memcpy(streamPtr, &opcode_vkDestroyDescriptorSetLayout, sizeof(uint32_t));
6409     streamPtr += sizeof(uint32_t);
6410     memcpy(streamPtr, &packetSize_vkDestroyDescriptorSetLayout, sizeof(uint32_t));
6411     streamPtr += sizeof(uint32_t);
6412     if (queueSubmitWithCommandsEnabled) {
6413         memcpy(streamPtr, &seqno, sizeof(uint32_t));
6414         streamPtr += sizeof(uint32_t);
6415     }
6416     uint64_t cgen_var_0;
6417     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
6418     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
6419     *streamPtrPtr += 1 * 8;
6420     uint64_t cgen_var_1;
6421     *&cgen_var_1 = get_host_u64_VkDescriptorSetLayout((*&local_descriptorSetLayout));
6422     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
6423     *streamPtrPtr += 1 * 8;
6424     // WARNING PTR CHECK
6425     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
6426     memcpy((*streamPtrPtr), &cgen_var_2, 8);
6427     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
6428     *streamPtrPtr += 8;
6429     if (local_pAllocator) {
6430         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6431                                               (VkAllocationCallbacks*)(local_pAllocator),
6432                                               streamPtrPtr);
6433     }
6434     sResourceTracker->destroyMapping()->mapHandles_VkDescriptorSetLayout(
6435         (VkDescriptorSetLayout*)&descriptorSetLayout);
6436     stream->flush();
6437     ++encodeCount;
6438     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
6439         pool->freeAll();
6440         stream->clearPool();
6441     }
6442     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
6443 }
6444 
vkCreateDescriptorPool(VkDevice device,const VkDescriptorPoolCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDescriptorPool * pDescriptorPool,uint32_t doLock)6445 VkResult VkEncoder::vkCreateDescriptorPool(VkDevice device,
6446                                            const VkDescriptorPoolCreateInfo* pCreateInfo,
6447                                            const VkAllocationCallbacks* pAllocator,
6448                                            VkDescriptorPool* pDescriptorPool, uint32_t doLock) {
6449     (void)doLock;
6450     bool queueSubmitWithCommandsEnabled =
6451         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
6452     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
6453     auto stream = mImpl->stream();
6454     auto pool = mImpl->pool();
6455     VkDevice local_device;
6456     VkDescriptorPoolCreateInfo* local_pCreateInfo;
6457     VkAllocationCallbacks* local_pAllocator;
6458     local_device = device;
6459     local_pCreateInfo = nullptr;
6460     if (pCreateInfo) {
6461         local_pCreateInfo =
6462             (VkDescriptorPoolCreateInfo*)pool->alloc(sizeof(const VkDescriptorPoolCreateInfo));
6463         deepcopy_VkDescriptorPoolCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
6464                                             (VkDescriptorPoolCreateInfo*)(local_pCreateInfo));
6465     }
6466     local_pAllocator = nullptr;
6467     if (pAllocator) {
6468         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
6469         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
6470                                        (VkAllocationCallbacks*)(local_pAllocator));
6471     }
6472     local_pAllocator = nullptr;
6473     if (local_pCreateInfo) {
6474         transform_tohost_VkDescriptorPoolCreateInfo(
6475             sResourceTracker, (VkDescriptorPoolCreateInfo*)(local_pCreateInfo));
6476     }
6477     if (local_pAllocator) {
6478         transform_tohost_VkAllocationCallbacks(sResourceTracker,
6479                                                (VkAllocationCallbacks*)(local_pAllocator));
6480     }
6481     size_t count = 0;
6482     size_t* countPtr = &count;
6483     {
6484         uint64_t cgen_var_0;
6485         *countPtr += 1 * 8;
6486         count_VkDescriptorPoolCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6487                                          (VkDescriptorPoolCreateInfo*)(local_pCreateInfo),
6488                                          countPtr);
6489         // WARNING PTR CHECK
6490         *countPtr += 8;
6491         if (local_pAllocator) {
6492             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6493                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
6494         }
6495         uint64_t cgen_var_1;
6496         *countPtr += 8;
6497     }
6498     uint32_t packetSize_vkCreateDescriptorPool =
6499         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
6500     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDescriptorPool);
6501     uint8_t* packetBeginPtr = streamPtr;
6502     uint8_t** streamPtrPtr = &streamPtr;
6503     uint32_t opcode_vkCreateDescriptorPool = OP_vkCreateDescriptorPool;
6504     uint32_t seqno;
6505     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
6506     memcpy(streamPtr, &opcode_vkCreateDescriptorPool, sizeof(uint32_t));
6507     streamPtr += sizeof(uint32_t);
6508     memcpy(streamPtr, &packetSize_vkCreateDescriptorPool, sizeof(uint32_t));
6509     streamPtr += sizeof(uint32_t);
6510     if (queueSubmitWithCommandsEnabled) {
6511         memcpy(streamPtr, &seqno, sizeof(uint32_t));
6512         streamPtr += sizeof(uint32_t);
6513     }
6514     uint64_t cgen_var_0;
6515     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
6516     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
6517     *streamPtrPtr += 1 * 8;
6518     reservedmarshal_VkDescriptorPoolCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6519                                                (VkDescriptorPoolCreateInfo*)(local_pCreateInfo),
6520                                                streamPtrPtr);
6521     // WARNING PTR CHECK
6522     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
6523     memcpy((*streamPtrPtr), &cgen_var_1, 8);
6524     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
6525     *streamPtrPtr += 8;
6526     if (local_pAllocator) {
6527         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6528                                               (VkAllocationCallbacks*)(local_pAllocator),
6529                                               streamPtrPtr);
6530     }
6531     /* is handle, possibly out */;
6532     uint64_t cgen_var_2;
6533     *&cgen_var_2 = (uint64_t)((*pDescriptorPool));
6534     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
6535     *streamPtrPtr += 8;
6536     /* is handle, possibly out */;
6537     stream->setHandleMapping(sResourceTracker->createMapping());
6538     uint64_t cgen_var_3;
6539     stream->read((uint64_t*)&cgen_var_3, 8);
6540     stream->handleMapping()->mapHandles_u64_VkDescriptorPool(&cgen_var_3,
6541                                                              (VkDescriptorPool*)pDescriptorPool, 1);
6542     stream->unsetHandleMapping();
6543     VkResult vkCreateDescriptorPool_VkResult_return = (VkResult)0;
6544     stream->read(&vkCreateDescriptorPool_VkResult_return, sizeof(VkResult));
6545     ++encodeCount;
6546     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
6547         pool->freeAll();
6548         stream->clearPool();
6549     }
6550     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
6551     return vkCreateDescriptorPool_VkResult_return;
6552 }
6553 
vkDestroyDescriptorPool(VkDevice device,VkDescriptorPool descriptorPool,const VkAllocationCallbacks * pAllocator,uint32_t doLock)6554 void VkEncoder::vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
6555                                         const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
6556     (void)doLock;
6557     bool queueSubmitWithCommandsEnabled =
6558         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
6559     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
6560     auto stream = mImpl->stream();
6561     auto pool = mImpl->pool();
6562     VkDevice local_device;
6563     VkDescriptorPool local_descriptorPool;
6564     VkAllocationCallbacks* local_pAllocator;
6565     local_device = device;
6566     local_descriptorPool = descriptorPool;
6567     local_pAllocator = nullptr;
6568     if (pAllocator) {
6569         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
6570         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
6571                                        (VkAllocationCallbacks*)(local_pAllocator));
6572     }
6573     local_pAllocator = nullptr;
6574     if (local_pAllocator) {
6575         transform_tohost_VkAllocationCallbacks(sResourceTracker,
6576                                                (VkAllocationCallbacks*)(local_pAllocator));
6577     }
6578     size_t count = 0;
6579     size_t* countPtr = &count;
6580     {
6581         uint64_t cgen_var_0;
6582         *countPtr += 1 * 8;
6583         uint64_t cgen_var_1;
6584         *countPtr += 1 * 8;
6585         // WARNING PTR CHECK
6586         *countPtr += 8;
6587         if (local_pAllocator) {
6588             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6589                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
6590         }
6591     }
6592     uint32_t packetSize_vkDestroyDescriptorPool =
6593         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
6594     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDescriptorPool);
6595     uint8_t* packetBeginPtr = streamPtr;
6596     uint8_t** streamPtrPtr = &streamPtr;
6597     uint32_t opcode_vkDestroyDescriptorPool = OP_vkDestroyDescriptorPool;
6598     uint32_t seqno;
6599     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
6600     memcpy(streamPtr, &opcode_vkDestroyDescriptorPool, sizeof(uint32_t));
6601     streamPtr += sizeof(uint32_t);
6602     memcpy(streamPtr, &packetSize_vkDestroyDescriptorPool, sizeof(uint32_t));
6603     streamPtr += sizeof(uint32_t);
6604     if (queueSubmitWithCommandsEnabled) {
6605         memcpy(streamPtr, &seqno, sizeof(uint32_t));
6606         streamPtr += sizeof(uint32_t);
6607     }
6608     uint64_t cgen_var_0;
6609     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
6610     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
6611     *streamPtrPtr += 1 * 8;
6612     uint64_t cgen_var_1;
6613     *&cgen_var_1 = get_host_u64_VkDescriptorPool((*&local_descriptorPool));
6614     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
6615     *streamPtrPtr += 1 * 8;
6616     // WARNING PTR CHECK
6617     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
6618     memcpy((*streamPtrPtr), &cgen_var_2, 8);
6619     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
6620     *streamPtrPtr += 8;
6621     if (local_pAllocator) {
6622         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6623                                               (VkAllocationCallbacks*)(local_pAllocator),
6624                                               streamPtrPtr);
6625     }
6626     sResourceTracker->destroyMapping()->mapHandles_VkDescriptorPool(
6627         (VkDescriptorPool*)&descriptorPool);
6628     stream->flush();
6629     ++encodeCount;
6630     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
6631         pool->freeAll();
6632         stream->clearPool();
6633     }
6634     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
6635 }
6636 
vkResetDescriptorPool(VkDevice device,VkDescriptorPool descriptorPool,VkDescriptorPoolResetFlags flags,uint32_t doLock)6637 VkResult VkEncoder::vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
6638                                           VkDescriptorPoolResetFlags flags, uint32_t doLock) {
6639     (void)doLock;
6640     bool queueSubmitWithCommandsEnabled =
6641         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
6642     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
6643     auto stream = mImpl->stream();
6644     auto pool = mImpl->pool();
6645     VkDevice local_device;
6646     VkDescriptorPool local_descriptorPool;
6647     VkDescriptorPoolResetFlags local_flags;
6648     local_device = device;
6649     local_descriptorPool = descriptorPool;
6650     local_flags = flags;
6651     size_t count = 0;
6652     size_t* countPtr = &count;
6653     {
6654         uint64_t cgen_var_0;
6655         *countPtr += 1 * 8;
6656         uint64_t cgen_var_1;
6657         *countPtr += 1 * 8;
6658         *countPtr += sizeof(VkDescriptorPoolResetFlags);
6659     }
6660     uint32_t packetSize_vkResetDescriptorPool =
6661         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
6662     uint8_t* streamPtr = stream->reserve(packetSize_vkResetDescriptorPool);
6663     uint8_t* packetBeginPtr = streamPtr;
6664     uint8_t** streamPtrPtr = &streamPtr;
6665     uint32_t opcode_vkResetDescriptorPool = OP_vkResetDescriptorPool;
6666     uint32_t seqno;
6667     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
6668     memcpy(streamPtr, &opcode_vkResetDescriptorPool, sizeof(uint32_t));
6669     streamPtr += sizeof(uint32_t);
6670     memcpy(streamPtr, &packetSize_vkResetDescriptorPool, sizeof(uint32_t));
6671     streamPtr += sizeof(uint32_t);
6672     if (queueSubmitWithCommandsEnabled) {
6673         memcpy(streamPtr, &seqno, sizeof(uint32_t));
6674         streamPtr += sizeof(uint32_t);
6675     }
6676     uint64_t cgen_var_0;
6677     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
6678     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
6679     *streamPtrPtr += 1 * 8;
6680     uint64_t cgen_var_1;
6681     *&cgen_var_1 = get_host_u64_VkDescriptorPool((*&local_descriptorPool));
6682     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
6683     *streamPtrPtr += 1 * 8;
6684     memcpy(*streamPtrPtr, (VkDescriptorPoolResetFlags*)&local_flags,
6685            sizeof(VkDescriptorPoolResetFlags));
6686     *streamPtrPtr += sizeof(VkDescriptorPoolResetFlags);
6687     VkResult vkResetDescriptorPool_VkResult_return = (VkResult)0;
6688     stream->read(&vkResetDescriptorPool_VkResult_return, sizeof(VkResult));
6689     ++encodeCount;
6690     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
6691         pool->freeAll();
6692         stream->clearPool();
6693     }
6694     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
6695     return vkResetDescriptorPool_VkResult_return;
6696 }
6697 
vkAllocateDescriptorSets(VkDevice device,const VkDescriptorSetAllocateInfo * pAllocateInfo,VkDescriptorSet * pDescriptorSets,uint32_t doLock)6698 VkResult VkEncoder::vkAllocateDescriptorSets(VkDevice device,
6699                                              const VkDescriptorSetAllocateInfo* pAllocateInfo,
6700                                              VkDescriptorSet* pDescriptorSets, uint32_t doLock) {
6701     (void)doLock;
6702     bool queueSubmitWithCommandsEnabled =
6703         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
6704     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
6705     auto stream = mImpl->stream();
6706     auto pool = mImpl->pool();
6707     VkDevice local_device;
6708     VkDescriptorSetAllocateInfo* local_pAllocateInfo;
6709     local_device = device;
6710     local_pAllocateInfo = nullptr;
6711     if (pAllocateInfo) {
6712         local_pAllocateInfo =
6713             (VkDescriptorSetAllocateInfo*)pool->alloc(sizeof(const VkDescriptorSetAllocateInfo));
6714         deepcopy_VkDescriptorSetAllocateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocateInfo,
6715                                              (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo));
6716     }
6717     if (local_pAllocateInfo) {
6718         transform_tohost_VkDescriptorSetAllocateInfo(
6719             sResourceTracker, (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo));
6720     }
6721     size_t count = 0;
6722     size_t* countPtr = &count;
6723     {
6724         uint64_t cgen_var_0;
6725         *countPtr += 1 * 8;
6726         count_VkDescriptorSetAllocateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6727                                           (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo),
6728                                           countPtr);
6729         if (pAllocateInfo->descriptorSetCount) {
6730             *countPtr += pAllocateInfo->descriptorSetCount * 8;
6731         }
6732     }
6733     uint32_t packetSize_vkAllocateDescriptorSets =
6734         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
6735     uint8_t* streamPtr = stream->reserve(packetSize_vkAllocateDescriptorSets);
6736     uint8_t* packetBeginPtr = streamPtr;
6737     uint8_t** streamPtrPtr = &streamPtr;
6738     uint32_t opcode_vkAllocateDescriptorSets = OP_vkAllocateDescriptorSets;
6739     uint32_t seqno;
6740     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
6741     memcpy(streamPtr, &opcode_vkAllocateDescriptorSets, sizeof(uint32_t));
6742     streamPtr += sizeof(uint32_t);
6743     memcpy(streamPtr, &packetSize_vkAllocateDescriptorSets, sizeof(uint32_t));
6744     streamPtr += sizeof(uint32_t);
6745     if (queueSubmitWithCommandsEnabled) {
6746         memcpy(streamPtr, &seqno, sizeof(uint32_t));
6747         streamPtr += sizeof(uint32_t);
6748     }
6749     uint64_t cgen_var_0;
6750     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
6751     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
6752     *streamPtrPtr += 1 * 8;
6753     reservedmarshal_VkDescriptorSetAllocateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6754                                                 (VkDescriptorSetAllocateInfo*)(local_pAllocateInfo),
6755                                                 streamPtrPtr);
6756     /* is handle, possibly out */;
6757     if (pAllocateInfo->descriptorSetCount) {
6758         uint8_t* cgen_var_1_ptr = (uint8_t*)(*streamPtrPtr);
6759         for (uint32_t k = 0; k < pAllocateInfo->descriptorSetCount; ++k) {
6760             uint64_t tmpval = (uint64_t)(pDescriptorSets[k]);
6761             memcpy(cgen_var_1_ptr + k * 8, &tmpval, sizeof(uint64_t));
6762         }
6763         *streamPtrPtr += 8 * pAllocateInfo->descriptorSetCount;
6764     }
6765     /* is handle, possibly out */;
6766     stream->setHandleMapping(sResourceTracker->createMapping());
6767     if (pAllocateInfo->descriptorSetCount) {
6768         uint64_t* cgen_var_2;
6769         stream->alloc((void**)&cgen_var_2, pAllocateInfo->descriptorSetCount * 8);
6770         stream->read((uint64_t*)cgen_var_2, pAllocateInfo->descriptorSetCount * 8);
6771         stream->handleMapping()->mapHandles_u64_VkDescriptorSet(
6772             cgen_var_2, (VkDescriptorSet*)pDescriptorSets, pAllocateInfo->descriptorSetCount);
6773     }
6774     stream->unsetHandleMapping();
6775     VkResult vkAllocateDescriptorSets_VkResult_return = (VkResult)0;
6776     stream->read(&vkAllocateDescriptorSets_VkResult_return, sizeof(VkResult));
6777     ++encodeCount;
6778     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
6779         pool->freeAll();
6780         stream->clearPool();
6781     }
6782     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
6783     return vkAllocateDescriptorSets_VkResult_return;
6784 }
6785 
vkFreeDescriptorSets(VkDevice device,VkDescriptorPool descriptorPool,uint32_t descriptorSetCount,const VkDescriptorSet * pDescriptorSets,uint32_t doLock)6786 VkResult VkEncoder::vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool,
6787                                          uint32_t descriptorSetCount,
6788                                          const VkDescriptorSet* pDescriptorSets, uint32_t doLock) {
6789     (void)doLock;
6790     bool queueSubmitWithCommandsEnabled =
6791         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
6792     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
6793     auto stream = mImpl->stream();
6794     auto pool = mImpl->pool();
6795     VkDevice local_device;
6796     VkDescriptorPool local_descriptorPool;
6797     uint32_t local_descriptorSetCount;
6798     VkDescriptorSet* local_pDescriptorSets;
6799     local_device = device;
6800     local_descriptorPool = descriptorPool;
6801     local_descriptorSetCount = descriptorSetCount;
6802     // Avoiding deepcopy for pDescriptorSets
6803     local_pDescriptorSets = (VkDescriptorSet*)pDescriptorSets;
6804     size_t count = 0;
6805     size_t* countPtr = &count;
6806     {
6807         uint64_t cgen_var_0;
6808         *countPtr += 1 * 8;
6809         uint64_t cgen_var_1;
6810         *countPtr += 1 * 8;
6811         *countPtr += sizeof(uint32_t);
6812         // WARNING PTR CHECK
6813         *countPtr += 8;
6814         if (local_pDescriptorSets) {
6815             if (((descriptorSetCount))) {
6816                 *countPtr += ((descriptorSetCount)) * 8;
6817             }
6818         }
6819     }
6820     uint32_t packetSize_vkFreeDescriptorSets =
6821         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
6822     uint8_t* streamPtr = stream->reserve(packetSize_vkFreeDescriptorSets);
6823     uint8_t* packetBeginPtr = streamPtr;
6824     uint8_t** streamPtrPtr = &streamPtr;
6825     uint32_t opcode_vkFreeDescriptorSets = OP_vkFreeDescriptorSets;
6826     uint32_t seqno;
6827     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
6828     memcpy(streamPtr, &opcode_vkFreeDescriptorSets, sizeof(uint32_t));
6829     streamPtr += sizeof(uint32_t);
6830     memcpy(streamPtr, &packetSize_vkFreeDescriptorSets, sizeof(uint32_t));
6831     streamPtr += sizeof(uint32_t);
6832     if (queueSubmitWithCommandsEnabled) {
6833         memcpy(streamPtr, &seqno, sizeof(uint32_t));
6834         streamPtr += sizeof(uint32_t);
6835     }
6836     uint64_t cgen_var_0;
6837     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
6838     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
6839     *streamPtrPtr += 1 * 8;
6840     uint64_t cgen_var_1;
6841     *&cgen_var_1 = get_host_u64_VkDescriptorPool((*&local_descriptorPool));
6842     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
6843     *streamPtrPtr += 1 * 8;
6844     memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorSetCount, sizeof(uint32_t));
6845     *streamPtrPtr += sizeof(uint32_t);
6846     // WARNING PTR CHECK
6847     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pDescriptorSets;
6848     memcpy((*streamPtrPtr), &cgen_var_2, 8);
6849     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
6850     *streamPtrPtr += 8;
6851     if (local_pDescriptorSets) {
6852         if (((descriptorSetCount))) {
6853             uint8_t* cgen_var_2_0_ptr = (uint8_t*)(*streamPtrPtr);
6854             for (uint32_t k = 0; k < ((descriptorSetCount)); ++k) {
6855                 uint64_t tmpval = get_host_u64_VkDescriptorSet(local_pDescriptorSets[k]);
6856                 memcpy(cgen_var_2_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
6857             }
6858             *streamPtrPtr += 8 * ((descriptorSetCount));
6859         }
6860     }
6861     VkResult vkFreeDescriptorSets_VkResult_return = (VkResult)0;
6862     stream->read(&vkFreeDescriptorSets_VkResult_return, sizeof(VkResult));
6863     if (pDescriptorSets) {
6864         sResourceTracker->destroyMapping()->mapHandles_VkDescriptorSet(
6865             (VkDescriptorSet*)pDescriptorSets, ((descriptorSetCount)));
6866     }
6867     ++encodeCount;
6868     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
6869         pool->freeAll();
6870         stream->clearPool();
6871     }
6872     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
6873     return vkFreeDescriptorSets_VkResult_return;
6874 }
6875 
vkUpdateDescriptorSets(VkDevice device,uint32_t descriptorWriteCount,const VkWriteDescriptorSet * pDescriptorWrites,uint32_t descriptorCopyCount,const VkCopyDescriptorSet * pDescriptorCopies,uint32_t doLock)6876 void VkEncoder::vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount,
6877                                        const VkWriteDescriptorSet* pDescriptorWrites,
6878                                        uint32_t descriptorCopyCount,
6879                                        const VkCopyDescriptorSet* pDescriptorCopies,
6880                                        uint32_t doLock) {
6881     (void)doLock;
6882     bool queueSubmitWithCommandsEnabled =
6883         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
6884     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
6885     auto stream = mImpl->stream();
6886     auto pool = mImpl->pool();
6887     VkDevice local_device;
6888     uint32_t local_descriptorWriteCount;
6889     VkWriteDescriptorSet* local_pDescriptorWrites;
6890     uint32_t local_descriptorCopyCount;
6891     VkCopyDescriptorSet* local_pDescriptorCopies;
6892     local_device = device;
6893     local_descriptorWriteCount = descriptorWriteCount;
6894     local_pDescriptorWrites = nullptr;
6895     if (pDescriptorWrites) {
6896         local_pDescriptorWrites = (VkWriteDescriptorSet*)pool->alloc(
6897             ((descriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
6898         for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i) {
6899             deepcopy_VkWriteDescriptorSet(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDescriptorWrites + i,
6900                                           (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
6901         }
6902     }
6903     local_descriptorCopyCount = descriptorCopyCount;
6904     local_pDescriptorCopies = nullptr;
6905     if (pDescriptorCopies) {
6906         local_pDescriptorCopies = (VkCopyDescriptorSet*)pool->alloc(
6907             ((descriptorCopyCount)) * sizeof(const VkCopyDescriptorSet));
6908         for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i) {
6909             deepcopy_VkCopyDescriptorSet(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDescriptorCopies + i,
6910                                          (VkCopyDescriptorSet*)(local_pDescriptorCopies + i));
6911         }
6912     }
6913     if (local_pDescriptorWrites) {
6914         for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i) {
6915             transform_tohost_VkWriteDescriptorSet(
6916                 sResourceTracker, (VkWriteDescriptorSet*)(local_pDescriptorWrites + i));
6917         }
6918     }
6919     if (local_pDescriptorCopies) {
6920         for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i) {
6921             transform_tohost_VkCopyDescriptorSet(
6922                 sResourceTracker, (VkCopyDescriptorSet*)(local_pDescriptorCopies + i));
6923         }
6924     }
6925     size_t count = 0;
6926     size_t* countPtr = &count;
6927     {
6928         uint64_t cgen_var_0;
6929         *countPtr += 1 * 8;
6930         *countPtr += sizeof(uint32_t);
6931         for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i) {
6932             count_VkWriteDescriptorSet(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6933                                        (VkWriteDescriptorSet*)(local_pDescriptorWrites + i),
6934                                        countPtr);
6935         }
6936         *countPtr += sizeof(uint32_t);
6937         for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i) {
6938             count_VkCopyDescriptorSet(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
6939                                       (VkCopyDescriptorSet*)(local_pDescriptorCopies + i),
6940                                       countPtr);
6941         }
6942     }
6943     uint32_t packetSize_vkUpdateDescriptorSets =
6944         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
6945     uint8_t* streamPtr = stream->reserve(packetSize_vkUpdateDescriptorSets);
6946     uint8_t* packetBeginPtr = streamPtr;
6947     uint8_t** streamPtrPtr = &streamPtr;
6948     uint32_t opcode_vkUpdateDescriptorSets = OP_vkUpdateDescriptorSets;
6949     uint32_t seqno;
6950     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
6951     memcpy(streamPtr, &opcode_vkUpdateDescriptorSets, sizeof(uint32_t));
6952     streamPtr += sizeof(uint32_t);
6953     memcpy(streamPtr, &packetSize_vkUpdateDescriptorSets, sizeof(uint32_t));
6954     streamPtr += sizeof(uint32_t);
6955     if (queueSubmitWithCommandsEnabled) {
6956         memcpy(streamPtr, &seqno, sizeof(uint32_t));
6957         streamPtr += sizeof(uint32_t);
6958     }
6959     uint64_t cgen_var_0;
6960     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
6961     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
6962     *streamPtrPtr += 1 * 8;
6963     memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorWriteCount, sizeof(uint32_t));
6964     *streamPtrPtr += sizeof(uint32_t);
6965     for (uint32_t i = 0; i < (uint32_t)((descriptorWriteCount)); ++i) {
6966         reservedmarshal_VkWriteDescriptorSet(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6967                                              (VkWriteDescriptorSet*)(local_pDescriptorWrites + i),
6968                                              streamPtrPtr);
6969     }
6970     memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorCopyCount, sizeof(uint32_t));
6971     *streamPtrPtr += sizeof(uint32_t);
6972     for (uint32_t i = 0; i < (uint32_t)((descriptorCopyCount)); ++i) {
6973         reservedmarshal_VkCopyDescriptorSet(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
6974                                             (VkCopyDescriptorSet*)(local_pDescriptorCopies + i),
6975                                             streamPtrPtr);
6976     }
6977     stream->flush();
6978     ++encodeCount;
6979     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
6980         pool->freeAll();
6981         stream->clearPool();
6982     }
6983     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
6984 }
6985 
vkCreateFramebuffer(VkDevice device,const VkFramebufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkFramebuffer * pFramebuffer,uint32_t doLock)6986 VkResult VkEncoder::vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo,
6987                                         const VkAllocationCallbacks* pAllocator,
6988                                         VkFramebuffer* pFramebuffer, uint32_t doLock) {
6989     (void)doLock;
6990     bool queueSubmitWithCommandsEnabled =
6991         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
6992     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
6993     auto stream = mImpl->stream();
6994     auto pool = mImpl->pool();
6995     VkDevice local_device;
6996     VkFramebufferCreateInfo* local_pCreateInfo;
6997     VkAllocationCallbacks* local_pAllocator;
6998     local_device = device;
6999     local_pCreateInfo = nullptr;
7000     if (pCreateInfo) {
7001         local_pCreateInfo =
7002             (VkFramebufferCreateInfo*)pool->alloc(sizeof(const VkFramebufferCreateInfo));
7003         deepcopy_VkFramebufferCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
7004                                          (VkFramebufferCreateInfo*)(local_pCreateInfo));
7005     }
7006     local_pAllocator = nullptr;
7007     if (pAllocator) {
7008         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
7009         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
7010                                        (VkAllocationCallbacks*)(local_pAllocator));
7011     }
7012     local_pAllocator = nullptr;
7013     if (local_pCreateInfo) {
7014         transform_tohost_VkFramebufferCreateInfo(sResourceTracker,
7015                                                  (VkFramebufferCreateInfo*)(local_pCreateInfo));
7016     }
7017     if (local_pAllocator) {
7018         transform_tohost_VkAllocationCallbacks(sResourceTracker,
7019                                                (VkAllocationCallbacks*)(local_pAllocator));
7020     }
7021     size_t count = 0;
7022     size_t* countPtr = &count;
7023     {
7024         uint64_t cgen_var_0;
7025         *countPtr += 1 * 8;
7026         count_VkFramebufferCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
7027                                       (VkFramebufferCreateInfo*)(local_pCreateInfo), countPtr);
7028         // WARNING PTR CHECK
7029         *countPtr += 8;
7030         if (local_pAllocator) {
7031             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
7032                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
7033         }
7034         uint64_t cgen_var_1;
7035         *countPtr += 8;
7036     }
7037     uint32_t packetSize_vkCreateFramebuffer =
7038         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
7039     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateFramebuffer);
7040     uint8_t* packetBeginPtr = streamPtr;
7041     uint8_t** streamPtrPtr = &streamPtr;
7042     uint32_t opcode_vkCreateFramebuffer = OP_vkCreateFramebuffer;
7043     uint32_t seqno;
7044     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
7045     memcpy(streamPtr, &opcode_vkCreateFramebuffer, sizeof(uint32_t));
7046     streamPtr += sizeof(uint32_t);
7047     memcpy(streamPtr, &packetSize_vkCreateFramebuffer, sizeof(uint32_t));
7048     streamPtr += sizeof(uint32_t);
7049     if (queueSubmitWithCommandsEnabled) {
7050         memcpy(streamPtr, &seqno, sizeof(uint32_t));
7051         streamPtr += sizeof(uint32_t);
7052     }
7053     uint64_t cgen_var_0;
7054     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
7055     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7056     *streamPtrPtr += 1 * 8;
7057     reservedmarshal_VkFramebufferCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
7058                                             (VkFramebufferCreateInfo*)(local_pCreateInfo),
7059                                             streamPtrPtr);
7060     // WARNING PTR CHECK
7061     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
7062     memcpy((*streamPtrPtr), &cgen_var_1, 8);
7063     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
7064     *streamPtrPtr += 8;
7065     if (local_pAllocator) {
7066         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
7067                                               (VkAllocationCallbacks*)(local_pAllocator),
7068                                               streamPtrPtr);
7069     }
7070     /* is handle, possibly out */;
7071     uint64_t cgen_var_2;
7072     *&cgen_var_2 = (uint64_t)((*pFramebuffer));
7073     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
7074     *streamPtrPtr += 8;
7075     /* is handle, possibly out */;
7076     stream->setHandleMapping(sResourceTracker->createMapping());
7077     uint64_t cgen_var_3;
7078     stream->read((uint64_t*)&cgen_var_3, 8);
7079     stream->handleMapping()->mapHandles_u64_VkFramebuffer(&cgen_var_3, (VkFramebuffer*)pFramebuffer,
7080                                                           1);
7081     stream->unsetHandleMapping();
7082     VkResult vkCreateFramebuffer_VkResult_return = (VkResult)0;
7083     stream->read(&vkCreateFramebuffer_VkResult_return, sizeof(VkResult));
7084     ++encodeCount;
7085     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7086         pool->freeAll();
7087         stream->clearPool();
7088     }
7089     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7090     return vkCreateFramebuffer_VkResult_return;
7091 }
7092 
vkDestroyFramebuffer(VkDevice device,VkFramebuffer framebuffer,const VkAllocationCallbacks * pAllocator,uint32_t doLock)7093 void VkEncoder::vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer,
7094                                      const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
7095     (void)doLock;
7096     bool queueSubmitWithCommandsEnabled =
7097         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7098     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7099     auto stream = mImpl->stream();
7100     auto pool = mImpl->pool();
7101     VkDevice local_device;
7102     VkFramebuffer local_framebuffer;
7103     VkAllocationCallbacks* local_pAllocator;
7104     local_device = device;
7105     local_framebuffer = framebuffer;
7106     local_pAllocator = nullptr;
7107     if (pAllocator) {
7108         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
7109         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
7110                                        (VkAllocationCallbacks*)(local_pAllocator));
7111     }
7112     local_pAllocator = nullptr;
7113     if (local_pAllocator) {
7114         transform_tohost_VkAllocationCallbacks(sResourceTracker,
7115                                                (VkAllocationCallbacks*)(local_pAllocator));
7116     }
7117     size_t count = 0;
7118     size_t* countPtr = &count;
7119     {
7120         uint64_t cgen_var_0;
7121         *countPtr += 1 * 8;
7122         uint64_t cgen_var_1;
7123         *countPtr += 1 * 8;
7124         // WARNING PTR CHECK
7125         *countPtr += 8;
7126         if (local_pAllocator) {
7127             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
7128                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
7129         }
7130     }
7131     uint32_t packetSize_vkDestroyFramebuffer =
7132         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
7133     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyFramebuffer);
7134     uint8_t* packetBeginPtr = streamPtr;
7135     uint8_t** streamPtrPtr = &streamPtr;
7136     uint32_t opcode_vkDestroyFramebuffer = OP_vkDestroyFramebuffer;
7137     uint32_t seqno;
7138     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
7139     memcpy(streamPtr, &opcode_vkDestroyFramebuffer, sizeof(uint32_t));
7140     streamPtr += sizeof(uint32_t);
7141     memcpy(streamPtr, &packetSize_vkDestroyFramebuffer, sizeof(uint32_t));
7142     streamPtr += sizeof(uint32_t);
7143     if (queueSubmitWithCommandsEnabled) {
7144         memcpy(streamPtr, &seqno, sizeof(uint32_t));
7145         streamPtr += sizeof(uint32_t);
7146     }
7147     uint64_t cgen_var_0;
7148     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
7149     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7150     *streamPtrPtr += 1 * 8;
7151     uint64_t cgen_var_1;
7152     *&cgen_var_1 = get_host_u64_VkFramebuffer((*&local_framebuffer));
7153     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
7154     *streamPtrPtr += 1 * 8;
7155     // WARNING PTR CHECK
7156     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
7157     memcpy((*streamPtrPtr), &cgen_var_2, 8);
7158     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
7159     *streamPtrPtr += 8;
7160     if (local_pAllocator) {
7161         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
7162                                               (VkAllocationCallbacks*)(local_pAllocator),
7163                                               streamPtrPtr);
7164     }
7165     sResourceTracker->destroyMapping()->mapHandles_VkFramebuffer((VkFramebuffer*)&framebuffer);
7166     stream->flush();
7167     ++encodeCount;
7168     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7169         pool->freeAll();
7170         stream->clearPool();
7171     }
7172     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7173 }
7174 
vkCreateRenderPass(VkDevice device,const VkRenderPassCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkRenderPass * pRenderPass,uint32_t doLock)7175 VkResult VkEncoder::vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo,
7176                                        const VkAllocationCallbacks* pAllocator,
7177                                        VkRenderPass* pRenderPass, uint32_t doLock) {
7178     (void)doLock;
7179     bool queueSubmitWithCommandsEnabled =
7180         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7181     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7182     auto stream = mImpl->stream();
7183     auto pool = mImpl->pool();
7184     VkDevice local_device;
7185     VkRenderPassCreateInfo* local_pCreateInfo;
7186     VkAllocationCallbacks* local_pAllocator;
7187     local_device = device;
7188     local_pCreateInfo = nullptr;
7189     if (pCreateInfo) {
7190         local_pCreateInfo =
7191             (VkRenderPassCreateInfo*)pool->alloc(sizeof(const VkRenderPassCreateInfo));
7192         deepcopy_VkRenderPassCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
7193                                         (VkRenderPassCreateInfo*)(local_pCreateInfo));
7194     }
7195     local_pAllocator = nullptr;
7196     if (pAllocator) {
7197         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
7198         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
7199                                        (VkAllocationCallbacks*)(local_pAllocator));
7200     }
7201     local_pAllocator = nullptr;
7202     if (local_pCreateInfo) {
7203         transform_tohost_VkRenderPassCreateInfo(sResourceTracker,
7204                                                 (VkRenderPassCreateInfo*)(local_pCreateInfo));
7205     }
7206     if (local_pAllocator) {
7207         transform_tohost_VkAllocationCallbacks(sResourceTracker,
7208                                                (VkAllocationCallbacks*)(local_pAllocator));
7209     }
7210     size_t count = 0;
7211     size_t* countPtr = &count;
7212     {
7213         uint64_t cgen_var_0;
7214         *countPtr += 1 * 8;
7215         count_VkRenderPassCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
7216                                      (VkRenderPassCreateInfo*)(local_pCreateInfo), countPtr);
7217         // WARNING PTR CHECK
7218         *countPtr += 8;
7219         if (local_pAllocator) {
7220             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
7221                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
7222         }
7223         uint64_t cgen_var_1;
7224         *countPtr += 8;
7225     }
7226     uint32_t packetSize_vkCreateRenderPass =
7227         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
7228     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateRenderPass);
7229     uint8_t* packetBeginPtr = streamPtr;
7230     uint8_t** streamPtrPtr = &streamPtr;
7231     uint32_t opcode_vkCreateRenderPass = OP_vkCreateRenderPass;
7232     uint32_t seqno;
7233     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
7234     memcpy(streamPtr, &opcode_vkCreateRenderPass, sizeof(uint32_t));
7235     streamPtr += sizeof(uint32_t);
7236     memcpy(streamPtr, &packetSize_vkCreateRenderPass, sizeof(uint32_t));
7237     streamPtr += sizeof(uint32_t);
7238     if (queueSubmitWithCommandsEnabled) {
7239         memcpy(streamPtr, &seqno, sizeof(uint32_t));
7240         streamPtr += sizeof(uint32_t);
7241     }
7242     uint64_t cgen_var_0;
7243     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
7244     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7245     *streamPtrPtr += 1 * 8;
7246     reservedmarshal_VkRenderPassCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
7247                                            (VkRenderPassCreateInfo*)(local_pCreateInfo),
7248                                            streamPtrPtr);
7249     // WARNING PTR CHECK
7250     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
7251     memcpy((*streamPtrPtr), &cgen_var_1, 8);
7252     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
7253     *streamPtrPtr += 8;
7254     if (local_pAllocator) {
7255         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
7256                                               (VkAllocationCallbacks*)(local_pAllocator),
7257                                               streamPtrPtr);
7258     }
7259     /* is handle, possibly out */;
7260     uint64_t cgen_var_2;
7261     *&cgen_var_2 = (uint64_t)((*pRenderPass));
7262     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
7263     *streamPtrPtr += 8;
7264     /* is handle, possibly out */;
7265     stream->setHandleMapping(sResourceTracker->createMapping());
7266     uint64_t cgen_var_3;
7267     stream->read((uint64_t*)&cgen_var_3, 8);
7268     stream->handleMapping()->mapHandles_u64_VkRenderPass(&cgen_var_3, (VkRenderPass*)pRenderPass,
7269                                                          1);
7270     stream->unsetHandleMapping();
7271     VkResult vkCreateRenderPass_VkResult_return = (VkResult)0;
7272     stream->read(&vkCreateRenderPass_VkResult_return, sizeof(VkResult));
7273     ++encodeCount;
7274     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7275         pool->freeAll();
7276         stream->clearPool();
7277     }
7278     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7279     return vkCreateRenderPass_VkResult_return;
7280 }
7281 
vkDestroyRenderPass(VkDevice device,VkRenderPass renderPass,const VkAllocationCallbacks * pAllocator,uint32_t doLock)7282 void VkEncoder::vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass,
7283                                     const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
7284     (void)doLock;
7285     bool queueSubmitWithCommandsEnabled =
7286         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7287     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7288     auto stream = mImpl->stream();
7289     auto pool = mImpl->pool();
7290     VkDevice local_device;
7291     VkRenderPass local_renderPass;
7292     VkAllocationCallbacks* local_pAllocator;
7293     local_device = device;
7294     local_renderPass = renderPass;
7295     local_pAllocator = nullptr;
7296     if (pAllocator) {
7297         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
7298         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
7299                                        (VkAllocationCallbacks*)(local_pAllocator));
7300     }
7301     local_pAllocator = nullptr;
7302     if (local_pAllocator) {
7303         transform_tohost_VkAllocationCallbacks(sResourceTracker,
7304                                                (VkAllocationCallbacks*)(local_pAllocator));
7305     }
7306     size_t count = 0;
7307     size_t* countPtr = &count;
7308     {
7309         uint64_t cgen_var_0;
7310         *countPtr += 1 * 8;
7311         uint64_t cgen_var_1;
7312         *countPtr += 1 * 8;
7313         // WARNING PTR CHECK
7314         *countPtr += 8;
7315         if (local_pAllocator) {
7316             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
7317                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
7318         }
7319     }
7320     uint32_t packetSize_vkDestroyRenderPass =
7321         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
7322     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyRenderPass);
7323     uint8_t* packetBeginPtr = streamPtr;
7324     uint8_t** streamPtrPtr = &streamPtr;
7325     uint32_t opcode_vkDestroyRenderPass = OP_vkDestroyRenderPass;
7326     uint32_t seqno;
7327     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
7328     memcpy(streamPtr, &opcode_vkDestroyRenderPass, sizeof(uint32_t));
7329     streamPtr += sizeof(uint32_t);
7330     memcpy(streamPtr, &packetSize_vkDestroyRenderPass, sizeof(uint32_t));
7331     streamPtr += sizeof(uint32_t);
7332     if (queueSubmitWithCommandsEnabled) {
7333         memcpy(streamPtr, &seqno, sizeof(uint32_t));
7334         streamPtr += sizeof(uint32_t);
7335     }
7336     uint64_t cgen_var_0;
7337     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
7338     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7339     *streamPtrPtr += 1 * 8;
7340     uint64_t cgen_var_1;
7341     *&cgen_var_1 = get_host_u64_VkRenderPass((*&local_renderPass));
7342     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
7343     *streamPtrPtr += 1 * 8;
7344     // WARNING PTR CHECK
7345     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
7346     memcpy((*streamPtrPtr), &cgen_var_2, 8);
7347     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
7348     *streamPtrPtr += 8;
7349     if (local_pAllocator) {
7350         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
7351                                               (VkAllocationCallbacks*)(local_pAllocator),
7352                                               streamPtrPtr);
7353     }
7354     sResourceTracker->destroyMapping()->mapHandles_VkRenderPass((VkRenderPass*)&renderPass);
7355     stream->flush();
7356     ++encodeCount;
7357     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7358         pool->freeAll();
7359         stream->clearPool();
7360     }
7361     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7362 }
7363 
vkGetRenderAreaGranularity(VkDevice device,VkRenderPass renderPass,VkExtent2D * pGranularity,uint32_t doLock)7364 void VkEncoder::vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass,
7365                                            VkExtent2D* pGranularity, uint32_t doLock) {
7366     (void)doLock;
7367     bool queueSubmitWithCommandsEnabled =
7368         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7369     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7370     auto stream = mImpl->stream();
7371     auto pool = mImpl->pool();
7372     VkDevice local_device;
7373     VkRenderPass local_renderPass;
7374     local_device = device;
7375     local_renderPass = renderPass;
7376     size_t count = 0;
7377     size_t* countPtr = &count;
7378     {
7379         uint64_t cgen_var_0;
7380         *countPtr += 1 * 8;
7381         uint64_t cgen_var_1;
7382         *countPtr += 1 * 8;
7383         count_VkExtent2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pGranularity),
7384                          countPtr);
7385     }
7386     uint32_t packetSize_vkGetRenderAreaGranularity =
7387         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
7388     uint8_t* streamPtr = stream->reserve(packetSize_vkGetRenderAreaGranularity);
7389     uint8_t* packetBeginPtr = streamPtr;
7390     uint8_t** streamPtrPtr = &streamPtr;
7391     uint32_t opcode_vkGetRenderAreaGranularity = OP_vkGetRenderAreaGranularity;
7392     uint32_t seqno;
7393     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
7394     memcpy(streamPtr, &opcode_vkGetRenderAreaGranularity, sizeof(uint32_t));
7395     streamPtr += sizeof(uint32_t);
7396     memcpy(streamPtr, &packetSize_vkGetRenderAreaGranularity, sizeof(uint32_t));
7397     streamPtr += sizeof(uint32_t);
7398     if (queueSubmitWithCommandsEnabled) {
7399         memcpy(streamPtr, &seqno, sizeof(uint32_t));
7400         streamPtr += sizeof(uint32_t);
7401     }
7402     uint64_t cgen_var_0;
7403     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
7404     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7405     *streamPtrPtr += 1 * 8;
7406     uint64_t cgen_var_1;
7407     *&cgen_var_1 = get_host_u64_VkRenderPass((*&local_renderPass));
7408     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
7409     *streamPtrPtr += 1 * 8;
7410     reservedmarshal_VkExtent2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pGranularity),
7411                                streamPtrPtr);
7412     unmarshal_VkExtent2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pGranularity));
7413     if (pGranularity) {
7414         transform_fromhost_VkExtent2D(sResourceTracker, (VkExtent2D*)(pGranularity));
7415     }
7416     ++encodeCount;
7417     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7418         pool->freeAll();
7419         stream->clearPool();
7420     }
7421     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7422 }
7423 
vkCreateCommandPool(VkDevice device,const VkCommandPoolCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkCommandPool * pCommandPool,uint32_t doLock)7424 VkResult VkEncoder::vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo,
7425                                         const VkAllocationCallbacks* pAllocator,
7426                                         VkCommandPool* pCommandPool, uint32_t doLock) {
7427     (void)doLock;
7428     bool queueSubmitWithCommandsEnabled =
7429         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7430     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7431     auto stream = mImpl->stream();
7432     auto pool = mImpl->pool();
7433     VkDevice local_device;
7434     VkCommandPoolCreateInfo* local_pCreateInfo;
7435     VkAllocationCallbacks* local_pAllocator;
7436     local_device = device;
7437     local_pCreateInfo = nullptr;
7438     if (pCreateInfo) {
7439         local_pCreateInfo =
7440             (VkCommandPoolCreateInfo*)pool->alloc(sizeof(const VkCommandPoolCreateInfo));
7441         deepcopy_VkCommandPoolCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
7442                                          (VkCommandPoolCreateInfo*)(local_pCreateInfo));
7443     }
7444     local_pAllocator = nullptr;
7445     if (pAllocator) {
7446         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
7447         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
7448                                        (VkAllocationCallbacks*)(local_pAllocator));
7449     }
7450     local_pAllocator = nullptr;
7451     if (local_pCreateInfo) {
7452         transform_tohost_VkCommandPoolCreateInfo(sResourceTracker,
7453                                                  (VkCommandPoolCreateInfo*)(local_pCreateInfo));
7454     }
7455     if (local_pAllocator) {
7456         transform_tohost_VkAllocationCallbacks(sResourceTracker,
7457                                                (VkAllocationCallbacks*)(local_pAllocator));
7458     }
7459     size_t count = 0;
7460     size_t* countPtr = &count;
7461     {
7462         uint64_t cgen_var_0;
7463         *countPtr += 1 * 8;
7464         count_VkCommandPoolCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
7465                                       (VkCommandPoolCreateInfo*)(local_pCreateInfo), countPtr);
7466         // WARNING PTR CHECK
7467         *countPtr += 8;
7468         if (local_pAllocator) {
7469             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
7470                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
7471         }
7472         uint64_t cgen_var_1;
7473         *countPtr += 8;
7474     }
7475     uint32_t packetSize_vkCreateCommandPool =
7476         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
7477     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateCommandPool);
7478     uint8_t* packetBeginPtr = streamPtr;
7479     uint8_t** streamPtrPtr = &streamPtr;
7480     uint32_t opcode_vkCreateCommandPool = OP_vkCreateCommandPool;
7481     uint32_t seqno;
7482     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
7483     memcpy(streamPtr, &opcode_vkCreateCommandPool, sizeof(uint32_t));
7484     streamPtr += sizeof(uint32_t);
7485     memcpy(streamPtr, &packetSize_vkCreateCommandPool, sizeof(uint32_t));
7486     streamPtr += sizeof(uint32_t);
7487     if (queueSubmitWithCommandsEnabled) {
7488         memcpy(streamPtr, &seqno, sizeof(uint32_t));
7489         streamPtr += sizeof(uint32_t);
7490     }
7491     uint64_t cgen_var_0;
7492     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
7493     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7494     *streamPtrPtr += 1 * 8;
7495     reservedmarshal_VkCommandPoolCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
7496                                             (VkCommandPoolCreateInfo*)(local_pCreateInfo),
7497                                             streamPtrPtr);
7498     // WARNING PTR CHECK
7499     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
7500     memcpy((*streamPtrPtr), &cgen_var_1, 8);
7501     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
7502     *streamPtrPtr += 8;
7503     if (local_pAllocator) {
7504         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
7505                                               (VkAllocationCallbacks*)(local_pAllocator),
7506                                               streamPtrPtr);
7507     }
7508     /* is handle, possibly out */;
7509     uint64_t cgen_var_2;
7510     *&cgen_var_2 = (uint64_t)((*pCommandPool));
7511     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
7512     *streamPtrPtr += 8;
7513     /* is handle, possibly out */;
7514     stream->setHandleMapping(sResourceTracker->createMapping());
7515     uint64_t cgen_var_3;
7516     stream->read((uint64_t*)&cgen_var_3, 8);
7517     stream->handleMapping()->mapHandles_u64_VkCommandPool(&cgen_var_3, (VkCommandPool*)pCommandPool,
7518                                                           1);
7519     stream->unsetHandleMapping();
7520     VkResult vkCreateCommandPool_VkResult_return = (VkResult)0;
7521     stream->read(&vkCreateCommandPool_VkResult_return, sizeof(VkResult));
7522     ++encodeCount;
7523     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7524         pool->freeAll();
7525         stream->clearPool();
7526     }
7527     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7528     return vkCreateCommandPool_VkResult_return;
7529 }
7530 
vkDestroyCommandPool(VkDevice device,VkCommandPool commandPool,const VkAllocationCallbacks * pAllocator,uint32_t doLock)7531 void VkEncoder::vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool,
7532                                      const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
7533     (void)doLock;
7534     bool queueSubmitWithCommandsEnabled =
7535         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7536     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7537     auto stream = mImpl->stream();
7538     auto pool = mImpl->pool();
7539     VkDevice local_device;
7540     VkCommandPool local_commandPool;
7541     VkAllocationCallbacks* local_pAllocator;
7542     local_device = device;
7543     local_commandPool = commandPool;
7544     local_pAllocator = nullptr;
7545     if (pAllocator) {
7546         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
7547         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
7548                                        (VkAllocationCallbacks*)(local_pAllocator));
7549     }
7550     local_pAllocator = nullptr;
7551     if (local_pAllocator) {
7552         transform_tohost_VkAllocationCallbacks(sResourceTracker,
7553                                                (VkAllocationCallbacks*)(local_pAllocator));
7554     }
7555     size_t count = 0;
7556     size_t* countPtr = &count;
7557     {
7558         uint64_t cgen_var_0;
7559         *countPtr += 1 * 8;
7560         uint64_t cgen_var_1;
7561         *countPtr += 1 * 8;
7562         // WARNING PTR CHECK
7563         *countPtr += 8;
7564         if (local_pAllocator) {
7565             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
7566                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
7567         }
7568     }
7569     uint32_t packetSize_vkDestroyCommandPool =
7570         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
7571     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyCommandPool);
7572     uint8_t* packetBeginPtr = streamPtr;
7573     uint8_t** streamPtrPtr = &streamPtr;
7574     uint32_t opcode_vkDestroyCommandPool = OP_vkDestroyCommandPool;
7575     uint32_t seqno;
7576     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
7577     memcpy(streamPtr, &opcode_vkDestroyCommandPool, sizeof(uint32_t));
7578     streamPtr += sizeof(uint32_t);
7579     memcpy(streamPtr, &packetSize_vkDestroyCommandPool, sizeof(uint32_t));
7580     streamPtr += sizeof(uint32_t);
7581     if (queueSubmitWithCommandsEnabled) {
7582         memcpy(streamPtr, &seqno, sizeof(uint32_t));
7583         streamPtr += sizeof(uint32_t);
7584     }
7585     uint64_t cgen_var_0;
7586     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
7587     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7588     *streamPtrPtr += 1 * 8;
7589     uint64_t cgen_var_1;
7590     *&cgen_var_1 = get_host_u64_VkCommandPool((*&local_commandPool));
7591     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
7592     *streamPtrPtr += 1 * 8;
7593     // WARNING PTR CHECK
7594     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
7595     memcpy((*streamPtrPtr), &cgen_var_2, 8);
7596     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
7597     *streamPtrPtr += 8;
7598     if (local_pAllocator) {
7599         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
7600                                               (VkAllocationCallbacks*)(local_pAllocator),
7601                                               streamPtrPtr);
7602     }
7603     sResourceTracker->destroyMapping()->mapHandles_VkCommandPool((VkCommandPool*)&commandPool);
7604     stream->flush();
7605     ++encodeCount;
7606     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7607         pool->freeAll();
7608         stream->clearPool();
7609     }
7610     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7611 }
7612 
vkResetCommandPool(VkDevice device,VkCommandPool commandPool,VkCommandPoolResetFlags flags,uint32_t doLock)7613 VkResult VkEncoder::vkResetCommandPool(VkDevice device, VkCommandPool commandPool,
7614                                        VkCommandPoolResetFlags flags, uint32_t doLock) {
7615     (void)doLock;
7616     bool queueSubmitWithCommandsEnabled =
7617         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7618     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7619     auto stream = mImpl->stream();
7620     auto pool = mImpl->pool();
7621     VkDevice local_device;
7622     VkCommandPool local_commandPool;
7623     VkCommandPoolResetFlags local_flags;
7624     local_device = device;
7625     local_commandPool = commandPool;
7626     local_flags = flags;
7627     size_t count = 0;
7628     size_t* countPtr = &count;
7629     {
7630         uint64_t cgen_var_0;
7631         *countPtr += 1 * 8;
7632         uint64_t cgen_var_1;
7633         *countPtr += 1 * 8;
7634         *countPtr += sizeof(VkCommandPoolResetFlags);
7635     }
7636     uint32_t packetSize_vkResetCommandPool =
7637         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
7638     uint8_t* streamPtr = stream->reserve(packetSize_vkResetCommandPool);
7639     uint8_t* packetBeginPtr = streamPtr;
7640     uint8_t** streamPtrPtr = &streamPtr;
7641     uint32_t opcode_vkResetCommandPool = OP_vkResetCommandPool;
7642     uint32_t seqno;
7643     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
7644     memcpy(streamPtr, &opcode_vkResetCommandPool, sizeof(uint32_t));
7645     streamPtr += sizeof(uint32_t);
7646     memcpy(streamPtr, &packetSize_vkResetCommandPool, sizeof(uint32_t));
7647     streamPtr += sizeof(uint32_t);
7648     if (queueSubmitWithCommandsEnabled) {
7649         memcpy(streamPtr, &seqno, sizeof(uint32_t));
7650         streamPtr += sizeof(uint32_t);
7651     }
7652     uint64_t cgen_var_0;
7653     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
7654     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7655     *streamPtrPtr += 1 * 8;
7656     uint64_t cgen_var_1;
7657     *&cgen_var_1 = get_host_u64_VkCommandPool((*&local_commandPool));
7658     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
7659     *streamPtrPtr += 1 * 8;
7660     memcpy(*streamPtrPtr, (VkCommandPoolResetFlags*)&local_flags, sizeof(VkCommandPoolResetFlags));
7661     *streamPtrPtr += sizeof(VkCommandPoolResetFlags);
7662     VkResult vkResetCommandPool_VkResult_return = (VkResult)0;
7663     stream->read(&vkResetCommandPool_VkResult_return, sizeof(VkResult));
7664     ++encodeCount;
7665     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7666         pool->freeAll();
7667         stream->clearPool();
7668     }
7669     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7670     return vkResetCommandPool_VkResult_return;
7671 }
7672 
vkAllocateCommandBuffers(VkDevice device,const VkCommandBufferAllocateInfo * pAllocateInfo,VkCommandBuffer * pCommandBuffers,uint32_t doLock)7673 VkResult VkEncoder::vkAllocateCommandBuffers(VkDevice device,
7674                                              const VkCommandBufferAllocateInfo* pAllocateInfo,
7675                                              VkCommandBuffer* pCommandBuffers, uint32_t doLock) {
7676     (void)doLock;
7677     bool queueSubmitWithCommandsEnabled =
7678         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7679     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7680     auto stream = mImpl->stream();
7681     auto pool = mImpl->pool();
7682     VkDevice local_device;
7683     VkCommandBufferAllocateInfo* local_pAllocateInfo;
7684     local_device = device;
7685     local_pAllocateInfo = nullptr;
7686     if (pAllocateInfo) {
7687         local_pAllocateInfo =
7688             (VkCommandBufferAllocateInfo*)pool->alloc(sizeof(const VkCommandBufferAllocateInfo));
7689         deepcopy_VkCommandBufferAllocateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocateInfo,
7690                                              (VkCommandBufferAllocateInfo*)(local_pAllocateInfo));
7691     }
7692     if (local_pAllocateInfo) {
7693         transform_tohost_VkCommandBufferAllocateInfo(
7694             sResourceTracker, (VkCommandBufferAllocateInfo*)(local_pAllocateInfo));
7695     }
7696     size_t count = 0;
7697     size_t* countPtr = &count;
7698     {
7699         uint64_t cgen_var_0;
7700         *countPtr += 1 * 8;
7701         count_VkCommandBufferAllocateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
7702                                           (VkCommandBufferAllocateInfo*)(local_pAllocateInfo),
7703                                           countPtr);
7704         if (pAllocateInfo->commandBufferCount) {
7705             *countPtr += pAllocateInfo->commandBufferCount * 8;
7706         }
7707     }
7708     uint32_t packetSize_vkAllocateCommandBuffers =
7709         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
7710     uint8_t* streamPtr = stream->reserve(packetSize_vkAllocateCommandBuffers);
7711     uint8_t* packetBeginPtr = streamPtr;
7712     uint8_t** streamPtrPtr = &streamPtr;
7713     uint32_t opcode_vkAllocateCommandBuffers = OP_vkAllocateCommandBuffers;
7714     uint32_t seqno;
7715     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
7716     memcpy(streamPtr, &opcode_vkAllocateCommandBuffers, sizeof(uint32_t));
7717     streamPtr += sizeof(uint32_t);
7718     memcpy(streamPtr, &packetSize_vkAllocateCommandBuffers, sizeof(uint32_t));
7719     streamPtr += sizeof(uint32_t);
7720     if (queueSubmitWithCommandsEnabled) {
7721         memcpy(streamPtr, &seqno, sizeof(uint32_t));
7722         streamPtr += sizeof(uint32_t);
7723     }
7724     uint64_t cgen_var_0;
7725     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
7726     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7727     *streamPtrPtr += 1 * 8;
7728     reservedmarshal_VkCommandBufferAllocateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
7729                                                 (VkCommandBufferAllocateInfo*)(local_pAllocateInfo),
7730                                                 streamPtrPtr);
7731     /* is handle, possibly out */;
7732     if (pAllocateInfo->commandBufferCount) {
7733         uint8_t* cgen_var_1_ptr = (uint8_t*)(*streamPtrPtr);
7734         for (uint32_t k = 0; k < pAllocateInfo->commandBufferCount; ++k) {
7735             uint64_t tmpval = (uint64_t)(pCommandBuffers[k]);
7736             memcpy(cgen_var_1_ptr + k * 8, &tmpval, sizeof(uint64_t));
7737         }
7738         *streamPtrPtr += 8 * pAllocateInfo->commandBufferCount;
7739     }
7740     /* is handle, possibly out */;
7741     stream->setHandleMapping(sResourceTracker->createMapping());
7742     if (pAllocateInfo->commandBufferCount) {
7743         uint64_t* cgen_var_2;
7744         stream->alloc((void**)&cgen_var_2, pAllocateInfo->commandBufferCount * 8);
7745         stream->read((uint64_t*)cgen_var_2, pAllocateInfo->commandBufferCount * 8);
7746         stream->handleMapping()->mapHandles_u64_VkCommandBuffer(
7747             cgen_var_2, (VkCommandBuffer*)pCommandBuffers, pAllocateInfo->commandBufferCount);
7748     }
7749     stream->unsetHandleMapping();
7750     VkResult vkAllocateCommandBuffers_VkResult_return = (VkResult)0;
7751     stream->read(&vkAllocateCommandBuffers_VkResult_return, sizeof(VkResult));
7752     ++encodeCount;
7753     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7754         pool->freeAll();
7755         stream->clearPool();
7756     }
7757     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7758     return vkAllocateCommandBuffers_VkResult_return;
7759 }
7760 
vkFreeCommandBuffers(VkDevice device,VkCommandPool commandPool,uint32_t commandBufferCount,const VkCommandBuffer * pCommandBuffers,uint32_t doLock)7761 void VkEncoder::vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool,
7762                                      uint32_t commandBufferCount,
7763                                      const VkCommandBuffer* pCommandBuffers, uint32_t doLock) {
7764     (void)doLock;
7765     bool queueSubmitWithCommandsEnabled =
7766         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7767     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7768     auto stream = mImpl->stream();
7769     auto pool = mImpl->pool();
7770     VkDevice local_device;
7771     VkCommandPool local_commandPool;
7772     uint32_t local_commandBufferCount;
7773     VkCommandBuffer* local_pCommandBuffers;
7774     local_device = device;
7775     local_commandPool = commandPool;
7776     local_commandBufferCount = commandBufferCount;
7777     // Avoiding deepcopy for pCommandBuffers
7778     local_pCommandBuffers = (VkCommandBuffer*)pCommandBuffers;
7779     size_t count = 0;
7780     size_t* countPtr = &count;
7781     {
7782         uint64_t cgen_var_0;
7783         *countPtr += 1 * 8;
7784         uint64_t cgen_var_1;
7785         *countPtr += 1 * 8;
7786         *countPtr += sizeof(uint32_t);
7787         // WARNING PTR CHECK
7788         *countPtr += 8;
7789         if (local_pCommandBuffers) {
7790             if (((commandBufferCount))) {
7791                 *countPtr += ((commandBufferCount)) * 8;
7792             }
7793         }
7794     }
7795     uint32_t packetSize_vkFreeCommandBuffers =
7796         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
7797     uint8_t* streamPtr = stream->reserve(packetSize_vkFreeCommandBuffers);
7798     uint8_t* packetBeginPtr = streamPtr;
7799     uint8_t** streamPtrPtr = &streamPtr;
7800     uint32_t opcode_vkFreeCommandBuffers = OP_vkFreeCommandBuffers;
7801     uint32_t seqno;
7802     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
7803     memcpy(streamPtr, &opcode_vkFreeCommandBuffers, sizeof(uint32_t));
7804     streamPtr += sizeof(uint32_t);
7805     memcpy(streamPtr, &packetSize_vkFreeCommandBuffers, sizeof(uint32_t));
7806     streamPtr += sizeof(uint32_t);
7807     if (queueSubmitWithCommandsEnabled) {
7808         memcpy(streamPtr, &seqno, sizeof(uint32_t));
7809         streamPtr += sizeof(uint32_t);
7810     }
7811     uint64_t cgen_var_0;
7812     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
7813     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7814     *streamPtrPtr += 1 * 8;
7815     uint64_t cgen_var_1;
7816     *&cgen_var_1 = get_host_u64_VkCommandPool((*&local_commandPool));
7817     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
7818     *streamPtrPtr += 1 * 8;
7819     memcpy(*streamPtrPtr, (uint32_t*)&local_commandBufferCount, sizeof(uint32_t));
7820     *streamPtrPtr += sizeof(uint32_t);
7821     // WARNING PTR CHECK
7822     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pCommandBuffers;
7823     memcpy((*streamPtrPtr), &cgen_var_2, 8);
7824     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
7825     *streamPtrPtr += 8;
7826     if (local_pCommandBuffers) {
7827         if (((commandBufferCount))) {
7828             uint8_t* cgen_var_2_0_ptr = (uint8_t*)(*streamPtrPtr);
7829             for (uint32_t k = 0; k < ((commandBufferCount)); ++k) {
7830                 uint64_t tmpval = get_host_u64_VkCommandBuffer(local_pCommandBuffers[k]);
7831                 memcpy(cgen_var_2_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
7832             }
7833             *streamPtrPtr += 8 * ((commandBufferCount));
7834         }
7835     }
7836     if (pCommandBuffers) {
7837         sResourceTracker->destroyMapping()->mapHandles_VkCommandBuffer(
7838             (VkCommandBuffer*)pCommandBuffers, ((commandBufferCount)));
7839     }
7840     stream->flush();
7841     ++encodeCount;
7842     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7843         pool->freeAll();
7844         stream->clearPool();
7845     }
7846     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7847 }
7848 
vkBeginCommandBuffer(VkCommandBuffer commandBuffer,const VkCommandBufferBeginInfo * pBeginInfo,uint32_t doLock)7849 VkResult VkEncoder::vkBeginCommandBuffer(VkCommandBuffer commandBuffer,
7850                                          const VkCommandBufferBeginInfo* pBeginInfo,
7851                                          uint32_t doLock) {
7852     (void)doLock;
7853     bool queueSubmitWithCommandsEnabled =
7854         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7855     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7856     auto stream = mImpl->stream();
7857     auto pool = mImpl->pool();
7858     VkCommandBuffer local_commandBuffer;
7859     VkCommandBufferBeginInfo* local_pBeginInfo;
7860     local_commandBuffer = commandBuffer;
7861     local_pBeginInfo = nullptr;
7862     if (pBeginInfo) {
7863         local_pBeginInfo =
7864             (VkCommandBufferBeginInfo*)pool->alloc(sizeof(const VkCommandBufferBeginInfo));
7865         deepcopy_VkCommandBufferBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBeginInfo,
7866                                           (VkCommandBufferBeginInfo*)(local_pBeginInfo));
7867     }
7868     if (local_pBeginInfo) {
7869         transform_tohost_VkCommandBufferBeginInfo(sResourceTracker,
7870                                                   (VkCommandBufferBeginInfo*)(local_pBeginInfo));
7871     }
7872     size_t count = 0;
7873     size_t* countPtr = &count;
7874     {
7875         uint64_t cgen_var_0;
7876         *countPtr += 1 * 8;
7877         count_VkCommandBufferBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
7878                                        (VkCommandBufferBeginInfo*)(local_pBeginInfo), countPtr);
7879     }
7880     uint32_t packetSize_vkBeginCommandBuffer = 4 + 4 + count;
7881     if (queueSubmitWithCommandsEnabled) packetSize_vkBeginCommandBuffer -= 8;
7882     uint8_t* streamPtr = stream->reserve(packetSize_vkBeginCommandBuffer);
7883     uint8_t* packetBeginPtr = streamPtr;
7884     uint8_t** streamPtrPtr = &streamPtr;
7885     uint32_t opcode_vkBeginCommandBuffer = OP_vkBeginCommandBuffer;
7886     memcpy(streamPtr, &opcode_vkBeginCommandBuffer, sizeof(uint32_t));
7887     streamPtr += sizeof(uint32_t);
7888     memcpy(streamPtr, &packetSize_vkBeginCommandBuffer, sizeof(uint32_t));
7889     streamPtr += sizeof(uint32_t);
7890     if (!queueSubmitWithCommandsEnabled) {
7891         uint64_t cgen_var_0;
7892         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
7893         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7894         *streamPtrPtr += 1 * 8;
7895     }
7896     reservedmarshal_VkCommandBufferBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
7897                                              (VkCommandBufferBeginInfo*)(local_pBeginInfo),
7898                                              streamPtrPtr);
7899     VkResult vkBeginCommandBuffer_VkResult_return = (VkResult)0;
7900     stream->read(&vkBeginCommandBuffer_VkResult_return, sizeof(VkResult));
7901     ++encodeCount;
7902     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7903         pool->freeAll();
7904         stream->clearPool();
7905     }
7906     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7907     return vkBeginCommandBuffer_VkResult_return;
7908 }
7909 
vkEndCommandBuffer(VkCommandBuffer commandBuffer,uint32_t doLock)7910 VkResult VkEncoder::vkEndCommandBuffer(VkCommandBuffer commandBuffer, uint32_t doLock) {
7911     (void)doLock;
7912     bool queueSubmitWithCommandsEnabled =
7913         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7914     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7915     auto stream = mImpl->stream();
7916     auto pool = mImpl->pool();
7917     VkCommandBuffer local_commandBuffer;
7918     local_commandBuffer = commandBuffer;
7919     size_t count = 0;
7920     size_t* countPtr = &count;
7921     {
7922         uint64_t cgen_var_0;
7923         *countPtr += 1 * 8;
7924     }
7925     uint32_t packetSize_vkEndCommandBuffer = 4 + 4 + count;
7926     if (queueSubmitWithCommandsEnabled) packetSize_vkEndCommandBuffer -= 8;
7927     uint8_t* streamPtr = stream->reserve(packetSize_vkEndCommandBuffer);
7928     uint8_t* packetBeginPtr = streamPtr;
7929     uint8_t** streamPtrPtr = &streamPtr;
7930     uint32_t opcode_vkEndCommandBuffer = OP_vkEndCommandBuffer;
7931     memcpy(streamPtr, &opcode_vkEndCommandBuffer, sizeof(uint32_t));
7932     streamPtr += sizeof(uint32_t);
7933     memcpy(streamPtr, &packetSize_vkEndCommandBuffer, sizeof(uint32_t));
7934     streamPtr += sizeof(uint32_t);
7935     if (!queueSubmitWithCommandsEnabled) {
7936         uint64_t cgen_var_0;
7937         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
7938         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7939         *streamPtrPtr += 1 * 8;
7940     }
7941     VkResult vkEndCommandBuffer_VkResult_return = (VkResult)0;
7942     stream->read(&vkEndCommandBuffer_VkResult_return, sizeof(VkResult));
7943     ++encodeCount;
7944     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7945         pool->freeAll();
7946         stream->clearPool();
7947     }
7948     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7949     return vkEndCommandBuffer_VkResult_return;
7950 }
7951 
vkResetCommandBuffer(VkCommandBuffer commandBuffer,VkCommandBufferResetFlags flags,uint32_t doLock)7952 VkResult VkEncoder::vkResetCommandBuffer(VkCommandBuffer commandBuffer,
7953                                          VkCommandBufferResetFlags flags, uint32_t doLock) {
7954     (void)doLock;
7955     bool queueSubmitWithCommandsEnabled =
7956         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
7957     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
7958     auto stream = mImpl->stream();
7959     auto pool = mImpl->pool();
7960     VkCommandBuffer local_commandBuffer;
7961     VkCommandBufferResetFlags local_flags;
7962     local_commandBuffer = commandBuffer;
7963     local_flags = flags;
7964     size_t count = 0;
7965     size_t* countPtr = &count;
7966     {
7967         uint64_t cgen_var_0;
7968         *countPtr += 1 * 8;
7969         *countPtr += sizeof(VkCommandBufferResetFlags);
7970     }
7971     uint32_t packetSize_vkResetCommandBuffer = 4 + 4 + count;
7972     if (queueSubmitWithCommandsEnabled) packetSize_vkResetCommandBuffer -= 8;
7973     uint8_t* streamPtr = stream->reserve(packetSize_vkResetCommandBuffer);
7974     uint8_t* packetBeginPtr = streamPtr;
7975     uint8_t** streamPtrPtr = &streamPtr;
7976     uint32_t opcode_vkResetCommandBuffer = OP_vkResetCommandBuffer;
7977     memcpy(streamPtr, &opcode_vkResetCommandBuffer, sizeof(uint32_t));
7978     streamPtr += sizeof(uint32_t);
7979     memcpy(streamPtr, &packetSize_vkResetCommandBuffer, sizeof(uint32_t));
7980     streamPtr += sizeof(uint32_t);
7981     if (!queueSubmitWithCommandsEnabled) {
7982         uint64_t cgen_var_0;
7983         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
7984         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
7985         *streamPtrPtr += 1 * 8;
7986     }
7987     memcpy(*streamPtrPtr, (VkCommandBufferResetFlags*)&local_flags,
7988            sizeof(VkCommandBufferResetFlags));
7989     *streamPtrPtr += sizeof(VkCommandBufferResetFlags);
7990     VkResult vkResetCommandBuffer_VkResult_return = (VkResult)0;
7991     stream->read(&vkResetCommandBuffer_VkResult_return, sizeof(VkResult));
7992     ++encodeCount;
7993     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
7994         pool->freeAll();
7995         stream->clearPool();
7996     }
7997     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
7998     return vkResetCommandBuffer_VkResult_return;
7999 }
8000 
vkCmdBindPipeline(VkCommandBuffer commandBuffer,VkPipelineBindPoint pipelineBindPoint,VkPipeline pipeline,uint32_t doLock)8001 void VkEncoder::vkCmdBindPipeline(VkCommandBuffer commandBuffer,
8002                                   VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline,
8003                                   uint32_t doLock) {
8004     (void)doLock;
8005     bool queueSubmitWithCommandsEnabled =
8006         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8007     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8008     auto stream = mImpl->stream();
8009     auto pool = mImpl->pool();
8010     VkCommandBuffer local_commandBuffer;
8011     VkPipelineBindPoint local_pipelineBindPoint;
8012     VkPipeline local_pipeline;
8013     local_commandBuffer = commandBuffer;
8014     local_pipelineBindPoint = pipelineBindPoint;
8015     local_pipeline = pipeline;
8016     size_t count = 0;
8017     size_t* countPtr = &count;
8018     {
8019         uint64_t cgen_var_0;
8020         *countPtr += 1 * 8;
8021         *countPtr += sizeof(VkPipelineBindPoint);
8022         uint64_t cgen_var_1;
8023         *countPtr += 1 * 8;
8024     }
8025     uint32_t packetSize_vkCmdBindPipeline = 4 + 4 + count;
8026     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBindPipeline -= 8;
8027     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindPipeline);
8028     uint8_t* packetBeginPtr = streamPtr;
8029     uint8_t** streamPtrPtr = &streamPtr;
8030     uint32_t opcode_vkCmdBindPipeline = OP_vkCmdBindPipeline;
8031     memcpy(streamPtr, &opcode_vkCmdBindPipeline, sizeof(uint32_t));
8032     streamPtr += sizeof(uint32_t);
8033     memcpy(streamPtr, &packetSize_vkCmdBindPipeline, sizeof(uint32_t));
8034     streamPtr += sizeof(uint32_t);
8035     if (!queueSubmitWithCommandsEnabled) {
8036         uint64_t cgen_var_0;
8037         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8038         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8039         *streamPtrPtr += 1 * 8;
8040     }
8041     memcpy(*streamPtrPtr, (VkPipelineBindPoint*)&local_pipelineBindPoint,
8042            sizeof(VkPipelineBindPoint));
8043     *streamPtrPtr += sizeof(VkPipelineBindPoint);
8044     uint64_t cgen_var_0;
8045     *&cgen_var_0 = get_host_u64_VkPipeline((*&local_pipeline));
8046     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8047     *streamPtrPtr += 1 * 8;
8048     ++encodeCount;
8049     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8050         pool->freeAll();
8051         stream->clearPool();
8052     }
8053     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8054 }
8055 
vkCmdSetViewport(VkCommandBuffer commandBuffer,uint32_t firstViewport,uint32_t viewportCount,const VkViewport * pViewports,uint32_t doLock)8056 void VkEncoder::vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport,
8057                                  uint32_t viewportCount, const VkViewport* pViewports,
8058                                  uint32_t doLock) {
8059     (void)doLock;
8060     bool queueSubmitWithCommandsEnabled =
8061         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8062     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8063     auto stream = mImpl->stream();
8064     auto pool = mImpl->pool();
8065     VkCommandBuffer local_commandBuffer;
8066     uint32_t local_firstViewport;
8067     uint32_t local_viewportCount;
8068     VkViewport* local_pViewports;
8069     local_commandBuffer = commandBuffer;
8070     local_firstViewport = firstViewport;
8071     local_viewportCount = viewportCount;
8072     local_pViewports = nullptr;
8073     if (pViewports) {
8074         local_pViewports = (VkViewport*)pool->alloc(((viewportCount)) * sizeof(const VkViewport));
8075         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
8076             deepcopy_VkViewport(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pViewports + i,
8077                                 (VkViewport*)(local_pViewports + i));
8078         }
8079     }
8080     if (local_pViewports) {
8081         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
8082             transform_tohost_VkViewport(sResourceTracker, (VkViewport*)(local_pViewports + i));
8083         }
8084     }
8085     size_t count = 0;
8086     size_t* countPtr = &count;
8087     {
8088         uint64_t cgen_var_0;
8089         *countPtr += 1 * 8;
8090         *countPtr += sizeof(uint32_t);
8091         *countPtr += sizeof(uint32_t);
8092         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
8093             count_VkViewport(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
8094                              (VkViewport*)(local_pViewports + i), countPtr);
8095         }
8096     }
8097     uint32_t packetSize_vkCmdSetViewport = 4 + 4 + count;
8098     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetViewport -= 8;
8099     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetViewport);
8100     uint8_t* packetBeginPtr = streamPtr;
8101     uint8_t** streamPtrPtr = &streamPtr;
8102     uint32_t opcode_vkCmdSetViewport = OP_vkCmdSetViewport;
8103     memcpy(streamPtr, &opcode_vkCmdSetViewport, sizeof(uint32_t));
8104     streamPtr += sizeof(uint32_t);
8105     memcpy(streamPtr, &packetSize_vkCmdSetViewport, sizeof(uint32_t));
8106     streamPtr += sizeof(uint32_t);
8107     if (!queueSubmitWithCommandsEnabled) {
8108         uint64_t cgen_var_0;
8109         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8110         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8111         *streamPtrPtr += 1 * 8;
8112     }
8113     memcpy(*streamPtrPtr, (uint32_t*)&local_firstViewport, sizeof(uint32_t));
8114     *streamPtrPtr += sizeof(uint32_t);
8115     memcpy(*streamPtrPtr, (uint32_t*)&local_viewportCount, sizeof(uint32_t));
8116     *streamPtrPtr += sizeof(uint32_t);
8117     for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
8118         reservedmarshal_VkViewport(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
8119                                    (VkViewport*)(local_pViewports + i), streamPtrPtr);
8120     }
8121     ++encodeCount;
8122     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8123         pool->freeAll();
8124         stream->clearPool();
8125     }
8126     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8127 }
8128 
vkCmdSetScissor(VkCommandBuffer commandBuffer,uint32_t firstScissor,uint32_t scissorCount,const VkRect2D * pScissors,uint32_t doLock)8129 void VkEncoder::vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor,
8130                                 uint32_t scissorCount, const VkRect2D* pScissors, uint32_t doLock) {
8131     (void)doLock;
8132     bool queueSubmitWithCommandsEnabled =
8133         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8134     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8135     auto stream = mImpl->stream();
8136     auto pool = mImpl->pool();
8137     VkCommandBuffer local_commandBuffer;
8138     uint32_t local_firstScissor;
8139     uint32_t local_scissorCount;
8140     VkRect2D* local_pScissors;
8141     local_commandBuffer = commandBuffer;
8142     local_firstScissor = firstScissor;
8143     local_scissorCount = scissorCount;
8144     local_pScissors = nullptr;
8145     if (pScissors) {
8146         local_pScissors = (VkRect2D*)pool->alloc(((scissorCount)) * sizeof(const VkRect2D));
8147         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
8148             deepcopy_VkRect2D(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pScissors + i,
8149                               (VkRect2D*)(local_pScissors + i));
8150         }
8151     }
8152     if (local_pScissors) {
8153         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
8154             transform_tohost_VkRect2D(sResourceTracker, (VkRect2D*)(local_pScissors + i));
8155         }
8156     }
8157     size_t count = 0;
8158     size_t* countPtr = &count;
8159     {
8160         uint64_t cgen_var_0;
8161         *countPtr += 1 * 8;
8162         *countPtr += sizeof(uint32_t);
8163         *countPtr += sizeof(uint32_t);
8164         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
8165             count_VkRect2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
8166                            (VkRect2D*)(local_pScissors + i), countPtr);
8167         }
8168     }
8169     uint32_t packetSize_vkCmdSetScissor = 4 + 4 + count;
8170     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetScissor -= 8;
8171     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetScissor);
8172     uint8_t* packetBeginPtr = streamPtr;
8173     uint8_t** streamPtrPtr = &streamPtr;
8174     uint32_t opcode_vkCmdSetScissor = OP_vkCmdSetScissor;
8175     memcpy(streamPtr, &opcode_vkCmdSetScissor, sizeof(uint32_t));
8176     streamPtr += sizeof(uint32_t);
8177     memcpy(streamPtr, &packetSize_vkCmdSetScissor, sizeof(uint32_t));
8178     streamPtr += sizeof(uint32_t);
8179     if (!queueSubmitWithCommandsEnabled) {
8180         uint64_t cgen_var_0;
8181         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8182         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8183         *streamPtrPtr += 1 * 8;
8184     }
8185     memcpy(*streamPtrPtr, (uint32_t*)&local_firstScissor, sizeof(uint32_t));
8186     *streamPtrPtr += sizeof(uint32_t);
8187     memcpy(*streamPtrPtr, (uint32_t*)&local_scissorCount, sizeof(uint32_t));
8188     *streamPtrPtr += sizeof(uint32_t);
8189     for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
8190         reservedmarshal_VkRect2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
8191                                  (VkRect2D*)(local_pScissors + i), streamPtrPtr);
8192     }
8193     ++encodeCount;
8194     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8195         pool->freeAll();
8196         stream->clearPool();
8197     }
8198     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8199 }
8200 
vkCmdSetLineWidth(VkCommandBuffer commandBuffer,float lineWidth,uint32_t doLock)8201 void VkEncoder::vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth, uint32_t doLock) {
8202     (void)doLock;
8203     bool queueSubmitWithCommandsEnabled =
8204         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8205     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8206     auto stream = mImpl->stream();
8207     auto pool = mImpl->pool();
8208     VkCommandBuffer local_commandBuffer;
8209     float local_lineWidth;
8210     local_commandBuffer = commandBuffer;
8211     local_lineWidth = lineWidth;
8212     size_t count = 0;
8213     size_t* countPtr = &count;
8214     {
8215         uint64_t cgen_var_0;
8216         *countPtr += 1 * 8;
8217         *countPtr += sizeof(float);
8218     }
8219     uint32_t packetSize_vkCmdSetLineWidth = 4 + 4 + count;
8220     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetLineWidth -= 8;
8221     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetLineWidth);
8222     uint8_t* packetBeginPtr = streamPtr;
8223     uint8_t** streamPtrPtr = &streamPtr;
8224     uint32_t opcode_vkCmdSetLineWidth = OP_vkCmdSetLineWidth;
8225     memcpy(streamPtr, &opcode_vkCmdSetLineWidth, sizeof(uint32_t));
8226     streamPtr += sizeof(uint32_t);
8227     memcpy(streamPtr, &packetSize_vkCmdSetLineWidth, sizeof(uint32_t));
8228     streamPtr += sizeof(uint32_t);
8229     if (!queueSubmitWithCommandsEnabled) {
8230         uint64_t cgen_var_0;
8231         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8232         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8233         *streamPtrPtr += 1 * 8;
8234     }
8235     memcpy(*streamPtrPtr, (float*)&local_lineWidth, sizeof(float));
8236     *streamPtrPtr += sizeof(float);
8237     ++encodeCount;
8238     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8239         pool->freeAll();
8240         stream->clearPool();
8241     }
8242     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8243 }
8244 
vkCmdSetDepthBias(VkCommandBuffer commandBuffer,float depthBiasConstantFactor,float depthBiasClamp,float depthBiasSlopeFactor,uint32_t doLock)8245 void VkEncoder::vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
8246                                   float depthBiasClamp, float depthBiasSlopeFactor,
8247                                   uint32_t doLock) {
8248     (void)doLock;
8249     bool queueSubmitWithCommandsEnabled =
8250         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8251     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8252     auto stream = mImpl->stream();
8253     auto pool = mImpl->pool();
8254     VkCommandBuffer local_commandBuffer;
8255     float local_depthBiasConstantFactor;
8256     float local_depthBiasClamp;
8257     float local_depthBiasSlopeFactor;
8258     local_commandBuffer = commandBuffer;
8259     local_depthBiasConstantFactor = depthBiasConstantFactor;
8260     local_depthBiasClamp = depthBiasClamp;
8261     local_depthBiasSlopeFactor = depthBiasSlopeFactor;
8262     size_t count = 0;
8263     size_t* countPtr = &count;
8264     {
8265         uint64_t cgen_var_0;
8266         *countPtr += 1 * 8;
8267         *countPtr += sizeof(float);
8268         *countPtr += sizeof(float);
8269         *countPtr += sizeof(float);
8270     }
8271     uint32_t packetSize_vkCmdSetDepthBias = 4 + 4 + count;
8272     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthBias -= 8;
8273     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthBias);
8274     uint8_t* packetBeginPtr = streamPtr;
8275     uint8_t** streamPtrPtr = &streamPtr;
8276     uint32_t opcode_vkCmdSetDepthBias = OP_vkCmdSetDepthBias;
8277     memcpy(streamPtr, &opcode_vkCmdSetDepthBias, sizeof(uint32_t));
8278     streamPtr += sizeof(uint32_t);
8279     memcpy(streamPtr, &packetSize_vkCmdSetDepthBias, sizeof(uint32_t));
8280     streamPtr += sizeof(uint32_t);
8281     if (!queueSubmitWithCommandsEnabled) {
8282         uint64_t cgen_var_0;
8283         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8284         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8285         *streamPtrPtr += 1 * 8;
8286     }
8287     memcpy(*streamPtrPtr, (float*)&local_depthBiasConstantFactor, sizeof(float));
8288     *streamPtrPtr += sizeof(float);
8289     memcpy(*streamPtrPtr, (float*)&local_depthBiasClamp, sizeof(float));
8290     *streamPtrPtr += sizeof(float);
8291     memcpy(*streamPtrPtr, (float*)&local_depthBiasSlopeFactor, sizeof(float));
8292     *streamPtrPtr += sizeof(float);
8293     ++encodeCount;
8294     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8295         pool->freeAll();
8296         stream->clearPool();
8297     }
8298     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8299 }
8300 
vkCmdSetBlendConstants(VkCommandBuffer commandBuffer,const float blendConstants[4],uint32_t doLock)8301 void VkEncoder::vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4],
8302                                        uint32_t doLock) {
8303     (void)doLock;
8304     bool queueSubmitWithCommandsEnabled =
8305         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8306     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8307     auto stream = mImpl->stream();
8308     auto pool = mImpl->pool();
8309     VkCommandBuffer local_commandBuffer;
8310     float local_blendConstants[4];
8311     local_commandBuffer = commandBuffer;
8312     memcpy(local_blendConstants, blendConstants, 4 * sizeof(const float));
8313     size_t count = 0;
8314     size_t* countPtr = &count;
8315     {
8316         uint64_t cgen_var_0;
8317         *countPtr += 1 * 8;
8318         *countPtr += 4 * sizeof(float);
8319     }
8320     uint32_t packetSize_vkCmdSetBlendConstants = 4 + 4 + count;
8321     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetBlendConstants -= 8;
8322     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetBlendConstants);
8323     uint8_t* packetBeginPtr = streamPtr;
8324     uint8_t** streamPtrPtr = &streamPtr;
8325     uint32_t opcode_vkCmdSetBlendConstants = OP_vkCmdSetBlendConstants;
8326     memcpy(streamPtr, &opcode_vkCmdSetBlendConstants, sizeof(uint32_t));
8327     streamPtr += sizeof(uint32_t);
8328     memcpy(streamPtr, &packetSize_vkCmdSetBlendConstants, sizeof(uint32_t));
8329     streamPtr += sizeof(uint32_t);
8330     if (!queueSubmitWithCommandsEnabled) {
8331         uint64_t cgen_var_0;
8332         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8333         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8334         *streamPtrPtr += 1 * 8;
8335     }
8336     memcpy(*streamPtrPtr, (float*)local_blendConstants, 4 * sizeof(float));
8337     *streamPtrPtr += 4 * sizeof(float);
8338     ++encodeCount;
8339     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8340         pool->freeAll();
8341         stream->clearPool();
8342     }
8343     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8344 }
8345 
vkCmdSetDepthBounds(VkCommandBuffer commandBuffer,float minDepthBounds,float maxDepthBounds,uint32_t doLock)8346 void VkEncoder::vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
8347                                     float maxDepthBounds, uint32_t doLock) {
8348     (void)doLock;
8349     bool queueSubmitWithCommandsEnabled =
8350         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8351     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8352     auto stream = mImpl->stream();
8353     auto pool = mImpl->pool();
8354     VkCommandBuffer local_commandBuffer;
8355     float local_minDepthBounds;
8356     float local_maxDepthBounds;
8357     local_commandBuffer = commandBuffer;
8358     local_minDepthBounds = minDepthBounds;
8359     local_maxDepthBounds = maxDepthBounds;
8360     size_t count = 0;
8361     size_t* countPtr = &count;
8362     {
8363         uint64_t cgen_var_0;
8364         *countPtr += 1 * 8;
8365         *countPtr += sizeof(float);
8366         *countPtr += sizeof(float);
8367     }
8368     uint32_t packetSize_vkCmdSetDepthBounds = 4 + 4 + count;
8369     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthBounds -= 8;
8370     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthBounds);
8371     uint8_t* packetBeginPtr = streamPtr;
8372     uint8_t** streamPtrPtr = &streamPtr;
8373     uint32_t opcode_vkCmdSetDepthBounds = OP_vkCmdSetDepthBounds;
8374     memcpy(streamPtr, &opcode_vkCmdSetDepthBounds, sizeof(uint32_t));
8375     streamPtr += sizeof(uint32_t);
8376     memcpy(streamPtr, &packetSize_vkCmdSetDepthBounds, sizeof(uint32_t));
8377     streamPtr += sizeof(uint32_t);
8378     if (!queueSubmitWithCommandsEnabled) {
8379         uint64_t cgen_var_0;
8380         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8381         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8382         *streamPtrPtr += 1 * 8;
8383     }
8384     memcpy(*streamPtrPtr, (float*)&local_minDepthBounds, sizeof(float));
8385     *streamPtrPtr += sizeof(float);
8386     memcpy(*streamPtrPtr, (float*)&local_maxDepthBounds, sizeof(float));
8387     *streamPtrPtr += sizeof(float);
8388     ++encodeCount;
8389     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8390         pool->freeAll();
8391         stream->clearPool();
8392     }
8393     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8394 }
8395 
vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer,VkStencilFaceFlags faceMask,uint32_t compareMask,uint32_t doLock)8396 void VkEncoder::vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer,
8397                                            VkStencilFaceFlags faceMask, uint32_t compareMask,
8398                                            uint32_t doLock) {
8399     (void)doLock;
8400     bool queueSubmitWithCommandsEnabled =
8401         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8402     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8403     auto stream = mImpl->stream();
8404     auto pool = mImpl->pool();
8405     VkCommandBuffer local_commandBuffer;
8406     VkStencilFaceFlags local_faceMask;
8407     uint32_t local_compareMask;
8408     local_commandBuffer = commandBuffer;
8409     local_faceMask = faceMask;
8410     local_compareMask = compareMask;
8411     size_t count = 0;
8412     size_t* countPtr = &count;
8413     {
8414         uint64_t cgen_var_0;
8415         *countPtr += 1 * 8;
8416         *countPtr += sizeof(VkStencilFaceFlags);
8417         *countPtr += sizeof(uint32_t);
8418     }
8419     uint32_t packetSize_vkCmdSetStencilCompareMask = 4 + 4 + count;
8420     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetStencilCompareMask -= 8;
8421     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetStencilCompareMask);
8422     uint8_t* packetBeginPtr = streamPtr;
8423     uint8_t** streamPtrPtr = &streamPtr;
8424     uint32_t opcode_vkCmdSetStencilCompareMask = OP_vkCmdSetStencilCompareMask;
8425     memcpy(streamPtr, &opcode_vkCmdSetStencilCompareMask, sizeof(uint32_t));
8426     streamPtr += sizeof(uint32_t);
8427     memcpy(streamPtr, &packetSize_vkCmdSetStencilCompareMask, sizeof(uint32_t));
8428     streamPtr += sizeof(uint32_t);
8429     if (!queueSubmitWithCommandsEnabled) {
8430         uint64_t cgen_var_0;
8431         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8432         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8433         *streamPtrPtr += 1 * 8;
8434     }
8435     memcpy(*streamPtrPtr, (VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
8436     *streamPtrPtr += sizeof(VkStencilFaceFlags);
8437     memcpy(*streamPtrPtr, (uint32_t*)&local_compareMask, sizeof(uint32_t));
8438     *streamPtrPtr += sizeof(uint32_t);
8439     ++encodeCount;
8440     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8441         pool->freeAll();
8442         stream->clearPool();
8443     }
8444     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8445 }
8446 
vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer,VkStencilFaceFlags faceMask,uint32_t writeMask,uint32_t doLock)8447 void VkEncoder::vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
8448                                          uint32_t writeMask, uint32_t doLock) {
8449     (void)doLock;
8450     bool queueSubmitWithCommandsEnabled =
8451         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8452     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8453     auto stream = mImpl->stream();
8454     auto pool = mImpl->pool();
8455     VkCommandBuffer local_commandBuffer;
8456     VkStencilFaceFlags local_faceMask;
8457     uint32_t local_writeMask;
8458     local_commandBuffer = commandBuffer;
8459     local_faceMask = faceMask;
8460     local_writeMask = writeMask;
8461     size_t count = 0;
8462     size_t* countPtr = &count;
8463     {
8464         uint64_t cgen_var_0;
8465         *countPtr += 1 * 8;
8466         *countPtr += sizeof(VkStencilFaceFlags);
8467         *countPtr += sizeof(uint32_t);
8468     }
8469     uint32_t packetSize_vkCmdSetStencilWriteMask = 4 + 4 + count;
8470     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetStencilWriteMask -= 8;
8471     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetStencilWriteMask);
8472     uint8_t* packetBeginPtr = streamPtr;
8473     uint8_t** streamPtrPtr = &streamPtr;
8474     uint32_t opcode_vkCmdSetStencilWriteMask = OP_vkCmdSetStencilWriteMask;
8475     memcpy(streamPtr, &opcode_vkCmdSetStencilWriteMask, sizeof(uint32_t));
8476     streamPtr += sizeof(uint32_t);
8477     memcpy(streamPtr, &packetSize_vkCmdSetStencilWriteMask, sizeof(uint32_t));
8478     streamPtr += sizeof(uint32_t);
8479     if (!queueSubmitWithCommandsEnabled) {
8480         uint64_t cgen_var_0;
8481         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8482         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8483         *streamPtrPtr += 1 * 8;
8484     }
8485     memcpy(*streamPtrPtr, (VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
8486     *streamPtrPtr += sizeof(VkStencilFaceFlags);
8487     memcpy(*streamPtrPtr, (uint32_t*)&local_writeMask, sizeof(uint32_t));
8488     *streamPtrPtr += sizeof(uint32_t);
8489     ++encodeCount;
8490     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8491         pool->freeAll();
8492         stream->clearPool();
8493     }
8494     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8495 }
8496 
vkCmdSetStencilReference(VkCommandBuffer commandBuffer,VkStencilFaceFlags faceMask,uint32_t reference,uint32_t doLock)8497 void VkEncoder::vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
8498                                          uint32_t reference, uint32_t doLock) {
8499     (void)doLock;
8500     bool queueSubmitWithCommandsEnabled =
8501         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8502     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8503     auto stream = mImpl->stream();
8504     auto pool = mImpl->pool();
8505     VkCommandBuffer local_commandBuffer;
8506     VkStencilFaceFlags local_faceMask;
8507     uint32_t local_reference;
8508     local_commandBuffer = commandBuffer;
8509     local_faceMask = faceMask;
8510     local_reference = reference;
8511     size_t count = 0;
8512     size_t* countPtr = &count;
8513     {
8514         uint64_t cgen_var_0;
8515         *countPtr += 1 * 8;
8516         *countPtr += sizeof(VkStencilFaceFlags);
8517         *countPtr += sizeof(uint32_t);
8518     }
8519     uint32_t packetSize_vkCmdSetStencilReference = 4 + 4 + count;
8520     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetStencilReference -= 8;
8521     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetStencilReference);
8522     uint8_t* packetBeginPtr = streamPtr;
8523     uint8_t** streamPtrPtr = &streamPtr;
8524     uint32_t opcode_vkCmdSetStencilReference = OP_vkCmdSetStencilReference;
8525     memcpy(streamPtr, &opcode_vkCmdSetStencilReference, sizeof(uint32_t));
8526     streamPtr += sizeof(uint32_t);
8527     memcpy(streamPtr, &packetSize_vkCmdSetStencilReference, sizeof(uint32_t));
8528     streamPtr += sizeof(uint32_t);
8529     if (!queueSubmitWithCommandsEnabled) {
8530         uint64_t cgen_var_0;
8531         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8532         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8533         *streamPtrPtr += 1 * 8;
8534     }
8535     memcpy(*streamPtrPtr, (VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
8536     *streamPtrPtr += sizeof(VkStencilFaceFlags);
8537     memcpy(*streamPtrPtr, (uint32_t*)&local_reference, sizeof(uint32_t));
8538     *streamPtrPtr += sizeof(uint32_t);
8539     ++encodeCount;
8540     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8541         pool->freeAll();
8542         stream->clearPool();
8543     }
8544     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8545 }
8546 
vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer,VkPipelineBindPoint pipelineBindPoint,VkPipelineLayout layout,uint32_t firstSet,uint32_t descriptorSetCount,const VkDescriptorSet * pDescriptorSets,uint32_t dynamicOffsetCount,const uint32_t * pDynamicOffsets,uint32_t doLock)8547 void VkEncoder::vkCmdBindDescriptorSets(
8548     VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout,
8549     uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets,
8550     uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets, uint32_t doLock) {
8551     (void)doLock;
8552     bool queueSubmitWithCommandsEnabled =
8553         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8554     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8555     auto stream = mImpl->stream();
8556     auto pool = mImpl->pool();
8557     VkCommandBuffer local_commandBuffer;
8558     VkPipelineBindPoint local_pipelineBindPoint;
8559     VkPipelineLayout local_layout;
8560     uint32_t local_firstSet;
8561     uint32_t local_descriptorSetCount;
8562     VkDescriptorSet* local_pDescriptorSets;
8563     uint32_t local_dynamicOffsetCount;
8564     uint32_t* local_pDynamicOffsets;
8565     local_commandBuffer = commandBuffer;
8566     local_pipelineBindPoint = pipelineBindPoint;
8567     local_layout = layout;
8568     local_firstSet = firstSet;
8569     local_descriptorSetCount = descriptorSetCount;
8570     // Avoiding deepcopy for pDescriptorSets
8571     local_pDescriptorSets = (VkDescriptorSet*)pDescriptorSets;
8572     local_dynamicOffsetCount = dynamicOffsetCount;
8573     // Avoiding deepcopy for pDynamicOffsets
8574     local_pDynamicOffsets = (uint32_t*)pDynamicOffsets;
8575     size_t count = 0;
8576     size_t* countPtr = &count;
8577     {
8578         uint64_t cgen_var_0;
8579         *countPtr += 1 * 8;
8580         *countPtr += sizeof(VkPipelineBindPoint);
8581         uint64_t cgen_var_1;
8582         *countPtr += 1 * 8;
8583         *countPtr += sizeof(uint32_t);
8584         *countPtr += sizeof(uint32_t);
8585         if (((descriptorSetCount))) {
8586             *countPtr += ((descriptorSetCount)) * 8;
8587         }
8588         *countPtr += sizeof(uint32_t);
8589         *countPtr += ((dynamicOffsetCount)) * sizeof(uint32_t);
8590     }
8591     uint32_t packetSize_vkCmdBindDescriptorSets = 4 + 4 + count;
8592     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBindDescriptorSets -= 8;
8593     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindDescriptorSets);
8594     uint8_t* packetBeginPtr = streamPtr;
8595     uint8_t** streamPtrPtr = &streamPtr;
8596     uint32_t opcode_vkCmdBindDescriptorSets = OP_vkCmdBindDescriptorSets;
8597     memcpy(streamPtr, &opcode_vkCmdBindDescriptorSets, sizeof(uint32_t));
8598     streamPtr += sizeof(uint32_t);
8599     memcpy(streamPtr, &packetSize_vkCmdBindDescriptorSets, sizeof(uint32_t));
8600     streamPtr += sizeof(uint32_t);
8601     if (!queueSubmitWithCommandsEnabled) {
8602         uint64_t cgen_var_0;
8603         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8604         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8605         *streamPtrPtr += 1 * 8;
8606     }
8607     memcpy(*streamPtrPtr, (VkPipelineBindPoint*)&local_pipelineBindPoint,
8608            sizeof(VkPipelineBindPoint));
8609     *streamPtrPtr += sizeof(VkPipelineBindPoint);
8610     uint64_t cgen_var_0;
8611     *&cgen_var_0 = get_host_u64_VkPipelineLayout((*&local_layout));
8612     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8613     *streamPtrPtr += 1 * 8;
8614     memcpy(*streamPtrPtr, (uint32_t*)&local_firstSet, sizeof(uint32_t));
8615     *streamPtrPtr += sizeof(uint32_t);
8616     memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorSetCount, sizeof(uint32_t));
8617     *streamPtrPtr += sizeof(uint32_t);
8618     if (((descriptorSetCount))) {
8619         uint8_t* cgen_var_1_ptr = (uint8_t*)(*streamPtrPtr);
8620         for (uint32_t k = 0; k < ((descriptorSetCount)); ++k) {
8621             uint64_t tmpval = get_host_u64_VkDescriptorSet(local_pDescriptorSets[k]);
8622             memcpy(cgen_var_1_ptr + k * 8, &tmpval, sizeof(uint64_t));
8623         }
8624         *streamPtrPtr += 8 * ((descriptorSetCount));
8625     }
8626     memcpy(*streamPtrPtr, (uint32_t*)&local_dynamicOffsetCount, sizeof(uint32_t));
8627     *streamPtrPtr += sizeof(uint32_t);
8628     memcpy(*streamPtrPtr, (uint32_t*)local_pDynamicOffsets,
8629            ((dynamicOffsetCount)) * sizeof(uint32_t));
8630     *streamPtrPtr += ((dynamicOffsetCount)) * sizeof(uint32_t);
8631     ++encodeCount;
8632     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8633         pool->freeAll();
8634         stream->clearPool();
8635     }
8636     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8637 }
8638 
vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkIndexType indexType,uint32_t doLock)8639 void VkEncoder::vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer,
8640                                      VkDeviceSize offset, VkIndexType indexType, uint32_t doLock) {
8641     (void)doLock;
8642     bool queueSubmitWithCommandsEnabled =
8643         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8644     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8645     auto stream = mImpl->stream();
8646     auto pool = mImpl->pool();
8647     VkCommandBuffer local_commandBuffer;
8648     VkBuffer local_buffer;
8649     VkDeviceSize local_offset;
8650     VkIndexType local_indexType;
8651     local_commandBuffer = commandBuffer;
8652     local_buffer = buffer;
8653     local_offset = offset;
8654     local_indexType = indexType;
8655     size_t count = 0;
8656     size_t* countPtr = &count;
8657     {
8658         uint64_t cgen_var_0;
8659         *countPtr += 1 * 8;
8660         uint64_t cgen_var_1;
8661         *countPtr += 1 * 8;
8662         *countPtr += sizeof(VkDeviceSize);
8663         *countPtr += sizeof(VkIndexType);
8664     }
8665     uint32_t packetSize_vkCmdBindIndexBuffer = 4 + 4 + count;
8666     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBindIndexBuffer -= 8;
8667     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindIndexBuffer);
8668     uint8_t* packetBeginPtr = streamPtr;
8669     uint8_t** streamPtrPtr = &streamPtr;
8670     uint32_t opcode_vkCmdBindIndexBuffer = OP_vkCmdBindIndexBuffer;
8671     memcpy(streamPtr, &opcode_vkCmdBindIndexBuffer, sizeof(uint32_t));
8672     streamPtr += sizeof(uint32_t);
8673     memcpy(streamPtr, &packetSize_vkCmdBindIndexBuffer, sizeof(uint32_t));
8674     streamPtr += sizeof(uint32_t);
8675     if (!queueSubmitWithCommandsEnabled) {
8676         uint64_t cgen_var_0;
8677         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8678         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8679         *streamPtrPtr += 1 * 8;
8680     }
8681     uint64_t cgen_var_0;
8682     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_buffer));
8683     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8684     *streamPtrPtr += 1 * 8;
8685     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
8686     *streamPtrPtr += sizeof(VkDeviceSize);
8687     memcpy(*streamPtrPtr, (VkIndexType*)&local_indexType, sizeof(VkIndexType));
8688     *streamPtrPtr += sizeof(VkIndexType);
8689     ++encodeCount;
8690     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8691         pool->freeAll();
8692         stream->clearPool();
8693     }
8694     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8695 }
8696 
vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer,uint32_t firstBinding,uint32_t bindingCount,const VkBuffer * pBuffers,const VkDeviceSize * pOffsets,uint32_t doLock)8697 void VkEncoder::vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding,
8698                                        uint32_t bindingCount, const VkBuffer* pBuffers,
8699                                        const VkDeviceSize* pOffsets, uint32_t doLock) {
8700     (void)doLock;
8701     bool queueSubmitWithCommandsEnabled =
8702         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8703     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8704     auto stream = mImpl->stream();
8705     auto pool = mImpl->pool();
8706     VkCommandBuffer local_commandBuffer;
8707     uint32_t local_firstBinding;
8708     uint32_t local_bindingCount;
8709     VkBuffer* local_pBuffers;
8710     VkDeviceSize* local_pOffsets;
8711     local_commandBuffer = commandBuffer;
8712     local_firstBinding = firstBinding;
8713     local_bindingCount = bindingCount;
8714     // Avoiding deepcopy for pBuffers
8715     local_pBuffers = (VkBuffer*)pBuffers;
8716     // Avoiding deepcopy for pOffsets
8717     local_pOffsets = (VkDeviceSize*)pOffsets;
8718     size_t count = 0;
8719     size_t* countPtr = &count;
8720     {
8721         uint64_t cgen_var_0;
8722         *countPtr += 1 * 8;
8723         *countPtr += sizeof(uint32_t);
8724         *countPtr += sizeof(uint32_t);
8725         if (((bindingCount))) {
8726             *countPtr += ((bindingCount)) * 8;
8727         }
8728         *countPtr += ((bindingCount)) * sizeof(VkDeviceSize);
8729     }
8730     uint32_t packetSize_vkCmdBindVertexBuffers = 4 + 4 + count;
8731     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBindVertexBuffers -= 8;
8732     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindVertexBuffers);
8733     uint8_t* packetBeginPtr = streamPtr;
8734     uint8_t** streamPtrPtr = &streamPtr;
8735     uint32_t opcode_vkCmdBindVertexBuffers = OP_vkCmdBindVertexBuffers;
8736     memcpy(streamPtr, &opcode_vkCmdBindVertexBuffers, sizeof(uint32_t));
8737     streamPtr += sizeof(uint32_t);
8738     memcpy(streamPtr, &packetSize_vkCmdBindVertexBuffers, sizeof(uint32_t));
8739     streamPtr += sizeof(uint32_t);
8740     if (!queueSubmitWithCommandsEnabled) {
8741         uint64_t cgen_var_0;
8742         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8743         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8744         *streamPtrPtr += 1 * 8;
8745     }
8746     memcpy(*streamPtrPtr, (uint32_t*)&local_firstBinding, sizeof(uint32_t));
8747     *streamPtrPtr += sizeof(uint32_t);
8748     memcpy(*streamPtrPtr, (uint32_t*)&local_bindingCount, sizeof(uint32_t));
8749     *streamPtrPtr += sizeof(uint32_t);
8750     if (((bindingCount))) {
8751         uint8_t* cgen_var_0_ptr = (uint8_t*)(*streamPtrPtr);
8752         for (uint32_t k = 0; k < ((bindingCount)); ++k) {
8753             uint64_t tmpval = get_host_u64_VkBuffer(local_pBuffers[k]);
8754             memcpy(cgen_var_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
8755         }
8756         *streamPtrPtr += 8 * ((bindingCount));
8757     }
8758     memcpy(*streamPtrPtr, (VkDeviceSize*)local_pOffsets, ((bindingCount)) * sizeof(VkDeviceSize));
8759     *streamPtrPtr += ((bindingCount)) * sizeof(VkDeviceSize);
8760     ++encodeCount;
8761     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8762         pool->freeAll();
8763         stream->clearPool();
8764     }
8765     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8766 }
8767 
vkCmdDraw(VkCommandBuffer commandBuffer,uint32_t vertexCount,uint32_t instanceCount,uint32_t firstVertex,uint32_t firstInstance,uint32_t doLock)8768 void VkEncoder::vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount,
8769                           uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance,
8770                           uint32_t doLock) {
8771     (void)doLock;
8772     bool queueSubmitWithCommandsEnabled =
8773         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8774     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8775     auto stream = mImpl->stream();
8776     auto pool = mImpl->pool();
8777     VkCommandBuffer local_commandBuffer;
8778     uint32_t local_vertexCount;
8779     uint32_t local_instanceCount;
8780     uint32_t local_firstVertex;
8781     uint32_t local_firstInstance;
8782     local_commandBuffer = commandBuffer;
8783     local_vertexCount = vertexCount;
8784     local_instanceCount = instanceCount;
8785     local_firstVertex = firstVertex;
8786     local_firstInstance = firstInstance;
8787     size_t count = 0;
8788     size_t* countPtr = &count;
8789     {
8790         uint64_t cgen_var_0;
8791         *countPtr += 1 * 8;
8792         *countPtr += sizeof(uint32_t);
8793         *countPtr += sizeof(uint32_t);
8794         *countPtr += sizeof(uint32_t);
8795         *countPtr += sizeof(uint32_t);
8796     }
8797     uint32_t packetSize_vkCmdDraw = 4 + 4 + count;
8798     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDraw -= 8;
8799     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDraw);
8800     uint8_t* packetBeginPtr = streamPtr;
8801     uint8_t** streamPtrPtr = &streamPtr;
8802     uint32_t opcode_vkCmdDraw = OP_vkCmdDraw;
8803     memcpy(streamPtr, &opcode_vkCmdDraw, sizeof(uint32_t));
8804     streamPtr += sizeof(uint32_t);
8805     memcpy(streamPtr, &packetSize_vkCmdDraw, sizeof(uint32_t));
8806     streamPtr += sizeof(uint32_t);
8807     if (!queueSubmitWithCommandsEnabled) {
8808         uint64_t cgen_var_0;
8809         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8810         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8811         *streamPtrPtr += 1 * 8;
8812     }
8813     memcpy(*streamPtrPtr, (uint32_t*)&local_vertexCount, sizeof(uint32_t));
8814     *streamPtrPtr += sizeof(uint32_t);
8815     memcpy(*streamPtrPtr, (uint32_t*)&local_instanceCount, sizeof(uint32_t));
8816     *streamPtrPtr += sizeof(uint32_t);
8817     memcpy(*streamPtrPtr, (uint32_t*)&local_firstVertex, sizeof(uint32_t));
8818     *streamPtrPtr += sizeof(uint32_t);
8819     memcpy(*streamPtrPtr, (uint32_t*)&local_firstInstance, sizeof(uint32_t));
8820     *streamPtrPtr += sizeof(uint32_t);
8821     ++encodeCount;
8822     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8823         pool->freeAll();
8824         stream->clearPool();
8825     }
8826     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8827 }
8828 
vkCmdDrawIndexed(VkCommandBuffer commandBuffer,uint32_t indexCount,uint32_t instanceCount,uint32_t firstIndex,int32_t vertexOffset,uint32_t firstInstance,uint32_t doLock)8829 void VkEncoder::vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
8830                                  uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
8831                                  uint32_t firstInstance, uint32_t doLock) {
8832     (void)doLock;
8833     bool queueSubmitWithCommandsEnabled =
8834         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8835     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8836     auto stream = mImpl->stream();
8837     auto pool = mImpl->pool();
8838     VkCommandBuffer local_commandBuffer;
8839     uint32_t local_indexCount;
8840     uint32_t local_instanceCount;
8841     uint32_t local_firstIndex;
8842     int32_t local_vertexOffset;
8843     uint32_t local_firstInstance;
8844     local_commandBuffer = commandBuffer;
8845     local_indexCount = indexCount;
8846     local_instanceCount = instanceCount;
8847     local_firstIndex = firstIndex;
8848     local_vertexOffset = vertexOffset;
8849     local_firstInstance = firstInstance;
8850     size_t count = 0;
8851     size_t* countPtr = &count;
8852     {
8853         uint64_t cgen_var_0;
8854         *countPtr += 1 * 8;
8855         *countPtr += sizeof(uint32_t);
8856         *countPtr += sizeof(uint32_t);
8857         *countPtr += sizeof(uint32_t);
8858         *countPtr += sizeof(int32_t);
8859         *countPtr += sizeof(uint32_t);
8860     }
8861     uint32_t packetSize_vkCmdDrawIndexed = 4 + 4 + count;
8862     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDrawIndexed -= 8;
8863     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndexed);
8864     uint8_t* packetBeginPtr = streamPtr;
8865     uint8_t** streamPtrPtr = &streamPtr;
8866     uint32_t opcode_vkCmdDrawIndexed = OP_vkCmdDrawIndexed;
8867     memcpy(streamPtr, &opcode_vkCmdDrawIndexed, sizeof(uint32_t));
8868     streamPtr += sizeof(uint32_t);
8869     memcpy(streamPtr, &packetSize_vkCmdDrawIndexed, sizeof(uint32_t));
8870     streamPtr += sizeof(uint32_t);
8871     if (!queueSubmitWithCommandsEnabled) {
8872         uint64_t cgen_var_0;
8873         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8874         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8875         *streamPtrPtr += 1 * 8;
8876     }
8877     memcpy(*streamPtrPtr, (uint32_t*)&local_indexCount, sizeof(uint32_t));
8878     *streamPtrPtr += sizeof(uint32_t);
8879     memcpy(*streamPtrPtr, (uint32_t*)&local_instanceCount, sizeof(uint32_t));
8880     *streamPtrPtr += sizeof(uint32_t);
8881     memcpy(*streamPtrPtr, (uint32_t*)&local_firstIndex, sizeof(uint32_t));
8882     *streamPtrPtr += sizeof(uint32_t);
8883     memcpy(*streamPtrPtr, (int32_t*)&local_vertexOffset, sizeof(int32_t));
8884     *streamPtrPtr += sizeof(int32_t);
8885     memcpy(*streamPtrPtr, (uint32_t*)&local_firstInstance, sizeof(uint32_t));
8886     *streamPtrPtr += sizeof(uint32_t);
8887     ++encodeCount;
8888     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8889         pool->freeAll();
8890         stream->clearPool();
8891     }
8892     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8893 }
8894 
vkCmdDrawIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t drawCount,uint32_t stride,uint32_t doLock)8895 void VkEncoder::vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
8896                                   VkDeviceSize offset, uint32_t drawCount, uint32_t stride,
8897                                   uint32_t doLock) {
8898     (void)doLock;
8899     bool queueSubmitWithCommandsEnabled =
8900         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8901     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8902     auto stream = mImpl->stream();
8903     auto pool = mImpl->pool();
8904     VkCommandBuffer local_commandBuffer;
8905     VkBuffer local_buffer;
8906     VkDeviceSize local_offset;
8907     uint32_t local_drawCount;
8908     uint32_t local_stride;
8909     local_commandBuffer = commandBuffer;
8910     local_buffer = buffer;
8911     local_offset = offset;
8912     local_drawCount = drawCount;
8913     local_stride = stride;
8914     size_t count = 0;
8915     size_t* countPtr = &count;
8916     {
8917         uint64_t cgen_var_0;
8918         *countPtr += 1 * 8;
8919         uint64_t cgen_var_1;
8920         *countPtr += 1 * 8;
8921         *countPtr += sizeof(VkDeviceSize);
8922         *countPtr += sizeof(uint32_t);
8923         *countPtr += sizeof(uint32_t);
8924     }
8925     uint32_t packetSize_vkCmdDrawIndirect = 4 + 4 + count;
8926     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDrawIndirect -= 8;
8927     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndirect);
8928     uint8_t* packetBeginPtr = streamPtr;
8929     uint8_t** streamPtrPtr = &streamPtr;
8930     uint32_t opcode_vkCmdDrawIndirect = OP_vkCmdDrawIndirect;
8931     memcpy(streamPtr, &opcode_vkCmdDrawIndirect, sizeof(uint32_t));
8932     streamPtr += sizeof(uint32_t);
8933     memcpy(streamPtr, &packetSize_vkCmdDrawIndirect, sizeof(uint32_t));
8934     streamPtr += sizeof(uint32_t);
8935     if (!queueSubmitWithCommandsEnabled) {
8936         uint64_t cgen_var_0;
8937         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
8938         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8939         *streamPtrPtr += 1 * 8;
8940     }
8941     uint64_t cgen_var_0;
8942     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_buffer));
8943     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
8944     *streamPtrPtr += 1 * 8;
8945     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
8946     *streamPtrPtr += sizeof(VkDeviceSize);
8947     memcpy(*streamPtrPtr, (uint32_t*)&local_drawCount, sizeof(uint32_t));
8948     *streamPtrPtr += sizeof(uint32_t);
8949     memcpy(*streamPtrPtr, (uint32_t*)&local_stride, sizeof(uint32_t));
8950     *streamPtrPtr += sizeof(uint32_t);
8951     ++encodeCount;
8952     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
8953         pool->freeAll();
8954         stream->clearPool();
8955     }
8956     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
8957 }
8958 
vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t drawCount,uint32_t stride,uint32_t doLock)8959 void VkEncoder::vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
8960                                          VkDeviceSize offset, uint32_t drawCount, uint32_t stride,
8961                                          uint32_t doLock) {
8962     (void)doLock;
8963     bool queueSubmitWithCommandsEnabled =
8964         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
8965     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
8966     auto stream = mImpl->stream();
8967     auto pool = mImpl->pool();
8968     VkCommandBuffer local_commandBuffer;
8969     VkBuffer local_buffer;
8970     VkDeviceSize local_offset;
8971     uint32_t local_drawCount;
8972     uint32_t local_stride;
8973     local_commandBuffer = commandBuffer;
8974     local_buffer = buffer;
8975     local_offset = offset;
8976     local_drawCount = drawCount;
8977     local_stride = stride;
8978     size_t count = 0;
8979     size_t* countPtr = &count;
8980     {
8981         uint64_t cgen_var_0;
8982         *countPtr += 1 * 8;
8983         uint64_t cgen_var_1;
8984         *countPtr += 1 * 8;
8985         *countPtr += sizeof(VkDeviceSize);
8986         *countPtr += sizeof(uint32_t);
8987         *countPtr += sizeof(uint32_t);
8988     }
8989     uint32_t packetSize_vkCmdDrawIndexedIndirect = 4 + 4 + count;
8990     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDrawIndexedIndirect -= 8;
8991     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndexedIndirect);
8992     uint8_t* packetBeginPtr = streamPtr;
8993     uint8_t** streamPtrPtr = &streamPtr;
8994     uint32_t opcode_vkCmdDrawIndexedIndirect = OP_vkCmdDrawIndexedIndirect;
8995     memcpy(streamPtr, &opcode_vkCmdDrawIndexedIndirect, sizeof(uint32_t));
8996     streamPtr += sizeof(uint32_t);
8997     memcpy(streamPtr, &packetSize_vkCmdDrawIndexedIndirect, sizeof(uint32_t));
8998     streamPtr += sizeof(uint32_t);
8999     if (!queueSubmitWithCommandsEnabled) {
9000         uint64_t cgen_var_0;
9001         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9002         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9003         *streamPtrPtr += 1 * 8;
9004     }
9005     uint64_t cgen_var_0;
9006     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_buffer));
9007     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9008     *streamPtrPtr += 1 * 8;
9009     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
9010     *streamPtrPtr += sizeof(VkDeviceSize);
9011     memcpy(*streamPtrPtr, (uint32_t*)&local_drawCount, sizeof(uint32_t));
9012     *streamPtrPtr += sizeof(uint32_t);
9013     memcpy(*streamPtrPtr, (uint32_t*)&local_stride, sizeof(uint32_t));
9014     *streamPtrPtr += sizeof(uint32_t);
9015     ++encodeCount;
9016     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9017         pool->freeAll();
9018         stream->clearPool();
9019     }
9020     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9021 }
9022 
vkCmdDispatch(VkCommandBuffer commandBuffer,uint32_t groupCountX,uint32_t groupCountY,uint32_t groupCountZ,uint32_t doLock)9023 void VkEncoder::vkCmdDispatch(VkCommandBuffer commandBuffer, uint32_t groupCountX,
9024                               uint32_t groupCountY, uint32_t groupCountZ, uint32_t doLock) {
9025     (void)doLock;
9026     bool queueSubmitWithCommandsEnabled =
9027         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9028     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9029     auto stream = mImpl->stream();
9030     auto pool = mImpl->pool();
9031     VkCommandBuffer local_commandBuffer;
9032     uint32_t local_groupCountX;
9033     uint32_t local_groupCountY;
9034     uint32_t local_groupCountZ;
9035     local_commandBuffer = commandBuffer;
9036     local_groupCountX = groupCountX;
9037     local_groupCountY = groupCountY;
9038     local_groupCountZ = groupCountZ;
9039     size_t count = 0;
9040     size_t* countPtr = &count;
9041     {
9042         uint64_t cgen_var_0;
9043         *countPtr += 1 * 8;
9044         *countPtr += sizeof(uint32_t);
9045         *countPtr += sizeof(uint32_t);
9046         *countPtr += sizeof(uint32_t);
9047     }
9048     uint32_t packetSize_vkCmdDispatch = 4 + 4 + count;
9049     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDispatch -= 8;
9050     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDispatch);
9051     uint8_t* packetBeginPtr = streamPtr;
9052     uint8_t** streamPtrPtr = &streamPtr;
9053     uint32_t opcode_vkCmdDispatch = OP_vkCmdDispatch;
9054     memcpy(streamPtr, &opcode_vkCmdDispatch, sizeof(uint32_t));
9055     streamPtr += sizeof(uint32_t);
9056     memcpy(streamPtr, &packetSize_vkCmdDispatch, sizeof(uint32_t));
9057     streamPtr += sizeof(uint32_t);
9058     if (!queueSubmitWithCommandsEnabled) {
9059         uint64_t cgen_var_0;
9060         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9061         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9062         *streamPtrPtr += 1 * 8;
9063     }
9064     memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountX, sizeof(uint32_t));
9065     *streamPtrPtr += sizeof(uint32_t);
9066     memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountY, sizeof(uint32_t));
9067     *streamPtrPtr += sizeof(uint32_t);
9068     memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountZ, sizeof(uint32_t));
9069     *streamPtrPtr += sizeof(uint32_t);
9070     ++encodeCount;
9071     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9072         pool->freeAll();
9073         stream->clearPool();
9074     }
9075     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9076 }
9077 
vkCmdDispatchIndirect(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,uint32_t doLock)9078 void VkEncoder::vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
9079                                       VkDeviceSize offset, uint32_t doLock) {
9080     (void)doLock;
9081     bool queueSubmitWithCommandsEnabled =
9082         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9083     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9084     auto stream = mImpl->stream();
9085     auto pool = mImpl->pool();
9086     VkCommandBuffer local_commandBuffer;
9087     VkBuffer local_buffer;
9088     VkDeviceSize local_offset;
9089     local_commandBuffer = commandBuffer;
9090     local_buffer = buffer;
9091     local_offset = offset;
9092     size_t count = 0;
9093     size_t* countPtr = &count;
9094     {
9095         uint64_t cgen_var_0;
9096         *countPtr += 1 * 8;
9097         uint64_t cgen_var_1;
9098         *countPtr += 1 * 8;
9099         *countPtr += sizeof(VkDeviceSize);
9100     }
9101     uint32_t packetSize_vkCmdDispatchIndirect = 4 + 4 + count;
9102     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDispatchIndirect -= 8;
9103     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDispatchIndirect);
9104     uint8_t* packetBeginPtr = streamPtr;
9105     uint8_t** streamPtrPtr = &streamPtr;
9106     uint32_t opcode_vkCmdDispatchIndirect = OP_vkCmdDispatchIndirect;
9107     memcpy(streamPtr, &opcode_vkCmdDispatchIndirect, sizeof(uint32_t));
9108     streamPtr += sizeof(uint32_t);
9109     memcpy(streamPtr, &packetSize_vkCmdDispatchIndirect, sizeof(uint32_t));
9110     streamPtr += sizeof(uint32_t);
9111     if (!queueSubmitWithCommandsEnabled) {
9112         uint64_t cgen_var_0;
9113         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9114         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9115         *streamPtrPtr += 1 * 8;
9116     }
9117     uint64_t cgen_var_0;
9118     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_buffer));
9119     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9120     *streamPtrPtr += 1 * 8;
9121     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
9122     *streamPtrPtr += sizeof(VkDeviceSize);
9123     ++encodeCount;
9124     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9125         pool->freeAll();
9126         stream->clearPool();
9127     }
9128     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9129 }
9130 
vkCmdCopyBuffer(VkCommandBuffer commandBuffer,VkBuffer srcBuffer,VkBuffer dstBuffer,uint32_t regionCount,const VkBufferCopy * pRegions,uint32_t doLock)9131 void VkEncoder::vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
9132                                 VkBuffer dstBuffer, uint32_t regionCount,
9133                                 const VkBufferCopy* pRegions, uint32_t doLock) {
9134     (void)doLock;
9135     bool queueSubmitWithCommandsEnabled =
9136         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9137     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9138     auto stream = mImpl->stream();
9139     auto pool = mImpl->pool();
9140     VkCommandBuffer local_commandBuffer;
9141     VkBuffer local_srcBuffer;
9142     VkBuffer local_dstBuffer;
9143     uint32_t local_regionCount;
9144     VkBufferCopy* local_pRegions;
9145     local_commandBuffer = commandBuffer;
9146     local_srcBuffer = srcBuffer;
9147     local_dstBuffer = dstBuffer;
9148     local_regionCount = regionCount;
9149     local_pRegions = nullptr;
9150     if (pRegions) {
9151         local_pRegions = (VkBufferCopy*)pool->alloc(((regionCount)) * sizeof(const VkBufferCopy));
9152         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9153             deepcopy_VkBufferCopy(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i,
9154                                   (VkBufferCopy*)(local_pRegions + i));
9155         }
9156     }
9157     if (local_pRegions) {
9158         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9159             transform_tohost_VkBufferCopy(sResourceTracker, (VkBufferCopy*)(local_pRegions + i));
9160         }
9161     }
9162     size_t count = 0;
9163     size_t* countPtr = &count;
9164     {
9165         uint64_t cgen_var_0;
9166         *countPtr += 1 * 8;
9167         uint64_t cgen_var_1;
9168         *countPtr += 1 * 8;
9169         uint64_t cgen_var_2;
9170         *countPtr += 1 * 8;
9171         *countPtr += sizeof(uint32_t);
9172         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9173             count_VkBufferCopy(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
9174                                (VkBufferCopy*)(local_pRegions + i), countPtr);
9175         }
9176     }
9177     uint32_t packetSize_vkCmdCopyBuffer = 4 + 4 + count;
9178     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyBuffer -= 8;
9179     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyBuffer);
9180     uint8_t* packetBeginPtr = streamPtr;
9181     uint8_t** streamPtrPtr = &streamPtr;
9182     uint32_t opcode_vkCmdCopyBuffer = OP_vkCmdCopyBuffer;
9183     memcpy(streamPtr, &opcode_vkCmdCopyBuffer, sizeof(uint32_t));
9184     streamPtr += sizeof(uint32_t);
9185     memcpy(streamPtr, &packetSize_vkCmdCopyBuffer, sizeof(uint32_t));
9186     streamPtr += sizeof(uint32_t);
9187     if (!queueSubmitWithCommandsEnabled) {
9188         uint64_t cgen_var_0;
9189         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9190         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9191         *streamPtrPtr += 1 * 8;
9192     }
9193     uint64_t cgen_var_0;
9194     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_srcBuffer));
9195     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9196     *streamPtrPtr += 1 * 8;
9197     uint64_t cgen_var_1;
9198     *&cgen_var_1 = get_host_u64_VkBuffer((*&local_dstBuffer));
9199     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
9200     *streamPtrPtr += 1 * 8;
9201     memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
9202     *streamPtrPtr += sizeof(uint32_t);
9203     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9204         reservedmarshal_VkBufferCopy(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
9205                                      (VkBufferCopy*)(local_pRegions + i), streamPtrPtr);
9206     }
9207     ++encodeCount;
9208     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9209         pool->freeAll();
9210         stream->clearPool();
9211     }
9212     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9213 }
9214 
vkCmdCopyImage(VkCommandBuffer commandBuffer,VkImage srcImage,VkImageLayout srcImageLayout,VkImage dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageCopy * pRegions,uint32_t doLock)9215 void VkEncoder::vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage,
9216                                VkImageLayout srcImageLayout, VkImage dstImage,
9217                                VkImageLayout dstImageLayout, uint32_t regionCount,
9218                                const VkImageCopy* pRegions, uint32_t doLock) {
9219     (void)doLock;
9220     bool queueSubmitWithCommandsEnabled =
9221         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9222     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9223     auto stream = mImpl->stream();
9224     auto pool = mImpl->pool();
9225     VkCommandBuffer local_commandBuffer;
9226     VkImage local_srcImage;
9227     VkImageLayout local_srcImageLayout;
9228     VkImage local_dstImage;
9229     VkImageLayout local_dstImageLayout;
9230     uint32_t local_regionCount;
9231     VkImageCopy* local_pRegions;
9232     local_commandBuffer = commandBuffer;
9233     local_srcImage = srcImage;
9234     local_srcImageLayout = srcImageLayout;
9235     local_dstImage = dstImage;
9236     local_dstImageLayout = dstImageLayout;
9237     local_regionCount = regionCount;
9238     local_pRegions = nullptr;
9239     if (pRegions) {
9240         local_pRegions = (VkImageCopy*)pool->alloc(((regionCount)) * sizeof(const VkImageCopy));
9241         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9242             deepcopy_VkImageCopy(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i,
9243                                  (VkImageCopy*)(local_pRegions + i));
9244         }
9245     }
9246     if (local_pRegions) {
9247         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9248             transform_tohost_VkImageCopy(sResourceTracker, (VkImageCopy*)(local_pRegions + i));
9249         }
9250     }
9251     size_t count = 0;
9252     size_t* countPtr = &count;
9253     {
9254         uint64_t cgen_var_0;
9255         *countPtr += 1 * 8;
9256         uint64_t cgen_var_1;
9257         *countPtr += 1 * 8;
9258         *countPtr += sizeof(VkImageLayout);
9259         uint64_t cgen_var_2;
9260         *countPtr += 1 * 8;
9261         *countPtr += sizeof(VkImageLayout);
9262         *countPtr += sizeof(uint32_t);
9263         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9264             count_VkImageCopy(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
9265                               (VkImageCopy*)(local_pRegions + i), countPtr);
9266         }
9267     }
9268     uint32_t packetSize_vkCmdCopyImage = 4 + 4 + count;
9269     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyImage -= 8;
9270     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyImage);
9271     uint8_t* packetBeginPtr = streamPtr;
9272     uint8_t** streamPtrPtr = &streamPtr;
9273     uint32_t opcode_vkCmdCopyImage = OP_vkCmdCopyImage;
9274     memcpy(streamPtr, &opcode_vkCmdCopyImage, sizeof(uint32_t));
9275     streamPtr += sizeof(uint32_t);
9276     memcpy(streamPtr, &packetSize_vkCmdCopyImage, sizeof(uint32_t));
9277     streamPtr += sizeof(uint32_t);
9278     if (!queueSubmitWithCommandsEnabled) {
9279         uint64_t cgen_var_0;
9280         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9281         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9282         *streamPtrPtr += 1 * 8;
9283     }
9284     uint64_t cgen_var_0;
9285     *&cgen_var_0 = get_host_u64_VkImage((*&local_srcImage));
9286     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9287     *streamPtrPtr += 1 * 8;
9288     memcpy(*streamPtrPtr, (VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
9289     *streamPtrPtr += sizeof(VkImageLayout);
9290     uint64_t cgen_var_1;
9291     *&cgen_var_1 = get_host_u64_VkImage((*&local_dstImage));
9292     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
9293     *streamPtrPtr += 1 * 8;
9294     memcpy(*streamPtrPtr, (VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
9295     *streamPtrPtr += sizeof(VkImageLayout);
9296     memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
9297     *streamPtrPtr += sizeof(uint32_t);
9298     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9299         reservedmarshal_VkImageCopy(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
9300                                     (VkImageCopy*)(local_pRegions + i), streamPtrPtr);
9301     }
9302     ++encodeCount;
9303     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9304         pool->freeAll();
9305         stream->clearPool();
9306     }
9307     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9308 }
9309 
vkCmdBlitImage(VkCommandBuffer commandBuffer,VkImage srcImage,VkImageLayout srcImageLayout,VkImage dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageBlit * pRegions,VkFilter filter,uint32_t doLock)9310 void VkEncoder::vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage,
9311                                VkImageLayout srcImageLayout, VkImage dstImage,
9312                                VkImageLayout dstImageLayout, uint32_t regionCount,
9313                                const VkImageBlit* pRegions, VkFilter filter, uint32_t doLock) {
9314     (void)doLock;
9315     bool queueSubmitWithCommandsEnabled =
9316         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9317     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9318     auto stream = mImpl->stream();
9319     auto pool = mImpl->pool();
9320     VkCommandBuffer local_commandBuffer;
9321     VkImage local_srcImage;
9322     VkImageLayout local_srcImageLayout;
9323     VkImage local_dstImage;
9324     VkImageLayout local_dstImageLayout;
9325     uint32_t local_regionCount;
9326     VkImageBlit* local_pRegions;
9327     VkFilter local_filter;
9328     local_commandBuffer = commandBuffer;
9329     local_srcImage = srcImage;
9330     local_srcImageLayout = srcImageLayout;
9331     local_dstImage = dstImage;
9332     local_dstImageLayout = dstImageLayout;
9333     local_regionCount = regionCount;
9334     local_pRegions = nullptr;
9335     if (pRegions) {
9336         local_pRegions = (VkImageBlit*)pool->alloc(((regionCount)) * sizeof(const VkImageBlit));
9337         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9338             deepcopy_VkImageBlit(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i,
9339                                  (VkImageBlit*)(local_pRegions + i));
9340         }
9341     }
9342     local_filter = filter;
9343     if (local_pRegions) {
9344         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9345             transform_tohost_VkImageBlit(sResourceTracker, (VkImageBlit*)(local_pRegions + i));
9346         }
9347     }
9348     size_t count = 0;
9349     size_t* countPtr = &count;
9350     {
9351         uint64_t cgen_var_0;
9352         *countPtr += 1 * 8;
9353         uint64_t cgen_var_1;
9354         *countPtr += 1 * 8;
9355         *countPtr += sizeof(VkImageLayout);
9356         uint64_t cgen_var_2;
9357         *countPtr += 1 * 8;
9358         *countPtr += sizeof(VkImageLayout);
9359         *countPtr += sizeof(uint32_t);
9360         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9361             count_VkImageBlit(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
9362                               (VkImageBlit*)(local_pRegions + i), countPtr);
9363         }
9364         *countPtr += sizeof(VkFilter);
9365     }
9366     uint32_t packetSize_vkCmdBlitImage = 4 + 4 + count;
9367     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBlitImage -= 8;
9368     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBlitImage);
9369     uint8_t* packetBeginPtr = streamPtr;
9370     uint8_t** streamPtrPtr = &streamPtr;
9371     uint32_t opcode_vkCmdBlitImage = OP_vkCmdBlitImage;
9372     memcpy(streamPtr, &opcode_vkCmdBlitImage, sizeof(uint32_t));
9373     streamPtr += sizeof(uint32_t);
9374     memcpy(streamPtr, &packetSize_vkCmdBlitImage, sizeof(uint32_t));
9375     streamPtr += sizeof(uint32_t);
9376     if (!queueSubmitWithCommandsEnabled) {
9377         uint64_t cgen_var_0;
9378         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9379         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9380         *streamPtrPtr += 1 * 8;
9381     }
9382     uint64_t cgen_var_0;
9383     *&cgen_var_0 = get_host_u64_VkImage((*&local_srcImage));
9384     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9385     *streamPtrPtr += 1 * 8;
9386     memcpy(*streamPtrPtr, (VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
9387     *streamPtrPtr += sizeof(VkImageLayout);
9388     uint64_t cgen_var_1;
9389     *&cgen_var_1 = get_host_u64_VkImage((*&local_dstImage));
9390     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
9391     *streamPtrPtr += 1 * 8;
9392     memcpy(*streamPtrPtr, (VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
9393     *streamPtrPtr += sizeof(VkImageLayout);
9394     memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
9395     *streamPtrPtr += sizeof(uint32_t);
9396     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9397         reservedmarshal_VkImageBlit(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
9398                                     (VkImageBlit*)(local_pRegions + i), streamPtrPtr);
9399     }
9400     memcpy(*streamPtrPtr, (VkFilter*)&local_filter, sizeof(VkFilter));
9401     *streamPtrPtr += sizeof(VkFilter);
9402     ++encodeCount;
9403     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9404         pool->freeAll();
9405         stream->clearPool();
9406     }
9407     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9408 }
9409 
vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer,VkBuffer srcBuffer,VkImage dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkBufferImageCopy * pRegions,uint32_t doLock)9410 void VkEncoder::vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer,
9411                                        VkImage dstImage, VkImageLayout dstImageLayout,
9412                                        uint32_t regionCount, const VkBufferImageCopy* pRegions,
9413                                        uint32_t doLock) {
9414     (void)doLock;
9415     bool queueSubmitWithCommandsEnabled =
9416         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9417     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9418     auto stream = mImpl->stream();
9419     auto pool = mImpl->pool();
9420     VkCommandBuffer local_commandBuffer;
9421     VkBuffer local_srcBuffer;
9422     VkImage local_dstImage;
9423     VkImageLayout local_dstImageLayout;
9424     uint32_t local_regionCount;
9425     VkBufferImageCopy* local_pRegions;
9426     local_commandBuffer = commandBuffer;
9427     local_srcBuffer = srcBuffer;
9428     local_dstImage = dstImage;
9429     local_dstImageLayout = dstImageLayout;
9430     local_regionCount = regionCount;
9431     local_pRegions = nullptr;
9432     if (pRegions) {
9433         local_pRegions =
9434             (VkBufferImageCopy*)pool->alloc(((regionCount)) * sizeof(const VkBufferImageCopy));
9435         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9436             deepcopy_VkBufferImageCopy(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i,
9437                                        (VkBufferImageCopy*)(local_pRegions + i));
9438         }
9439     }
9440     if (local_pRegions) {
9441         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9442             transform_tohost_VkBufferImageCopy(sResourceTracker,
9443                                                (VkBufferImageCopy*)(local_pRegions + i));
9444         }
9445     }
9446     size_t count = 0;
9447     size_t* countPtr = &count;
9448     {
9449         uint64_t cgen_var_0;
9450         *countPtr += 1 * 8;
9451         uint64_t cgen_var_1;
9452         *countPtr += 1 * 8;
9453         uint64_t cgen_var_2;
9454         *countPtr += 1 * 8;
9455         *countPtr += sizeof(VkImageLayout);
9456         *countPtr += sizeof(uint32_t);
9457         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9458             count_VkBufferImageCopy(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
9459                                     (VkBufferImageCopy*)(local_pRegions + i), countPtr);
9460         }
9461     }
9462     uint32_t packetSize_vkCmdCopyBufferToImage = 4 + 4 + count;
9463     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyBufferToImage -= 8;
9464     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyBufferToImage);
9465     uint8_t* packetBeginPtr = streamPtr;
9466     uint8_t** streamPtrPtr = &streamPtr;
9467     uint32_t opcode_vkCmdCopyBufferToImage = OP_vkCmdCopyBufferToImage;
9468     memcpy(streamPtr, &opcode_vkCmdCopyBufferToImage, sizeof(uint32_t));
9469     streamPtr += sizeof(uint32_t);
9470     memcpy(streamPtr, &packetSize_vkCmdCopyBufferToImage, sizeof(uint32_t));
9471     streamPtr += sizeof(uint32_t);
9472     if (!queueSubmitWithCommandsEnabled) {
9473         uint64_t cgen_var_0;
9474         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9475         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9476         *streamPtrPtr += 1 * 8;
9477     }
9478     uint64_t cgen_var_0;
9479     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_srcBuffer));
9480     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9481     *streamPtrPtr += 1 * 8;
9482     uint64_t cgen_var_1;
9483     *&cgen_var_1 = get_host_u64_VkImage((*&local_dstImage));
9484     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
9485     *streamPtrPtr += 1 * 8;
9486     memcpy(*streamPtrPtr, (VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
9487     *streamPtrPtr += sizeof(VkImageLayout);
9488     memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
9489     *streamPtrPtr += sizeof(uint32_t);
9490     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9491         reservedmarshal_VkBufferImageCopy(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
9492                                           (VkBufferImageCopy*)(local_pRegions + i), streamPtrPtr);
9493     }
9494     ++encodeCount;
9495     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9496         pool->freeAll();
9497         stream->clearPool();
9498     }
9499     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9500 }
9501 
vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer,VkImage srcImage,VkImageLayout srcImageLayout,VkBuffer dstBuffer,uint32_t regionCount,const VkBufferImageCopy * pRegions,uint32_t doLock)9502 void VkEncoder::vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
9503                                        VkImageLayout srcImageLayout, VkBuffer dstBuffer,
9504                                        uint32_t regionCount, const VkBufferImageCopy* pRegions,
9505                                        uint32_t doLock) {
9506     (void)doLock;
9507     bool queueSubmitWithCommandsEnabled =
9508         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9509     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9510     auto stream = mImpl->stream();
9511     auto pool = mImpl->pool();
9512     VkCommandBuffer local_commandBuffer;
9513     VkImage local_srcImage;
9514     VkImageLayout local_srcImageLayout;
9515     VkBuffer local_dstBuffer;
9516     uint32_t local_regionCount;
9517     VkBufferImageCopy* local_pRegions;
9518     local_commandBuffer = commandBuffer;
9519     local_srcImage = srcImage;
9520     local_srcImageLayout = srcImageLayout;
9521     local_dstBuffer = dstBuffer;
9522     local_regionCount = regionCount;
9523     local_pRegions = nullptr;
9524     if (pRegions) {
9525         local_pRegions =
9526             (VkBufferImageCopy*)pool->alloc(((regionCount)) * sizeof(const VkBufferImageCopy));
9527         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9528             deepcopy_VkBufferImageCopy(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i,
9529                                        (VkBufferImageCopy*)(local_pRegions + i));
9530         }
9531     }
9532     if (local_pRegions) {
9533         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9534             transform_tohost_VkBufferImageCopy(sResourceTracker,
9535                                                (VkBufferImageCopy*)(local_pRegions + i));
9536         }
9537     }
9538     size_t count = 0;
9539     size_t* countPtr = &count;
9540     {
9541         uint64_t cgen_var_0;
9542         *countPtr += 1 * 8;
9543         uint64_t cgen_var_1;
9544         *countPtr += 1 * 8;
9545         *countPtr += sizeof(VkImageLayout);
9546         uint64_t cgen_var_2;
9547         *countPtr += 1 * 8;
9548         *countPtr += sizeof(uint32_t);
9549         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9550             count_VkBufferImageCopy(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
9551                                     (VkBufferImageCopy*)(local_pRegions + i), countPtr);
9552         }
9553     }
9554     uint32_t packetSize_vkCmdCopyImageToBuffer = 4 + 4 + count;
9555     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyImageToBuffer -= 8;
9556     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyImageToBuffer);
9557     uint8_t* packetBeginPtr = streamPtr;
9558     uint8_t** streamPtrPtr = &streamPtr;
9559     uint32_t opcode_vkCmdCopyImageToBuffer = OP_vkCmdCopyImageToBuffer;
9560     memcpy(streamPtr, &opcode_vkCmdCopyImageToBuffer, sizeof(uint32_t));
9561     streamPtr += sizeof(uint32_t);
9562     memcpy(streamPtr, &packetSize_vkCmdCopyImageToBuffer, sizeof(uint32_t));
9563     streamPtr += sizeof(uint32_t);
9564     if (!queueSubmitWithCommandsEnabled) {
9565         uint64_t cgen_var_0;
9566         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9567         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9568         *streamPtrPtr += 1 * 8;
9569     }
9570     uint64_t cgen_var_0;
9571     *&cgen_var_0 = get_host_u64_VkImage((*&local_srcImage));
9572     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9573     *streamPtrPtr += 1 * 8;
9574     memcpy(*streamPtrPtr, (VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
9575     *streamPtrPtr += sizeof(VkImageLayout);
9576     uint64_t cgen_var_1;
9577     *&cgen_var_1 = get_host_u64_VkBuffer((*&local_dstBuffer));
9578     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
9579     *streamPtrPtr += 1 * 8;
9580     memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
9581     *streamPtrPtr += sizeof(uint32_t);
9582     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
9583         reservedmarshal_VkBufferImageCopy(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
9584                                           (VkBufferImageCopy*)(local_pRegions + i), streamPtrPtr);
9585     }
9586     ++encodeCount;
9587     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9588         pool->freeAll();
9589         stream->clearPool();
9590     }
9591     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9592 }
9593 
vkCmdUpdateBuffer(VkCommandBuffer commandBuffer,VkBuffer dstBuffer,VkDeviceSize dstOffset,VkDeviceSize dataSize,const void * pData,uint32_t doLock)9594 void VkEncoder::vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
9595                                   VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData,
9596                                   uint32_t doLock) {
9597     (void)doLock;
9598     bool queueSubmitWithCommandsEnabled =
9599         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9600     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9601     auto stream = mImpl->stream();
9602     auto pool = mImpl->pool();
9603     VkCommandBuffer local_commandBuffer;
9604     VkBuffer local_dstBuffer;
9605     VkDeviceSize local_dstOffset;
9606     VkDeviceSize local_dataSize;
9607     void* local_pData;
9608     local_commandBuffer = commandBuffer;
9609     local_dstBuffer = dstBuffer;
9610     local_dstOffset = dstOffset;
9611     local_dataSize = dataSize;
9612     // Avoiding deepcopy for pData
9613     local_pData = (void*)pData;
9614     size_t count = 0;
9615     size_t* countPtr = &count;
9616     {
9617         uint64_t cgen_var_0;
9618         *countPtr += 1 * 8;
9619         uint64_t cgen_var_1;
9620         *countPtr += 1 * 8;
9621         *countPtr += sizeof(VkDeviceSize);
9622         *countPtr += sizeof(VkDeviceSize);
9623         *countPtr += ((dataSize)) * sizeof(uint8_t);
9624     }
9625     uint32_t packetSize_vkCmdUpdateBuffer = 4 + 4 + count;
9626     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdUpdateBuffer -= 8;
9627     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdUpdateBuffer);
9628     uint8_t* packetBeginPtr = streamPtr;
9629     uint8_t** streamPtrPtr = &streamPtr;
9630     uint32_t opcode_vkCmdUpdateBuffer = OP_vkCmdUpdateBuffer;
9631     memcpy(streamPtr, &opcode_vkCmdUpdateBuffer, sizeof(uint32_t));
9632     streamPtr += sizeof(uint32_t);
9633     memcpy(streamPtr, &packetSize_vkCmdUpdateBuffer, sizeof(uint32_t));
9634     streamPtr += sizeof(uint32_t);
9635     if (!queueSubmitWithCommandsEnabled) {
9636         uint64_t cgen_var_0;
9637         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9638         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9639         *streamPtrPtr += 1 * 8;
9640     }
9641     uint64_t cgen_var_0;
9642     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_dstBuffer));
9643     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9644     *streamPtrPtr += 1 * 8;
9645     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
9646     *streamPtrPtr += sizeof(VkDeviceSize);
9647     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dataSize, sizeof(VkDeviceSize));
9648     *streamPtrPtr += sizeof(VkDeviceSize);
9649     memcpy(*streamPtrPtr, (void*)local_pData, ((dataSize)) * sizeof(uint8_t));
9650     *streamPtrPtr += ((dataSize)) * sizeof(uint8_t);
9651     ++encodeCount;
9652     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9653         pool->freeAll();
9654         stream->clearPool();
9655     }
9656     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9657 }
9658 
vkCmdFillBuffer(VkCommandBuffer commandBuffer,VkBuffer dstBuffer,VkDeviceSize dstOffset,VkDeviceSize size,uint32_t data,uint32_t doLock)9659 void VkEncoder::vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer,
9660                                 VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data,
9661                                 uint32_t doLock) {
9662     (void)doLock;
9663     bool queueSubmitWithCommandsEnabled =
9664         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9665     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9666     auto stream = mImpl->stream();
9667     auto pool = mImpl->pool();
9668     VkCommandBuffer local_commandBuffer;
9669     VkBuffer local_dstBuffer;
9670     VkDeviceSize local_dstOffset;
9671     VkDeviceSize local_size;
9672     uint32_t local_data;
9673     local_commandBuffer = commandBuffer;
9674     local_dstBuffer = dstBuffer;
9675     local_dstOffset = dstOffset;
9676     local_size = size;
9677     local_data = data;
9678     size_t count = 0;
9679     size_t* countPtr = &count;
9680     {
9681         uint64_t cgen_var_0;
9682         *countPtr += 1 * 8;
9683         uint64_t cgen_var_1;
9684         *countPtr += 1 * 8;
9685         *countPtr += sizeof(VkDeviceSize);
9686         *countPtr += sizeof(VkDeviceSize);
9687         *countPtr += sizeof(uint32_t);
9688     }
9689     uint32_t packetSize_vkCmdFillBuffer = 4 + 4 + count;
9690     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdFillBuffer -= 8;
9691     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdFillBuffer);
9692     uint8_t* packetBeginPtr = streamPtr;
9693     uint8_t** streamPtrPtr = &streamPtr;
9694     uint32_t opcode_vkCmdFillBuffer = OP_vkCmdFillBuffer;
9695     memcpy(streamPtr, &opcode_vkCmdFillBuffer, sizeof(uint32_t));
9696     streamPtr += sizeof(uint32_t);
9697     memcpy(streamPtr, &packetSize_vkCmdFillBuffer, sizeof(uint32_t));
9698     streamPtr += sizeof(uint32_t);
9699     if (!queueSubmitWithCommandsEnabled) {
9700         uint64_t cgen_var_0;
9701         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9702         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9703         *streamPtrPtr += 1 * 8;
9704     }
9705     uint64_t cgen_var_0;
9706     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_dstBuffer));
9707     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9708     *streamPtrPtr += 1 * 8;
9709     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
9710     *streamPtrPtr += sizeof(VkDeviceSize);
9711     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_size, sizeof(VkDeviceSize));
9712     *streamPtrPtr += sizeof(VkDeviceSize);
9713     memcpy(*streamPtrPtr, (uint32_t*)&local_data, sizeof(uint32_t));
9714     *streamPtrPtr += sizeof(uint32_t);
9715     ++encodeCount;
9716     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9717         pool->freeAll();
9718         stream->clearPool();
9719     }
9720     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9721 }
9722 
vkCmdClearColorImage(VkCommandBuffer commandBuffer,VkImage image,VkImageLayout imageLayout,const VkClearColorValue * pColor,uint32_t rangeCount,const VkImageSubresourceRange * pRanges,uint32_t doLock)9723 void VkEncoder::vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image,
9724                                      VkImageLayout imageLayout, const VkClearColorValue* pColor,
9725                                      uint32_t rangeCount, const VkImageSubresourceRange* pRanges,
9726                                      uint32_t doLock) {
9727     (void)doLock;
9728     bool queueSubmitWithCommandsEnabled =
9729         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9730     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9731     auto stream = mImpl->stream();
9732     auto pool = mImpl->pool();
9733     VkCommandBuffer local_commandBuffer;
9734     VkImage local_image;
9735     VkImageLayout local_imageLayout;
9736     VkClearColorValue* local_pColor;
9737     uint32_t local_rangeCount;
9738     VkImageSubresourceRange* local_pRanges;
9739     local_commandBuffer = commandBuffer;
9740     local_image = image;
9741     local_imageLayout = imageLayout;
9742     local_pColor = nullptr;
9743     if (pColor) {
9744         local_pColor = (VkClearColorValue*)pool->alloc(sizeof(const VkClearColorValue));
9745         deepcopy_VkClearColorValue(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pColor,
9746                                    (VkClearColorValue*)(local_pColor));
9747     }
9748     local_rangeCount = rangeCount;
9749     local_pRanges = nullptr;
9750     if (pRanges) {
9751         local_pRanges = (VkImageSubresourceRange*)pool->alloc(
9752             ((rangeCount)) * sizeof(const VkImageSubresourceRange));
9753         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
9754             deepcopy_VkImageSubresourceRange(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRanges + i,
9755                                              (VkImageSubresourceRange*)(local_pRanges + i));
9756         }
9757     }
9758     if (local_pColor) {
9759         transform_tohost_VkClearColorValue(sResourceTracker, (VkClearColorValue*)(local_pColor));
9760     }
9761     if (local_pRanges) {
9762         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
9763             transform_tohost_VkImageSubresourceRange(sResourceTracker,
9764                                                      (VkImageSubresourceRange*)(local_pRanges + i));
9765         }
9766     }
9767     size_t count = 0;
9768     size_t* countPtr = &count;
9769     {
9770         uint64_t cgen_var_0;
9771         *countPtr += 1 * 8;
9772         uint64_t cgen_var_1;
9773         *countPtr += 1 * 8;
9774         *countPtr += sizeof(VkImageLayout);
9775         count_VkClearColorValue(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
9776                                 (VkClearColorValue*)(local_pColor), countPtr);
9777         *countPtr += sizeof(uint32_t);
9778         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
9779             count_VkImageSubresourceRange(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
9780                                           (VkImageSubresourceRange*)(local_pRanges + i), countPtr);
9781         }
9782     }
9783     uint32_t packetSize_vkCmdClearColorImage = 4 + 4 + count;
9784     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdClearColorImage -= 8;
9785     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdClearColorImage);
9786     uint8_t* packetBeginPtr = streamPtr;
9787     uint8_t** streamPtrPtr = &streamPtr;
9788     uint32_t opcode_vkCmdClearColorImage = OP_vkCmdClearColorImage;
9789     memcpy(streamPtr, &opcode_vkCmdClearColorImage, sizeof(uint32_t));
9790     streamPtr += sizeof(uint32_t);
9791     memcpy(streamPtr, &packetSize_vkCmdClearColorImage, sizeof(uint32_t));
9792     streamPtr += sizeof(uint32_t);
9793     if (!queueSubmitWithCommandsEnabled) {
9794         uint64_t cgen_var_0;
9795         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9796         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9797         *streamPtrPtr += 1 * 8;
9798     }
9799     uint64_t cgen_var_0;
9800     *&cgen_var_0 = get_host_u64_VkImage((*&local_image));
9801     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9802     *streamPtrPtr += 1 * 8;
9803     memcpy(*streamPtrPtr, (VkImageLayout*)&local_imageLayout, sizeof(VkImageLayout));
9804     *streamPtrPtr += sizeof(VkImageLayout);
9805     reservedmarshal_VkClearColorValue(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
9806                                       (VkClearColorValue*)(local_pColor), streamPtrPtr);
9807     memcpy(*streamPtrPtr, (uint32_t*)&local_rangeCount, sizeof(uint32_t));
9808     *streamPtrPtr += sizeof(uint32_t);
9809     for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
9810         reservedmarshal_VkImageSubresourceRange(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
9811                                                 (VkImageSubresourceRange*)(local_pRanges + i),
9812                                                 streamPtrPtr);
9813     }
9814     ++encodeCount;
9815     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9816         pool->freeAll();
9817         stream->clearPool();
9818     }
9819     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9820 }
9821 
vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer,VkImage image,VkImageLayout imageLayout,const VkClearDepthStencilValue * pDepthStencil,uint32_t rangeCount,const VkImageSubresourceRange * pRanges,uint32_t doLock)9822 void VkEncoder::vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image,
9823                                             VkImageLayout imageLayout,
9824                                             const VkClearDepthStencilValue* pDepthStencil,
9825                                             uint32_t rangeCount,
9826                                             const VkImageSubresourceRange* pRanges,
9827                                             uint32_t doLock) {
9828     (void)doLock;
9829     bool queueSubmitWithCommandsEnabled =
9830         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9831     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9832     auto stream = mImpl->stream();
9833     auto pool = mImpl->pool();
9834     VkCommandBuffer local_commandBuffer;
9835     VkImage local_image;
9836     VkImageLayout local_imageLayout;
9837     VkClearDepthStencilValue* local_pDepthStencil;
9838     uint32_t local_rangeCount;
9839     VkImageSubresourceRange* local_pRanges;
9840     local_commandBuffer = commandBuffer;
9841     local_image = image;
9842     local_imageLayout = imageLayout;
9843     local_pDepthStencil = nullptr;
9844     if (pDepthStencil) {
9845         local_pDepthStencil =
9846             (VkClearDepthStencilValue*)pool->alloc(sizeof(const VkClearDepthStencilValue));
9847         deepcopy_VkClearDepthStencilValue(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDepthStencil,
9848                                           (VkClearDepthStencilValue*)(local_pDepthStencil));
9849     }
9850     local_rangeCount = rangeCount;
9851     local_pRanges = nullptr;
9852     if (pRanges) {
9853         local_pRanges = (VkImageSubresourceRange*)pool->alloc(
9854             ((rangeCount)) * sizeof(const VkImageSubresourceRange));
9855         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
9856             deepcopy_VkImageSubresourceRange(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRanges + i,
9857                                              (VkImageSubresourceRange*)(local_pRanges + i));
9858         }
9859     }
9860     if (local_pDepthStencil) {
9861         transform_tohost_VkClearDepthStencilValue(sResourceTracker,
9862                                                   (VkClearDepthStencilValue*)(local_pDepthStencil));
9863     }
9864     if (local_pRanges) {
9865         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
9866             transform_tohost_VkImageSubresourceRange(sResourceTracker,
9867                                                      (VkImageSubresourceRange*)(local_pRanges + i));
9868         }
9869     }
9870     size_t count = 0;
9871     size_t* countPtr = &count;
9872     {
9873         uint64_t cgen_var_0;
9874         *countPtr += 1 * 8;
9875         uint64_t cgen_var_1;
9876         *countPtr += 1 * 8;
9877         *countPtr += sizeof(VkImageLayout);
9878         count_VkClearDepthStencilValue(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
9879                                        (VkClearDepthStencilValue*)(local_pDepthStencil), countPtr);
9880         *countPtr += sizeof(uint32_t);
9881         for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
9882             count_VkImageSubresourceRange(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
9883                                           (VkImageSubresourceRange*)(local_pRanges + i), countPtr);
9884         }
9885     }
9886     uint32_t packetSize_vkCmdClearDepthStencilImage = 4 + 4 + count;
9887     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdClearDepthStencilImage -= 8;
9888     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdClearDepthStencilImage);
9889     uint8_t* packetBeginPtr = streamPtr;
9890     uint8_t** streamPtrPtr = &streamPtr;
9891     uint32_t opcode_vkCmdClearDepthStencilImage = OP_vkCmdClearDepthStencilImage;
9892     memcpy(streamPtr, &opcode_vkCmdClearDepthStencilImage, sizeof(uint32_t));
9893     streamPtr += sizeof(uint32_t);
9894     memcpy(streamPtr, &packetSize_vkCmdClearDepthStencilImage, sizeof(uint32_t));
9895     streamPtr += sizeof(uint32_t);
9896     if (!queueSubmitWithCommandsEnabled) {
9897         uint64_t cgen_var_0;
9898         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
9899         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9900         *streamPtrPtr += 1 * 8;
9901     }
9902     uint64_t cgen_var_0;
9903     *&cgen_var_0 = get_host_u64_VkImage((*&local_image));
9904     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
9905     *streamPtrPtr += 1 * 8;
9906     memcpy(*streamPtrPtr, (VkImageLayout*)&local_imageLayout, sizeof(VkImageLayout));
9907     *streamPtrPtr += sizeof(VkImageLayout);
9908     reservedmarshal_VkClearDepthStencilValue(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
9909                                              (VkClearDepthStencilValue*)(local_pDepthStencil),
9910                                              streamPtrPtr);
9911     memcpy(*streamPtrPtr, (uint32_t*)&local_rangeCount, sizeof(uint32_t));
9912     *streamPtrPtr += sizeof(uint32_t);
9913     for (uint32_t i = 0; i < (uint32_t)((rangeCount)); ++i) {
9914         reservedmarshal_VkImageSubresourceRange(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
9915                                                 (VkImageSubresourceRange*)(local_pRanges + i),
9916                                                 streamPtrPtr);
9917     }
9918     ++encodeCount;
9919     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
9920         pool->freeAll();
9921         stream->clearPool();
9922     }
9923     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
9924 }
9925 
vkCmdClearAttachments(VkCommandBuffer commandBuffer,uint32_t attachmentCount,const VkClearAttachment * pAttachments,uint32_t rectCount,const VkClearRect * pRects,uint32_t doLock)9926 void VkEncoder::vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
9927                                       const VkClearAttachment* pAttachments, uint32_t rectCount,
9928                                       const VkClearRect* pRects, uint32_t doLock) {
9929     (void)doLock;
9930     bool queueSubmitWithCommandsEnabled =
9931         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
9932     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
9933     auto stream = mImpl->stream();
9934     auto pool = mImpl->pool();
9935     VkCommandBuffer local_commandBuffer;
9936     uint32_t local_attachmentCount;
9937     VkClearAttachment* local_pAttachments;
9938     uint32_t local_rectCount;
9939     VkClearRect* local_pRects;
9940     local_commandBuffer = commandBuffer;
9941     local_attachmentCount = attachmentCount;
9942     local_pAttachments = nullptr;
9943     if (pAttachments) {
9944         local_pAttachments =
9945             (VkClearAttachment*)pool->alloc(((attachmentCount)) * sizeof(const VkClearAttachment));
9946         for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i) {
9947             deepcopy_VkClearAttachment(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAttachments + i,
9948                                        (VkClearAttachment*)(local_pAttachments + i));
9949         }
9950     }
9951     local_rectCount = rectCount;
9952     local_pRects = nullptr;
9953     if (pRects) {
9954         local_pRects = (VkClearRect*)pool->alloc(((rectCount)) * sizeof(const VkClearRect));
9955         for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i) {
9956             deepcopy_VkClearRect(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRects + i,
9957                                  (VkClearRect*)(local_pRects + i));
9958         }
9959     }
9960     if (local_pAttachments) {
9961         for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i) {
9962             transform_tohost_VkClearAttachment(sResourceTracker,
9963                                                (VkClearAttachment*)(local_pAttachments + i));
9964         }
9965     }
9966     if (local_pRects) {
9967         for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i) {
9968             transform_tohost_VkClearRect(sResourceTracker, (VkClearRect*)(local_pRects + i));
9969         }
9970     }
9971     size_t count = 0;
9972     size_t* countPtr = &count;
9973     {
9974         uint64_t cgen_var_0;
9975         *countPtr += 1 * 8;
9976         *countPtr += sizeof(uint32_t);
9977         for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i) {
9978             count_VkClearAttachment(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
9979                                     (VkClearAttachment*)(local_pAttachments + i), countPtr);
9980         }
9981         *countPtr += sizeof(uint32_t);
9982         for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i) {
9983             count_VkClearRect(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
9984                               (VkClearRect*)(local_pRects + i), countPtr);
9985         }
9986     }
9987     uint32_t packetSize_vkCmdClearAttachments = 4 + 4 + count;
9988     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdClearAttachments -= 8;
9989     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdClearAttachments);
9990     uint8_t* packetBeginPtr = streamPtr;
9991     uint8_t** streamPtrPtr = &streamPtr;
9992     uint32_t opcode_vkCmdClearAttachments = OP_vkCmdClearAttachments;
9993     memcpy(streamPtr, &opcode_vkCmdClearAttachments, sizeof(uint32_t));
9994     streamPtr += sizeof(uint32_t);
9995     memcpy(streamPtr, &packetSize_vkCmdClearAttachments, sizeof(uint32_t));
9996     streamPtr += sizeof(uint32_t);
9997     if (!queueSubmitWithCommandsEnabled) {
9998         uint64_t cgen_var_0;
9999         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10000         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10001         *streamPtrPtr += 1 * 8;
10002     }
10003     memcpy(*streamPtrPtr, (uint32_t*)&local_attachmentCount, sizeof(uint32_t));
10004     *streamPtrPtr += sizeof(uint32_t);
10005     for (uint32_t i = 0; i < (uint32_t)((attachmentCount)); ++i) {
10006         reservedmarshal_VkClearAttachment(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
10007                                           (VkClearAttachment*)(local_pAttachments + i),
10008                                           streamPtrPtr);
10009     }
10010     memcpy(*streamPtrPtr, (uint32_t*)&local_rectCount, sizeof(uint32_t));
10011     *streamPtrPtr += sizeof(uint32_t);
10012     for (uint32_t i = 0; i < (uint32_t)((rectCount)); ++i) {
10013         reservedmarshal_VkClearRect(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
10014                                     (VkClearRect*)(local_pRects + i), streamPtrPtr);
10015     }
10016     ++encodeCount;
10017     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10018         pool->freeAll();
10019         stream->clearPool();
10020     }
10021     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10022 }
10023 
vkCmdResolveImage(VkCommandBuffer commandBuffer,VkImage srcImage,VkImageLayout srcImageLayout,VkImage dstImage,VkImageLayout dstImageLayout,uint32_t regionCount,const VkImageResolve * pRegions,uint32_t doLock)10024 void VkEncoder::vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage,
10025                                   VkImageLayout srcImageLayout, VkImage dstImage,
10026                                   VkImageLayout dstImageLayout, uint32_t regionCount,
10027                                   const VkImageResolve* pRegions, uint32_t doLock) {
10028     (void)doLock;
10029     bool queueSubmitWithCommandsEnabled =
10030         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10031     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10032     auto stream = mImpl->stream();
10033     auto pool = mImpl->pool();
10034     VkCommandBuffer local_commandBuffer;
10035     VkImage local_srcImage;
10036     VkImageLayout local_srcImageLayout;
10037     VkImage local_dstImage;
10038     VkImageLayout local_dstImageLayout;
10039     uint32_t local_regionCount;
10040     VkImageResolve* local_pRegions;
10041     local_commandBuffer = commandBuffer;
10042     local_srcImage = srcImage;
10043     local_srcImageLayout = srcImageLayout;
10044     local_dstImage = dstImage;
10045     local_dstImageLayout = dstImageLayout;
10046     local_regionCount = regionCount;
10047     local_pRegions = nullptr;
10048     if (pRegions) {
10049         local_pRegions =
10050             (VkImageResolve*)pool->alloc(((regionCount)) * sizeof(const VkImageResolve));
10051         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
10052             deepcopy_VkImageResolve(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRegions + i,
10053                                     (VkImageResolve*)(local_pRegions + i));
10054         }
10055     }
10056     if (local_pRegions) {
10057         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
10058             transform_tohost_VkImageResolve(sResourceTracker,
10059                                             (VkImageResolve*)(local_pRegions + i));
10060         }
10061     }
10062     size_t count = 0;
10063     size_t* countPtr = &count;
10064     {
10065         uint64_t cgen_var_0;
10066         *countPtr += 1 * 8;
10067         uint64_t cgen_var_1;
10068         *countPtr += 1 * 8;
10069         *countPtr += sizeof(VkImageLayout);
10070         uint64_t cgen_var_2;
10071         *countPtr += 1 * 8;
10072         *countPtr += sizeof(VkImageLayout);
10073         *countPtr += sizeof(uint32_t);
10074         for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
10075             count_VkImageResolve(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
10076                                  (VkImageResolve*)(local_pRegions + i), countPtr);
10077         }
10078     }
10079     uint32_t packetSize_vkCmdResolveImage = 4 + 4 + count;
10080     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdResolveImage -= 8;
10081     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdResolveImage);
10082     uint8_t* packetBeginPtr = streamPtr;
10083     uint8_t** streamPtrPtr = &streamPtr;
10084     uint32_t opcode_vkCmdResolveImage = OP_vkCmdResolveImage;
10085     memcpy(streamPtr, &opcode_vkCmdResolveImage, sizeof(uint32_t));
10086     streamPtr += sizeof(uint32_t);
10087     memcpy(streamPtr, &packetSize_vkCmdResolveImage, sizeof(uint32_t));
10088     streamPtr += sizeof(uint32_t);
10089     if (!queueSubmitWithCommandsEnabled) {
10090         uint64_t cgen_var_0;
10091         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10092         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10093         *streamPtrPtr += 1 * 8;
10094     }
10095     uint64_t cgen_var_0;
10096     *&cgen_var_0 = get_host_u64_VkImage((*&local_srcImage));
10097     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10098     *streamPtrPtr += 1 * 8;
10099     memcpy(*streamPtrPtr, (VkImageLayout*)&local_srcImageLayout, sizeof(VkImageLayout));
10100     *streamPtrPtr += sizeof(VkImageLayout);
10101     uint64_t cgen_var_1;
10102     *&cgen_var_1 = get_host_u64_VkImage((*&local_dstImage));
10103     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
10104     *streamPtrPtr += 1 * 8;
10105     memcpy(*streamPtrPtr, (VkImageLayout*)&local_dstImageLayout, sizeof(VkImageLayout));
10106     *streamPtrPtr += sizeof(VkImageLayout);
10107     memcpy(*streamPtrPtr, (uint32_t*)&local_regionCount, sizeof(uint32_t));
10108     *streamPtrPtr += sizeof(uint32_t);
10109     for (uint32_t i = 0; i < (uint32_t)((regionCount)); ++i) {
10110         reservedmarshal_VkImageResolve(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
10111                                        (VkImageResolve*)(local_pRegions + i), streamPtrPtr);
10112     }
10113     ++encodeCount;
10114     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10115         pool->freeAll();
10116         stream->clearPool();
10117     }
10118     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10119 }
10120 
vkCmdSetEvent(VkCommandBuffer commandBuffer,VkEvent event,VkPipelineStageFlags stageMask,uint32_t doLock)10121 void VkEncoder::vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event,
10122                               VkPipelineStageFlags stageMask, uint32_t doLock) {
10123     (void)doLock;
10124     bool queueSubmitWithCommandsEnabled =
10125         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10126     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10127     auto stream = mImpl->stream();
10128     auto pool = mImpl->pool();
10129     VkCommandBuffer local_commandBuffer;
10130     VkEvent local_event;
10131     VkPipelineStageFlags local_stageMask;
10132     local_commandBuffer = commandBuffer;
10133     local_event = event;
10134     local_stageMask = stageMask;
10135     size_t count = 0;
10136     size_t* countPtr = &count;
10137     {
10138         uint64_t cgen_var_0;
10139         *countPtr += 1 * 8;
10140         uint64_t cgen_var_1;
10141         *countPtr += 1 * 8;
10142         *countPtr += sizeof(VkPipelineStageFlags);
10143     }
10144     uint32_t packetSize_vkCmdSetEvent = 4 + 4 + count;
10145     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetEvent -= 8;
10146     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetEvent);
10147     uint8_t* packetBeginPtr = streamPtr;
10148     uint8_t** streamPtrPtr = &streamPtr;
10149     uint32_t opcode_vkCmdSetEvent = OP_vkCmdSetEvent;
10150     memcpy(streamPtr, &opcode_vkCmdSetEvent, sizeof(uint32_t));
10151     streamPtr += sizeof(uint32_t);
10152     memcpy(streamPtr, &packetSize_vkCmdSetEvent, sizeof(uint32_t));
10153     streamPtr += sizeof(uint32_t);
10154     if (!queueSubmitWithCommandsEnabled) {
10155         uint64_t cgen_var_0;
10156         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10157         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10158         *streamPtrPtr += 1 * 8;
10159     }
10160     uint64_t cgen_var_0;
10161     *&cgen_var_0 = get_host_u64_VkEvent((*&local_event));
10162     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10163     *streamPtrPtr += 1 * 8;
10164     memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_stageMask, sizeof(VkPipelineStageFlags));
10165     *streamPtrPtr += sizeof(VkPipelineStageFlags);
10166     ++encodeCount;
10167     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10168         pool->freeAll();
10169         stream->clearPool();
10170     }
10171     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10172 }
10173 
vkCmdResetEvent(VkCommandBuffer commandBuffer,VkEvent event,VkPipelineStageFlags stageMask,uint32_t doLock)10174 void VkEncoder::vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
10175                                 VkPipelineStageFlags stageMask, uint32_t doLock) {
10176     (void)doLock;
10177     bool queueSubmitWithCommandsEnabled =
10178         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10179     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10180     auto stream = mImpl->stream();
10181     auto pool = mImpl->pool();
10182     VkCommandBuffer local_commandBuffer;
10183     VkEvent local_event;
10184     VkPipelineStageFlags local_stageMask;
10185     local_commandBuffer = commandBuffer;
10186     local_event = event;
10187     local_stageMask = stageMask;
10188     size_t count = 0;
10189     size_t* countPtr = &count;
10190     {
10191         uint64_t cgen_var_0;
10192         *countPtr += 1 * 8;
10193         uint64_t cgen_var_1;
10194         *countPtr += 1 * 8;
10195         *countPtr += sizeof(VkPipelineStageFlags);
10196     }
10197     uint32_t packetSize_vkCmdResetEvent = 4 + 4 + count;
10198     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdResetEvent -= 8;
10199     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdResetEvent);
10200     uint8_t* packetBeginPtr = streamPtr;
10201     uint8_t** streamPtrPtr = &streamPtr;
10202     uint32_t opcode_vkCmdResetEvent = OP_vkCmdResetEvent;
10203     memcpy(streamPtr, &opcode_vkCmdResetEvent, sizeof(uint32_t));
10204     streamPtr += sizeof(uint32_t);
10205     memcpy(streamPtr, &packetSize_vkCmdResetEvent, sizeof(uint32_t));
10206     streamPtr += sizeof(uint32_t);
10207     if (!queueSubmitWithCommandsEnabled) {
10208         uint64_t cgen_var_0;
10209         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10210         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10211         *streamPtrPtr += 1 * 8;
10212     }
10213     uint64_t cgen_var_0;
10214     *&cgen_var_0 = get_host_u64_VkEvent((*&local_event));
10215     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10216     *streamPtrPtr += 1 * 8;
10217     memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_stageMask, sizeof(VkPipelineStageFlags));
10218     *streamPtrPtr += sizeof(VkPipelineStageFlags);
10219     ++encodeCount;
10220     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10221         pool->freeAll();
10222         stream->clearPool();
10223     }
10224     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10225 }
10226 
vkCmdWaitEvents(VkCommandBuffer commandBuffer,uint32_t eventCount,const VkEvent * pEvents,VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,uint32_t memoryBarrierCount,const VkMemoryBarrier * pMemoryBarriers,uint32_t bufferMemoryBarrierCount,const VkBufferMemoryBarrier * pBufferMemoryBarriers,uint32_t imageMemoryBarrierCount,const VkImageMemoryBarrier * pImageMemoryBarriers,uint32_t doLock)10227 void VkEncoder::vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount,
10228                                 const VkEvent* pEvents, VkPipelineStageFlags srcStageMask,
10229                                 VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount,
10230                                 const VkMemoryBarrier* pMemoryBarriers,
10231                                 uint32_t bufferMemoryBarrierCount,
10232                                 const VkBufferMemoryBarrier* pBufferMemoryBarriers,
10233                                 uint32_t imageMemoryBarrierCount,
10234                                 const VkImageMemoryBarrier* pImageMemoryBarriers, uint32_t doLock) {
10235     (void)doLock;
10236     bool queueSubmitWithCommandsEnabled =
10237         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10238     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10239     auto stream = mImpl->stream();
10240     auto pool = mImpl->pool();
10241     VkCommandBuffer local_commandBuffer;
10242     uint32_t local_eventCount;
10243     VkEvent* local_pEvents;
10244     VkPipelineStageFlags local_srcStageMask;
10245     VkPipelineStageFlags local_dstStageMask;
10246     uint32_t local_memoryBarrierCount;
10247     VkMemoryBarrier* local_pMemoryBarriers;
10248     uint32_t local_bufferMemoryBarrierCount;
10249     VkBufferMemoryBarrier* local_pBufferMemoryBarriers;
10250     uint32_t local_imageMemoryBarrierCount;
10251     VkImageMemoryBarrier* local_pImageMemoryBarriers;
10252     local_commandBuffer = commandBuffer;
10253     local_eventCount = eventCount;
10254     // Avoiding deepcopy for pEvents
10255     local_pEvents = (VkEvent*)pEvents;
10256     local_srcStageMask = srcStageMask;
10257     local_dstStageMask = dstStageMask;
10258     local_memoryBarrierCount = memoryBarrierCount;
10259     local_pMemoryBarriers = nullptr;
10260     if (pMemoryBarriers) {
10261         local_pMemoryBarriers =
10262             (VkMemoryBarrier*)pool->alloc(((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
10263         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
10264             deepcopy_VkMemoryBarrier(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMemoryBarriers + i,
10265                                      (VkMemoryBarrier*)(local_pMemoryBarriers + i));
10266         }
10267     }
10268     local_bufferMemoryBarrierCount = bufferMemoryBarrierCount;
10269     local_pBufferMemoryBarriers = nullptr;
10270     if (pBufferMemoryBarriers) {
10271         local_pBufferMemoryBarriers = (VkBufferMemoryBarrier*)pool->alloc(
10272             ((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
10273         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
10274             deepcopy_VkBufferMemoryBarrier(
10275                 pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBufferMemoryBarriers + i,
10276                 (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
10277         }
10278     }
10279     local_imageMemoryBarrierCount = imageMemoryBarrierCount;
10280     local_pImageMemoryBarriers = nullptr;
10281     if (pImageMemoryBarriers) {
10282         local_pImageMemoryBarriers = (VkImageMemoryBarrier*)pool->alloc(
10283             ((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
10284         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
10285             deepcopy_VkImageMemoryBarrier(pool, VK_STRUCTURE_TYPE_MAX_ENUM,
10286                                           pImageMemoryBarriers + i,
10287                                           (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
10288         }
10289     }
10290     if (local_pMemoryBarriers) {
10291         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
10292             transform_tohost_VkMemoryBarrier(sResourceTracker,
10293                                              (VkMemoryBarrier*)(local_pMemoryBarriers + i));
10294         }
10295     }
10296     if (local_pBufferMemoryBarriers) {
10297         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
10298             transform_tohost_VkBufferMemoryBarrier(
10299                 sResourceTracker, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
10300         }
10301     }
10302     if (local_pImageMemoryBarriers) {
10303         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
10304             transform_tohost_VkImageMemoryBarrier(
10305                 sResourceTracker, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
10306         }
10307     }
10308     size_t count = 0;
10309     size_t* countPtr = &count;
10310     {
10311         uint64_t cgen_var_0;
10312         *countPtr += 1 * 8;
10313         *countPtr += sizeof(uint32_t);
10314         if (((eventCount))) {
10315             *countPtr += ((eventCount)) * 8;
10316         }
10317         *countPtr += sizeof(VkPipelineStageFlags);
10318         *countPtr += sizeof(VkPipelineStageFlags);
10319         *countPtr += sizeof(uint32_t);
10320         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
10321             count_VkMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
10322                                   (VkMemoryBarrier*)(local_pMemoryBarriers + i), countPtr);
10323         }
10324         *countPtr += sizeof(uint32_t);
10325         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
10326             count_VkBufferMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
10327                                         (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i),
10328                                         countPtr);
10329         }
10330         *countPtr += sizeof(uint32_t);
10331         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
10332             count_VkImageMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
10333                                        (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i),
10334                                        countPtr);
10335         }
10336     }
10337     uint32_t packetSize_vkCmdWaitEvents = 4 + 4 + count;
10338     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdWaitEvents -= 8;
10339     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdWaitEvents);
10340     uint8_t* packetBeginPtr = streamPtr;
10341     uint8_t** streamPtrPtr = &streamPtr;
10342     uint32_t opcode_vkCmdWaitEvents = OP_vkCmdWaitEvents;
10343     memcpy(streamPtr, &opcode_vkCmdWaitEvents, sizeof(uint32_t));
10344     streamPtr += sizeof(uint32_t);
10345     memcpy(streamPtr, &packetSize_vkCmdWaitEvents, sizeof(uint32_t));
10346     streamPtr += sizeof(uint32_t);
10347     if (!queueSubmitWithCommandsEnabled) {
10348         uint64_t cgen_var_0;
10349         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10350         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10351         *streamPtrPtr += 1 * 8;
10352     }
10353     memcpy(*streamPtrPtr, (uint32_t*)&local_eventCount, sizeof(uint32_t));
10354     *streamPtrPtr += sizeof(uint32_t);
10355     if (((eventCount))) {
10356         uint8_t* cgen_var_0_ptr = (uint8_t*)(*streamPtrPtr);
10357         for (uint32_t k = 0; k < ((eventCount)); ++k) {
10358             uint64_t tmpval = get_host_u64_VkEvent(local_pEvents[k]);
10359             memcpy(cgen_var_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
10360         }
10361         *streamPtrPtr += 8 * ((eventCount));
10362     }
10363     memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_srcStageMask, sizeof(VkPipelineStageFlags));
10364     *streamPtrPtr += sizeof(VkPipelineStageFlags);
10365     memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_dstStageMask, sizeof(VkPipelineStageFlags));
10366     *streamPtrPtr += sizeof(VkPipelineStageFlags);
10367     memcpy(*streamPtrPtr, (uint32_t*)&local_memoryBarrierCount, sizeof(uint32_t));
10368     *streamPtrPtr += sizeof(uint32_t);
10369     for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
10370         reservedmarshal_VkMemoryBarrier(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
10371                                         (VkMemoryBarrier*)(local_pMemoryBarriers + i),
10372                                         streamPtrPtr);
10373     }
10374     memcpy(*streamPtrPtr, (uint32_t*)&local_bufferMemoryBarrierCount, sizeof(uint32_t));
10375     *streamPtrPtr += sizeof(uint32_t);
10376     for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
10377         reservedmarshal_VkBufferMemoryBarrier(
10378             stream, VK_STRUCTURE_TYPE_MAX_ENUM,
10379             (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), streamPtrPtr);
10380     }
10381     memcpy(*streamPtrPtr, (uint32_t*)&local_imageMemoryBarrierCount, sizeof(uint32_t));
10382     *streamPtrPtr += sizeof(uint32_t);
10383     for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
10384         reservedmarshal_VkImageMemoryBarrier(
10385             stream, VK_STRUCTURE_TYPE_MAX_ENUM,
10386             (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), streamPtrPtr);
10387     }
10388     ++encodeCount;
10389     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10390         pool->freeAll();
10391         stream->clearPool();
10392     }
10393     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10394 }
10395 
vkCmdPipelineBarrier(VkCommandBuffer commandBuffer,VkPipelineStageFlags srcStageMask,VkPipelineStageFlags dstStageMask,VkDependencyFlags dependencyFlags,uint32_t memoryBarrierCount,const VkMemoryBarrier * pMemoryBarriers,uint32_t bufferMemoryBarrierCount,const VkBufferMemoryBarrier * pBufferMemoryBarriers,uint32_t imageMemoryBarrierCount,const VkImageMemoryBarrier * pImageMemoryBarriers,uint32_t doLock)10396 void VkEncoder::vkCmdPipelineBarrier(
10397     VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
10398     VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
10399     uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers,
10400     uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers,
10401     uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers,
10402     uint32_t doLock) {
10403     (void)doLock;
10404     bool queueSubmitWithCommandsEnabled =
10405         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10406     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10407     auto stream = mImpl->stream();
10408     auto pool = mImpl->pool();
10409     VkCommandBuffer local_commandBuffer;
10410     VkPipelineStageFlags local_srcStageMask;
10411     VkPipelineStageFlags local_dstStageMask;
10412     VkDependencyFlags local_dependencyFlags;
10413     uint32_t local_memoryBarrierCount;
10414     VkMemoryBarrier* local_pMemoryBarriers;
10415     uint32_t local_bufferMemoryBarrierCount;
10416     VkBufferMemoryBarrier* local_pBufferMemoryBarriers;
10417     uint32_t local_imageMemoryBarrierCount;
10418     VkImageMemoryBarrier* local_pImageMemoryBarriers;
10419     local_commandBuffer = commandBuffer;
10420     local_srcStageMask = srcStageMask;
10421     local_dstStageMask = dstStageMask;
10422     local_dependencyFlags = dependencyFlags;
10423     local_memoryBarrierCount = memoryBarrierCount;
10424     local_pMemoryBarriers = nullptr;
10425     if (pMemoryBarriers) {
10426         local_pMemoryBarriers =
10427             (VkMemoryBarrier*)pool->alloc(((memoryBarrierCount)) * sizeof(const VkMemoryBarrier));
10428         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
10429             deepcopy_VkMemoryBarrier(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pMemoryBarriers + i,
10430                                      (VkMemoryBarrier*)(local_pMemoryBarriers + i));
10431         }
10432     }
10433     local_bufferMemoryBarrierCount = bufferMemoryBarrierCount;
10434     local_pBufferMemoryBarriers = nullptr;
10435     if (pBufferMemoryBarriers) {
10436         local_pBufferMemoryBarriers = (VkBufferMemoryBarrier*)pool->alloc(
10437             ((bufferMemoryBarrierCount)) * sizeof(const VkBufferMemoryBarrier));
10438         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
10439             deepcopy_VkBufferMemoryBarrier(
10440                 pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBufferMemoryBarriers + i,
10441                 (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
10442         }
10443     }
10444     local_imageMemoryBarrierCount = imageMemoryBarrierCount;
10445     local_pImageMemoryBarriers = nullptr;
10446     if (pImageMemoryBarriers) {
10447         local_pImageMemoryBarriers = (VkImageMemoryBarrier*)pool->alloc(
10448             ((imageMemoryBarrierCount)) * sizeof(const VkImageMemoryBarrier));
10449         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
10450             deepcopy_VkImageMemoryBarrier(pool, VK_STRUCTURE_TYPE_MAX_ENUM,
10451                                           pImageMemoryBarriers + i,
10452                                           (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
10453         }
10454     }
10455     if (local_pMemoryBarriers) {
10456         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
10457             transform_tohost_VkMemoryBarrier(sResourceTracker,
10458                                              (VkMemoryBarrier*)(local_pMemoryBarriers + i));
10459         }
10460     }
10461     if (local_pBufferMemoryBarriers) {
10462         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
10463             transform_tohost_VkBufferMemoryBarrier(
10464                 sResourceTracker, (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i));
10465         }
10466     }
10467     if (local_pImageMemoryBarriers) {
10468         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
10469             transform_tohost_VkImageMemoryBarrier(
10470                 sResourceTracker, (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i));
10471         }
10472     }
10473     size_t count = 0;
10474     size_t* countPtr = &count;
10475     {
10476         uint64_t cgen_var_0;
10477         *countPtr += 1 * 8;
10478         *countPtr += sizeof(VkPipelineStageFlags);
10479         *countPtr += sizeof(VkPipelineStageFlags);
10480         *countPtr += sizeof(VkDependencyFlags);
10481         *countPtr += sizeof(uint32_t);
10482         for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
10483             count_VkMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
10484                                   (VkMemoryBarrier*)(local_pMemoryBarriers + i), countPtr);
10485         }
10486         *countPtr += sizeof(uint32_t);
10487         for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
10488             count_VkBufferMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
10489                                         (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i),
10490                                         countPtr);
10491         }
10492         *countPtr += sizeof(uint32_t);
10493         for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
10494             count_VkImageMemoryBarrier(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
10495                                        (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i),
10496                                        countPtr);
10497         }
10498     }
10499     uint32_t packetSize_vkCmdPipelineBarrier = 4 + 4 + count;
10500     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdPipelineBarrier -= 8;
10501     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdPipelineBarrier);
10502     uint8_t* packetBeginPtr = streamPtr;
10503     uint8_t** streamPtrPtr = &streamPtr;
10504     uint32_t opcode_vkCmdPipelineBarrier = OP_vkCmdPipelineBarrier;
10505     memcpy(streamPtr, &opcode_vkCmdPipelineBarrier, sizeof(uint32_t));
10506     streamPtr += sizeof(uint32_t);
10507     memcpy(streamPtr, &packetSize_vkCmdPipelineBarrier, sizeof(uint32_t));
10508     streamPtr += sizeof(uint32_t);
10509     if (!queueSubmitWithCommandsEnabled) {
10510         uint64_t cgen_var_0;
10511         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10512         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10513         *streamPtrPtr += 1 * 8;
10514     }
10515     memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_srcStageMask, sizeof(VkPipelineStageFlags));
10516     *streamPtrPtr += sizeof(VkPipelineStageFlags);
10517     memcpy(*streamPtrPtr, (VkPipelineStageFlags*)&local_dstStageMask, sizeof(VkPipelineStageFlags));
10518     *streamPtrPtr += sizeof(VkPipelineStageFlags);
10519     memcpy(*streamPtrPtr, (VkDependencyFlags*)&local_dependencyFlags, sizeof(VkDependencyFlags));
10520     *streamPtrPtr += sizeof(VkDependencyFlags);
10521     memcpy(*streamPtrPtr, (uint32_t*)&local_memoryBarrierCount, sizeof(uint32_t));
10522     *streamPtrPtr += sizeof(uint32_t);
10523     for (uint32_t i = 0; i < (uint32_t)((memoryBarrierCount)); ++i) {
10524         reservedmarshal_VkMemoryBarrier(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
10525                                         (VkMemoryBarrier*)(local_pMemoryBarriers + i),
10526                                         streamPtrPtr);
10527     }
10528     memcpy(*streamPtrPtr, (uint32_t*)&local_bufferMemoryBarrierCount, sizeof(uint32_t));
10529     *streamPtrPtr += sizeof(uint32_t);
10530     for (uint32_t i = 0; i < (uint32_t)((bufferMemoryBarrierCount)); ++i) {
10531         reservedmarshal_VkBufferMemoryBarrier(
10532             stream, VK_STRUCTURE_TYPE_MAX_ENUM,
10533             (VkBufferMemoryBarrier*)(local_pBufferMemoryBarriers + i), streamPtrPtr);
10534     }
10535     memcpy(*streamPtrPtr, (uint32_t*)&local_imageMemoryBarrierCount, sizeof(uint32_t));
10536     *streamPtrPtr += sizeof(uint32_t);
10537     for (uint32_t i = 0; i < (uint32_t)((imageMemoryBarrierCount)); ++i) {
10538         reservedmarshal_VkImageMemoryBarrier(
10539             stream, VK_STRUCTURE_TYPE_MAX_ENUM,
10540             (VkImageMemoryBarrier*)(local_pImageMemoryBarriers + i), streamPtrPtr);
10541     }
10542     ++encodeCount;
10543     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10544         pool->freeAll();
10545         stream->clearPool();
10546     }
10547     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10548 }
10549 
vkCmdBeginQuery(VkCommandBuffer commandBuffer,VkQueryPool queryPool,uint32_t query,VkQueryControlFlags flags,uint32_t doLock)10550 void VkEncoder::vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
10551                                 uint32_t query, VkQueryControlFlags flags, uint32_t doLock) {
10552     (void)doLock;
10553     bool queueSubmitWithCommandsEnabled =
10554         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10555     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10556     auto stream = mImpl->stream();
10557     auto pool = mImpl->pool();
10558     VkCommandBuffer local_commandBuffer;
10559     VkQueryPool local_queryPool;
10560     uint32_t local_query;
10561     VkQueryControlFlags local_flags;
10562     local_commandBuffer = commandBuffer;
10563     local_queryPool = queryPool;
10564     local_query = query;
10565     local_flags = flags;
10566     size_t count = 0;
10567     size_t* countPtr = &count;
10568     {
10569         uint64_t cgen_var_0;
10570         *countPtr += 1 * 8;
10571         uint64_t cgen_var_1;
10572         *countPtr += 1 * 8;
10573         *countPtr += sizeof(uint32_t);
10574         *countPtr += sizeof(VkQueryControlFlags);
10575     }
10576     uint32_t packetSize_vkCmdBeginQuery = 4 + 4 + count;
10577     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginQuery -= 8;
10578     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginQuery);
10579     uint8_t* packetBeginPtr = streamPtr;
10580     uint8_t** streamPtrPtr = &streamPtr;
10581     uint32_t opcode_vkCmdBeginQuery = OP_vkCmdBeginQuery;
10582     memcpy(streamPtr, &opcode_vkCmdBeginQuery, sizeof(uint32_t));
10583     streamPtr += sizeof(uint32_t);
10584     memcpy(streamPtr, &packetSize_vkCmdBeginQuery, sizeof(uint32_t));
10585     streamPtr += sizeof(uint32_t);
10586     if (!queueSubmitWithCommandsEnabled) {
10587         uint64_t cgen_var_0;
10588         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10589         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10590         *streamPtrPtr += 1 * 8;
10591     }
10592     uint64_t cgen_var_0;
10593     *&cgen_var_0 = get_host_u64_VkQueryPool((*&local_queryPool));
10594     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10595     *streamPtrPtr += 1 * 8;
10596     memcpy(*streamPtrPtr, (uint32_t*)&local_query, sizeof(uint32_t));
10597     *streamPtrPtr += sizeof(uint32_t);
10598     memcpy(*streamPtrPtr, (VkQueryControlFlags*)&local_flags, sizeof(VkQueryControlFlags));
10599     *streamPtrPtr += sizeof(VkQueryControlFlags);
10600     ++encodeCount;
10601     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10602         pool->freeAll();
10603         stream->clearPool();
10604     }
10605     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10606 }
10607 
vkCmdEndQuery(VkCommandBuffer commandBuffer,VkQueryPool queryPool,uint32_t query,uint32_t doLock)10608 void VkEncoder::vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query,
10609                               uint32_t doLock) {
10610     (void)doLock;
10611     bool queueSubmitWithCommandsEnabled =
10612         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10613     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10614     auto stream = mImpl->stream();
10615     auto pool = mImpl->pool();
10616     VkCommandBuffer local_commandBuffer;
10617     VkQueryPool local_queryPool;
10618     uint32_t local_query;
10619     local_commandBuffer = commandBuffer;
10620     local_queryPool = queryPool;
10621     local_query = query;
10622     size_t count = 0;
10623     size_t* countPtr = &count;
10624     {
10625         uint64_t cgen_var_0;
10626         *countPtr += 1 * 8;
10627         uint64_t cgen_var_1;
10628         *countPtr += 1 * 8;
10629         *countPtr += sizeof(uint32_t);
10630     }
10631     uint32_t packetSize_vkCmdEndQuery = 4 + 4 + count;
10632     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdEndQuery -= 8;
10633     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndQuery);
10634     uint8_t* packetBeginPtr = streamPtr;
10635     uint8_t** streamPtrPtr = &streamPtr;
10636     uint32_t opcode_vkCmdEndQuery = OP_vkCmdEndQuery;
10637     memcpy(streamPtr, &opcode_vkCmdEndQuery, sizeof(uint32_t));
10638     streamPtr += sizeof(uint32_t);
10639     memcpy(streamPtr, &packetSize_vkCmdEndQuery, sizeof(uint32_t));
10640     streamPtr += sizeof(uint32_t);
10641     if (!queueSubmitWithCommandsEnabled) {
10642         uint64_t cgen_var_0;
10643         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10644         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10645         *streamPtrPtr += 1 * 8;
10646     }
10647     uint64_t cgen_var_0;
10648     *&cgen_var_0 = get_host_u64_VkQueryPool((*&local_queryPool));
10649     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10650     *streamPtrPtr += 1 * 8;
10651     memcpy(*streamPtrPtr, (uint32_t*)&local_query, sizeof(uint32_t));
10652     *streamPtrPtr += sizeof(uint32_t);
10653     ++encodeCount;
10654     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10655         pool->freeAll();
10656         stream->clearPool();
10657     }
10658     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10659 }
10660 
vkCmdResetQueryPool(VkCommandBuffer commandBuffer,VkQueryPool queryPool,uint32_t firstQuery,uint32_t queryCount,uint32_t doLock)10661 void VkEncoder::vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
10662                                     uint32_t firstQuery, uint32_t queryCount, uint32_t doLock) {
10663     (void)doLock;
10664     bool queueSubmitWithCommandsEnabled =
10665         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10666     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10667     auto stream = mImpl->stream();
10668     auto pool = mImpl->pool();
10669     VkCommandBuffer local_commandBuffer;
10670     VkQueryPool local_queryPool;
10671     uint32_t local_firstQuery;
10672     uint32_t local_queryCount;
10673     local_commandBuffer = commandBuffer;
10674     local_queryPool = queryPool;
10675     local_firstQuery = firstQuery;
10676     local_queryCount = queryCount;
10677     size_t count = 0;
10678     size_t* countPtr = &count;
10679     {
10680         uint64_t cgen_var_0;
10681         *countPtr += 1 * 8;
10682         uint64_t cgen_var_1;
10683         *countPtr += 1 * 8;
10684         *countPtr += sizeof(uint32_t);
10685         *countPtr += sizeof(uint32_t);
10686     }
10687     uint32_t packetSize_vkCmdResetQueryPool = 4 + 4 + count;
10688     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdResetQueryPool -= 8;
10689     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdResetQueryPool);
10690     uint8_t* packetBeginPtr = streamPtr;
10691     uint8_t** streamPtrPtr = &streamPtr;
10692     uint32_t opcode_vkCmdResetQueryPool = OP_vkCmdResetQueryPool;
10693     memcpy(streamPtr, &opcode_vkCmdResetQueryPool, sizeof(uint32_t));
10694     streamPtr += sizeof(uint32_t);
10695     memcpy(streamPtr, &packetSize_vkCmdResetQueryPool, sizeof(uint32_t));
10696     streamPtr += sizeof(uint32_t);
10697     if (!queueSubmitWithCommandsEnabled) {
10698         uint64_t cgen_var_0;
10699         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10700         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10701         *streamPtrPtr += 1 * 8;
10702     }
10703     uint64_t cgen_var_0;
10704     *&cgen_var_0 = get_host_u64_VkQueryPool((*&local_queryPool));
10705     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10706     *streamPtrPtr += 1 * 8;
10707     memcpy(*streamPtrPtr, (uint32_t*)&local_firstQuery, sizeof(uint32_t));
10708     *streamPtrPtr += sizeof(uint32_t);
10709     memcpy(*streamPtrPtr, (uint32_t*)&local_queryCount, sizeof(uint32_t));
10710     *streamPtrPtr += sizeof(uint32_t);
10711     ++encodeCount;
10712     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10713         pool->freeAll();
10714         stream->clearPool();
10715     }
10716     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10717 }
10718 
vkCmdWriteTimestamp(VkCommandBuffer commandBuffer,VkPipelineStageFlagBits pipelineStage,VkQueryPool queryPool,uint32_t query,uint32_t doLock)10719 void VkEncoder::vkCmdWriteTimestamp(VkCommandBuffer commandBuffer,
10720                                     VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool,
10721                                     uint32_t query, uint32_t doLock) {
10722     (void)doLock;
10723     bool queueSubmitWithCommandsEnabled =
10724         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10725     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10726     auto stream = mImpl->stream();
10727     auto pool = mImpl->pool();
10728     VkCommandBuffer local_commandBuffer;
10729     VkPipelineStageFlagBits local_pipelineStage;
10730     VkQueryPool local_queryPool;
10731     uint32_t local_query;
10732     local_commandBuffer = commandBuffer;
10733     local_pipelineStage = pipelineStage;
10734     local_queryPool = queryPool;
10735     local_query = query;
10736     size_t count = 0;
10737     size_t* countPtr = &count;
10738     {
10739         uint64_t cgen_var_0;
10740         *countPtr += 1 * 8;
10741         *countPtr += sizeof(VkPipelineStageFlagBits);
10742         uint64_t cgen_var_1;
10743         *countPtr += 1 * 8;
10744         *countPtr += sizeof(uint32_t);
10745     }
10746     uint32_t packetSize_vkCmdWriteTimestamp = 4 + 4 + count;
10747     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdWriteTimestamp -= 8;
10748     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdWriteTimestamp);
10749     uint8_t* packetBeginPtr = streamPtr;
10750     uint8_t** streamPtrPtr = &streamPtr;
10751     uint32_t opcode_vkCmdWriteTimestamp = OP_vkCmdWriteTimestamp;
10752     memcpy(streamPtr, &opcode_vkCmdWriteTimestamp, sizeof(uint32_t));
10753     streamPtr += sizeof(uint32_t);
10754     memcpy(streamPtr, &packetSize_vkCmdWriteTimestamp, sizeof(uint32_t));
10755     streamPtr += sizeof(uint32_t);
10756     if (!queueSubmitWithCommandsEnabled) {
10757         uint64_t cgen_var_0;
10758         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10759         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10760         *streamPtrPtr += 1 * 8;
10761     }
10762     memcpy(*streamPtrPtr, (VkPipelineStageFlagBits*)&local_pipelineStage,
10763            sizeof(VkPipelineStageFlagBits));
10764     *streamPtrPtr += sizeof(VkPipelineStageFlagBits);
10765     uint64_t cgen_var_0;
10766     *&cgen_var_0 = get_host_u64_VkQueryPool((*&local_queryPool));
10767     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10768     *streamPtrPtr += 1 * 8;
10769     memcpy(*streamPtrPtr, (uint32_t*)&local_query, sizeof(uint32_t));
10770     *streamPtrPtr += sizeof(uint32_t);
10771     ++encodeCount;
10772     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10773         pool->freeAll();
10774         stream->clearPool();
10775     }
10776     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10777 }
10778 
vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer,VkQueryPool queryPool,uint32_t firstQuery,uint32_t queryCount,VkBuffer dstBuffer,VkDeviceSize dstOffset,VkDeviceSize stride,VkQueryResultFlags flags,uint32_t doLock)10779 void VkEncoder::vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
10780                                           uint32_t firstQuery, uint32_t queryCount,
10781                                           VkBuffer dstBuffer, VkDeviceSize dstOffset,
10782                                           VkDeviceSize stride, VkQueryResultFlags flags,
10783                                           uint32_t doLock) {
10784     (void)doLock;
10785     bool queueSubmitWithCommandsEnabled =
10786         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10787     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10788     auto stream = mImpl->stream();
10789     auto pool = mImpl->pool();
10790     VkCommandBuffer local_commandBuffer;
10791     VkQueryPool local_queryPool;
10792     uint32_t local_firstQuery;
10793     uint32_t local_queryCount;
10794     VkBuffer local_dstBuffer;
10795     VkDeviceSize local_dstOffset;
10796     VkDeviceSize local_stride;
10797     VkQueryResultFlags local_flags;
10798     local_commandBuffer = commandBuffer;
10799     local_queryPool = queryPool;
10800     local_firstQuery = firstQuery;
10801     local_queryCount = queryCount;
10802     local_dstBuffer = dstBuffer;
10803     local_dstOffset = dstOffset;
10804     local_stride = stride;
10805     local_flags = flags;
10806     size_t count = 0;
10807     size_t* countPtr = &count;
10808     {
10809         uint64_t cgen_var_0;
10810         *countPtr += 1 * 8;
10811         uint64_t cgen_var_1;
10812         *countPtr += 1 * 8;
10813         *countPtr += sizeof(uint32_t);
10814         *countPtr += sizeof(uint32_t);
10815         uint64_t cgen_var_2;
10816         *countPtr += 1 * 8;
10817         *countPtr += sizeof(VkDeviceSize);
10818         *countPtr += sizeof(VkDeviceSize);
10819         *countPtr += sizeof(VkQueryResultFlags);
10820     }
10821     uint32_t packetSize_vkCmdCopyQueryPoolResults = 4 + 4 + count;
10822     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyQueryPoolResults -= 8;
10823     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyQueryPoolResults);
10824     uint8_t* packetBeginPtr = streamPtr;
10825     uint8_t** streamPtrPtr = &streamPtr;
10826     uint32_t opcode_vkCmdCopyQueryPoolResults = OP_vkCmdCopyQueryPoolResults;
10827     memcpy(streamPtr, &opcode_vkCmdCopyQueryPoolResults, sizeof(uint32_t));
10828     streamPtr += sizeof(uint32_t);
10829     memcpy(streamPtr, &packetSize_vkCmdCopyQueryPoolResults, sizeof(uint32_t));
10830     streamPtr += sizeof(uint32_t);
10831     if (!queueSubmitWithCommandsEnabled) {
10832         uint64_t cgen_var_0;
10833         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10834         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10835         *streamPtrPtr += 1 * 8;
10836     }
10837     uint64_t cgen_var_0;
10838     *&cgen_var_0 = get_host_u64_VkQueryPool((*&local_queryPool));
10839     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10840     *streamPtrPtr += 1 * 8;
10841     memcpy(*streamPtrPtr, (uint32_t*)&local_firstQuery, sizeof(uint32_t));
10842     *streamPtrPtr += sizeof(uint32_t);
10843     memcpy(*streamPtrPtr, (uint32_t*)&local_queryCount, sizeof(uint32_t));
10844     *streamPtrPtr += sizeof(uint32_t);
10845     uint64_t cgen_var_1;
10846     *&cgen_var_1 = get_host_u64_VkBuffer((*&local_dstBuffer));
10847     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
10848     *streamPtrPtr += 1 * 8;
10849     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
10850     *streamPtrPtr += sizeof(VkDeviceSize);
10851     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_stride, sizeof(VkDeviceSize));
10852     *streamPtrPtr += sizeof(VkDeviceSize);
10853     memcpy(*streamPtrPtr, (VkQueryResultFlags*)&local_flags, sizeof(VkQueryResultFlags));
10854     *streamPtrPtr += sizeof(VkQueryResultFlags);
10855     ++encodeCount;
10856     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10857         pool->freeAll();
10858         stream->clearPool();
10859     }
10860     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10861 }
10862 
vkCmdPushConstants(VkCommandBuffer commandBuffer,VkPipelineLayout layout,VkShaderStageFlags stageFlags,uint32_t offset,uint32_t size,const void * pValues,uint32_t doLock)10863 void VkEncoder::vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
10864                                    VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size,
10865                                    const void* pValues, uint32_t doLock) {
10866     (void)doLock;
10867     bool queueSubmitWithCommandsEnabled =
10868         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10869     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10870     auto stream = mImpl->stream();
10871     auto pool = mImpl->pool();
10872     VkCommandBuffer local_commandBuffer;
10873     VkPipelineLayout local_layout;
10874     VkShaderStageFlags local_stageFlags;
10875     uint32_t local_offset;
10876     uint32_t local_size;
10877     void* local_pValues;
10878     local_commandBuffer = commandBuffer;
10879     local_layout = layout;
10880     local_stageFlags = stageFlags;
10881     local_offset = offset;
10882     local_size = size;
10883     // Avoiding deepcopy for pValues
10884     local_pValues = (void*)pValues;
10885     size_t count = 0;
10886     size_t* countPtr = &count;
10887     {
10888         uint64_t cgen_var_0;
10889         *countPtr += 1 * 8;
10890         uint64_t cgen_var_1;
10891         *countPtr += 1 * 8;
10892         *countPtr += sizeof(VkShaderStageFlags);
10893         *countPtr += sizeof(uint32_t);
10894         *countPtr += sizeof(uint32_t);
10895         *countPtr += ((size)) * sizeof(uint8_t);
10896     }
10897     uint32_t packetSize_vkCmdPushConstants = 4 + 4 + count;
10898     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdPushConstants -= 8;
10899     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdPushConstants);
10900     uint8_t* packetBeginPtr = streamPtr;
10901     uint8_t** streamPtrPtr = &streamPtr;
10902     uint32_t opcode_vkCmdPushConstants = OP_vkCmdPushConstants;
10903     memcpy(streamPtr, &opcode_vkCmdPushConstants, sizeof(uint32_t));
10904     streamPtr += sizeof(uint32_t);
10905     memcpy(streamPtr, &packetSize_vkCmdPushConstants, sizeof(uint32_t));
10906     streamPtr += sizeof(uint32_t);
10907     if (!queueSubmitWithCommandsEnabled) {
10908         uint64_t cgen_var_0;
10909         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10910         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10911         *streamPtrPtr += 1 * 8;
10912     }
10913     uint64_t cgen_var_0;
10914     *&cgen_var_0 = get_host_u64_VkPipelineLayout((*&local_layout));
10915     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10916     *streamPtrPtr += 1 * 8;
10917     memcpy(*streamPtrPtr, (VkShaderStageFlags*)&local_stageFlags, sizeof(VkShaderStageFlags));
10918     *streamPtrPtr += sizeof(VkShaderStageFlags);
10919     memcpy(*streamPtrPtr, (uint32_t*)&local_offset, sizeof(uint32_t));
10920     *streamPtrPtr += sizeof(uint32_t);
10921     memcpy(*streamPtrPtr, (uint32_t*)&local_size, sizeof(uint32_t));
10922     *streamPtrPtr += sizeof(uint32_t);
10923     memcpy(*streamPtrPtr, (void*)local_pValues, ((size)) * sizeof(uint8_t));
10924     *streamPtrPtr += ((size)) * sizeof(uint8_t);
10925     ++encodeCount;
10926     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10927         pool->freeAll();
10928         stream->clearPool();
10929     }
10930     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10931 }
10932 
vkCmdBeginRenderPass(VkCommandBuffer commandBuffer,const VkRenderPassBeginInfo * pRenderPassBegin,VkSubpassContents contents,uint32_t doLock)10933 void VkEncoder::vkCmdBeginRenderPass(VkCommandBuffer commandBuffer,
10934                                      const VkRenderPassBeginInfo* pRenderPassBegin,
10935                                      VkSubpassContents contents, uint32_t doLock) {
10936     (void)doLock;
10937     bool queueSubmitWithCommandsEnabled =
10938         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
10939     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
10940     auto stream = mImpl->stream();
10941     auto pool = mImpl->pool();
10942     VkCommandBuffer local_commandBuffer;
10943     VkRenderPassBeginInfo* local_pRenderPassBegin;
10944     VkSubpassContents local_contents;
10945     local_commandBuffer = commandBuffer;
10946     local_pRenderPassBegin = nullptr;
10947     if (pRenderPassBegin) {
10948         local_pRenderPassBegin =
10949             (VkRenderPassBeginInfo*)pool->alloc(sizeof(const VkRenderPassBeginInfo));
10950         deepcopy_VkRenderPassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRenderPassBegin,
10951                                        (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
10952     }
10953     local_contents = contents;
10954     if (local_pRenderPassBegin) {
10955         transform_tohost_VkRenderPassBeginInfo(sResourceTracker,
10956                                                (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
10957     }
10958     size_t count = 0;
10959     size_t* countPtr = &count;
10960     {
10961         uint64_t cgen_var_0;
10962         *countPtr += 1 * 8;
10963         count_VkRenderPassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
10964                                     (VkRenderPassBeginInfo*)(local_pRenderPassBegin), countPtr);
10965         *countPtr += sizeof(VkSubpassContents);
10966     }
10967     uint32_t packetSize_vkCmdBeginRenderPass = 4 + 4 + count;
10968     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginRenderPass -= 8;
10969     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginRenderPass);
10970     uint8_t* packetBeginPtr = streamPtr;
10971     uint8_t** streamPtrPtr = &streamPtr;
10972     uint32_t opcode_vkCmdBeginRenderPass = OP_vkCmdBeginRenderPass;
10973     memcpy(streamPtr, &opcode_vkCmdBeginRenderPass, sizeof(uint32_t));
10974     streamPtr += sizeof(uint32_t);
10975     memcpy(streamPtr, &packetSize_vkCmdBeginRenderPass, sizeof(uint32_t));
10976     streamPtr += sizeof(uint32_t);
10977     if (!queueSubmitWithCommandsEnabled) {
10978         uint64_t cgen_var_0;
10979         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
10980         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
10981         *streamPtrPtr += 1 * 8;
10982     }
10983     reservedmarshal_VkRenderPassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
10984                                           (VkRenderPassBeginInfo*)(local_pRenderPassBegin),
10985                                           streamPtrPtr);
10986     memcpy(*streamPtrPtr, (VkSubpassContents*)&local_contents, sizeof(VkSubpassContents));
10987     *streamPtrPtr += sizeof(VkSubpassContents);
10988     ++encodeCount;
10989     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
10990         pool->freeAll();
10991         stream->clearPool();
10992     }
10993     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
10994 }
10995 
vkCmdNextSubpass(VkCommandBuffer commandBuffer,VkSubpassContents contents,uint32_t doLock)10996 void VkEncoder::vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents,
10997                                  uint32_t doLock) {
10998     (void)doLock;
10999     bool queueSubmitWithCommandsEnabled =
11000         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11001     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11002     auto stream = mImpl->stream();
11003     auto pool = mImpl->pool();
11004     VkCommandBuffer local_commandBuffer;
11005     VkSubpassContents local_contents;
11006     local_commandBuffer = commandBuffer;
11007     local_contents = contents;
11008     size_t count = 0;
11009     size_t* countPtr = &count;
11010     {
11011         uint64_t cgen_var_0;
11012         *countPtr += 1 * 8;
11013         *countPtr += sizeof(VkSubpassContents);
11014     }
11015     uint32_t packetSize_vkCmdNextSubpass = 4 + 4 + count;
11016     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdNextSubpass -= 8;
11017     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdNextSubpass);
11018     uint8_t* packetBeginPtr = streamPtr;
11019     uint8_t** streamPtrPtr = &streamPtr;
11020     uint32_t opcode_vkCmdNextSubpass = OP_vkCmdNextSubpass;
11021     memcpy(streamPtr, &opcode_vkCmdNextSubpass, sizeof(uint32_t));
11022     streamPtr += sizeof(uint32_t);
11023     memcpy(streamPtr, &packetSize_vkCmdNextSubpass, sizeof(uint32_t));
11024     streamPtr += sizeof(uint32_t);
11025     if (!queueSubmitWithCommandsEnabled) {
11026         uint64_t cgen_var_0;
11027         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
11028         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11029         *streamPtrPtr += 1 * 8;
11030     }
11031     memcpy(*streamPtrPtr, (VkSubpassContents*)&local_contents, sizeof(VkSubpassContents));
11032     *streamPtrPtr += sizeof(VkSubpassContents);
11033     ++encodeCount;
11034     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11035         pool->freeAll();
11036         stream->clearPool();
11037     }
11038     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11039 }
11040 
vkCmdEndRenderPass(VkCommandBuffer commandBuffer,uint32_t doLock)11041 void VkEncoder::vkCmdEndRenderPass(VkCommandBuffer commandBuffer, uint32_t doLock) {
11042     (void)doLock;
11043     bool queueSubmitWithCommandsEnabled =
11044         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11045     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11046     auto stream = mImpl->stream();
11047     auto pool = mImpl->pool();
11048     VkCommandBuffer local_commandBuffer;
11049     local_commandBuffer = commandBuffer;
11050     size_t count = 0;
11051     size_t* countPtr = &count;
11052     {
11053         uint64_t cgen_var_0;
11054         *countPtr += 1 * 8;
11055     }
11056     uint32_t packetSize_vkCmdEndRenderPass = 4 + 4 + count;
11057     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdEndRenderPass -= 8;
11058     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndRenderPass);
11059     uint8_t* packetBeginPtr = streamPtr;
11060     uint8_t** streamPtrPtr = &streamPtr;
11061     uint32_t opcode_vkCmdEndRenderPass = OP_vkCmdEndRenderPass;
11062     memcpy(streamPtr, &opcode_vkCmdEndRenderPass, sizeof(uint32_t));
11063     streamPtr += sizeof(uint32_t);
11064     memcpy(streamPtr, &packetSize_vkCmdEndRenderPass, sizeof(uint32_t));
11065     streamPtr += sizeof(uint32_t);
11066     if (!queueSubmitWithCommandsEnabled) {
11067         uint64_t cgen_var_0;
11068         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
11069         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11070         *streamPtrPtr += 1 * 8;
11071     }
11072     ++encodeCount;
11073     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11074         pool->freeAll();
11075         stream->clearPool();
11076     }
11077     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11078 }
11079 
vkCmdExecuteCommands(VkCommandBuffer commandBuffer,uint32_t commandBufferCount,const VkCommandBuffer * pCommandBuffers,uint32_t doLock)11080 void VkEncoder::vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
11081                                      const VkCommandBuffer* pCommandBuffers, uint32_t doLock) {
11082     (void)doLock;
11083     bool queueSubmitWithCommandsEnabled =
11084         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11085     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11086     auto stream = mImpl->stream();
11087     auto pool = mImpl->pool();
11088     VkCommandBuffer local_commandBuffer;
11089     uint32_t local_commandBufferCount;
11090     VkCommandBuffer* local_pCommandBuffers;
11091     local_commandBuffer = commandBuffer;
11092     local_commandBufferCount = commandBufferCount;
11093     // Avoiding deepcopy for pCommandBuffers
11094     local_pCommandBuffers = (VkCommandBuffer*)pCommandBuffers;
11095     size_t count = 0;
11096     size_t* countPtr = &count;
11097     {
11098         uint64_t cgen_var_0;
11099         *countPtr += 1 * 8;
11100         *countPtr += sizeof(uint32_t);
11101         if (((commandBufferCount))) {
11102             *countPtr += ((commandBufferCount)) * 8;
11103         }
11104     }
11105     uint32_t packetSize_vkCmdExecuteCommands = 4 + 4 + count;
11106     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdExecuteCommands -= 8;
11107     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdExecuteCommands);
11108     uint8_t* packetBeginPtr = streamPtr;
11109     uint8_t** streamPtrPtr = &streamPtr;
11110     uint32_t opcode_vkCmdExecuteCommands = OP_vkCmdExecuteCommands;
11111     memcpy(streamPtr, &opcode_vkCmdExecuteCommands, sizeof(uint32_t));
11112     streamPtr += sizeof(uint32_t);
11113     memcpy(streamPtr, &packetSize_vkCmdExecuteCommands, sizeof(uint32_t));
11114     streamPtr += sizeof(uint32_t);
11115     if (!queueSubmitWithCommandsEnabled) {
11116         uint64_t cgen_var_0;
11117         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
11118         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11119         *streamPtrPtr += 1 * 8;
11120     }
11121     memcpy(*streamPtrPtr, (uint32_t*)&local_commandBufferCount, sizeof(uint32_t));
11122     *streamPtrPtr += sizeof(uint32_t);
11123     if (((commandBufferCount))) {
11124         uint8_t* cgen_var_0_ptr = (uint8_t*)(*streamPtrPtr);
11125         for (uint32_t k = 0; k < ((commandBufferCount)); ++k) {
11126             uint64_t tmpval = get_host_u64_VkCommandBuffer(local_pCommandBuffers[k]);
11127             memcpy(cgen_var_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
11128         }
11129         *streamPtrPtr += 8 * ((commandBufferCount));
11130     }
11131     ++encodeCount;
11132     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11133         pool->freeAll();
11134         stream->clearPool();
11135     }
11136     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11137 }
11138 
11139 #endif
11140 #ifdef VK_VERSION_1_1
vkEnumerateInstanceVersion(uint32_t * pApiVersion,uint32_t doLock)11141 VkResult VkEncoder::vkEnumerateInstanceVersion(uint32_t* pApiVersion, uint32_t doLock) {
11142     (void)doLock;
11143     bool queueSubmitWithCommandsEnabled =
11144         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11145     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11146     auto stream = mImpl->stream();
11147     auto pool = mImpl->pool();
11148     size_t count = 0;
11149     size_t* countPtr = &count;
11150     {
11151         *countPtr += sizeof(uint32_t);
11152     }
11153     uint32_t packetSize_vkEnumerateInstanceVersion =
11154         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
11155     uint8_t* streamPtr = stream->reserve(packetSize_vkEnumerateInstanceVersion);
11156     uint8_t* packetBeginPtr = streamPtr;
11157     uint8_t** streamPtrPtr = &streamPtr;
11158     uint32_t opcode_vkEnumerateInstanceVersion = OP_vkEnumerateInstanceVersion;
11159     uint32_t seqno;
11160     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
11161     memcpy(streamPtr, &opcode_vkEnumerateInstanceVersion, sizeof(uint32_t));
11162     streamPtr += sizeof(uint32_t);
11163     memcpy(streamPtr, &packetSize_vkEnumerateInstanceVersion, sizeof(uint32_t));
11164     streamPtr += sizeof(uint32_t);
11165     if (queueSubmitWithCommandsEnabled) {
11166         memcpy(streamPtr, &seqno, sizeof(uint32_t));
11167         streamPtr += sizeof(uint32_t);
11168     }
11169     memcpy(*streamPtrPtr, (uint32_t*)pApiVersion, sizeof(uint32_t));
11170     *streamPtrPtr += sizeof(uint32_t);
11171     stream->read((uint32_t*)pApiVersion, sizeof(uint32_t));
11172     VkResult vkEnumerateInstanceVersion_VkResult_return = (VkResult)0;
11173     stream->read(&vkEnumerateInstanceVersion_VkResult_return, sizeof(VkResult));
11174     ++encodeCount;
11175     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11176         pool->freeAll();
11177         stream->clearPool();
11178     }
11179     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11180     return vkEnumerateInstanceVersion_VkResult_return;
11181 }
11182 
vkBindBufferMemory2(VkDevice device,uint32_t bindInfoCount,const VkBindBufferMemoryInfo * pBindInfos,uint32_t doLock)11183 VkResult VkEncoder::vkBindBufferMemory2(VkDevice device, uint32_t bindInfoCount,
11184                                         const VkBindBufferMemoryInfo* pBindInfos, uint32_t doLock) {
11185     (void)doLock;
11186     bool queueSubmitWithCommandsEnabled =
11187         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11188     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11189     auto stream = mImpl->stream();
11190     auto pool = mImpl->pool();
11191     VkDevice local_device;
11192     uint32_t local_bindInfoCount;
11193     VkBindBufferMemoryInfo* local_pBindInfos;
11194     local_device = device;
11195     local_bindInfoCount = bindInfoCount;
11196     local_pBindInfos = nullptr;
11197     if (pBindInfos) {
11198         local_pBindInfos = (VkBindBufferMemoryInfo*)pool->alloc(
11199             ((bindInfoCount)) * sizeof(const VkBindBufferMemoryInfo));
11200         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
11201             deepcopy_VkBindBufferMemoryInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfos + i,
11202                                             (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
11203         }
11204     }
11205     if (local_pBindInfos) {
11206         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
11207             transform_tohost_VkBindBufferMemoryInfo(
11208                 sResourceTracker, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
11209         }
11210     }
11211     size_t count = 0;
11212     size_t* countPtr = &count;
11213     {
11214         uint64_t cgen_var_0;
11215         *countPtr += 1 * 8;
11216         *countPtr += sizeof(uint32_t);
11217         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
11218             count_VkBindBufferMemoryInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
11219                                          (VkBindBufferMemoryInfo*)(local_pBindInfos + i), countPtr);
11220         }
11221     }
11222     uint32_t packetSize_vkBindBufferMemory2 =
11223         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
11224     uint8_t* streamPtr = stream->reserve(packetSize_vkBindBufferMemory2);
11225     uint8_t* packetBeginPtr = streamPtr;
11226     uint8_t** streamPtrPtr = &streamPtr;
11227     uint32_t opcode_vkBindBufferMemory2 = OP_vkBindBufferMemory2;
11228     uint32_t seqno;
11229     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
11230     memcpy(streamPtr, &opcode_vkBindBufferMemory2, sizeof(uint32_t));
11231     streamPtr += sizeof(uint32_t);
11232     memcpy(streamPtr, &packetSize_vkBindBufferMemory2, sizeof(uint32_t));
11233     streamPtr += sizeof(uint32_t);
11234     if (queueSubmitWithCommandsEnabled) {
11235         memcpy(streamPtr, &seqno, sizeof(uint32_t));
11236         streamPtr += sizeof(uint32_t);
11237     }
11238     uint64_t cgen_var_0;
11239     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
11240     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11241     *streamPtrPtr += 1 * 8;
11242     memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
11243     *streamPtrPtr += sizeof(uint32_t);
11244     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
11245         reservedmarshal_VkBindBufferMemoryInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11246                                                (VkBindBufferMemoryInfo*)(local_pBindInfos + i),
11247                                                streamPtrPtr);
11248     }
11249     VkResult vkBindBufferMemory2_VkResult_return = (VkResult)0;
11250     stream->read(&vkBindBufferMemory2_VkResult_return, sizeof(VkResult));
11251     ++encodeCount;
11252     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11253         pool->freeAll();
11254         stream->clearPool();
11255     }
11256     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11257     return vkBindBufferMemory2_VkResult_return;
11258 }
11259 
vkBindImageMemory2(VkDevice device,uint32_t bindInfoCount,const VkBindImageMemoryInfo * pBindInfos,uint32_t doLock)11260 VkResult VkEncoder::vkBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
11261                                        const VkBindImageMemoryInfo* pBindInfos, uint32_t doLock) {
11262     (void)doLock;
11263     bool queueSubmitWithCommandsEnabled =
11264         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11265     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11266     auto stream = mImpl->stream();
11267     auto pool = mImpl->pool();
11268     VkDevice local_device;
11269     uint32_t local_bindInfoCount;
11270     VkBindImageMemoryInfo* local_pBindInfos;
11271     local_device = device;
11272     local_bindInfoCount = bindInfoCount;
11273     local_pBindInfos = nullptr;
11274     if (pBindInfos) {
11275         local_pBindInfos = (VkBindImageMemoryInfo*)pool->alloc(((bindInfoCount)) *
11276                                                                sizeof(const VkBindImageMemoryInfo));
11277         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
11278             deepcopy_VkBindImageMemoryInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfos + i,
11279                                            (VkBindImageMemoryInfo*)(local_pBindInfos + i));
11280         }
11281     }
11282     sResourceTracker->unwrap_VkBindImageMemory2_pBindInfos(bindInfoCount, pBindInfos,
11283                                                            local_pBindInfos);
11284     if (local_pBindInfos) {
11285         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
11286             transform_tohost_VkBindImageMemoryInfo(sResourceTracker,
11287                                                    (VkBindImageMemoryInfo*)(local_pBindInfos + i));
11288         }
11289     }
11290     size_t count = 0;
11291     size_t* countPtr = &count;
11292     {
11293         uint64_t cgen_var_0;
11294         *countPtr += 1 * 8;
11295         *countPtr += sizeof(uint32_t);
11296         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
11297             count_VkBindImageMemoryInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
11298                                         (VkBindImageMemoryInfo*)(local_pBindInfos + i), countPtr);
11299         }
11300     }
11301     uint32_t packetSize_vkBindImageMemory2 =
11302         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
11303     uint8_t* streamPtr = stream->reserve(packetSize_vkBindImageMemory2);
11304     uint8_t* packetBeginPtr = streamPtr;
11305     uint8_t** streamPtrPtr = &streamPtr;
11306     uint32_t opcode_vkBindImageMemory2 = OP_vkBindImageMemory2;
11307     uint32_t seqno;
11308     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
11309     memcpy(streamPtr, &opcode_vkBindImageMemory2, sizeof(uint32_t));
11310     streamPtr += sizeof(uint32_t);
11311     memcpy(streamPtr, &packetSize_vkBindImageMemory2, sizeof(uint32_t));
11312     streamPtr += sizeof(uint32_t);
11313     if (queueSubmitWithCommandsEnabled) {
11314         memcpy(streamPtr, &seqno, sizeof(uint32_t));
11315         streamPtr += sizeof(uint32_t);
11316     }
11317     uint64_t cgen_var_0;
11318     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
11319     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11320     *streamPtrPtr += 1 * 8;
11321     memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
11322     *streamPtrPtr += sizeof(uint32_t);
11323     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
11324         reservedmarshal_VkBindImageMemoryInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11325                                               (VkBindImageMemoryInfo*)(local_pBindInfos + i),
11326                                               streamPtrPtr);
11327     }
11328     VkResult vkBindImageMemory2_VkResult_return = (VkResult)0;
11329     stream->read(&vkBindImageMemory2_VkResult_return, sizeof(VkResult));
11330     ++encodeCount;
11331     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11332         pool->freeAll();
11333         stream->clearPool();
11334     }
11335     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11336     return vkBindImageMemory2_VkResult_return;
11337 }
11338 
vkGetDeviceGroupPeerMemoryFeatures(VkDevice device,uint32_t heapIndex,uint32_t localDeviceIndex,uint32_t remoteDeviceIndex,VkPeerMemoryFeatureFlags * pPeerMemoryFeatures,uint32_t doLock)11339 void VkEncoder::vkGetDeviceGroupPeerMemoryFeatures(VkDevice device, uint32_t heapIndex,
11340                                                    uint32_t localDeviceIndex,
11341                                                    uint32_t remoteDeviceIndex,
11342                                                    VkPeerMemoryFeatureFlags* pPeerMemoryFeatures,
11343                                                    uint32_t doLock) {
11344     (void)doLock;
11345     bool queueSubmitWithCommandsEnabled =
11346         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11347     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11348     auto stream = mImpl->stream();
11349     auto pool = mImpl->pool();
11350     VkDevice local_device;
11351     uint32_t local_heapIndex;
11352     uint32_t local_localDeviceIndex;
11353     uint32_t local_remoteDeviceIndex;
11354     local_device = device;
11355     local_heapIndex = heapIndex;
11356     local_localDeviceIndex = localDeviceIndex;
11357     local_remoteDeviceIndex = remoteDeviceIndex;
11358     size_t count = 0;
11359     size_t* countPtr = &count;
11360     {
11361         uint64_t cgen_var_0;
11362         *countPtr += 1 * 8;
11363         *countPtr += sizeof(uint32_t);
11364         *countPtr += sizeof(uint32_t);
11365         *countPtr += sizeof(uint32_t);
11366         *countPtr += sizeof(VkPeerMemoryFeatureFlags);
11367     }
11368     uint32_t packetSize_vkGetDeviceGroupPeerMemoryFeatures =
11369         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
11370     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceGroupPeerMemoryFeatures);
11371     uint8_t* packetBeginPtr = streamPtr;
11372     uint8_t** streamPtrPtr = &streamPtr;
11373     uint32_t opcode_vkGetDeviceGroupPeerMemoryFeatures = OP_vkGetDeviceGroupPeerMemoryFeatures;
11374     uint32_t seqno;
11375     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
11376     memcpy(streamPtr, &opcode_vkGetDeviceGroupPeerMemoryFeatures, sizeof(uint32_t));
11377     streamPtr += sizeof(uint32_t);
11378     memcpy(streamPtr, &packetSize_vkGetDeviceGroupPeerMemoryFeatures, sizeof(uint32_t));
11379     streamPtr += sizeof(uint32_t);
11380     if (queueSubmitWithCommandsEnabled) {
11381         memcpy(streamPtr, &seqno, sizeof(uint32_t));
11382         streamPtr += sizeof(uint32_t);
11383     }
11384     uint64_t cgen_var_0;
11385     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
11386     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11387     *streamPtrPtr += 1 * 8;
11388     memcpy(*streamPtrPtr, (uint32_t*)&local_heapIndex, sizeof(uint32_t));
11389     *streamPtrPtr += sizeof(uint32_t);
11390     memcpy(*streamPtrPtr, (uint32_t*)&local_localDeviceIndex, sizeof(uint32_t));
11391     *streamPtrPtr += sizeof(uint32_t);
11392     memcpy(*streamPtrPtr, (uint32_t*)&local_remoteDeviceIndex, sizeof(uint32_t));
11393     *streamPtrPtr += sizeof(uint32_t);
11394     memcpy(*streamPtrPtr, (VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures,
11395            sizeof(VkPeerMemoryFeatureFlags));
11396     *streamPtrPtr += sizeof(VkPeerMemoryFeatureFlags);
11397     stream->read((VkPeerMemoryFeatureFlags*)pPeerMemoryFeatures, sizeof(VkPeerMemoryFeatureFlags));
11398     ++encodeCount;
11399     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11400         pool->freeAll();
11401         stream->clearPool();
11402     }
11403     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11404 }
11405 
vkCmdSetDeviceMask(VkCommandBuffer commandBuffer,uint32_t deviceMask,uint32_t doLock)11406 void VkEncoder::vkCmdSetDeviceMask(VkCommandBuffer commandBuffer, uint32_t deviceMask,
11407                                    uint32_t doLock) {
11408     (void)doLock;
11409     bool queueSubmitWithCommandsEnabled =
11410         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11411     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11412     auto stream = mImpl->stream();
11413     auto pool = mImpl->pool();
11414     VkCommandBuffer local_commandBuffer;
11415     uint32_t local_deviceMask;
11416     local_commandBuffer = commandBuffer;
11417     local_deviceMask = deviceMask;
11418     size_t count = 0;
11419     size_t* countPtr = &count;
11420     {
11421         uint64_t cgen_var_0;
11422         *countPtr += 1 * 8;
11423         *countPtr += sizeof(uint32_t);
11424     }
11425     uint32_t packetSize_vkCmdSetDeviceMask = 4 + 4 + count;
11426     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDeviceMask -= 8;
11427     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDeviceMask);
11428     uint8_t* packetBeginPtr = streamPtr;
11429     uint8_t** streamPtrPtr = &streamPtr;
11430     uint32_t opcode_vkCmdSetDeviceMask = OP_vkCmdSetDeviceMask;
11431     memcpy(streamPtr, &opcode_vkCmdSetDeviceMask, sizeof(uint32_t));
11432     streamPtr += sizeof(uint32_t);
11433     memcpy(streamPtr, &packetSize_vkCmdSetDeviceMask, sizeof(uint32_t));
11434     streamPtr += sizeof(uint32_t);
11435     if (!queueSubmitWithCommandsEnabled) {
11436         uint64_t cgen_var_0;
11437         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
11438         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11439         *streamPtrPtr += 1 * 8;
11440     }
11441     memcpy(*streamPtrPtr, (uint32_t*)&local_deviceMask, sizeof(uint32_t));
11442     *streamPtrPtr += sizeof(uint32_t);
11443     ++encodeCount;
11444     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11445         pool->freeAll();
11446         stream->clearPool();
11447     }
11448     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11449 }
11450 
vkCmdDispatchBase(VkCommandBuffer commandBuffer,uint32_t baseGroupX,uint32_t baseGroupY,uint32_t baseGroupZ,uint32_t groupCountX,uint32_t groupCountY,uint32_t groupCountZ,uint32_t doLock)11451 void VkEncoder::vkCmdDispatchBase(VkCommandBuffer commandBuffer, uint32_t baseGroupX,
11452                                   uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX,
11453                                   uint32_t groupCountY, uint32_t groupCountZ, uint32_t doLock) {
11454     (void)doLock;
11455     bool queueSubmitWithCommandsEnabled =
11456         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11457     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11458     auto stream = mImpl->stream();
11459     auto pool = mImpl->pool();
11460     VkCommandBuffer local_commandBuffer;
11461     uint32_t local_baseGroupX;
11462     uint32_t local_baseGroupY;
11463     uint32_t local_baseGroupZ;
11464     uint32_t local_groupCountX;
11465     uint32_t local_groupCountY;
11466     uint32_t local_groupCountZ;
11467     local_commandBuffer = commandBuffer;
11468     local_baseGroupX = baseGroupX;
11469     local_baseGroupY = baseGroupY;
11470     local_baseGroupZ = baseGroupZ;
11471     local_groupCountX = groupCountX;
11472     local_groupCountY = groupCountY;
11473     local_groupCountZ = groupCountZ;
11474     size_t count = 0;
11475     size_t* countPtr = &count;
11476     {
11477         uint64_t cgen_var_0;
11478         *countPtr += 1 * 8;
11479         *countPtr += sizeof(uint32_t);
11480         *countPtr += sizeof(uint32_t);
11481         *countPtr += sizeof(uint32_t);
11482         *countPtr += sizeof(uint32_t);
11483         *countPtr += sizeof(uint32_t);
11484         *countPtr += sizeof(uint32_t);
11485     }
11486     uint32_t packetSize_vkCmdDispatchBase = 4 + 4 + count;
11487     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDispatchBase -= 8;
11488     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDispatchBase);
11489     uint8_t* packetBeginPtr = streamPtr;
11490     uint8_t** streamPtrPtr = &streamPtr;
11491     uint32_t opcode_vkCmdDispatchBase = OP_vkCmdDispatchBase;
11492     memcpy(streamPtr, &opcode_vkCmdDispatchBase, sizeof(uint32_t));
11493     streamPtr += sizeof(uint32_t);
11494     memcpy(streamPtr, &packetSize_vkCmdDispatchBase, sizeof(uint32_t));
11495     streamPtr += sizeof(uint32_t);
11496     if (!queueSubmitWithCommandsEnabled) {
11497         uint64_t cgen_var_0;
11498         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
11499         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11500         *streamPtrPtr += 1 * 8;
11501     }
11502     memcpy(*streamPtrPtr, (uint32_t*)&local_baseGroupX, sizeof(uint32_t));
11503     *streamPtrPtr += sizeof(uint32_t);
11504     memcpy(*streamPtrPtr, (uint32_t*)&local_baseGroupY, sizeof(uint32_t));
11505     *streamPtrPtr += sizeof(uint32_t);
11506     memcpy(*streamPtrPtr, (uint32_t*)&local_baseGroupZ, sizeof(uint32_t));
11507     *streamPtrPtr += sizeof(uint32_t);
11508     memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountX, sizeof(uint32_t));
11509     *streamPtrPtr += sizeof(uint32_t);
11510     memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountY, sizeof(uint32_t));
11511     *streamPtrPtr += sizeof(uint32_t);
11512     memcpy(*streamPtrPtr, (uint32_t*)&local_groupCountZ, sizeof(uint32_t));
11513     *streamPtrPtr += sizeof(uint32_t);
11514     ++encodeCount;
11515     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11516         pool->freeAll();
11517         stream->clearPool();
11518     }
11519     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11520 }
11521 
vkEnumeratePhysicalDeviceGroups(VkInstance instance,uint32_t * pPhysicalDeviceGroupCount,VkPhysicalDeviceGroupProperties * pPhysicalDeviceGroupProperties,uint32_t doLock)11522 VkResult VkEncoder::vkEnumeratePhysicalDeviceGroups(
11523     VkInstance instance, uint32_t* pPhysicalDeviceGroupCount,
11524     VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties, uint32_t doLock) {
11525     (void)doLock;
11526     bool queueSubmitWithCommandsEnabled =
11527         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11528     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11529     auto stream = mImpl->stream();
11530     auto pool = mImpl->pool();
11531     VkInstance local_instance;
11532     local_instance = instance;
11533     size_t count = 0;
11534     size_t* countPtr = &count;
11535     {
11536         uint64_t cgen_var_0;
11537         *countPtr += 1 * 8;
11538         // WARNING PTR CHECK
11539         *countPtr += 8;
11540         if (pPhysicalDeviceGroupCount) {
11541             *countPtr += sizeof(uint32_t);
11542         }
11543         // WARNING PTR CHECK
11544         *countPtr += 8;
11545         if (pPhysicalDeviceGroupProperties) {
11546             if (pPhysicalDeviceGroupCount) {
11547                 for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
11548                     count_VkPhysicalDeviceGroupProperties(
11549                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
11550                         (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i),
11551                         countPtr);
11552                 }
11553             }
11554         }
11555     }
11556     uint32_t packetSize_vkEnumeratePhysicalDeviceGroups =
11557         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
11558     uint8_t* streamPtr = stream->reserve(packetSize_vkEnumeratePhysicalDeviceGroups);
11559     uint8_t* packetBeginPtr = streamPtr;
11560     uint8_t** streamPtrPtr = &streamPtr;
11561     uint32_t opcode_vkEnumeratePhysicalDeviceGroups = OP_vkEnumeratePhysicalDeviceGroups;
11562     uint32_t seqno;
11563     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
11564     memcpy(streamPtr, &opcode_vkEnumeratePhysicalDeviceGroups, sizeof(uint32_t));
11565     streamPtr += sizeof(uint32_t);
11566     memcpy(streamPtr, &packetSize_vkEnumeratePhysicalDeviceGroups, sizeof(uint32_t));
11567     streamPtr += sizeof(uint32_t);
11568     if (queueSubmitWithCommandsEnabled) {
11569         memcpy(streamPtr, &seqno, sizeof(uint32_t));
11570         streamPtr += sizeof(uint32_t);
11571     }
11572     uint64_t cgen_var_0;
11573     *&cgen_var_0 = get_host_u64_VkInstance((*&local_instance));
11574     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11575     *streamPtrPtr += 1 * 8;
11576     // WARNING PTR CHECK
11577     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupCount;
11578     memcpy((*streamPtrPtr), &cgen_var_1, 8);
11579     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
11580     *streamPtrPtr += 8;
11581     if (pPhysicalDeviceGroupCount) {
11582         memcpy(*streamPtrPtr, (uint32_t*)pPhysicalDeviceGroupCount, sizeof(uint32_t));
11583         *streamPtrPtr += sizeof(uint32_t);
11584     }
11585     // WARNING PTR CHECK
11586     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pPhysicalDeviceGroupProperties;
11587     memcpy((*streamPtrPtr), &cgen_var_2, 8);
11588     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
11589     *streamPtrPtr += 8;
11590     if (pPhysicalDeviceGroupProperties) {
11591         for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
11592             reservedmarshal_VkPhysicalDeviceGroupProperties(
11593                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11594                 (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i),
11595                 streamPtrPtr);
11596         }
11597     }
11598     // WARNING PTR CHECK
11599     uint32_t* check_pPhysicalDeviceGroupCount;
11600     check_pPhysicalDeviceGroupCount = (uint32_t*)(uintptr_t)stream->getBe64();
11601     if (pPhysicalDeviceGroupCount) {
11602         if (!(check_pPhysicalDeviceGroupCount)) {
11603             fprintf(stderr,
11604                     "fatal: pPhysicalDeviceGroupCount inconsistent between guest and host\n");
11605         }
11606         stream->read((uint32_t*)pPhysicalDeviceGroupCount, sizeof(uint32_t));
11607     }
11608     // WARNING PTR CHECK
11609     VkPhysicalDeviceGroupProperties* check_pPhysicalDeviceGroupProperties;
11610     check_pPhysicalDeviceGroupProperties =
11611         (VkPhysicalDeviceGroupProperties*)(uintptr_t)stream->getBe64();
11612     if (pPhysicalDeviceGroupProperties) {
11613         if (!(check_pPhysicalDeviceGroupProperties)) {
11614             fprintf(stderr,
11615                     "fatal: pPhysicalDeviceGroupProperties inconsistent between guest and host\n");
11616         }
11617         if (pPhysicalDeviceGroupCount) {
11618             for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
11619                 unmarshal_VkPhysicalDeviceGroupProperties(
11620                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11621                     (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
11622             }
11623         }
11624     }
11625     if (pPhysicalDeviceGroupCount) {
11626         if (pPhysicalDeviceGroupProperties) {
11627             for (uint32_t i = 0; i < (uint32_t)(*(pPhysicalDeviceGroupCount)); ++i) {
11628                 transform_fromhost_VkPhysicalDeviceGroupProperties(
11629                     sResourceTracker,
11630                     (VkPhysicalDeviceGroupProperties*)(pPhysicalDeviceGroupProperties + i));
11631             }
11632         }
11633     }
11634     VkResult vkEnumeratePhysicalDeviceGroups_VkResult_return = (VkResult)0;
11635     stream->read(&vkEnumeratePhysicalDeviceGroups_VkResult_return, sizeof(VkResult));
11636     ++encodeCount;
11637     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11638         pool->freeAll();
11639         stream->clearPool();
11640     }
11641     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11642     return vkEnumeratePhysicalDeviceGroups_VkResult_return;
11643 }
11644 
vkGetImageMemoryRequirements2(VkDevice device,const VkImageMemoryRequirementsInfo2 * pInfo,VkMemoryRequirements2 * pMemoryRequirements,uint32_t doLock)11645 void VkEncoder::vkGetImageMemoryRequirements2(VkDevice device,
11646                                               const VkImageMemoryRequirementsInfo2* pInfo,
11647                                               VkMemoryRequirements2* pMemoryRequirements,
11648                                               uint32_t doLock) {
11649     (void)doLock;
11650     bool queueSubmitWithCommandsEnabled =
11651         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11652     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11653     auto stream = mImpl->stream();
11654     auto pool = mImpl->pool();
11655     VkDevice local_device;
11656     VkImageMemoryRequirementsInfo2* local_pInfo;
11657     local_device = device;
11658     local_pInfo = nullptr;
11659     if (pInfo) {
11660         local_pInfo = (VkImageMemoryRequirementsInfo2*)pool->alloc(
11661             sizeof(const VkImageMemoryRequirementsInfo2));
11662         deepcopy_VkImageMemoryRequirementsInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
11663                                                 (VkImageMemoryRequirementsInfo2*)(local_pInfo));
11664     }
11665     if (local_pInfo) {
11666         transform_tohost_VkImageMemoryRequirementsInfo2(
11667             sResourceTracker, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
11668     }
11669     size_t count = 0;
11670     size_t* countPtr = &count;
11671     {
11672         uint64_t cgen_var_0;
11673         *countPtr += 1 * 8;
11674         count_VkImageMemoryRequirementsInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
11675                                              (VkImageMemoryRequirementsInfo2*)(local_pInfo),
11676                                              countPtr);
11677         count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
11678                                     (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
11679     }
11680     uint32_t packetSize_vkGetImageMemoryRequirements2 =
11681         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
11682     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageMemoryRequirements2);
11683     uint8_t* packetBeginPtr = streamPtr;
11684     uint8_t** streamPtrPtr = &streamPtr;
11685     uint32_t opcode_vkGetImageMemoryRequirements2 = OP_vkGetImageMemoryRequirements2;
11686     uint32_t seqno;
11687     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
11688     memcpy(streamPtr, &opcode_vkGetImageMemoryRequirements2, sizeof(uint32_t));
11689     streamPtr += sizeof(uint32_t);
11690     memcpy(streamPtr, &packetSize_vkGetImageMemoryRequirements2, sizeof(uint32_t));
11691     streamPtr += sizeof(uint32_t);
11692     if (queueSubmitWithCommandsEnabled) {
11693         memcpy(streamPtr, &seqno, sizeof(uint32_t));
11694         streamPtr += sizeof(uint32_t);
11695     }
11696     uint64_t cgen_var_0;
11697     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
11698     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11699     *streamPtrPtr += 1 * 8;
11700     reservedmarshal_VkImageMemoryRequirementsInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11701                                                    (VkImageMemoryRequirementsInfo2*)(local_pInfo),
11702                                                    streamPtrPtr);
11703     reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11704                                           (VkMemoryRequirements2*)(pMemoryRequirements),
11705                                           streamPtrPtr);
11706     unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11707                                     (VkMemoryRequirements2*)(pMemoryRequirements));
11708     if (pMemoryRequirements) {
11709         transform_fromhost_VkMemoryRequirements2(sResourceTracker,
11710                                                  (VkMemoryRequirements2*)(pMemoryRequirements));
11711     }
11712     ++encodeCount;
11713     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11714         pool->freeAll();
11715         stream->clearPool();
11716     }
11717     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11718 }
11719 
vkGetBufferMemoryRequirements2(VkDevice device,const VkBufferMemoryRequirementsInfo2 * pInfo,VkMemoryRequirements2 * pMemoryRequirements,uint32_t doLock)11720 void VkEncoder::vkGetBufferMemoryRequirements2(VkDevice device,
11721                                                const VkBufferMemoryRequirementsInfo2* pInfo,
11722                                                VkMemoryRequirements2* pMemoryRequirements,
11723                                                uint32_t doLock) {
11724     (void)doLock;
11725     bool queueSubmitWithCommandsEnabled =
11726         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11727     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11728     auto stream = mImpl->stream();
11729     auto pool = mImpl->pool();
11730     VkDevice local_device;
11731     VkBufferMemoryRequirementsInfo2* local_pInfo;
11732     local_device = device;
11733     local_pInfo = nullptr;
11734     if (pInfo) {
11735         local_pInfo = (VkBufferMemoryRequirementsInfo2*)pool->alloc(
11736             sizeof(const VkBufferMemoryRequirementsInfo2));
11737         deepcopy_VkBufferMemoryRequirementsInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
11738                                                  (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
11739     }
11740     if (local_pInfo) {
11741         transform_tohost_VkBufferMemoryRequirementsInfo2(
11742             sResourceTracker, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
11743     }
11744     size_t count = 0;
11745     size_t* countPtr = &count;
11746     {
11747         uint64_t cgen_var_0;
11748         *countPtr += 1 * 8;
11749         count_VkBufferMemoryRequirementsInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
11750                                               (VkBufferMemoryRequirementsInfo2*)(local_pInfo),
11751                                               countPtr);
11752         count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
11753                                     (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
11754     }
11755     uint32_t packetSize_vkGetBufferMemoryRequirements2 =
11756         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
11757     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferMemoryRequirements2);
11758     uint8_t* packetBeginPtr = streamPtr;
11759     uint8_t** streamPtrPtr = &streamPtr;
11760     uint32_t opcode_vkGetBufferMemoryRequirements2 = OP_vkGetBufferMemoryRequirements2;
11761     uint32_t seqno;
11762     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
11763     memcpy(streamPtr, &opcode_vkGetBufferMemoryRequirements2, sizeof(uint32_t));
11764     streamPtr += sizeof(uint32_t);
11765     memcpy(streamPtr, &packetSize_vkGetBufferMemoryRequirements2, sizeof(uint32_t));
11766     streamPtr += sizeof(uint32_t);
11767     if (queueSubmitWithCommandsEnabled) {
11768         memcpy(streamPtr, &seqno, sizeof(uint32_t));
11769         streamPtr += sizeof(uint32_t);
11770     }
11771     uint64_t cgen_var_0;
11772     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
11773     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11774     *streamPtrPtr += 1 * 8;
11775     reservedmarshal_VkBufferMemoryRequirementsInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11776                                                     (VkBufferMemoryRequirementsInfo2*)(local_pInfo),
11777                                                     streamPtrPtr);
11778     reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11779                                           (VkMemoryRequirements2*)(pMemoryRequirements),
11780                                           streamPtrPtr);
11781     unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11782                                     (VkMemoryRequirements2*)(pMemoryRequirements));
11783     if (pMemoryRequirements) {
11784         transform_fromhost_VkMemoryRequirements2(sResourceTracker,
11785                                                  (VkMemoryRequirements2*)(pMemoryRequirements));
11786     }
11787     ++encodeCount;
11788     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11789         pool->freeAll();
11790         stream->clearPool();
11791     }
11792     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11793 }
11794 
vkGetImageSparseMemoryRequirements2(VkDevice device,const VkImageSparseMemoryRequirementsInfo2 * pInfo,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements2 * pSparseMemoryRequirements,uint32_t doLock)11795 void VkEncoder::vkGetImageSparseMemoryRequirements2(
11796     VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo,
11797     uint32_t* pSparseMemoryRequirementCount,
11798     VkSparseImageMemoryRequirements2* pSparseMemoryRequirements, uint32_t doLock) {
11799     (void)doLock;
11800     bool queueSubmitWithCommandsEnabled =
11801         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11802     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11803     auto stream = mImpl->stream();
11804     auto pool = mImpl->pool();
11805     VkDevice local_device;
11806     VkImageSparseMemoryRequirementsInfo2* local_pInfo;
11807     local_device = device;
11808     local_pInfo = nullptr;
11809     if (pInfo) {
11810         local_pInfo = (VkImageSparseMemoryRequirementsInfo2*)pool->alloc(
11811             sizeof(const VkImageSparseMemoryRequirementsInfo2));
11812         deepcopy_VkImageSparseMemoryRequirementsInfo2(
11813             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
11814             (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
11815     }
11816     if (local_pInfo) {
11817         transform_tohost_VkImageSparseMemoryRequirementsInfo2(
11818             sResourceTracker, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
11819     }
11820     size_t count = 0;
11821     size_t* countPtr = &count;
11822     {
11823         uint64_t cgen_var_0;
11824         *countPtr += 1 * 8;
11825         count_VkImageSparseMemoryRequirementsInfo2(
11826             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
11827             (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), countPtr);
11828         // WARNING PTR CHECK
11829         *countPtr += 8;
11830         if (pSparseMemoryRequirementCount) {
11831             *countPtr += sizeof(uint32_t);
11832         }
11833         // WARNING PTR CHECK
11834         *countPtr += 8;
11835         if (pSparseMemoryRequirements) {
11836             if (pSparseMemoryRequirementCount) {
11837                 for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
11838                     count_VkSparseImageMemoryRequirements2(
11839                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
11840                         (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i),
11841                         countPtr);
11842                 }
11843             }
11844         }
11845     }
11846     uint32_t packetSize_vkGetImageSparseMemoryRequirements2 =
11847         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
11848     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageSparseMemoryRequirements2);
11849     uint8_t* packetBeginPtr = streamPtr;
11850     uint8_t** streamPtrPtr = &streamPtr;
11851     uint32_t opcode_vkGetImageSparseMemoryRequirements2 = OP_vkGetImageSparseMemoryRequirements2;
11852     uint32_t seqno;
11853     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
11854     memcpy(streamPtr, &opcode_vkGetImageSparseMemoryRequirements2, sizeof(uint32_t));
11855     streamPtr += sizeof(uint32_t);
11856     memcpy(streamPtr, &packetSize_vkGetImageSparseMemoryRequirements2, sizeof(uint32_t));
11857     streamPtr += sizeof(uint32_t);
11858     if (queueSubmitWithCommandsEnabled) {
11859         memcpy(streamPtr, &seqno, sizeof(uint32_t));
11860         streamPtr += sizeof(uint32_t);
11861     }
11862     uint64_t cgen_var_0;
11863     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
11864     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11865     *streamPtrPtr += 1 * 8;
11866     reservedmarshal_VkImageSparseMemoryRequirementsInfo2(
11867         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo),
11868         streamPtrPtr);
11869     // WARNING PTR CHECK
11870     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
11871     memcpy((*streamPtrPtr), &cgen_var_1, 8);
11872     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
11873     *streamPtrPtr += 8;
11874     if (pSparseMemoryRequirementCount) {
11875         memcpy(*streamPtrPtr, (uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
11876         *streamPtrPtr += sizeof(uint32_t);
11877     }
11878     // WARNING PTR CHECK
11879     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
11880     memcpy((*streamPtrPtr), &cgen_var_2, 8);
11881     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
11882     *streamPtrPtr += 8;
11883     if (pSparseMemoryRequirements) {
11884         for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
11885             reservedmarshal_VkSparseImageMemoryRequirements2(
11886                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11887                 (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), streamPtrPtr);
11888         }
11889     }
11890     // WARNING PTR CHECK
11891     uint32_t* check_pSparseMemoryRequirementCount;
11892     check_pSparseMemoryRequirementCount = (uint32_t*)(uintptr_t)stream->getBe64();
11893     if (pSparseMemoryRequirementCount) {
11894         if (!(check_pSparseMemoryRequirementCount)) {
11895             fprintf(stderr,
11896                     "fatal: pSparseMemoryRequirementCount inconsistent between guest and host\n");
11897         }
11898         stream->read((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
11899     }
11900     // WARNING PTR CHECK
11901     VkSparseImageMemoryRequirements2* check_pSparseMemoryRequirements;
11902     check_pSparseMemoryRequirements =
11903         (VkSparseImageMemoryRequirements2*)(uintptr_t)stream->getBe64();
11904     if (pSparseMemoryRequirements) {
11905         if (!(check_pSparseMemoryRequirements)) {
11906             fprintf(stderr,
11907                     "fatal: pSparseMemoryRequirements inconsistent between guest and host\n");
11908         }
11909         if (pSparseMemoryRequirementCount) {
11910             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
11911                 unmarshal_VkSparseImageMemoryRequirements2(
11912                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11913                     (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
11914             }
11915         }
11916     }
11917     if (pSparseMemoryRequirementCount) {
11918         if (pSparseMemoryRequirements) {
11919             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
11920                 transform_fromhost_VkSparseImageMemoryRequirements2(
11921                     sResourceTracker,
11922                     (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
11923             }
11924         }
11925     }
11926     ++encodeCount;
11927     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11928         pool->freeAll();
11929         stream->clearPool();
11930     }
11931     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11932 }
11933 
vkGetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,VkPhysicalDeviceFeatures2 * pFeatures,uint32_t doLock)11934 void VkEncoder::vkGetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
11935                                              VkPhysicalDeviceFeatures2* pFeatures,
11936                                              uint32_t doLock) {
11937     (void)doLock;
11938     bool queueSubmitWithCommandsEnabled =
11939         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11940     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11941     auto stream = mImpl->stream();
11942     auto pool = mImpl->pool();
11943     VkPhysicalDevice local_physicalDevice;
11944     local_physicalDevice = physicalDevice;
11945     size_t count = 0;
11946     size_t* countPtr = &count;
11947     {
11948         uint64_t cgen_var_0;
11949         *countPtr += 1 * 8;
11950         count_VkPhysicalDeviceFeatures2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
11951                                         (VkPhysicalDeviceFeatures2*)(pFeatures), countPtr);
11952     }
11953     uint32_t packetSize_vkGetPhysicalDeviceFeatures2 =
11954         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
11955     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFeatures2);
11956     uint8_t* packetBeginPtr = streamPtr;
11957     uint8_t** streamPtrPtr = &streamPtr;
11958     uint32_t opcode_vkGetPhysicalDeviceFeatures2 = OP_vkGetPhysicalDeviceFeatures2;
11959     uint32_t seqno;
11960     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
11961     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFeatures2, sizeof(uint32_t));
11962     streamPtr += sizeof(uint32_t);
11963     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFeatures2, sizeof(uint32_t));
11964     streamPtr += sizeof(uint32_t);
11965     if (queueSubmitWithCommandsEnabled) {
11966         memcpy(streamPtr, &seqno, sizeof(uint32_t));
11967         streamPtr += sizeof(uint32_t);
11968     }
11969     uint64_t cgen_var_0;
11970     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
11971     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
11972     *streamPtrPtr += 1 * 8;
11973     reservedmarshal_VkPhysicalDeviceFeatures2(
11974         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures), streamPtrPtr);
11975     unmarshal_VkPhysicalDeviceFeatures2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
11976                                         (VkPhysicalDeviceFeatures2*)(pFeatures));
11977     if (pFeatures) {
11978         transform_fromhost_VkPhysicalDeviceFeatures2(sResourceTracker,
11979                                                      (VkPhysicalDeviceFeatures2*)(pFeatures));
11980     }
11981     sResourceTracker->on_vkGetPhysicalDeviceFeatures2(this, physicalDevice, pFeatures);
11982     ++encodeCount;
11983     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
11984         pool->freeAll();
11985         stream->clearPool();
11986     }
11987     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
11988 }
11989 
vkGetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,VkPhysicalDeviceProperties2 * pProperties,uint32_t doLock)11990 void VkEncoder::vkGetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
11991                                                VkPhysicalDeviceProperties2* pProperties,
11992                                                uint32_t doLock) {
11993     (void)doLock;
11994     bool queueSubmitWithCommandsEnabled =
11995         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
11996     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
11997     auto stream = mImpl->stream();
11998     auto pool = mImpl->pool();
11999     VkPhysicalDevice local_physicalDevice;
12000     local_physicalDevice = physicalDevice;
12001     size_t count = 0;
12002     size_t* countPtr = &count;
12003     {
12004         uint64_t cgen_var_0;
12005         *countPtr += 1 * 8;
12006         count_VkPhysicalDeviceProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12007                                           (VkPhysicalDeviceProperties2*)(pProperties), countPtr);
12008     }
12009     uint32_t packetSize_vkGetPhysicalDeviceProperties2 =
12010         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12011     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceProperties2);
12012     uint8_t* packetBeginPtr = streamPtr;
12013     uint8_t** streamPtrPtr = &streamPtr;
12014     uint32_t opcode_vkGetPhysicalDeviceProperties2 = OP_vkGetPhysicalDeviceProperties2;
12015     uint32_t seqno;
12016     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12017     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceProperties2, sizeof(uint32_t));
12018     streamPtr += sizeof(uint32_t);
12019     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceProperties2, sizeof(uint32_t));
12020     streamPtr += sizeof(uint32_t);
12021     if (queueSubmitWithCommandsEnabled) {
12022         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12023         streamPtr += sizeof(uint32_t);
12024     }
12025     uint64_t cgen_var_0;
12026     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
12027     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12028     *streamPtrPtr += 1 * 8;
12029     reservedmarshal_VkPhysicalDeviceProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12030                                                 (VkPhysicalDeviceProperties2*)(pProperties),
12031                                                 streamPtrPtr);
12032     unmarshal_VkPhysicalDeviceProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12033                                           (VkPhysicalDeviceProperties2*)(pProperties));
12034     if (pProperties) {
12035         transform_fromhost_VkPhysicalDeviceProperties2(sResourceTracker,
12036                                                        (VkPhysicalDeviceProperties2*)(pProperties));
12037     }
12038     sResourceTracker->on_vkGetPhysicalDeviceProperties2(this, physicalDevice, pProperties);
12039     ++encodeCount;
12040     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
12041         pool->freeAll();
12042         stream->clearPool();
12043     }
12044     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
12045 }
12046 
vkGetPhysicalDeviceFormatProperties2(VkPhysicalDevice physicalDevice,VkFormat format,VkFormatProperties2 * pFormatProperties,uint32_t doLock)12047 void VkEncoder::vkGetPhysicalDeviceFormatProperties2(VkPhysicalDevice physicalDevice,
12048                                                      VkFormat format,
12049                                                      VkFormatProperties2* pFormatProperties,
12050                                                      uint32_t doLock) {
12051     (void)doLock;
12052     bool queueSubmitWithCommandsEnabled =
12053         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
12054     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
12055     auto stream = mImpl->stream();
12056     auto pool = mImpl->pool();
12057     VkPhysicalDevice local_physicalDevice;
12058     VkFormat local_format;
12059     local_physicalDevice = physicalDevice;
12060     local_format = format;
12061     size_t count = 0;
12062     size_t* countPtr = &count;
12063     {
12064         uint64_t cgen_var_0;
12065         *countPtr += 1 * 8;
12066         *countPtr += sizeof(VkFormat);
12067         count_VkFormatProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12068                                   (VkFormatProperties2*)(pFormatProperties), countPtr);
12069     }
12070     uint32_t packetSize_vkGetPhysicalDeviceFormatProperties2 =
12071         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12072     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFormatProperties2);
12073     uint8_t* packetBeginPtr = streamPtr;
12074     uint8_t** streamPtrPtr = &streamPtr;
12075     uint32_t opcode_vkGetPhysicalDeviceFormatProperties2 = OP_vkGetPhysicalDeviceFormatProperties2;
12076     uint32_t seqno;
12077     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12078     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFormatProperties2, sizeof(uint32_t));
12079     streamPtr += sizeof(uint32_t);
12080     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFormatProperties2, sizeof(uint32_t));
12081     streamPtr += sizeof(uint32_t);
12082     if (queueSubmitWithCommandsEnabled) {
12083         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12084         streamPtr += sizeof(uint32_t);
12085     }
12086     uint64_t cgen_var_0;
12087     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
12088     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12089     *streamPtrPtr += 1 * 8;
12090     memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
12091     *streamPtrPtr += sizeof(VkFormat);
12092     reservedmarshal_VkFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12093                                         (VkFormatProperties2*)(pFormatProperties), streamPtrPtr);
12094     unmarshal_VkFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12095                                   (VkFormatProperties2*)(pFormatProperties));
12096     if (pFormatProperties) {
12097         transform_fromhost_VkFormatProperties2(sResourceTracker,
12098                                                (VkFormatProperties2*)(pFormatProperties));
12099     }
12100     ++encodeCount;
12101     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
12102         pool->freeAll();
12103         stream->clearPool();
12104     }
12105     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
12106 }
12107 
vkGetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceImageFormatInfo2 * pImageFormatInfo,VkImageFormatProperties2 * pImageFormatProperties,uint32_t doLock)12108 VkResult VkEncoder::vkGetPhysicalDeviceImageFormatProperties2(
12109     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
12110     VkImageFormatProperties2* pImageFormatProperties, uint32_t doLock) {
12111     (void)doLock;
12112     bool queueSubmitWithCommandsEnabled =
12113         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
12114     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
12115     auto stream = mImpl->stream();
12116     auto pool = mImpl->pool();
12117     VkPhysicalDevice local_physicalDevice;
12118     VkPhysicalDeviceImageFormatInfo2* local_pImageFormatInfo;
12119     local_physicalDevice = physicalDevice;
12120     local_pImageFormatInfo = nullptr;
12121     if (pImageFormatInfo) {
12122         local_pImageFormatInfo = (VkPhysicalDeviceImageFormatInfo2*)pool->alloc(
12123             sizeof(const VkPhysicalDeviceImageFormatInfo2));
12124         deepcopy_VkPhysicalDeviceImageFormatInfo2(
12125             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImageFormatInfo,
12126             (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
12127     }
12128     if (local_pImageFormatInfo) {
12129         transform_tohost_VkPhysicalDeviceImageFormatInfo2(
12130             sResourceTracker, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
12131     }
12132     size_t count = 0;
12133     size_t* countPtr = &count;
12134     {
12135         uint64_t cgen_var_0;
12136         *countPtr += 1 * 8;
12137         count_VkPhysicalDeviceImageFormatInfo2(
12138             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12139             (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), countPtr);
12140         count_VkImageFormatProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12141                                        (VkImageFormatProperties2*)(pImageFormatProperties),
12142                                        countPtr);
12143     }
12144     uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties2 =
12145         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12146     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceImageFormatProperties2);
12147     uint8_t* packetBeginPtr = streamPtr;
12148     uint8_t** streamPtrPtr = &streamPtr;
12149     uint32_t opcode_vkGetPhysicalDeviceImageFormatProperties2 =
12150         OP_vkGetPhysicalDeviceImageFormatProperties2;
12151     uint32_t seqno;
12152     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12153     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceImageFormatProperties2, sizeof(uint32_t));
12154     streamPtr += sizeof(uint32_t);
12155     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceImageFormatProperties2, sizeof(uint32_t));
12156     streamPtr += sizeof(uint32_t);
12157     if (queueSubmitWithCommandsEnabled) {
12158         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12159         streamPtr += sizeof(uint32_t);
12160     }
12161     uint64_t cgen_var_0;
12162     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
12163     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12164     *streamPtrPtr += 1 * 8;
12165     reservedmarshal_VkPhysicalDeviceImageFormatInfo2(
12166         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12167         (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), streamPtrPtr);
12168     reservedmarshal_VkImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12169                                              (VkImageFormatProperties2*)(pImageFormatProperties),
12170                                              streamPtrPtr);
12171     unmarshal_VkImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12172                                        (VkImageFormatProperties2*)(pImageFormatProperties));
12173     if (pImageFormatProperties) {
12174         transform_fromhost_VkImageFormatProperties2(
12175             sResourceTracker, (VkImageFormatProperties2*)(pImageFormatProperties));
12176     }
12177     VkResult vkGetPhysicalDeviceImageFormatProperties2_VkResult_return = (VkResult)0;
12178     stream->read(&vkGetPhysicalDeviceImageFormatProperties2_VkResult_return, sizeof(VkResult));
12179     ++encodeCount;
12180     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
12181         pool->freeAll();
12182         stream->clearPool();
12183     }
12184     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
12185     return vkGetPhysicalDeviceImageFormatProperties2_VkResult_return;
12186 }
12187 
vkGetPhysicalDeviceQueueFamilyProperties2(VkPhysicalDevice physicalDevice,uint32_t * pQueueFamilyPropertyCount,VkQueueFamilyProperties2 * pQueueFamilyProperties,uint32_t doLock)12188 void VkEncoder::vkGetPhysicalDeviceQueueFamilyProperties2(
12189     VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount,
12190     VkQueueFamilyProperties2* pQueueFamilyProperties, uint32_t doLock) {
12191     (void)doLock;
12192     bool queueSubmitWithCommandsEnabled =
12193         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
12194     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
12195     auto stream = mImpl->stream();
12196     auto pool = mImpl->pool();
12197     VkPhysicalDevice local_physicalDevice;
12198     local_physicalDevice = physicalDevice;
12199     size_t count = 0;
12200     size_t* countPtr = &count;
12201     {
12202         uint64_t cgen_var_0;
12203         *countPtr += 1 * 8;
12204         // WARNING PTR CHECK
12205         *countPtr += 8;
12206         if (pQueueFamilyPropertyCount) {
12207             *countPtr += sizeof(uint32_t);
12208         }
12209         // WARNING PTR CHECK
12210         *countPtr += 8;
12211         if (pQueueFamilyProperties) {
12212             if (pQueueFamilyPropertyCount) {
12213                 for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
12214                     count_VkQueueFamilyProperties2(
12215                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12216                         (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), countPtr);
12217                 }
12218             }
12219         }
12220     }
12221     uint32_t packetSize_vkGetPhysicalDeviceQueueFamilyProperties2 =
12222         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12223     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceQueueFamilyProperties2);
12224     uint8_t* packetBeginPtr = streamPtr;
12225     uint8_t** streamPtrPtr = &streamPtr;
12226     uint32_t opcode_vkGetPhysicalDeviceQueueFamilyProperties2 =
12227         OP_vkGetPhysicalDeviceQueueFamilyProperties2;
12228     uint32_t seqno;
12229     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12230     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceQueueFamilyProperties2, sizeof(uint32_t));
12231     streamPtr += sizeof(uint32_t);
12232     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceQueueFamilyProperties2, sizeof(uint32_t));
12233     streamPtr += sizeof(uint32_t);
12234     if (queueSubmitWithCommandsEnabled) {
12235         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12236         streamPtr += sizeof(uint32_t);
12237     }
12238     uint64_t cgen_var_0;
12239     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
12240     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12241     *streamPtrPtr += 1 * 8;
12242     // WARNING PTR CHECK
12243     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
12244     memcpy((*streamPtrPtr), &cgen_var_1, 8);
12245     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
12246     *streamPtrPtr += 8;
12247     if (pQueueFamilyPropertyCount) {
12248         memcpy(*streamPtrPtr, (uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
12249         *streamPtrPtr += sizeof(uint32_t);
12250     }
12251     // WARNING PTR CHECK
12252     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
12253     memcpy((*streamPtrPtr), &cgen_var_2, 8);
12254     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
12255     *streamPtrPtr += 8;
12256     if (pQueueFamilyProperties) {
12257         for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
12258             reservedmarshal_VkQueueFamilyProperties2(
12259                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12260                 (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), streamPtrPtr);
12261         }
12262     }
12263     // WARNING PTR CHECK
12264     uint32_t* check_pQueueFamilyPropertyCount;
12265     check_pQueueFamilyPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
12266     if (pQueueFamilyPropertyCount) {
12267         if (!(check_pQueueFamilyPropertyCount)) {
12268             fprintf(stderr,
12269                     "fatal: pQueueFamilyPropertyCount inconsistent between guest and host\n");
12270         }
12271         stream->read((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
12272     }
12273     // WARNING PTR CHECK
12274     VkQueueFamilyProperties2* check_pQueueFamilyProperties;
12275     check_pQueueFamilyProperties = (VkQueueFamilyProperties2*)(uintptr_t)stream->getBe64();
12276     if (pQueueFamilyProperties) {
12277         if (!(check_pQueueFamilyProperties)) {
12278             fprintf(stderr, "fatal: pQueueFamilyProperties inconsistent between guest and host\n");
12279         }
12280         if (pQueueFamilyPropertyCount) {
12281             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
12282                 unmarshal_VkQueueFamilyProperties2(
12283                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12284                     (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
12285             }
12286         }
12287     }
12288     if (pQueueFamilyPropertyCount) {
12289         if (pQueueFamilyProperties) {
12290             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
12291                 transform_fromhost_VkQueueFamilyProperties2(
12292                     sResourceTracker, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
12293             }
12294         }
12295     }
12296     ++encodeCount;
12297     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
12298         pool->freeAll();
12299         stream->clearPool();
12300     }
12301     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
12302 }
12303 
vkGetPhysicalDeviceMemoryProperties2(VkPhysicalDevice physicalDevice,VkPhysicalDeviceMemoryProperties2 * pMemoryProperties,uint32_t doLock)12304 void VkEncoder::vkGetPhysicalDeviceMemoryProperties2(
12305     VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties,
12306     uint32_t doLock) {
12307     (void)doLock;
12308     bool queueSubmitWithCommandsEnabled =
12309         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
12310     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
12311     auto stream = mImpl->stream();
12312     auto pool = mImpl->pool();
12313     VkPhysicalDevice local_physicalDevice;
12314     local_physicalDevice = physicalDevice;
12315     size_t count = 0;
12316     size_t* countPtr = &count;
12317     {
12318         uint64_t cgen_var_0;
12319         *countPtr += 1 * 8;
12320         count_VkPhysicalDeviceMemoryProperties2(
12321             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12322             (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), countPtr);
12323     }
12324     uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties2 =
12325         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12326     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMemoryProperties2);
12327     uint8_t* packetBeginPtr = streamPtr;
12328     uint8_t** streamPtrPtr = &streamPtr;
12329     uint32_t opcode_vkGetPhysicalDeviceMemoryProperties2 = OP_vkGetPhysicalDeviceMemoryProperties2;
12330     uint32_t seqno;
12331     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12332     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceMemoryProperties2, sizeof(uint32_t));
12333     streamPtr += sizeof(uint32_t);
12334     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceMemoryProperties2, sizeof(uint32_t));
12335     streamPtr += sizeof(uint32_t);
12336     if (queueSubmitWithCommandsEnabled) {
12337         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12338         streamPtr += sizeof(uint32_t);
12339     }
12340     uint64_t cgen_var_0;
12341     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
12342     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12343     *streamPtrPtr += 1 * 8;
12344     reservedmarshal_VkPhysicalDeviceMemoryProperties2(
12345         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties),
12346         streamPtrPtr);
12347     unmarshal_VkPhysicalDeviceMemoryProperties2(
12348         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12349         (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
12350     if (pMemoryProperties) {
12351         transform_fromhost_VkPhysicalDeviceMemoryProperties2(
12352             sResourceTracker, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
12353     }
12354     ++encodeCount;
12355     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
12356         pool->freeAll();
12357         stream->clearPool();
12358     }
12359     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
12360 }
12361 
vkGetPhysicalDeviceSparseImageFormatProperties2(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceSparseImageFormatInfo2 * pFormatInfo,uint32_t * pPropertyCount,VkSparseImageFormatProperties2 * pProperties,uint32_t doLock)12362 void VkEncoder::vkGetPhysicalDeviceSparseImageFormatProperties2(
12363     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
12364     uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties, uint32_t doLock) {
12365     (void)doLock;
12366     bool queueSubmitWithCommandsEnabled =
12367         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
12368     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
12369     auto stream = mImpl->stream();
12370     auto pool = mImpl->pool();
12371     VkPhysicalDevice local_physicalDevice;
12372     VkPhysicalDeviceSparseImageFormatInfo2* local_pFormatInfo;
12373     local_physicalDevice = physicalDevice;
12374     local_pFormatInfo = nullptr;
12375     if (pFormatInfo) {
12376         local_pFormatInfo = (VkPhysicalDeviceSparseImageFormatInfo2*)pool->alloc(
12377             sizeof(const VkPhysicalDeviceSparseImageFormatInfo2));
12378         deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(
12379             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pFormatInfo,
12380             (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
12381     }
12382     if (local_pFormatInfo) {
12383         transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2(
12384             sResourceTracker, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
12385     }
12386     size_t count = 0;
12387     size_t* countPtr = &count;
12388     {
12389         uint64_t cgen_var_0;
12390         *countPtr += 1 * 8;
12391         count_VkPhysicalDeviceSparseImageFormatInfo2(
12392             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12393             (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), countPtr);
12394         // WARNING PTR CHECK
12395         *countPtr += 8;
12396         if (pPropertyCount) {
12397             *countPtr += sizeof(uint32_t);
12398         }
12399         // WARNING PTR CHECK
12400         *countPtr += 8;
12401         if (pProperties) {
12402             if (pPropertyCount) {
12403                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
12404                     count_VkSparseImageFormatProperties2(
12405                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12406                         (VkSparseImageFormatProperties2*)(pProperties + i), countPtr);
12407                 }
12408             }
12409         }
12410     }
12411     uint32_t packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2 =
12412         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12413     uint8_t* streamPtr =
12414         stream->reserve(packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2);
12415     uint8_t* packetBeginPtr = streamPtr;
12416     uint8_t** streamPtrPtr = &streamPtr;
12417     uint32_t opcode_vkGetPhysicalDeviceSparseImageFormatProperties2 =
12418         OP_vkGetPhysicalDeviceSparseImageFormatProperties2;
12419     uint32_t seqno;
12420     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12421     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSparseImageFormatProperties2, sizeof(uint32_t));
12422     streamPtr += sizeof(uint32_t);
12423     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2,
12424            sizeof(uint32_t));
12425     streamPtr += sizeof(uint32_t);
12426     if (queueSubmitWithCommandsEnabled) {
12427         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12428         streamPtr += sizeof(uint32_t);
12429     }
12430     uint64_t cgen_var_0;
12431     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
12432     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12433     *streamPtrPtr += 1 * 8;
12434     reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
12435         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12436         (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), streamPtrPtr);
12437     // WARNING PTR CHECK
12438     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pPropertyCount;
12439     memcpy((*streamPtrPtr), &cgen_var_1, 8);
12440     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
12441     *streamPtrPtr += 8;
12442     if (pPropertyCount) {
12443         memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
12444         *streamPtrPtr += sizeof(uint32_t);
12445     }
12446     // WARNING PTR CHECK
12447     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pProperties;
12448     memcpy((*streamPtrPtr), &cgen_var_2, 8);
12449     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
12450     *streamPtrPtr += 8;
12451     if (pProperties) {
12452         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
12453             reservedmarshal_VkSparseImageFormatProperties2(
12454                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12455                 (VkSparseImageFormatProperties2*)(pProperties + i), streamPtrPtr);
12456         }
12457     }
12458     // WARNING PTR CHECK
12459     uint32_t* check_pPropertyCount;
12460     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
12461     if (pPropertyCount) {
12462         if (!(check_pPropertyCount)) {
12463             fprintf(stderr, "fatal: pPropertyCount inconsistent between guest and host\n");
12464         }
12465         stream->read((uint32_t*)pPropertyCount, sizeof(uint32_t));
12466     }
12467     // WARNING PTR CHECK
12468     VkSparseImageFormatProperties2* check_pProperties;
12469     check_pProperties = (VkSparseImageFormatProperties2*)(uintptr_t)stream->getBe64();
12470     if (pProperties) {
12471         if (!(check_pProperties)) {
12472             fprintf(stderr, "fatal: pProperties inconsistent between guest and host\n");
12473         }
12474         if (pPropertyCount) {
12475             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
12476                 unmarshal_VkSparseImageFormatProperties2(
12477                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12478                     (VkSparseImageFormatProperties2*)(pProperties + i));
12479             }
12480         }
12481     }
12482     if (pPropertyCount) {
12483         if (pProperties) {
12484             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
12485                 transform_fromhost_VkSparseImageFormatProperties2(
12486                     sResourceTracker, (VkSparseImageFormatProperties2*)(pProperties + i));
12487             }
12488         }
12489     }
12490     ++encodeCount;
12491     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
12492         pool->freeAll();
12493         stream->clearPool();
12494     }
12495     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
12496 }
12497 
vkTrimCommandPool(VkDevice device,VkCommandPool commandPool,VkCommandPoolTrimFlags flags,uint32_t doLock)12498 void VkEncoder::vkTrimCommandPool(VkDevice device, VkCommandPool commandPool,
12499                                   VkCommandPoolTrimFlags flags, uint32_t doLock) {
12500     (void)doLock;
12501     bool queueSubmitWithCommandsEnabled =
12502         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
12503     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
12504     auto stream = mImpl->stream();
12505     auto pool = mImpl->pool();
12506     VkDevice local_device;
12507     VkCommandPool local_commandPool;
12508     VkCommandPoolTrimFlags local_flags;
12509     local_device = device;
12510     local_commandPool = commandPool;
12511     local_flags = flags;
12512     size_t count = 0;
12513     size_t* countPtr = &count;
12514     {
12515         uint64_t cgen_var_0;
12516         *countPtr += 1 * 8;
12517         uint64_t cgen_var_1;
12518         *countPtr += 1 * 8;
12519         *countPtr += sizeof(VkCommandPoolTrimFlags);
12520     }
12521     uint32_t packetSize_vkTrimCommandPool =
12522         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12523     uint8_t* streamPtr = stream->reserve(packetSize_vkTrimCommandPool);
12524     uint8_t* packetBeginPtr = streamPtr;
12525     uint8_t** streamPtrPtr = &streamPtr;
12526     uint32_t opcode_vkTrimCommandPool = OP_vkTrimCommandPool;
12527     uint32_t seqno;
12528     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12529     memcpy(streamPtr, &opcode_vkTrimCommandPool, sizeof(uint32_t));
12530     streamPtr += sizeof(uint32_t);
12531     memcpy(streamPtr, &packetSize_vkTrimCommandPool, sizeof(uint32_t));
12532     streamPtr += sizeof(uint32_t);
12533     if (queueSubmitWithCommandsEnabled) {
12534         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12535         streamPtr += sizeof(uint32_t);
12536     }
12537     uint64_t cgen_var_0;
12538     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
12539     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12540     *streamPtrPtr += 1 * 8;
12541     uint64_t cgen_var_1;
12542     *&cgen_var_1 = get_host_u64_VkCommandPool((*&local_commandPool));
12543     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
12544     *streamPtrPtr += 1 * 8;
12545     memcpy(*streamPtrPtr, (VkCommandPoolTrimFlags*)&local_flags, sizeof(VkCommandPoolTrimFlags));
12546     *streamPtrPtr += sizeof(VkCommandPoolTrimFlags);
12547     stream->flush();
12548     ++encodeCount;
12549     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
12550         pool->freeAll();
12551         stream->clearPool();
12552     }
12553     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
12554 }
12555 
vkGetDeviceQueue2(VkDevice device,const VkDeviceQueueInfo2 * pQueueInfo,VkQueue * pQueue,uint32_t doLock)12556 void VkEncoder::vkGetDeviceQueue2(VkDevice device, const VkDeviceQueueInfo2* pQueueInfo,
12557                                   VkQueue* pQueue, uint32_t doLock) {
12558     (void)doLock;
12559     bool queueSubmitWithCommandsEnabled =
12560         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
12561     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
12562     auto stream = mImpl->stream();
12563     auto pool = mImpl->pool();
12564     VkDevice local_device;
12565     VkDeviceQueueInfo2* local_pQueueInfo;
12566     local_device = device;
12567     local_pQueueInfo = nullptr;
12568     if (pQueueInfo) {
12569         local_pQueueInfo = (VkDeviceQueueInfo2*)pool->alloc(sizeof(const VkDeviceQueueInfo2));
12570         deepcopy_VkDeviceQueueInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pQueueInfo,
12571                                     (VkDeviceQueueInfo2*)(local_pQueueInfo));
12572     }
12573     if (local_pQueueInfo) {
12574         transform_tohost_VkDeviceQueueInfo2(sResourceTracker,
12575                                             (VkDeviceQueueInfo2*)(local_pQueueInfo));
12576     }
12577     size_t count = 0;
12578     size_t* countPtr = &count;
12579     {
12580         uint64_t cgen_var_0;
12581         *countPtr += 1 * 8;
12582         count_VkDeviceQueueInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12583                                  (VkDeviceQueueInfo2*)(local_pQueueInfo), countPtr);
12584         uint64_t cgen_var_1;
12585         *countPtr += 8;
12586     }
12587     uint32_t packetSize_vkGetDeviceQueue2 =
12588         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12589     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceQueue2);
12590     uint8_t* packetBeginPtr = streamPtr;
12591     uint8_t** streamPtrPtr = &streamPtr;
12592     uint32_t opcode_vkGetDeviceQueue2 = OP_vkGetDeviceQueue2;
12593     uint32_t seqno;
12594     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12595     memcpy(streamPtr, &opcode_vkGetDeviceQueue2, sizeof(uint32_t));
12596     streamPtr += sizeof(uint32_t);
12597     memcpy(streamPtr, &packetSize_vkGetDeviceQueue2, sizeof(uint32_t));
12598     streamPtr += sizeof(uint32_t);
12599     if (queueSubmitWithCommandsEnabled) {
12600         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12601         streamPtr += sizeof(uint32_t);
12602     }
12603     uint64_t cgen_var_0;
12604     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
12605     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12606     *streamPtrPtr += 1 * 8;
12607     reservedmarshal_VkDeviceQueueInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12608                                        (VkDeviceQueueInfo2*)(local_pQueueInfo), streamPtrPtr);
12609     /* is handle, possibly out */;
12610     uint64_t cgen_var_1;
12611     *&cgen_var_1 = (uint64_t)((*pQueue));
12612     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 8);
12613     *streamPtrPtr += 8;
12614     /* is handle, possibly out */;
12615     stream->setHandleMapping(sResourceTracker->createMapping());
12616     uint64_t cgen_var_2;
12617     stream->read((uint64_t*)&cgen_var_2, 8);
12618     stream->handleMapping()->mapHandles_u64_VkQueue(&cgen_var_2, (VkQueue*)pQueue, 1);
12619     stream->unsetHandleMapping();
12620     sResourceTracker->on_vkGetDeviceQueue2(this, device, pQueueInfo, pQueue);
12621     ++encodeCount;
12622     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
12623         pool->freeAll();
12624         stream->clearPool();
12625     }
12626     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
12627 }
12628 
vkCreateSamplerYcbcrConversion(VkDevice device,const VkSamplerYcbcrConversionCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSamplerYcbcrConversion * pYcbcrConversion,uint32_t doLock)12629 VkResult VkEncoder::vkCreateSamplerYcbcrConversion(
12630     VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
12631     const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversion* pYcbcrConversion,
12632     uint32_t doLock) {
12633     (void)doLock;
12634     bool queueSubmitWithCommandsEnabled =
12635         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
12636     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
12637     auto stream = mImpl->stream();
12638     auto pool = mImpl->pool();
12639     VkDevice local_device;
12640     VkSamplerYcbcrConversionCreateInfo* local_pCreateInfo;
12641     VkAllocationCallbacks* local_pAllocator;
12642     local_device = device;
12643     local_pCreateInfo = nullptr;
12644     if (pCreateInfo) {
12645         local_pCreateInfo = (VkSamplerYcbcrConversionCreateInfo*)pool->alloc(
12646             sizeof(const VkSamplerYcbcrConversionCreateInfo));
12647         deepcopy_VkSamplerYcbcrConversionCreateInfo(
12648             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
12649             (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
12650     }
12651     local_pAllocator = nullptr;
12652     if (pAllocator) {
12653         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
12654         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
12655                                        (VkAllocationCallbacks*)(local_pAllocator));
12656     }
12657     local_pAllocator = nullptr;
12658     if (local_pCreateInfo) {
12659         transform_tohost_VkSamplerYcbcrConversionCreateInfo(
12660             sResourceTracker, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
12661     }
12662     if (local_pAllocator) {
12663         transform_tohost_VkAllocationCallbacks(sResourceTracker,
12664                                                (VkAllocationCallbacks*)(local_pAllocator));
12665     }
12666     size_t count = 0;
12667     size_t* countPtr = &count;
12668     {
12669         uint64_t cgen_var_0;
12670         *countPtr += 1 * 8;
12671         count_VkSamplerYcbcrConversionCreateInfo(
12672             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12673             (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), countPtr);
12674         // WARNING PTR CHECK
12675         *countPtr += 8;
12676         if (local_pAllocator) {
12677             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12678                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
12679         }
12680         uint64_t cgen_var_1;
12681         *countPtr += 8;
12682     }
12683     uint32_t packetSize_vkCreateSamplerYcbcrConversion =
12684         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12685     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateSamplerYcbcrConversion);
12686     uint8_t* packetBeginPtr = streamPtr;
12687     uint8_t** streamPtrPtr = &streamPtr;
12688     uint32_t opcode_vkCreateSamplerYcbcrConversion = OP_vkCreateSamplerYcbcrConversion;
12689     uint32_t seqno;
12690     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12691     memcpy(streamPtr, &opcode_vkCreateSamplerYcbcrConversion, sizeof(uint32_t));
12692     streamPtr += sizeof(uint32_t);
12693     memcpy(streamPtr, &packetSize_vkCreateSamplerYcbcrConversion, sizeof(uint32_t));
12694     streamPtr += sizeof(uint32_t);
12695     if (queueSubmitWithCommandsEnabled) {
12696         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12697         streamPtr += sizeof(uint32_t);
12698     }
12699     uint64_t cgen_var_0;
12700     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
12701     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12702     *streamPtrPtr += 1 * 8;
12703     reservedmarshal_VkSamplerYcbcrConversionCreateInfo(
12704         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12705         (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), streamPtrPtr);
12706     // WARNING PTR CHECK
12707     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
12708     memcpy((*streamPtrPtr), &cgen_var_1, 8);
12709     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
12710     *streamPtrPtr += 8;
12711     if (local_pAllocator) {
12712         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12713                                               (VkAllocationCallbacks*)(local_pAllocator),
12714                                               streamPtrPtr);
12715     }
12716     /* is handle, possibly out */;
12717     uint64_t cgen_var_2;
12718     *&cgen_var_2 = (uint64_t)((*pYcbcrConversion));
12719     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
12720     *streamPtrPtr += 8;
12721     /* is handle, possibly out */;
12722     stream->setHandleMapping(sResourceTracker->createMapping());
12723     uint64_t cgen_var_3;
12724     stream->read((uint64_t*)&cgen_var_3, 8);
12725     stream->handleMapping()->mapHandles_u64_VkSamplerYcbcrConversion(
12726         &cgen_var_3, (VkSamplerYcbcrConversion*)pYcbcrConversion, 1);
12727     stream->unsetHandleMapping();
12728     VkResult vkCreateSamplerYcbcrConversion_VkResult_return = (VkResult)0;
12729     stream->read(&vkCreateSamplerYcbcrConversion_VkResult_return, sizeof(VkResult));
12730     ++encodeCount;
12731     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
12732         pool->freeAll();
12733         stream->clearPool();
12734     }
12735     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
12736     return vkCreateSamplerYcbcrConversion_VkResult_return;
12737 }
12738 
vkDestroySamplerYcbcrConversion(VkDevice device,VkSamplerYcbcrConversion ycbcrConversion,const VkAllocationCallbacks * pAllocator,uint32_t doLock)12739 void VkEncoder::vkDestroySamplerYcbcrConversion(VkDevice device,
12740                                                 VkSamplerYcbcrConversion ycbcrConversion,
12741                                                 const VkAllocationCallbacks* pAllocator,
12742                                                 uint32_t doLock) {
12743     (void)doLock;
12744     bool queueSubmitWithCommandsEnabled =
12745         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
12746     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
12747     auto stream = mImpl->stream();
12748     auto pool = mImpl->pool();
12749     VkDevice local_device;
12750     VkSamplerYcbcrConversion local_ycbcrConversion;
12751     VkAllocationCallbacks* local_pAllocator;
12752     local_device = device;
12753     local_ycbcrConversion = ycbcrConversion;
12754     local_pAllocator = nullptr;
12755     if (pAllocator) {
12756         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
12757         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
12758                                        (VkAllocationCallbacks*)(local_pAllocator));
12759     }
12760     local_pAllocator = nullptr;
12761     if (local_pAllocator) {
12762         transform_tohost_VkAllocationCallbacks(sResourceTracker,
12763                                                (VkAllocationCallbacks*)(local_pAllocator));
12764     }
12765     size_t count = 0;
12766     size_t* countPtr = &count;
12767     {
12768         uint64_t cgen_var_0;
12769         *countPtr += 1 * 8;
12770         uint64_t cgen_var_1;
12771         *countPtr += 1 * 8;
12772         // WARNING PTR CHECK
12773         *countPtr += 8;
12774         if (local_pAllocator) {
12775             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12776                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
12777         }
12778     }
12779     uint32_t packetSize_vkDestroySamplerYcbcrConversion =
12780         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12781     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroySamplerYcbcrConversion);
12782     uint8_t* packetBeginPtr = streamPtr;
12783     uint8_t** streamPtrPtr = &streamPtr;
12784     uint32_t opcode_vkDestroySamplerYcbcrConversion = OP_vkDestroySamplerYcbcrConversion;
12785     uint32_t seqno;
12786     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12787     memcpy(streamPtr, &opcode_vkDestroySamplerYcbcrConversion, sizeof(uint32_t));
12788     streamPtr += sizeof(uint32_t);
12789     memcpy(streamPtr, &packetSize_vkDestroySamplerYcbcrConversion, sizeof(uint32_t));
12790     streamPtr += sizeof(uint32_t);
12791     if (queueSubmitWithCommandsEnabled) {
12792         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12793         streamPtr += sizeof(uint32_t);
12794     }
12795     uint64_t cgen_var_0;
12796     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
12797     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12798     *streamPtrPtr += 1 * 8;
12799     uint64_t cgen_var_1;
12800     *&cgen_var_1 = get_host_u64_VkSamplerYcbcrConversion((*&local_ycbcrConversion));
12801     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
12802     *streamPtrPtr += 1 * 8;
12803     // WARNING PTR CHECK
12804     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
12805     memcpy((*streamPtrPtr), &cgen_var_2, 8);
12806     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
12807     *streamPtrPtr += 8;
12808     if (local_pAllocator) {
12809         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12810                                               (VkAllocationCallbacks*)(local_pAllocator),
12811                                               streamPtrPtr);
12812     }
12813     sResourceTracker->destroyMapping()->mapHandles_VkSamplerYcbcrConversion(
12814         (VkSamplerYcbcrConversion*)&ycbcrConversion);
12815     stream->flush();
12816     ++encodeCount;
12817     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
12818         pool->freeAll();
12819         stream->clearPool();
12820     }
12821     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
12822 }
12823 
vkCreateDescriptorUpdateTemplate(VkDevice device,const VkDescriptorUpdateTemplateCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDescriptorUpdateTemplate * pDescriptorUpdateTemplate,uint32_t doLock)12824 VkResult VkEncoder::vkCreateDescriptorUpdateTemplate(
12825     VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
12826     const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate,
12827     uint32_t doLock) {
12828     (void)doLock;
12829     bool queueSubmitWithCommandsEnabled =
12830         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
12831     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
12832     auto stream = mImpl->stream();
12833     auto pool = mImpl->pool();
12834     VkDevice local_device;
12835     VkDescriptorUpdateTemplateCreateInfo* local_pCreateInfo;
12836     VkAllocationCallbacks* local_pAllocator;
12837     local_device = device;
12838     local_pCreateInfo = nullptr;
12839     if (pCreateInfo) {
12840         local_pCreateInfo = (VkDescriptorUpdateTemplateCreateInfo*)pool->alloc(
12841             sizeof(const VkDescriptorUpdateTemplateCreateInfo));
12842         deepcopy_VkDescriptorUpdateTemplateCreateInfo(
12843             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
12844             (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
12845     }
12846     local_pAllocator = nullptr;
12847     if (pAllocator) {
12848         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
12849         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
12850                                        (VkAllocationCallbacks*)(local_pAllocator));
12851     }
12852     local_pAllocator = nullptr;
12853     if (local_pCreateInfo) {
12854         transform_tohost_VkDescriptorUpdateTemplateCreateInfo(
12855             sResourceTracker, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
12856     }
12857     if (local_pAllocator) {
12858         transform_tohost_VkAllocationCallbacks(sResourceTracker,
12859                                                (VkAllocationCallbacks*)(local_pAllocator));
12860     }
12861     size_t count = 0;
12862     size_t* countPtr = &count;
12863     {
12864         uint64_t cgen_var_0;
12865         *countPtr += 1 * 8;
12866         count_VkDescriptorUpdateTemplateCreateInfo(
12867             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12868             (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), countPtr);
12869         // WARNING PTR CHECK
12870         *countPtr += 8;
12871         if (local_pAllocator) {
12872             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12873                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
12874         }
12875         uint64_t cgen_var_1;
12876         *countPtr += 8;
12877     }
12878     uint32_t packetSize_vkCreateDescriptorUpdateTemplate =
12879         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12880     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDescriptorUpdateTemplate);
12881     uint8_t* packetBeginPtr = streamPtr;
12882     uint8_t** streamPtrPtr = &streamPtr;
12883     uint32_t opcode_vkCreateDescriptorUpdateTemplate = OP_vkCreateDescriptorUpdateTemplate;
12884     uint32_t seqno;
12885     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12886     memcpy(streamPtr, &opcode_vkCreateDescriptorUpdateTemplate, sizeof(uint32_t));
12887     streamPtr += sizeof(uint32_t);
12888     memcpy(streamPtr, &packetSize_vkCreateDescriptorUpdateTemplate, sizeof(uint32_t));
12889     streamPtr += sizeof(uint32_t);
12890     if (queueSubmitWithCommandsEnabled) {
12891         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12892         streamPtr += sizeof(uint32_t);
12893     }
12894     uint64_t cgen_var_0;
12895     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
12896     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12897     *streamPtrPtr += 1 * 8;
12898     reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(
12899         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12900         (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), streamPtrPtr);
12901     // WARNING PTR CHECK
12902     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
12903     memcpy((*streamPtrPtr), &cgen_var_1, 8);
12904     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
12905     *streamPtrPtr += 8;
12906     if (local_pAllocator) {
12907         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
12908                                               (VkAllocationCallbacks*)(local_pAllocator),
12909                                               streamPtrPtr);
12910     }
12911     /* is handle, possibly out */;
12912     uint64_t cgen_var_2;
12913     *&cgen_var_2 = (uint64_t)((*pDescriptorUpdateTemplate));
12914     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
12915     *streamPtrPtr += 8;
12916     /* is handle, possibly out */;
12917     stream->setHandleMapping(sResourceTracker->createMapping());
12918     uint64_t cgen_var_3;
12919     stream->read((uint64_t*)&cgen_var_3, 8);
12920     stream->handleMapping()->mapHandles_u64_VkDescriptorUpdateTemplate(
12921         &cgen_var_3, (VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 1);
12922     stream->unsetHandleMapping();
12923     VkResult vkCreateDescriptorUpdateTemplate_VkResult_return = (VkResult)0;
12924     stream->read(&vkCreateDescriptorUpdateTemplate_VkResult_return, sizeof(VkResult));
12925     sResourceTracker->on_vkCreateDescriptorUpdateTemplate(
12926         this, vkCreateDescriptorUpdateTemplate_VkResult_return, device, pCreateInfo, pAllocator,
12927         pDescriptorUpdateTemplate);
12928     ++encodeCount;
12929     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
12930         pool->freeAll();
12931         stream->clearPool();
12932     }
12933     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
12934     return vkCreateDescriptorUpdateTemplate_VkResult_return;
12935 }
12936 
vkDestroyDescriptorUpdateTemplate(VkDevice device,VkDescriptorUpdateTemplate descriptorUpdateTemplate,const VkAllocationCallbacks * pAllocator,uint32_t doLock)12937 void VkEncoder::vkDestroyDescriptorUpdateTemplate(
12938     VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate,
12939     const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
12940     (void)doLock;
12941     bool queueSubmitWithCommandsEnabled =
12942         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
12943     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
12944     auto stream = mImpl->stream();
12945     auto pool = mImpl->pool();
12946     VkDevice local_device;
12947     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
12948     VkAllocationCallbacks* local_pAllocator;
12949     local_device = device;
12950     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
12951     local_pAllocator = nullptr;
12952     if (pAllocator) {
12953         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
12954         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
12955                                        (VkAllocationCallbacks*)(local_pAllocator));
12956     }
12957     local_pAllocator = nullptr;
12958     if (local_pAllocator) {
12959         transform_tohost_VkAllocationCallbacks(sResourceTracker,
12960                                                (VkAllocationCallbacks*)(local_pAllocator));
12961     }
12962     size_t count = 0;
12963     size_t* countPtr = &count;
12964     {
12965         uint64_t cgen_var_0;
12966         *countPtr += 1 * 8;
12967         uint64_t cgen_var_1;
12968         *countPtr += 1 * 8;
12969         // WARNING PTR CHECK
12970         *countPtr += 8;
12971         if (local_pAllocator) {
12972             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
12973                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
12974         }
12975     }
12976     uint32_t packetSize_vkDestroyDescriptorUpdateTemplate =
12977         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
12978     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDescriptorUpdateTemplate);
12979     uint8_t* packetBeginPtr = streamPtr;
12980     uint8_t** streamPtrPtr = &streamPtr;
12981     uint32_t opcode_vkDestroyDescriptorUpdateTemplate = OP_vkDestroyDescriptorUpdateTemplate;
12982     uint32_t seqno;
12983     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
12984     memcpy(streamPtr, &opcode_vkDestroyDescriptorUpdateTemplate, sizeof(uint32_t));
12985     streamPtr += sizeof(uint32_t);
12986     memcpy(streamPtr, &packetSize_vkDestroyDescriptorUpdateTemplate, sizeof(uint32_t));
12987     streamPtr += sizeof(uint32_t);
12988     if (queueSubmitWithCommandsEnabled) {
12989         memcpy(streamPtr, &seqno, sizeof(uint32_t));
12990         streamPtr += sizeof(uint32_t);
12991     }
12992     uint64_t cgen_var_0;
12993     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
12994     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
12995     *streamPtrPtr += 1 * 8;
12996     uint64_t cgen_var_1;
12997     *&cgen_var_1 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
12998     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
12999     *streamPtrPtr += 1 * 8;
13000     // WARNING PTR CHECK
13001     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
13002     memcpy((*streamPtrPtr), &cgen_var_2, 8);
13003     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
13004     *streamPtrPtr += 8;
13005     if (local_pAllocator) {
13006         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13007                                               (VkAllocationCallbacks*)(local_pAllocator),
13008                                               streamPtrPtr);
13009     }
13010     sResourceTracker->destroyMapping()->mapHandles_VkDescriptorUpdateTemplate(
13011         (VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate);
13012     stream->flush();
13013     ++encodeCount;
13014     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13015         pool->freeAll();
13016         stream->clearPool();
13017     }
13018     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13019 }
13020 
vkUpdateDescriptorSetWithTemplate(VkDevice device,VkDescriptorSet descriptorSet,VkDescriptorUpdateTemplate descriptorUpdateTemplate,const void * pData,uint32_t doLock)13021 void VkEncoder::vkUpdateDescriptorSetWithTemplate(
13022     VkDevice device, VkDescriptorSet descriptorSet,
13023     VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData, uint32_t doLock) {
13024     (void)doLock;
13025     bool queueSubmitWithCommandsEnabled =
13026         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13027     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13028     auto stream = mImpl->stream();
13029     auto pool = mImpl->pool();
13030     VkDevice local_device;
13031     VkDescriptorSet local_descriptorSet;
13032     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
13033     void* local_pData;
13034     local_device = device;
13035     local_descriptorSet = descriptorSet;
13036     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
13037     // Avoiding deepcopy for pData
13038     local_pData = (void*)pData;
13039     size_t count = 0;
13040     size_t* countPtr = &count;
13041     {
13042         uint64_t cgen_var_0;
13043         *countPtr += 1 * 8;
13044         uint64_t cgen_var_1;
13045         *countPtr += 1 * 8;
13046         uint64_t cgen_var_2;
13047         *countPtr += 1 * 8;
13048         // WARNING PTR CHECK
13049         *countPtr += 8;
13050         if (local_pData) {
13051             *countPtr += sizeof(uint8_t);
13052         }
13053     }
13054     uint32_t packetSize_vkUpdateDescriptorSetWithTemplate =
13055         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
13056     uint8_t* streamPtr = stream->reserve(packetSize_vkUpdateDescriptorSetWithTemplate);
13057     uint8_t* packetBeginPtr = streamPtr;
13058     uint8_t** streamPtrPtr = &streamPtr;
13059     uint32_t opcode_vkUpdateDescriptorSetWithTemplate = OP_vkUpdateDescriptorSetWithTemplate;
13060     uint32_t seqno;
13061     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
13062     memcpy(streamPtr, &opcode_vkUpdateDescriptorSetWithTemplate, sizeof(uint32_t));
13063     streamPtr += sizeof(uint32_t);
13064     memcpy(streamPtr, &packetSize_vkUpdateDescriptorSetWithTemplate, sizeof(uint32_t));
13065     streamPtr += sizeof(uint32_t);
13066     if (queueSubmitWithCommandsEnabled) {
13067         memcpy(streamPtr, &seqno, sizeof(uint32_t));
13068         streamPtr += sizeof(uint32_t);
13069     }
13070     uint64_t cgen_var_0;
13071     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
13072     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13073     *streamPtrPtr += 1 * 8;
13074     uint64_t cgen_var_1;
13075     *&cgen_var_1 = get_host_u64_VkDescriptorSet((*&local_descriptorSet));
13076     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
13077     *streamPtrPtr += 1 * 8;
13078     uint64_t cgen_var_2;
13079     *&cgen_var_2 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
13080     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
13081     *streamPtrPtr += 1 * 8;
13082     // WARNING PTR CHECK
13083     uint64_t cgen_var_3 = (uint64_t)(uintptr_t)local_pData;
13084     memcpy((*streamPtrPtr), &cgen_var_3, 8);
13085     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
13086     *streamPtrPtr += 8;
13087     if (local_pData) {
13088         memcpy(*streamPtrPtr, (void*)local_pData, sizeof(uint8_t));
13089         *streamPtrPtr += sizeof(uint8_t);
13090     }
13091     stream->flush();
13092     ++encodeCount;
13093     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13094         pool->freeAll();
13095         stream->clearPool();
13096     }
13097     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13098 }
13099 
vkGetPhysicalDeviceExternalBufferProperties(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalBufferInfo * pExternalBufferInfo,VkExternalBufferProperties * pExternalBufferProperties,uint32_t doLock)13100 void VkEncoder::vkGetPhysicalDeviceExternalBufferProperties(
13101     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
13102     VkExternalBufferProperties* pExternalBufferProperties, uint32_t doLock) {
13103     (void)doLock;
13104     bool queueSubmitWithCommandsEnabled =
13105         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13106     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13107     auto stream = mImpl->stream();
13108     auto pool = mImpl->pool();
13109     VkPhysicalDevice local_physicalDevice;
13110     VkPhysicalDeviceExternalBufferInfo* local_pExternalBufferInfo;
13111     local_physicalDevice = physicalDevice;
13112     local_pExternalBufferInfo = nullptr;
13113     if (pExternalBufferInfo) {
13114         local_pExternalBufferInfo = (VkPhysicalDeviceExternalBufferInfo*)pool->alloc(
13115             sizeof(const VkPhysicalDeviceExternalBufferInfo));
13116         deepcopy_VkPhysicalDeviceExternalBufferInfo(
13117             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalBufferInfo,
13118             (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
13119     }
13120     if (local_pExternalBufferInfo) {
13121         sResourceTracker->transformImpl_VkPhysicalDeviceExternalBufferInfo_tohost(
13122             local_pExternalBufferInfo, 1);
13123         transform_tohost_VkPhysicalDeviceExternalBufferInfo(
13124             sResourceTracker, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
13125     }
13126     size_t count = 0;
13127     size_t* countPtr = &count;
13128     {
13129         uint64_t cgen_var_0;
13130         *countPtr += 1 * 8;
13131         count_VkPhysicalDeviceExternalBufferInfo(
13132             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13133             (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), countPtr);
13134         count_VkExternalBufferProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13135                                          (VkExternalBufferProperties*)(pExternalBufferProperties),
13136                                          countPtr);
13137     }
13138     uint32_t packetSize_vkGetPhysicalDeviceExternalBufferProperties =
13139         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
13140     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalBufferProperties);
13141     uint8_t* packetBeginPtr = streamPtr;
13142     uint8_t** streamPtrPtr = &streamPtr;
13143     uint32_t opcode_vkGetPhysicalDeviceExternalBufferProperties =
13144         OP_vkGetPhysicalDeviceExternalBufferProperties;
13145     uint32_t seqno;
13146     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
13147     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalBufferProperties, sizeof(uint32_t));
13148     streamPtr += sizeof(uint32_t);
13149     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalBufferProperties, sizeof(uint32_t));
13150     streamPtr += sizeof(uint32_t);
13151     if (queueSubmitWithCommandsEnabled) {
13152         memcpy(streamPtr, &seqno, sizeof(uint32_t));
13153         streamPtr += sizeof(uint32_t);
13154     }
13155     uint64_t cgen_var_0;
13156     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
13157     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13158     *streamPtrPtr += 1 * 8;
13159     reservedmarshal_VkPhysicalDeviceExternalBufferInfo(
13160         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13161         (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), streamPtrPtr);
13162     reservedmarshal_VkExternalBufferProperties(
13163         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13164         (VkExternalBufferProperties*)(pExternalBufferProperties), streamPtrPtr);
13165     unmarshal_VkExternalBufferProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13166                                          (VkExternalBufferProperties*)(pExternalBufferProperties));
13167     if (pExternalBufferProperties) {
13168         sResourceTracker->transformImpl_VkExternalBufferProperties_fromhost(
13169             pExternalBufferProperties, 1);
13170         transform_fromhost_VkExternalBufferProperties(
13171             sResourceTracker, (VkExternalBufferProperties*)(pExternalBufferProperties));
13172     }
13173     ++encodeCount;
13174     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13175         pool->freeAll();
13176         stream->clearPool();
13177     }
13178     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13179 }
13180 
vkGetPhysicalDeviceExternalFenceProperties(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalFenceInfo * pExternalFenceInfo,VkExternalFenceProperties * pExternalFenceProperties,uint32_t doLock)13181 void VkEncoder::vkGetPhysicalDeviceExternalFenceProperties(
13182     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
13183     VkExternalFenceProperties* pExternalFenceProperties, uint32_t doLock) {
13184     (void)doLock;
13185     bool queueSubmitWithCommandsEnabled =
13186         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13187     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13188     auto stream = mImpl->stream();
13189     auto pool = mImpl->pool();
13190     VkPhysicalDevice local_physicalDevice;
13191     VkPhysicalDeviceExternalFenceInfo* local_pExternalFenceInfo;
13192     local_physicalDevice = physicalDevice;
13193     local_pExternalFenceInfo = nullptr;
13194     if (pExternalFenceInfo) {
13195         local_pExternalFenceInfo = (VkPhysicalDeviceExternalFenceInfo*)pool->alloc(
13196             sizeof(const VkPhysicalDeviceExternalFenceInfo));
13197         deepcopy_VkPhysicalDeviceExternalFenceInfo(
13198             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalFenceInfo,
13199             (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
13200     }
13201     if (local_pExternalFenceInfo) {
13202         transform_tohost_VkPhysicalDeviceExternalFenceInfo(
13203             sResourceTracker, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
13204     }
13205     size_t count = 0;
13206     size_t* countPtr = &count;
13207     {
13208         uint64_t cgen_var_0;
13209         *countPtr += 1 * 8;
13210         count_VkPhysicalDeviceExternalFenceInfo(
13211             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13212             (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), countPtr);
13213         count_VkExternalFenceProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13214                                         (VkExternalFenceProperties*)(pExternalFenceProperties),
13215                                         countPtr);
13216     }
13217     uint32_t packetSize_vkGetPhysicalDeviceExternalFenceProperties =
13218         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
13219     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalFenceProperties);
13220     uint8_t* packetBeginPtr = streamPtr;
13221     uint8_t** streamPtrPtr = &streamPtr;
13222     uint32_t opcode_vkGetPhysicalDeviceExternalFenceProperties =
13223         OP_vkGetPhysicalDeviceExternalFenceProperties;
13224     uint32_t seqno;
13225     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
13226     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalFenceProperties, sizeof(uint32_t));
13227     streamPtr += sizeof(uint32_t);
13228     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalFenceProperties, sizeof(uint32_t));
13229     streamPtr += sizeof(uint32_t);
13230     if (queueSubmitWithCommandsEnabled) {
13231         memcpy(streamPtr, &seqno, sizeof(uint32_t));
13232         streamPtr += sizeof(uint32_t);
13233     }
13234     uint64_t cgen_var_0;
13235     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
13236     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13237     *streamPtrPtr += 1 * 8;
13238     reservedmarshal_VkPhysicalDeviceExternalFenceInfo(
13239         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13240         (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), streamPtrPtr);
13241     reservedmarshal_VkExternalFenceProperties(
13242         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties),
13243         streamPtrPtr);
13244     unmarshal_VkExternalFenceProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13245                                         (VkExternalFenceProperties*)(pExternalFenceProperties));
13246     if (pExternalFenceProperties) {
13247         transform_fromhost_VkExternalFenceProperties(
13248             sResourceTracker, (VkExternalFenceProperties*)(pExternalFenceProperties));
13249     }
13250     ++encodeCount;
13251     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13252         pool->freeAll();
13253         stream->clearPool();
13254     }
13255     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13256 }
13257 
vkGetPhysicalDeviceExternalSemaphoreProperties(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalSemaphoreInfo * pExternalSemaphoreInfo,VkExternalSemaphoreProperties * pExternalSemaphoreProperties,uint32_t doLock)13258 void VkEncoder::vkGetPhysicalDeviceExternalSemaphoreProperties(
13259     VkPhysicalDevice physicalDevice,
13260     const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
13261     VkExternalSemaphoreProperties* pExternalSemaphoreProperties, uint32_t doLock) {
13262     (void)doLock;
13263     bool queueSubmitWithCommandsEnabled =
13264         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13265     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13266     auto stream = mImpl->stream();
13267     auto pool = mImpl->pool();
13268     VkPhysicalDevice local_physicalDevice;
13269     VkPhysicalDeviceExternalSemaphoreInfo* local_pExternalSemaphoreInfo;
13270     local_physicalDevice = physicalDevice;
13271     local_pExternalSemaphoreInfo = nullptr;
13272     if (pExternalSemaphoreInfo) {
13273         local_pExternalSemaphoreInfo = (VkPhysicalDeviceExternalSemaphoreInfo*)pool->alloc(
13274             sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
13275         deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(
13276             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalSemaphoreInfo,
13277             (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
13278     }
13279     if (local_pExternalSemaphoreInfo) {
13280         transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo(
13281             sResourceTracker,
13282             (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
13283     }
13284     size_t count = 0;
13285     size_t* countPtr = &count;
13286     {
13287         uint64_t cgen_var_0;
13288         *countPtr += 1 * 8;
13289         count_VkPhysicalDeviceExternalSemaphoreInfo(
13290             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13291             (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), countPtr);
13292         count_VkExternalSemaphoreProperties(
13293             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13294             (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), countPtr);
13295     }
13296     uint32_t packetSize_vkGetPhysicalDeviceExternalSemaphoreProperties =
13297         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
13298     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalSemaphoreProperties);
13299     uint8_t* packetBeginPtr = streamPtr;
13300     uint8_t** streamPtrPtr = &streamPtr;
13301     uint32_t opcode_vkGetPhysicalDeviceExternalSemaphoreProperties =
13302         OP_vkGetPhysicalDeviceExternalSemaphoreProperties;
13303     uint32_t seqno;
13304     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
13305     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalSemaphoreProperties, sizeof(uint32_t));
13306     streamPtr += sizeof(uint32_t);
13307     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalSemaphoreProperties, sizeof(uint32_t));
13308     streamPtr += sizeof(uint32_t);
13309     if (queueSubmitWithCommandsEnabled) {
13310         memcpy(streamPtr, &seqno, sizeof(uint32_t));
13311         streamPtr += sizeof(uint32_t);
13312     }
13313     uint64_t cgen_var_0;
13314     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
13315     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13316     *streamPtrPtr += 1 * 8;
13317     reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
13318         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13319         (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), streamPtrPtr);
13320     reservedmarshal_VkExternalSemaphoreProperties(
13321         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13322         (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), streamPtrPtr);
13323     unmarshal_VkExternalSemaphoreProperties(
13324         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13325         (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
13326     if (pExternalSemaphoreProperties) {
13327         transform_fromhost_VkExternalSemaphoreProperties(
13328             sResourceTracker, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
13329     }
13330     sResourceTracker->on_vkGetPhysicalDeviceExternalSemaphoreProperties(
13331         this, physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
13332     ++encodeCount;
13333     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13334         pool->freeAll();
13335         stream->clearPool();
13336     }
13337     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13338 }
13339 
vkGetDescriptorSetLayoutSupport(VkDevice device,const VkDescriptorSetLayoutCreateInfo * pCreateInfo,VkDescriptorSetLayoutSupport * pSupport,uint32_t doLock)13340 void VkEncoder::vkGetDescriptorSetLayoutSupport(VkDevice device,
13341                                                 const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
13342                                                 VkDescriptorSetLayoutSupport* pSupport,
13343                                                 uint32_t doLock) {
13344     (void)doLock;
13345     bool queueSubmitWithCommandsEnabled =
13346         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13347     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13348     auto stream = mImpl->stream();
13349     auto pool = mImpl->pool();
13350     VkDevice local_device;
13351     VkDescriptorSetLayoutCreateInfo* local_pCreateInfo;
13352     local_device = device;
13353     local_pCreateInfo = nullptr;
13354     if (pCreateInfo) {
13355         local_pCreateInfo = (VkDescriptorSetLayoutCreateInfo*)pool->alloc(
13356             sizeof(const VkDescriptorSetLayoutCreateInfo));
13357         deepcopy_VkDescriptorSetLayoutCreateInfo(
13358             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
13359             (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
13360     }
13361     if (local_pCreateInfo) {
13362         transform_tohost_VkDescriptorSetLayoutCreateInfo(
13363             sResourceTracker, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
13364     }
13365     size_t count = 0;
13366     size_t* countPtr = &count;
13367     {
13368         uint64_t cgen_var_0;
13369         *countPtr += 1 * 8;
13370         count_VkDescriptorSetLayoutCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13371                                               (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo),
13372                                               countPtr);
13373         count_VkDescriptorSetLayoutSupport(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13374                                            (VkDescriptorSetLayoutSupport*)(pSupport), countPtr);
13375     }
13376     uint32_t packetSize_vkGetDescriptorSetLayoutSupport =
13377         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
13378     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDescriptorSetLayoutSupport);
13379     uint8_t* packetBeginPtr = streamPtr;
13380     uint8_t** streamPtrPtr = &streamPtr;
13381     uint32_t opcode_vkGetDescriptorSetLayoutSupport = OP_vkGetDescriptorSetLayoutSupport;
13382     uint32_t seqno;
13383     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
13384     memcpy(streamPtr, &opcode_vkGetDescriptorSetLayoutSupport, sizeof(uint32_t));
13385     streamPtr += sizeof(uint32_t);
13386     memcpy(streamPtr, &packetSize_vkGetDescriptorSetLayoutSupport, sizeof(uint32_t));
13387     streamPtr += sizeof(uint32_t);
13388     if (queueSubmitWithCommandsEnabled) {
13389         memcpy(streamPtr, &seqno, sizeof(uint32_t));
13390         streamPtr += sizeof(uint32_t);
13391     }
13392     uint64_t cgen_var_0;
13393     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
13394     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13395     *streamPtrPtr += 1 * 8;
13396     reservedmarshal_VkDescriptorSetLayoutCreateInfo(
13397         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo),
13398         streamPtrPtr);
13399     reservedmarshal_VkDescriptorSetLayoutSupport(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13400                                                  (VkDescriptorSetLayoutSupport*)(pSupport),
13401                                                  streamPtrPtr);
13402     unmarshal_VkDescriptorSetLayoutSupport(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13403                                            (VkDescriptorSetLayoutSupport*)(pSupport));
13404     if (pSupport) {
13405         transform_fromhost_VkDescriptorSetLayoutSupport(sResourceTracker,
13406                                                         (VkDescriptorSetLayoutSupport*)(pSupport));
13407     }
13408     ++encodeCount;
13409     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13410         pool->freeAll();
13411         stream->clearPool();
13412     }
13413     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13414 }
13415 
13416 #endif
13417 #ifdef VK_VERSION_1_2
vkCmdDrawIndirectCount(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkBuffer countBuffer,VkDeviceSize countBufferOffset,uint32_t maxDrawCount,uint32_t stride,uint32_t doLock)13418 void VkEncoder::vkCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
13419                                        VkDeviceSize offset, VkBuffer countBuffer,
13420                                        VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
13421                                        uint32_t stride, uint32_t doLock) {
13422     (void)doLock;
13423     bool queueSubmitWithCommandsEnabled =
13424         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13425     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13426     auto stream = mImpl->stream();
13427     auto pool = mImpl->pool();
13428     VkCommandBuffer local_commandBuffer;
13429     VkBuffer local_buffer;
13430     VkDeviceSize local_offset;
13431     VkBuffer local_countBuffer;
13432     VkDeviceSize local_countBufferOffset;
13433     uint32_t local_maxDrawCount;
13434     uint32_t local_stride;
13435     local_commandBuffer = commandBuffer;
13436     local_buffer = buffer;
13437     local_offset = offset;
13438     local_countBuffer = countBuffer;
13439     local_countBufferOffset = countBufferOffset;
13440     local_maxDrawCount = maxDrawCount;
13441     local_stride = stride;
13442     size_t count = 0;
13443     size_t* countPtr = &count;
13444     {
13445         uint64_t cgen_var_0;
13446         *countPtr += 1 * 8;
13447         uint64_t cgen_var_1;
13448         *countPtr += 1 * 8;
13449         *countPtr += sizeof(VkDeviceSize);
13450         uint64_t cgen_var_2;
13451         *countPtr += 1 * 8;
13452         *countPtr += sizeof(VkDeviceSize);
13453         *countPtr += sizeof(uint32_t);
13454         *countPtr += sizeof(uint32_t);
13455     }
13456     uint32_t packetSize_vkCmdDrawIndirectCount = 4 + 4 + count;
13457     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDrawIndirectCount -= 8;
13458     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndirectCount);
13459     uint8_t* packetBeginPtr = streamPtr;
13460     uint8_t** streamPtrPtr = &streamPtr;
13461     uint32_t opcode_vkCmdDrawIndirectCount = OP_vkCmdDrawIndirectCount;
13462     memcpy(streamPtr, &opcode_vkCmdDrawIndirectCount, sizeof(uint32_t));
13463     streamPtr += sizeof(uint32_t);
13464     memcpy(streamPtr, &packetSize_vkCmdDrawIndirectCount, sizeof(uint32_t));
13465     streamPtr += sizeof(uint32_t);
13466     if (!queueSubmitWithCommandsEnabled) {
13467         uint64_t cgen_var_0;
13468         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
13469         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13470         *streamPtrPtr += 1 * 8;
13471     }
13472     uint64_t cgen_var_0;
13473     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_buffer));
13474     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13475     *streamPtrPtr += 1 * 8;
13476     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
13477     *streamPtrPtr += sizeof(VkDeviceSize);
13478     uint64_t cgen_var_1;
13479     *&cgen_var_1 = get_host_u64_VkBuffer((*&local_countBuffer));
13480     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
13481     *streamPtrPtr += 1 * 8;
13482     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
13483     *streamPtrPtr += sizeof(VkDeviceSize);
13484     memcpy(*streamPtrPtr, (uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
13485     *streamPtrPtr += sizeof(uint32_t);
13486     memcpy(*streamPtrPtr, (uint32_t*)&local_stride, sizeof(uint32_t));
13487     *streamPtrPtr += sizeof(uint32_t);
13488     ++encodeCount;
13489     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13490         pool->freeAll();
13491         stream->clearPool();
13492     }
13493     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13494 }
13495 
vkCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkBuffer countBuffer,VkDeviceSize countBufferOffset,uint32_t maxDrawCount,uint32_t stride,uint32_t doLock)13496 void VkEncoder::vkCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
13497                                               VkDeviceSize offset, VkBuffer countBuffer,
13498                                               VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
13499                                               uint32_t stride, uint32_t doLock) {
13500     (void)doLock;
13501     bool queueSubmitWithCommandsEnabled =
13502         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13503     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13504     auto stream = mImpl->stream();
13505     auto pool = mImpl->pool();
13506     VkCommandBuffer local_commandBuffer;
13507     VkBuffer local_buffer;
13508     VkDeviceSize local_offset;
13509     VkBuffer local_countBuffer;
13510     VkDeviceSize local_countBufferOffset;
13511     uint32_t local_maxDrawCount;
13512     uint32_t local_stride;
13513     local_commandBuffer = commandBuffer;
13514     local_buffer = buffer;
13515     local_offset = offset;
13516     local_countBuffer = countBuffer;
13517     local_countBufferOffset = countBufferOffset;
13518     local_maxDrawCount = maxDrawCount;
13519     local_stride = stride;
13520     size_t count = 0;
13521     size_t* countPtr = &count;
13522     {
13523         uint64_t cgen_var_0;
13524         *countPtr += 1 * 8;
13525         uint64_t cgen_var_1;
13526         *countPtr += 1 * 8;
13527         *countPtr += sizeof(VkDeviceSize);
13528         uint64_t cgen_var_2;
13529         *countPtr += 1 * 8;
13530         *countPtr += sizeof(VkDeviceSize);
13531         *countPtr += sizeof(uint32_t);
13532         *countPtr += sizeof(uint32_t);
13533     }
13534     uint32_t packetSize_vkCmdDrawIndexedIndirectCount = 4 + 4 + count;
13535     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDrawIndexedIndirectCount -= 8;
13536     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndexedIndirectCount);
13537     uint8_t* packetBeginPtr = streamPtr;
13538     uint8_t** streamPtrPtr = &streamPtr;
13539     uint32_t opcode_vkCmdDrawIndexedIndirectCount = OP_vkCmdDrawIndexedIndirectCount;
13540     memcpy(streamPtr, &opcode_vkCmdDrawIndexedIndirectCount, sizeof(uint32_t));
13541     streamPtr += sizeof(uint32_t);
13542     memcpy(streamPtr, &packetSize_vkCmdDrawIndexedIndirectCount, sizeof(uint32_t));
13543     streamPtr += sizeof(uint32_t);
13544     if (!queueSubmitWithCommandsEnabled) {
13545         uint64_t cgen_var_0;
13546         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
13547         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13548         *streamPtrPtr += 1 * 8;
13549     }
13550     uint64_t cgen_var_0;
13551     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_buffer));
13552     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13553     *streamPtrPtr += 1 * 8;
13554     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
13555     *streamPtrPtr += sizeof(VkDeviceSize);
13556     uint64_t cgen_var_1;
13557     *&cgen_var_1 = get_host_u64_VkBuffer((*&local_countBuffer));
13558     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
13559     *streamPtrPtr += 1 * 8;
13560     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_countBufferOffset, sizeof(VkDeviceSize));
13561     *streamPtrPtr += sizeof(VkDeviceSize);
13562     memcpy(*streamPtrPtr, (uint32_t*)&local_maxDrawCount, sizeof(uint32_t));
13563     *streamPtrPtr += sizeof(uint32_t);
13564     memcpy(*streamPtrPtr, (uint32_t*)&local_stride, sizeof(uint32_t));
13565     *streamPtrPtr += sizeof(uint32_t);
13566     ++encodeCount;
13567     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13568         pool->freeAll();
13569         stream->clearPool();
13570     }
13571     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13572 }
13573 
vkCreateRenderPass2(VkDevice device,const VkRenderPassCreateInfo2 * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkRenderPass * pRenderPass,uint32_t doLock)13574 VkResult VkEncoder::vkCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo,
13575                                         const VkAllocationCallbacks* pAllocator,
13576                                         VkRenderPass* pRenderPass, uint32_t doLock) {
13577     (void)doLock;
13578     bool queueSubmitWithCommandsEnabled =
13579         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13580     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13581     auto stream = mImpl->stream();
13582     auto pool = mImpl->pool();
13583     VkDevice local_device;
13584     VkRenderPassCreateInfo2* local_pCreateInfo;
13585     VkAllocationCallbacks* local_pAllocator;
13586     local_device = device;
13587     local_pCreateInfo = nullptr;
13588     if (pCreateInfo) {
13589         local_pCreateInfo =
13590             (VkRenderPassCreateInfo2*)pool->alloc(sizeof(const VkRenderPassCreateInfo2));
13591         deepcopy_VkRenderPassCreateInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
13592                                          (VkRenderPassCreateInfo2*)(local_pCreateInfo));
13593     }
13594     local_pAllocator = nullptr;
13595     if (pAllocator) {
13596         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
13597         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
13598                                        (VkAllocationCallbacks*)(local_pAllocator));
13599     }
13600     local_pAllocator = nullptr;
13601     if (local_pCreateInfo) {
13602         transform_tohost_VkRenderPassCreateInfo2(sResourceTracker,
13603                                                  (VkRenderPassCreateInfo2*)(local_pCreateInfo));
13604     }
13605     if (local_pAllocator) {
13606         transform_tohost_VkAllocationCallbacks(sResourceTracker,
13607                                                (VkAllocationCallbacks*)(local_pAllocator));
13608     }
13609     size_t count = 0;
13610     size_t* countPtr = &count;
13611     {
13612         uint64_t cgen_var_0;
13613         *countPtr += 1 * 8;
13614         count_VkRenderPassCreateInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13615                                       (VkRenderPassCreateInfo2*)(local_pCreateInfo), countPtr);
13616         // WARNING PTR CHECK
13617         *countPtr += 8;
13618         if (local_pAllocator) {
13619             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13620                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
13621         }
13622         uint64_t cgen_var_1;
13623         *countPtr += 8;
13624     }
13625     uint32_t packetSize_vkCreateRenderPass2 =
13626         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
13627     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateRenderPass2);
13628     uint8_t* packetBeginPtr = streamPtr;
13629     uint8_t** streamPtrPtr = &streamPtr;
13630     uint32_t opcode_vkCreateRenderPass2 = OP_vkCreateRenderPass2;
13631     uint32_t seqno;
13632     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
13633     memcpy(streamPtr, &opcode_vkCreateRenderPass2, sizeof(uint32_t));
13634     streamPtr += sizeof(uint32_t);
13635     memcpy(streamPtr, &packetSize_vkCreateRenderPass2, sizeof(uint32_t));
13636     streamPtr += sizeof(uint32_t);
13637     if (queueSubmitWithCommandsEnabled) {
13638         memcpy(streamPtr, &seqno, sizeof(uint32_t));
13639         streamPtr += sizeof(uint32_t);
13640     }
13641     uint64_t cgen_var_0;
13642     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
13643     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13644     *streamPtrPtr += 1 * 8;
13645     reservedmarshal_VkRenderPassCreateInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13646                                             (VkRenderPassCreateInfo2*)(local_pCreateInfo),
13647                                             streamPtrPtr);
13648     // WARNING PTR CHECK
13649     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
13650     memcpy((*streamPtrPtr), &cgen_var_1, 8);
13651     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
13652     *streamPtrPtr += 8;
13653     if (local_pAllocator) {
13654         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13655                                               (VkAllocationCallbacks*)(local_pAllocator),
13656                                               streamPtrPtr);
13657     }
13658     /* is handle, possibly out */;
13659     uint64_t cgen_var_2;
13660     *&cgen_var_2 = (uint64_t)((*pRenderPass));
13661     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
13662     *streamPtrPtr += 8;
13663     /* is handle, possibly out */;
13664     stream->setHandleMapping(sResourceTracker->createMapping());
13665     uint64_t cgen_var_3;
13666     stream->read((uint64_t*)&cgen_var_3, 8);
13667     stream->handleMapping()->mapHandles_u64_VkRenderPass(&cgen_var_3, (VkRenderPass*)pRenderPass,
13668                                                          1);
13669     stream->unsetHandleMapping();
13670     VkResult vkCreateRenderPass2_VkResult_return = (VkResult)0;
13671     stream->read(&vkCreateRenderPass2_VkResult_return, sizeof(VkResult));
13672     ++encodeCount;
13673     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13674         pool->freeAll();
13675         stream->clearPool();
13676     }
13677     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13678     return vkCreateRenderPass2_VkResult_return;
13679 }
13680 
vkCmdBeginRenderPass2(VkCommandBuffer commandBuffer,const VkRenderPassBeginInfo * pRenderPassBegin,const VkSubpassBeginInfo * pSubpassBeginInfo,uint32_t doLock)13681 void VkEncoder::vkCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
13682                                       const VkRenderPassBeginInfo* pRenderPassBegin,
13683                                       const VkSubpassBeginInfo* pSubpassBeginInfo,
13684                                       uint32_t doLock) {
13685     (void)doLock;
13686     bool queueSubmitWithCommandsEnabled =
13687         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13688     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13689     auto stream = mImpl->stream();
13690     auto pool = mImpl->pool();
13691     VkCommandBuffer local_commandBuffer;
13692     VkRenderPassBeginInfo* local_pRenderPassBegin;
13693     VkSubpassBeginInfo* local_pSubpassBeginInfo;
13694     local_commandBuffer = commandBuffer;
13695     local_pRenderPassBegin = nullptr;
13696     if (pRenderPassBegin) {
13697         local_pRenderPassBegin =
13698             (VkRenderPassBeginInfo*)pool->alloc(sizeof(const VkRenderPassBeginInfo));
13699         deepcopy_VkRenderPassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRenderPassBegin,
13700                                        (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
13701     }
13702     local_pSubpassBeginInfo = nullptr;
13703     if (pSubpassBeginInfo) {
13704         local_pSubpassBeginInfo =
13705             (VkSubpassBeginInfo*)pool->alloc(sizeof(const VkSubpassBeginInfo));
13706         deepcopy_VkSubpassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassBeginInfo,
13707                                     (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
13708     }
13709     if (local_pRenderPassBegin) {
13710         transform_tohost_VkRenderPassBeginInfo(sResourceTracker,
13711                                                (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
13712     }
13713     if (local_pSubpassBeginInfo) {
13714         transform_tohost_VkSubpassBeginInfo(sResourceTracker,
13715                                             (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
13716     }
13717     size_t count = 0;
13718     size_t* countPtr = &count;
13719     {
13720         uint64_t cgen_var_0;
13721         *countPtr += 1 * 8;
13722         count_VkRenderPassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13723                                     (VkRenderPassBeginInfo*)(local_pRenderPassBegin), countPtr);
13724         count_VkSubpassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13725                                  (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
13726     }
13727     uint32_t packetSize_vkCmdBeginRenderPass2 = 4 + 4 + count;
13728     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginRenderPass2 -= 8;
13729     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginRenderPass2);
13730     uint8_t* packetBeginPtr = streamPtr;
13731     uint8_t** streamPtrPtr = &streamPtr;
13732     uint32_t opcode_vkCmdBeginRenderPass2 = OP_vkCmdBeginRenderPass2;
13733     memcpy(streamPtr, &opcode_vkCmdBeginRenderPass2, sizeof(uint32_t));
13734     streamPtr += sizeof(uint32_t);
13735     memcpy(streamPtr, &packetSize_vkCmdBeginRenderPass2, sizeof(uint32_t));
13736     streamPtr += sizeof(uint32_t);
13737     if (!queueSubmitWithCommandsEnabled) {
13738         uint64_t cgen_var_0;
13739         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
13740         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13741         *streamPtrPtr += 1 * 8;
13742     }
13743     reservedmarshal_VkRenderPassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13744                                           (VkRenderPassBeginInfo*)(local_pRenderPassBegin),
13745                                           streamPtrPtr);
13746     reservedmarshal_VkSubpassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13747                                        (VkSubpassBeginInfo*)(local_pSubpassBeginInfo),
13748                                        streamPtrPtr);
13749     ++encodeCount;
13750     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13751         pool->freeAll();
13752         stream->clearPool();
13753     }
13754     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13755 }
13756 
vkCmdNextSubpass2(VkCommandBuffer commandBuffer,const VkSubpassBeginInfo * pSubpassBeginInfo,const VkSubpassEndInfo * pSubpassEndInfo,uint32_t doLock)13757 void VkEncoder::vkCmdNextSubpass2(VkCommandBuffer commandBuffer,
13758                                   const VkSubpassBeginInfo* pSubpassBeginInfo,
13759                                   const VkSubpassEndInfo* pSubpassEndInfo, uint32_t doLock) {
13760     (void)doLock;
13761     bool queueSubmitWithCommandsEnabled =
13762         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13763     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13764     auto stream = mImpl->stream();
13765     auto pool = mImpl->pool();
13766     VkCommandBuffer local_commandBuffer;
13767     VkSubpassBeginInfo* local_pSubpassBeginInfo;
13768     VkSubpassEndInfo* local_pSubpassEndInfo;
13769     local_commandBuffer = commandBuffer;
13770     local_pSubpassBeginInfo = nullptr;
13771     if (pSubpassBeginInfo) {
13772         local_pSubpassBeginInfo =
13773             (VkSubpassBeginInfo*)pool->alloc(sizeof(const VkSubpassBeginInfo));
13774         deepcopy_VkSubpassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassBeginInfo,
13775                                     (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
13776     }
13777     local_pSubpassEndInfo = nullptr;
13778     if (pSubpassEndInfo) {
13779         local_pSubpassEndInfo = (VkSubpassEndInfo*)pool->alloc(sizeof(const VkSubpassEndInfo));
13780         deepcopy_VkSubpassEndInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassEndInfo,
13781                                   (VkSubpassEndInfo*)(local_pSubpassEndInfo));
13782     }
13783     if (local_pSubpassBeginInfo) {
13784         transform_tohost_VkSubpassBeginInfo(sResourceTracker,
13785                                             (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
13786     }
13787     if (local_pSubpassEndInfo) {
13788         transform_tohost_VkSubpassEndInfo(sResourceTracker,
13789                                           (VkSubpassEndInfo*)(local_pSubpassEndInfo));
13790     }
13791     size_t count = 0;
13792     size_t* countPtr = &count;
13793     {
13794         uint64_t cgen_var_0;
13795         *countPtr += 1 * 8;
13796         count_VkSubpassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13797                                  (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
13798         count_VkSubpassEndInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13799                                (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
13800     }
13801     uint32_t packetSize_vkCmdNextSubpass2 = 4 + 4 + count;
13802     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdNextSubpass2 -= 8;
13803     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdNextSubpass2);
13804     uint8_t* packetBeginPtr = streamPtr;
13805     uint8_t** streamPtrPtr = &streamPtr;
13806     uint32_t opcode_vkCmdNextSubpass2 = OP_vkCmdNextSubpass2;
13807     memcpy(streamPtr, &opcode_vkCmdNextSubpass2, sizeof(uint32_t));
13808     streamPtr += sizeof(uint32_t);
13809     memcpy(streamPtr, &packetSize_vkCmdNextSubpass2, sizeof(uint32_t));
13810     streamPtr += sizeof(uint32_t);
13811     if (!queueSubmitWithCommandsEnabled) {
13812         uint64_t cgen_var_0;
13813         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
13814         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13815         *streamPtrPtr += 1 * 8;
13816     }
13817     reservedmarshal_VkSubpassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13818                                        (VkSubpassBeginInfo*)(local_pSubpassBeginInfo),
13819                                        streamPtrPtr);
13820     reservedmarshal_VkSubpassEndInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13821                                      (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
13822     ++encodeCount;
13823     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13824         pool->freeAll();
13825         stream->clearPool();
13826     }
13827     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13828 }
13829 
vkCmdEndRenderPass2(VkCommandBuffer commandBuffer,const VkSubpassEndInfo * pSubpassEndInfo,uint32_t doLock)13830 void VkEncoder::vkCmdEndRenderPass2(VkCommandBuffer commandBuffer,
13831                                     const VkSubpassEndInfo* pSubpassEndInfo, uint32_t doLock) {
13832     (void)doLock;
13833     bool queueSubmitWithCommandsEnabled =
13834         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13835     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13836     auto stream = mImpl->stream();
13837     auto pool = mImpl->pool();
13838     VkCommandBuffer local_commandBuffer;
13839     VkSubpassEndInfo* local_pSubpassEndInfo;
13840     local_commandBuffer = commandBuffer;
13841     local_pSubpassEndInfo = nullptr;
13842     if (pSubpassEndInfo) {
13843         local_pSubpassEndInfo = (VkSubpassEndInfo*)pool->alloc(sizeof(const VkSubpassEndInfo));
13844         deepcopy_VkSubpassEndInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassEndInfo,
13845                                   (VkSubpassEndInfo*)(local_pSubpassEndInfo));
13846     }
13847     if (local_pSubpassEndInfo) {
13848         transform_tohost_VkSubpassEndInfo(sResourceTracker,
13849                                           (VkSubpassEndInfo*)(local_pSubpassEndInfo));
13850     }
13851     size_t count = 0;
13852     size_t* countPtr = &count;
13853     {
13854         uint64_t cgen_var_0;
13855         *countPtr += 1 * 8;
13856         count_VkSubpassEndInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
13857                                (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
13858     }
13859     uint32_t packetSize_vkCmdEndRenderPass2 = 4 + 4 + count;
13860     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdEndRenderPass2 -= 8;
13861     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndRenderPass2);
13862     uint8_t* packetBeginPtr = streamPtr;
13863     uint8_t** streamPtrPtr = &streamPtr;
13864     uint32_t opcode_vkCmdEndRenderPass2 = OP_vkCmdEndRenderPass2;
13865     memcpy(streamPtr, &opcode_vkCmdEndRenderPass2, sizeof(uint32_t));
13866     streamPtr += sizeof(uint32_t);
13867     memcpy(streamPtr, &packetSize_vkCmdEndRenderPass2, sizeof(uint32_t));
13868     streamPtr += sizeof(uint32_t);
13869     if (!queueSubmitWithCommandsEnabled) {
13870         uint64_t cgen_var_0;
13871         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
13872         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13873         *streamPtrPtr += 1 * 8;
13874     }
13875     reservedmarshal_VkSubpassEndInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
13876                                      (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
13877     ++encodeCount;
13878     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13879         pool->freeAll();
13880         stream->clearPool();
13881     }
13882     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13883 }
13884 
vkResetQueryPool(VkDevice device,VkQueryPool queryPool,uint32_t firstQuery,uint32_t queryCount,uint32_t doLock)13885 void VkEncoder::vkResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
13886                                  uint32_t queryCount, uint32_t doLock) {
13887     (void)doLock;
13888     bool queueSubmitWithCommandsEnabled =
13889         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13890     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13891     auto stream = mImpl->stream();
13892     auto pool = mImpl->pool();
13893     VkDevice local_device;
13894     VkQueryPool local_queryPool;
13895     uint32_t local_firstQuery;
13896     uint32_t local_queryCount;
13897     local_device = device;
13898     local_queryPool = queryPool;
13899     local_firstQuery = firstQuery;
13900     local_queryCount = queryCount;
13901     size_t count = 0;
13902     size_t* countPtr = &count;
13903     {
13904         uint64_t cgen_var_0;
13905         *countPtr += 1 * 8;
13906         uint64_t cgen_var_1;
13907         *countPtr += 1 * 8;
13908         *countPtr += sizeof(uint32_t);
13909         *countPtr += sizeof(uint32_t);
13910     }
13911     uint32_t packetSize_vkResetQueryPool = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
13912     uint8_t* streamPtr = stream->reserve(packetSize_vkResetQueryPool);
13913     uint8_t* packetBeginPtr = streamPtr;
13914     uint8_t** streamPtrPtr = &streamPtr;
13915     uint32_t opcode_vkResetQueryPool = OP_vkResetQueryPool;
13916     uint32_t seqno;
13917     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
13918     memcpy(streamPtr, &opcode_vkResetQueryPool, sizeof(uint32_t));
13919     streamPtr += sizeof(uint32_t);
13920     memcpy(streamPtr, &packetSize_vkResetQueryPool, sizeof(uint32_t));
13921     streamPtr += sizeof(uint32_t);
13922     if (queueSubmitWithCommandsEnabled) {
13923         memcpy(streamPtr, &seqno, sizeof(uint32_t));
13924         streamPtr += sizeof(uint32_t);
13925     }
13926     uint64_t cgen_var_0;
13927     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
13928     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13929     *streamPtrPtr += 1 * 8;
13930     uint64_t cgen_var_1;
13931     *&cgen_var_1 = get_host_u64_VkQueryPool((*&local_queryPool));
13932     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
13933     *streamPtrPtr += 1 * 8;
13934     memcpy(*streamPtrPtr, (uint32_t*)&local_firstQuery, sizeof(uint32_t));
13935     *streamPtrPtr += sizeof(uint32_t);
13936     memcpy(*streamPtrPtr, (uint32_t*)&local_queryCount, sizeof(uint32_t));
13937     *streamPtrPtr += sizeof(uint32_t);
13938     stream->flush();
13939     ++encodeCount;
13940     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13941         pool->freeAll();
13942         stream->clearPool();
13943     }
13944     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
13945 }
13946 
vkGetSemaphoreCounterValue(VkDevice device,VkSemaphore semaphore,uint64_t * pValue,uint32_t doLock)13947 VkResult VkEncoder::vkGetSemaphoreCounterValue(VkDevice device, VkSemaphore semaphore,
13948                                                uint64_t* pValue, uint32_t doLock) {
13949     (void)doLock;
13950     bool queueSubmitWithCommandsEnabled =
13951         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
13952     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
13953     auto stream = mImpl->stream();
13954     auto pool = mImpl->pool();
13955     VkDevice local_device;
13956     VkSemaphore local_semaphore;
13957     local_device = device;
13958     local_semaphore = semaphore;
13959     size_t count = 0;
13960     size_t* countPtr = &count;
13961     {
13962         uint64_t cgen_var_0;
13963         *countPtr += 1 * 8;
13964         uint64_t cgen_var_1;
13965         *countPtr += 1 * 8;
13966         *countPtr += sizeof(uint64_t);
13967     }
13968     uint32_t packetSize_vkGetSemaphoreCounterValue =
13969         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
13970     uint8_t* streamPtr = stream->reserve(packetSize_vkGetSemaphoreCounterValue);
13971     uint8_t* packetBeginPtr = streamPtr;
13972     uint8_t** streamPtrPtr = &streamPtr;
13973     uint32_t opcode_vkGetSemaphoreCounterValue = OP_vkGetSemaphoreCounterValue;
13974     uint32_t seqno;
13975     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
13976     memcpy(streamPtr, &opcode_vkGetSemaphoreCounterValue, sizeof(uint32_t));
13977     streamPtr += sizeof(uint32_t);
13978     memcpy(streamPtr, &packetSize_vkGetSemaphoreCounterValue, sizeof(uint32_t));
13979     streamPtr += sizeof(uint32_t);
13980     if (queueSubmitWithCommandsEnabled) {
13981         memcpy(streamPtr, &seqno, sizeof(uint32_t));
13982         streamPtr += sizeof(uint32_t);
13983     }
13984     uint64_t cgen_var_0;
13985     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
13986     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
13987     *streamPtrPtr += 1 * 8;
13988     uint64_t cgen_var_1;
13989     *&cgen_var_1 = get_host_u64_VkSemaphore((*&local_semaphore));
13990     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
13991     *streamPtrPtr += 1 * 8;
13992     memcpy(*streamPtrPtr, (uint64_t*)pValue, sizeof(uint64_t));
13993     *streamPtrPtr += sizeof(uint64_t);
13994     stream->read((uint64_t*)pValue, sizeof(uint64_t));
13995     VkResult vkGetSemaphoreCounterValue_VkResult_return = (VkResult)0;
13996     stream->read(&vkGetSemaphoreCounterValue_VkResult_return, sizeof(VkResult));
13997     ++encodeCount;
13998     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
13999         pool->freeAll();
14000         stream->clearPool();
14001     }
14002     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14003     return vkGetSemaphoreCounterValue_VkResult_return;
14004 }
14005 
vkWaitSemaphores(VkDevice device,const VkSemaphoreWaitInfo * pWaitInfo,uint64_t timeout,uint32_t doLock)14006 VkResult VkEncoder::vkWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo,
14007                                      uint64_t timeout, uint32_t doLock) {
14008     (void)doLock;
14009     bool queueSubmitWithCommandsEnabled =
14010         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14011     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14012     auto stream = mImpl->stream();
14013     auto pool = mImpl->pool();
14014     VkDevice local_device;
14015     VkSemaphoreWaitInfo* local_pWaitInfo;
14016     uint64_t local_timeout;
14017     local_device = device;
14018     local_pWaitInfo = nullptr;
14019     if (pWaitInfo) {
14020         local_pWaitInfo = (VkSemaphoreWaitInfo*)pool->alloc(sizeof(const VkSemaphoreWaitInfo));
14021         deepcopy_VkSemaphoreWaitInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pWaitInfo,
14022                                      (VkSemaphoreWaitInfo*)(local_pWaitInfo));
14023     }
14024     local_timeout = timeout;
14025     if (local_pWaitInfo) {
14026         transform_tohost_VkSemaphoreWaitInfo(sResourceTracker,
14027                                              (VkSemaphoreWaitInfo*)(local_pWaitInfo));
14028     }
14029     size_t count = 0;
14030     size_t* countPtr = &count;
14031     {
14032         uint64_t cgen_var_0;
14033         *countPtr += 1 * 8;
14034         count_VkSemaphoreWaitInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
14035                                   (VkSemaphoreWaitInfo*)(local_pWaitInfo), countPtr);
14036         *countPtr += sizeof(uint64_t);
14037     }
14038     uint32_t packetSize_vkWaitSemaphores = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
14039     uint8_t* streamPtr = stream->reserve(packetSize_vkWaitSemaphores);
14040     uint8_t* packetBeginPtr = streamPtr;
14041     uint8_t** streamPtrPtr = &streamPtr;
14042     uint32_t opcode_vkWaitSemaphores = OP_vkWaitSemaphores;
14043     uint32_t seqno;
14044     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
14045     memcpy(streamPtr, &opcode_vkWaitSemaphores, sizeof(uint32_t));
14046     streamPtr += sizeof(uint32_t);
14047     memcpy(streamPtr, &packetSize_vkWaitSemaphores, sizeof(uint32_t));
14048     streamPtr += sizeof(uint32_t);
14049     if (queueSubmitWithCommandsEnabled) {
14050         memcpy(streamPtr, &seqno, sizeof(uint32_t));
14051         streamPtr += sizeof(uint32_t);
14052     }
14053     uint64_t cgen_var_0;
14054     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
14055     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14056     *streamPtrPtr += 1 * 8;
14057     reservedmarshal_VkSemaphoreWaitInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
14058                                         (VkSemaphoreWaitInfo*)(local_pWaitInfo), streamPtrPtr);
14059     memcpy(*streamPtrPtr, (uint64_t*)&local_timeout, sizeof(uint64_t));
14060     *streamPtrPtr += sizeof(uint64_t);
14061     VkResult vkWaitSemaphores_VkResult_return = (VkResult)0;
14062     stream->read(&vkWaitSemaphores_VkResult_return, sizeof(VkResult));
14063     ++encodeCount;
14064     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14065         pool->freeAll();
14066         stream->clearPool();
14067     }
14068     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14069     return vkWaitSemaphores_VkResult_return;
14070 }
14071 
vkSignalSemaphore(VkDevice device,const VkSemaphoreSignalInfo * pSignalInfo,uint32_t doLock)14072 VkResult VkEncoder::vkSignalSemaphore(VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo,
14073                                       uint32_t doLock) {
14074     (void)doLock;
14075     bool queueSubmitWithCommandsEnabled =
14076         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14077     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14078     auto stream = mImpl->stream();
14079     auto pool = mImpl->pool();
14080     VkDevice local_device;
14081     VkSemaphoreSignalInfo* local_pSignalInfo;
14082     local_device = device;
14083     local_pSignalInfo = nullptr;
14084     if (pSignalInfo) {
14085         local_pSignalInfo =
14086             (VkSemaphoreSignalInfo*)pool->alloc(sizeof(const VkSemaphoreSignalInfo));
14087         deepcopy_VkSemaphoreSignalInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSignalInfo,
14088                                        (VkSemaphoreSignalInfo*)(local_pSignalInfo));
14089     }
14090     if (local_pSignalInfo) {
14091         transform_tohost_VkSemaphoreSignalInfo(sResourceTracker,
14092                                                (VkSemaphoreSignalInfo*)(local_pSignalInfo));
14093     }
14094     size_t count = 0;
14095     size_t* countPtr = &count;
14096     {
14097         uint64_t cgen_var_0;
14098         *countPtr += 1 * 8;
14099         count_VkSemaphoreSignalInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
14100                                     (VkSemaphoreSignalInfo*)(local_pSignalInfo), countPtr);
14101     }
14102     uint32_t packetSize_vkSignalSemaphore =
14103         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
14104     uint8_t* streamPtr = stream->reserve(packetSize_vkSignalSemaphore);
14105     uint8_t* packetBeginPtr = streamPtr;
14106     uint8_t** streamPtrPtr = &streamPtr;
14107     uint32_t opcode_vkSignalSemaphore = OP_vkSignalSemaphore;
14108     uint32_t seqno;
14109     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
14110     memcpy(streamPtr, &opcode_vkSignalSemaphore, sizeof(uint32_t));
14111     streamPtr += sizeof(uint32_t);
14112     memcpy(streamPtr, &packetSize_vkSignalSemaphore, sizeof(uint32_t));
14113     streamPtr += sizeof(uint32_t);
14114     if (queueSubmitWithCommandsEnabled) {
14115         memcpy(streamPtr, &seqno, sizeof(uint32_t));
14116         streamPtr += sizeof(uint32_t);
14117     }
14118     uint64_t cgen_var_0;
14119     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
14120     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14121     *streamPtrPtr += 1 * 8;
14122     reservedmarshal_VkSemaphoreSignalInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
14123                                           (VkSemaphoreSignalInfo*)(local_pSignalInfo),
14124                                           streamPtrPtr);
14125     VkResult vkSignalSemaphore_VkResult_return = (VkResult)0;
14126     stream->read(&vkSignalSemaphore_VkResult_return, sizeof(VkResult));
14127     ++encodeCount;
14128     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14129         pool->freeAll();
14130         stream->clearPool();
14131     }
14132     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14133     return vkSignalSemaphore_VkResult_return;
14134 }
14135 
vkGetBufferDeviceAddress(VkDevice device,const VkBufferDeviceAddressInfo * pInfo,uint32_t doLock)14136 VkDeviceAddress VkEncoder::vkGetBufferDeviceAddress(VkDevice device,
14137                                                     const VkBufferDeviceAddressInfo* pInfo,
14138                                                     uint32_t doLock) {
14139     (void)doLock;
14140     bool queueSubmitWithCommandsEnabled =
14141         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14142     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14143     auto stream = mImpl->stream();
14144     auto pool = mImpl->pool();
14145     VkDevice local_device;
14146     VkBufferDeviceAddressInfo* local_pInfo;
14147     local_device = device;
14148     local_pInfo = nullptr;
14149     if (pInfo) {
14150         local_pInfo =
14151             (VkBufferDeviceAddressInfo*)pool->alloc(sizeof(const VkBufferDeviceAddressInfo));
14152         deepcopy_VkBufferDeviceAddressInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
14153                                            (VkBufferDeviceAddressInfo*)(local_pInfo));
14154     }
14155     if (local_pInfo) {
14156         transform_tohost_VkBufferDeviceAddressInfo(sResourceTracker,
14157                                                    (VkBufferDeviceAddressInfo*)(local_pInfo));
14158     }
14159     size_t count = 0;
14160     size_t* countPtr = &count;
14161     {
14162         uint64_t cgen_var_0;
14163         *countPtr += 1 * 8;
14164         count_VkBufferDeviceAddressInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
14165                                         (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
14166     }
14167     uint32_t packetSize_vkGetBufferDeviceAddress =
14168         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
14169     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferDeviceAddress);
14170     uint8_t* packetBeginPtr = streamPtr;
14171     uint8_t** streamPtrPtr = &streamPtr;
14172     uint32_t opcode_vkGetBufferDeviceAddress = OP_vkGetBufferDeviceAddress;
14173     uint32_t seqno;
14174     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
14175     memcpy(streamPtr, &opcode_vkGetBufferDeviceAddress, sizeof(uint32_t));
14176     streamPtr += sizeof(uint32_t);
14177     memcpy(streamPtr, &packetSize_vkGetBufferDeviceAddress, sizeof(uint32_t));
14178     streamPtr += sizeof(uint32_t);
14179     if (queueSubmitWithCommandsEnabled) {
14180         memcpy(streamPtr, &seqno, sizeof(uint32_t));
14181         streamPtr += sizeof(uint32_t);
14182     }
14183     uint64_t cgen_var_0;
14184     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
14185     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14186     *streamPtrPtr += 1 * 8;
14187     reservedmarshal_VkBufferDeviceAddressInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
14188                                               (VkBufferDeviceAddressInfo*)(local_pInfo),
14189                                               streamPtrPtr);
14190     VkDeviceAddress vkGetBufferDeviceAddress_VkDeviceAddress_return = (VkDeviceAddress)0;
14191     stream->read(&vkGetBufferDeviceAddress_VkDeviceAddress_return, sizeof(VkDeviceAddress));
14192     ++encodeCount;
14193     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14194         pool->freeAll();
14195         stream->clearPool();
14196     }
14197     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14198     return vkGetBufferDeviceAddress_VkDeviceAddress_return;
14199 }
14200 
vkGetBufferOpaqueCaptureAddress(VkDevice device,const VkBufferDeviceAddressInfo * pInfo,uint32_t doLock)14201 uint64_t VkEncoder::vkGetBufferOpaqueCaptureAddress(VkDevice device,
14202                                                     const VkBufferDeviceAddressInfo* pInfo,
14203                                                     uint32_t doLock) {
14204     (void)doLock;
14205     bool queueSubmitWithCommandsEnabled =
14206         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14207     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14208     auto stream = mImpl->stream();
14209     auto pool = mImpl->pool();
14210     VkDevice local_device;
14211     VkBufferDeviceAddressInfo* local_pInfo;
14212     local_device = device;
14213     local_pInfo = nullptr;
14214     if (pInfo) {
14215         local_pInfo =
14216             (VkBufferDeviceAddressInfo*)pool->alloc(sizeof(const VkBufferDeviceAddressInfo));
14217         deepcopy_VkBufferDeviceAddressInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
14218                                            (VkBufferDeviceAddressInfo*)(local_pInfo));
14219     }
14220     if (local_pInfo) {
14221         transform_tohost_VkBufferDeviceAddressInfo(sResourceTracker,
14222                                                    (VkBufferDeviceAddressInfo*)(local_pInfo));
14223     }
14224     size_t count = 0;
14225     size_t* countPtr = &count;
14226     {
14227         uint64_t cgen_var_0;
14228         *countPtr += 1 * 8;
14229         count_VkBufferDeviceAddressInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
14230                                         (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
14231     }
14232     uint32_t packetSize_vkGetBufferOpaqueCaptureAddress =
14233         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
14234     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferOpaqueCaptureAddress);
14235     uint8_t* packetBeginPtr = streamPtr;
14236     uint8_t** streamPtrPtr = &streamPtr;
14237     uint32_t opcode_vkGetBufferOpaqueCaptureAddress = OP_vkGetBufferOpaqueCaptureAddress;
14238     uint32_t seqno;
14239     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
14240     memcpy(streamPtr, &opcode_vkGetBufferOpaqueCaptureAddress, sizeof(uint32_t));
14241     streamPtr += sizeof(uint32_t);
14242     memcpy(streamPtr, &packetSize_vkGetBufferOpaqueCaptureAddress, sizeof(uint32_t));
14243     streamPtr += sizeof(uint32_t);
14244     if (queueSubmitWithCommandsEnabled) {
14245         memcpy(streamPtr, &seqno, sizeof(uint32_t));
14246         streamPtr += sizeof(uint32_t);
14247     }
14248     uint64_t cgen_var_0;
14249     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
14250     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14251     *streamPtrPtr += 1 * 8;
14252     reservedmarshal_VkBufferDeviceAddressInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
14253                                               (VkBufferDeviceAddressInfo*)(local_pInfo),
14254                                               streamPtrPtr);
14255     uint64_t vkGetBufferOpaqueCaptureAddress_uint64_t_return = (uint64_t)0;
14256     stream->read(&vkGetBufferOpaqueCaptureAddress_uint64_t_return, sizeof(uint64_t));
14257     ++encodeCount;
14258     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14259         pool->freeAll();
14260         stream->clearPool();
14261     }
14262     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14263     return vkGetBufferOpaqueCaptureAddress_uint64_t_return;
14264 }
14265 
vkGetDeviceMemoryOpaqueCaptureAddress(VkDevice device,const VkDeviceMemoryOpaqueCaptureAddressInfo * pInfo,uint32_t doLock)14266 uint64_t VkEncoder::vkGetDeviceMemoryOpaqueCaptureAddress(
14267     VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo, uint32_t doLock) {
14268     (void)doLock;
14269     bool queueSubmitWithCommandsEnabled =
14270         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14271     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14272     auto stream = mImpl->stream();
14273     auto pool = mImpl->pool();
14274     VkDevice local_device;
14275     VkDeviceMemoryOpaqueCaptureAddressInfo* local_pInfo;
14276     local_device = device;
14277     local_pInfo = nullptr;
14278     if (pInfo) {
14279         local_pInfo = (VkDeviceMemoryOpaqueCaptureAddressInfo*)pool->alloc(
14280             sizeof(const VkDeviceMemoryOpaqueCaptureAddressInfo));
14281         deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo(
14282             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
14283             (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo));
14284     }
14285     if (local_pInfo) {
14286         transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfo(
14287             sResourceTracker, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo));
14288     }
14289     size_t count = 0;
14290     size_t* countPtr = &count;
14291     {
14292         uint64_t cgen_var_0;
14293         *countPtr += 1 * 8;
14294         count_VkDeviceMemoryOpaqueCaptureAddressInfo(
14295             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
14296             (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo), countPtr);
14297     }
14298     uint32_t packetSize_vkGetDeviceMemoryOpaqueCaptureAddress =
14299         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
14300     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceMemoryOpaqueCaptureAddress);
14301     uint8_t* packetBeginPtr = streamPtr;
14302     uint8_t** streamPtrPtr = &streamPtr;
14303     uint32_t opcode_vkGetDeviceMemoryOpaqueCaptureAddress =
14304         OP_vkGetDeviceMemoryOpaqueCaptureAddress;
14305     uint32_t seqno;
14306     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
14307     memcpy(streamPtr, &opcode_vkGetDeviceMemoryOpaqueCaptureAddress, sizeof(uint32_t));
14308     streamPtr += sizeof(uint32_t);
14309     memcpy(streamPtr, &packetSize_vkGetDeviceMemoryOpaqueCaptureAddress, sizeof(uint32_t));
14310     streamPtr += sizeof(uint32_t);
14311     if (queueSubmitWithCommandsEnabled) {
14312         memcpy(streamPtr, &seqno, sizeof(uint32_t));
14313         streamPtr += sizeof(uint32_t);
14314     }
14315     uint64_t cgen_var_0;
14316     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
14317     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14318     *streamPtrPtr += 1 * 8;
14319     reservedmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
14320         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo),
14321         streamPtrPtr);
14322     uint64_t vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return = (uint64_t)0;
14323     stream->read(&vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return, sizeof(uint64_t));
14324     ++encodeCount;
14325     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14326         pool->freeAll();
14327         stream->clearPool();
14328     }
14329     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14330     return vkGetDeviceMemoryOpaqueCaptureAddress_uint64_t_return;
14331 }
14332 
14333 #endif
14334 #ifdef VK_VERSION_1_3
vkGetPhysicalDeviceToolProperties(VkPhysicalDevice physicalDevice,uint32_t * pToolCount,VkPhysicalDeviceToolProperties * pToolProperties,uint32_t doLock)14335 VkResult VkEncoder::vkGetPhysicalDeviceToolProperties(
14336     VkPhysicalDevice physicalDevice, uint32_t* pToolCount,
14337     VkPhysicalDeviceToolProperties* pToolProperties, uint32_t doLock) {
14338     (void)doLock;
14339     bool queueSubmitWithCommandsEnabled =
14340         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14341     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14342     auto stream = mImpl->stream();
14343     auto pool = mImpl->pool();
14344     VkPhysicalDevice local_physicalDevice;
14345     local_physicalDevice = physicalDevice;
14346     size_t count = 0;
14347     size_t* countPtr = &count;
14348     {
14349         uint64_t cgen_var_0;
14350         *countPtr += 1 * 8;
14351         // WARNING PTR CHECK
14352         *countPtr += 8;
14353         if (pToolCount) {
14354             *countPtr += sizeof(uint32_t);
14355         }
14356         // WARNING PTR CHECK
14357         *countPtr += 8;
14358         if (pToolProperties) {
14359             if (pToolCount) {
14360                 for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
14361                     count_VkPhysicalDeviceToolProperties(
14362                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
14363                         (VkPhysicalDeviceToolProperties*)(pToolProperties + i), countPtr);
14364                 }
14365             }
14366         }
14367     }
14368     uint32_t packetSize_vkGetPhysicalDeviceToolProperties =
14369         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
14370     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceToolProperties);
14371     uint8_t* packetBeginPtr = streamPtr;
14372     uint8_t** streamPtrPtr = &streamPtr;
14373     uint32_t opcode_vkGetPhysicalDeviceToolProperties = OP_vkGetPhysicalDeviceToolProperties;
14374     uint32_t seqno;
14375     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
14376     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceToolProperties, sizeof(uint32_t));
14377     streamPtr += sizeof(uint32_t);
14378     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceToolProperties, sizeof(uint32_t));
14379     streamPtr += sizeof(uint32_t);
14380     if (queueSubmitWithCommandsEnabled) {
14381         memcpy(streamPtr, &seqno, sizeof(uint32_t));
14382         streamPtr += sizeof(uint32_t);
14383     }
14384     uint64_t cgen_var_0;
14385     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
14386     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14387     *streamPtrPtr += 1 * 8;
14388     // WARNING PTR CHECK
14389     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pToolCount;
14390     memcpy((*streamPtrPtr), &cgen_var_1, 8);
14391     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
14392     *streamPtrPtr += 8;
14393     if (pToolCount) {
14394         memcpy(*streamPtrPtr, (uint32_t*)pToolCount, sizeof(uint32_t));
14395         *streamPtrPtr += sizeof(uint32_t);
14396     }
14397     // WARNING PTR CHECK
14398     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pToolProperties;
14399     memcpy((*streamPtrPtr), &cgen_var_2, 8);
14400     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
14401     *streamPtrPtr += 8;
14402     if (pToolProperties) {
14403         for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
14404             reservedmarshal_VkPhysicalDeviceToolProperties(
14405                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
14406                 (VkPhysicalDeviceToolProperties*)(pToolProperties + i), streamPtrPtr);
14407         }
14408     }
14409     // WARNING PTR CHECK
14410     uint32_t* check_pToolCount;
14411     check_pToolCount = (uint32_t*)(uintptr_t)stream->getBe64();
14412     if (pToolCount) {
14413         if (!(check_pToolCount)) {
14414             fprintf(stderr, "fatal: pToolCount inconsistent between guest and host\n");
14415         }
14416         stream->read((uint32_t*)pToolCount, sizeof(uint32_t));
14417     }
14418     // WARNING PTR CHECK
14419     VkPhysicalDeviceToolProperties* check_pToolProperties;
14420     check_pToolProperties = (VkPhysicalDeviceToolProperties*)(uintptr_t)stream->getBe64();
14421     if (pToolProperties) {
14422         if (!(check_pToolProperties)) {
14423             fprintf(stderr, "fatal: pToolProperties inconsistent between guest and host\n");
14424         }
14425         if (pToolCount) {
14426             for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
14427                 unmarshal_VkPhysicalDeviceToolProperties(
14428                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
14429                     (VkPhysicalDeviceToolProperties*)(pToolProperties + i));
14430             }
14431         }
14432     }
14433     if (pToolCount) {
14434         if (pToolProperties) {
14435             for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
14436                 transform_fromhost_VkPhysicalDeviceToolProperties(
14437                     sResourceTracker, (VkPhysicalDeviceToolProperties*)(pToolProperties + i));
14438             }
14439         }
14440     }
14441     VkResult vkGetPhysicalDeviceToolProperties_VkResult_return = (VkResult)0;
14442     stream->read(&vkGetPhysicalDeviceToolProperties_VkResult_return, sizeof(VkResult));
14443     ++encodeCount;
14444     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14445         pool->freeAll();
14446         stream->clearPool();
14447     }
14448     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14449     return vkGetPhysicalDeviceToolProperties_VkResult_return;
14450 }
14451 
vkCreatePrivateDataSlot(VkDevice device,const VkPrivateDataSlotCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkPrivateDataSlot * pPrivateDataSlot,uint32_t doLock)14452 VkResult VkEncoder::vkCreatePrivateDataSlot(VkDevice device,
14453                                             const VkPrivateDataSlotCreateInfo* pCreateInfo,
14454                                             const VkAllocationCallbacks* pAllocator,
14455                                             VkPrivateDataSlot* pPrivateDataSlot, uint32_t doLock) {
14456     (void)doLock;
14457     bool queueSubmitWithCommandsEnabled =
14458         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14459     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14460     auto stream = mImpl->stream();
14461     auto pool = mImpl->pool();
14462     VkDevice local_device;
14463     VkPrivateDataSlotCreateInfo* local_pCreateInfo;
14464     VkAllocationCallbacks* local_pAllocator;
14465     local_device = device;
14466     local_pCreateInfo = nullptr;
14467     if (pCreateInfo) {
14468         local_pCreateInfo =
14469             (VkPrivateDataSlotCreateInfo*)pool->alloc(sizeof(const VkPrivateDataSlotCreateInfo));
14470         deepcopy_VkPrivateDataSlotCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
14471                                              (VkPrivateDataSlotCreateInfo*)(local_pCreateInfo));
14472     }
14473     local_pAllocator = nullptr;
14474     if (pAllocator) {
14475         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
14476         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
14477                                        (VkAllocationCallbacks*)(local_pAllocator));
14478     }
14479     local_pAllocator = nullptr;
14480     if (local_pCreateInfo) {
14481         transform_tohost_VkPrivateDataSlotCreateInfo(
14482             sResourceTracker, (VkPrivateDataSlotCreateInfo*)(local_pCreateInfo));
14483     }
14484     if (local_pAllocator) {
14485         transform_tohost_VkAllocationCallbacks(sResourceTracker,
14486                                                (VkAllocationCallbacks*)(local_pAllocator));
14487     }
14488     size_t count = 0;
14489     size_t* countPtr = &count;
14490     {
14491         uint64_t cgen_var_0;
14492         *countPtr += 1 * 8;
14493         count_VkPrivateDataSlotCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
14494                                           (VkPrivateDataSlotCreateInfo*)(local_pCreateInfo),
14495                                           countPtr);
14496         // WARNING PTR CHECK
14497         *countPtr += 8;
14498         if (local_pAllocator) {
14499             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
14500                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
14501         }
14502         uint64_t cgen_var_1;
14503         *countPtr += 8;
14504     }
14505     uint32_t packetSize_vkCreatePrivateDataSlot =
14506         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
14507     uint8_t* streamPtr = stream->reserve(packetSize_vkCreatePrivateDataSlot);
14508     uint8_t* packetBeginPtr = streamPtr;
14509     uint8_t** streamPtrPtr = &streamPtr;
14510     uint32_t opcode_vkCreatePrivateDataSlot = OP_vkCreatePrivateDataSlot;
14511     uint32_t seqno;
14512     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
14513     memcpy(streamPtr, &opcode_vkCreatePrivateDataSlot, sizeof(uint32_t));
14514     streamPtr += sizeof(uint32_t);
14515     memcpy(streamPtr, &packetSize_vkCreatePrivateDataSlot, sizeof(uint32_t));
14516     streamPtr += sizeof(uint32_t);
14517     if (queueSubmitWithCommandsEnabled) {
14518         memcpy(streamPtr, &seqno, sizeof(uint32_t));
14519         streamPtr += sizeof(uint32_t);
14520     }
14521     uint64_t cgen_var_0;
14522     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
14523     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14524     *streamPtrPtr += 1 * 8;
14525     reservedmarshal_VkPrivateDataSlotCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
14526                                                 (VkPrivateDataSlotCreateInfo*)(local_pCreateInfo),
14527                                                 streamPtrPtr);
14528     // WARNING PTR CHECK
14529     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
14530     memcpy((*streamPtrPtr), &cgen_var_1, 8);
14531     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
14532     *streamPtrPtr += 8;
14533     if (local_pAllocator) {
14534         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
14535                                               (VkAllocationCallbacks*)(local_pAllocator),
14536                                               streamPtrPtr);
14537     }
14538     /* is handle, possibly out */;
14539     uint64_t cgen_var_2;
14540     *&cgen_var_2 = (uint64_t)((*pPrivateDataSlot));
14541     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
14542     *streamPtrPtr += 8;
14543     /* is handle, possibly out */;
14544     stream->setHandleMapping(sResourceTracker->createMapping());
14545     uint64_t cgen_var_3;
14546     stream->read((uint64_t*)&cgen_var_3, 8);
14547     stream->handleMapping()->mapHandles_u64_VkPrivateDataSlot(
14548         &cgen_var_3, (VkPrivateDataSlot*)pPrivateDataSlot, 1);
14549     stream->unsetHandleMapping();
14550     VkResult vkCreatePrivateDataSlot_VkResult_return = (VkResult)0;
14551     stream->read(&vkCreatePrivateDataSlot_VkResult_return, sizeof(VkResult));
14552     ++encodeCount;
14553     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14554         pool->freeAll();
14555         stream->clearPool();
14556     }
14557     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14558     return vkCreatePrivateDataSlot_VkResult_return;
14559 }
14560 
vkDestroyPrivateDataSlot(VkDevice device,VkPrivateDataSlot privateDataSlot,const VkAllocationCallbacks * pAllocator,uint32_t doLock)14561 void VkEncoder::vkDestroyPrivateDataSlot(VkDevice device, VkPrivateDataSlot privateDataSlot,
14562                                          const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
14563     (void)doLock;
14564     bool queueSubmitWithCommandsEnabled =
14565         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14566     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14567     auto stream = mImpl->stream();
14568     auto pool = mImpl->pool();
14569     VkDevice local_device;
14570     VkPrivateDataSlot local_privateDataSlot;
14571     VkAllocationCallbacks* local_pAllocator;
14572     local_device = device;
14573     local_privateDataSlot = privateDataSlot;
14574     local_pAllocator = nullptr;
14575     if (pAllocator) {
14576         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
14577         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
14578                                        (VkAllocationCallbacks*)(local_pAllocator));
14579     }
14580     local_pAllocator = nullptr;
14581     if (local_pAllocator) {
14582         transform_tohost_VkAllocationCallbacks(sResourceTracker,
14583                                                (VkAllocationCallbacks*)(local_pAllocator));
14584     }
14585     size_t count = 0;
14586     size_t* countPtr = &count;
14587     {
14588         uint64_t cgen_var_0;
14589         *countPtr += 1 * 8;
14590         uint64_t cgen_var_1;
14591         *countPtr += 1 * 8;
14592         // WARNING PTR CHECK
14593         *countPtr += 8;
14594         if (local_pAllocator) {
14595             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
14596                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
14597         }
14598     }
14599     uint32_t packetSize_vkDestroyPrivateDataSlot =
14600         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
14601     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyPrivateDataSlot);
14602     uint8_t* packetBeginPtr = streamPtr;
14603     uint8_t** streamPtrPtr = &streamPtr;
14604     uint32_t opcode_vkDestroyPrivateDataSlot = OP_vkDestroyPrivateDataSlot;
14605     uint32_t seqno;
14606     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
14607     memcpy(streamPtr, &opcode_vkDestroyPrivateDataSlot, sizeof(uint32_t));
14608     streamPtr += sizeof(uint32_t);
14609     memcpy(streamPtr, &packetSize_vkDestroyPrivateDataSlot, sizeof(uint32_t));
14610     streamPtr += sizeof(uint32_t);
14611     if (queueSubmitWithCommandsEnabled) {
14612         memcpy(streamPtr, &seqno, sizeof(uint32_t));
14613         streamPtr += sizeof(uint32_t);
14614     }
14615     uint64_t cgen_var_0;
14616     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
14617     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14618     *streamPtrPtr += 1 * 8;
14619     uint64_t cgen_var_1;
14620     *&cgen_var_1 = get_host_u64_VkPrivateDataSlot((*&local_privateDataSlot));
14621     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
14622     *streamPtrPtr += 1 * 8;
14623     // WARNING PTR CHECK
14624     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
14625     memcpy((*streamPtrPtr), &cgen_var_2, 8);
14626     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
14627     *streamPtrPtr += 8;
14628     if (local_pAllocator) {
14629         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
14630                                               (VkAllocationCallbacks*)(local_pAllocator),
14631                                               streamPtrPtr);
14632     }
14633     sResourceTracker->destroyMapping()->mapHandles_VkPrivateDataSlot(
14634         (VkPrivateDataSlot*)&privateDataSlot);
14635     stream->flush();
14636     ++encodeCount;
14637     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14638         pool->freeAll();
14639         stream->clearPool();
14640     }
14641     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14642 }
14643 
vkSetPrivateData(VkDevice device,VkObjectType objectType,uint64_t objectHandle,VkPrivateDataSlot privateDataSlot,uint64_t data,uint32_t doLock)14644 VkResult VkEncoder::vkSetPrivateData(VkDevice device, VkObjectType objectType,
14645                                      uint64_t objectHandle, VkPrivateDataSlot privateDataSlot,
14646                                      uint64_t data, uint32_t doLock) {
14647     (void)doLock;
14648     bool queueSubmitWithCommandsEnabled =
14649         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14650     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14651     auto stream = mImpl->stream();
14652     auto pool = mImpl->pool();
14653     VkDevice local_device;
14654     VkObjectType local_objectType;
14655     uint64_t local_objectHandle;
14656     VkPrivateDataSlot local_privateDataSlot;
14657     uint64_t local_data;
14658     local_device = device;
14659     local_objectType = objectType;
14660     local_objectHandle = objectHandle;
14661     local_privateDataSlot = privateDataSlot;
14662     local_data = data;
14663     size_t count = 0;
14664     size_t* countPtr = &count;
14665     {
14666         uint64_t cgen_var_0;
14667         *countPtr += 1 * 8;
14668         *countPtr += sizeof(VkObjectType);
14669         *countPtr += sizeof(uint64_t);
14670         uint64_t cgen_var_1;
14671         *countPtr += 1 * 8;
14672         *countPtr += sizeof(uint64_t);
14673     }
14674     uint32_t packetSize_vkSetPrivateData = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
14675     uint8_t* streamPtr = stream->reserve(packetSize_vkSetPrivateData);
14676     uint8_t* packetBeginPtr = streamPtr;
14677     uint8_t** streamPtrPtr = &streamPtr;
14678     uint32_t opcode_vkSetPrivateData = OP_vkSetPrivateData;
14679     uint32_t seqno;
14680     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
14681     memcpy(streamPtr, &opcode_vkSetPrivateData, sizeof(uint32_t));
14682     streamPtr += sizeof(uint32_t);
14683     memcpy(streamPtr, &packetSize_vkSetPrivateData, sizeof(uint32_t));
14684     streamPtr += sizeof(uint32_t);
14685     if (queueSubmitWithCommandsEnabled) {
14686         memcpy(streamPtr, &seqno, sizeof(uint32_t));
14687         streamPtr += sizeof(uint32_t);
14688     }
14689     uint64_t cgen_var_0;
14690     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
14691     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14692     *streamPtrPtr += 1 * 8;
14693     memcpy(*streamPtrPtr, (VkObjectType*)&local_objectType, sizeof(VkObjectType));
14694     *streamPtrPtr += sizeof(VkObjectType);
14695     memcpy(*streamPtrPtr, (uint64_t*)&local_objectHandle, sizeof(uint64_t));
14696     *streamPtrPtr += sizeof(uint64_t);
14697     uint64_t cgen_var_1;
14698     *&cgen_var_1 = get_host_u64_VkPrivateDataSlot((*&local_privateDataSlot));
14699     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
14700     *streamPtrPtr += 1 * 8;
14701     memcpy(*streamPtrPtr, (uint64_t*)&local_data, sizeof(uint64_t));
14702     *streamPtrPtr += sizeof(uint64_t);
14703     VkResult vkSetPrivateData_VkResult_return = (VkResult)0;
14704     stream->read(&vkSetPrivateData_VkResult_return, sizeof(VkResult));
14705     ++encodeCount;
14706     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14707         pool->freeAll();
14708         stream->clearPool();
14709     }
14710     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14711     return vkSetPrivateData_VkResult_return;
14712 }
14713 
vkGetPrivateData(VkDevice device,VkObjectType objectType,uint64_t objectHandle,VkPrivateDataSlot privateDataSlot,uint64_t * pData,uint32_t doLock)14714 void VkEncoder::vkGetPrivateData(VkDevice device, VkObjectType objectType, uint64_t objectHandle,
14715                                  VkPrivateDataSlot privateDataSlot, uint64_t* pData,
14716                                  uint32_t doLock) {
14717     (void)doLock;
14718     bool queueSubmitWithCommandsEnabled =
14719         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14720     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14721     auto stream = mImpl->stream();
14722     auto pool = mImpl->pool();
14723     VkDevice local_device;
14724     VkObjectType local_objectType;
14725     uint64_t local_objectHandle;
14726     VkPrivateDataSlot local_privateDataSlot;
14727     local_device = device;
14728     local_objectType = objectType;
14729     local_objectHandle = objectHandle;
14730     local_privateDataSlot = privateDataSlot;
14731     size_t count = 0;
14732     size_t* countPtr = &count;
14733     {
14734         uint64_t cgen_var_0;
14735         *countPtr += 1 * 8;
14736         *countPtr += sizeof(VkObjectType);
14737         *countPtr += sizeof(uint64_t);
14738         uint64_t cgen_var_1;
14739         *countPtr += 1 * 8;
14740         *countPtr += sizeof(uint64_t);
14741     }
14742     uint32_t packetSize_vkGetPrivateData = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
14743     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPrivateData);
14744     uint8_t* packetBeginPtr = streamPtr;
14745     uint8_t** streamPtrPtr = &streamPtr;
14746     uint32_t opcode_vkGetPrivateData = OP_vkGetPrivateData;
14747     uint32_t seqno;
14748     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
14749     memcpy(streamPtr, &opcode_vkGetPrivateData, sizeof(uint32_t));
14750     streamPtr += sizeof(uint32_t);
14751     memcpy(streamPtr, &packetSize_vkGetPrivateData, sizeof(uint32_t));
14752     streamPtr += sizeof(uint32_t);
14753     if (queueSubmitWithCommandsEnabled) {
14754         memcpy(streamPtr, &seqno, sizeof(uint32_t));
14755         streamPtr += sizeof(uint32_t);
14756     }
14757     uint64_t cgen_var_0;
14758     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
14759     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14760     *streamPtrPtr += 1 * 8;
14761     memcpy(*streamPtrPtr, (VkObjectType*)&local_objectType, sizeof(VkObjectType));
14762     *streamPtrPtr += sizeof(VkObjectType);
14763     memcpy(*streamPtrPtr, (uint64_t*)&local_objectHandle, sizeof(uint64_t));
14764     *streamPtrPtr += sizeof(uint64_t);
14765     uint64_t cgen_var_1;
14766     *&cgen_var_1 = get_host_u64_VkPrivateDataSlot((*&local_privateDataSlot));
14767     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
14768     *streamPtrPtr += 1 * 8;
14769     memcpy(*streamPtrPtr, (uint64_t*)pData, sizeof(uint64_t));
14770     *streamPtrPtr += sizeof(uint64_t);
14771     stream->read((uint64_t*)pData, sizeof(uint64_t));
14772     ++encodeCount;
14773     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14774         pool->freeAll();
14775         stream->clearPool();
14776     }
14777     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14778 }
14779 
vkCmdSetEvent2(VkCommandBuffer commandBuffer,VkEvent event,const VkDependencyInfo * pDependencyInfo,uint32_t doLock)14780 void VkEncoder::vkCmdSetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
14781                                const VkDependencyInfo* pDependencyInfo, uint32_t doLock) {
14782     (void)doLock;
14783     bool queueSubmitWithCommandsEnabled =
14784         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14785     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14786     auto stream = mImpl->stream();
14787     auto pool = mImpl->pool();
14788     VkCommandBuffer local_commandBuffer;
14789     VkEvent local_event;
14790     VkDependencyInfo* local_pDependencyInfo;
14791     local_commandBuffer = commandBuffer;
14792     local_event = event;
14793     local_pDependencyInfo = nullptr;
14794     if (pDependencyInfo) {
14795         local_pDependencyInfo = (VkDependencyInfo*)pool->alloc(sizeof(const VkDependencyInfo));
14796         deepcopy_VkDependencyInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDependencyInfo,
14797                                   (VkDependencyInfo*)(local_pDependencyInfo));
14798     }
14799     if (local_pDependencyInfo) {
14800         transform_tohost_VkDependencyInfo(sResourceTracker,
14801                                           (VkDependencyInfo*)(local_pDependencyInfo));
14802     }
14803     size_t count = 0;
14804     size_t* countPtr = &count;
14805     {
14806         uint64_t cgen_var_0;
14807         *countPtr += 1 * 8;
14808         uint64_t cgen_var_1;
14809         *countPtr += 1 * 8;
14810         count_VkDependencyInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
14811                                (VkDependencyInfo*)(local_pDependencyInfo), countPtr);
14812     }
14813     uint32_t packetSize_vkCmdSetEvent2 = 4 + 4 + count;
14814     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetEvent2 -= 8;
14815     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetEvent2);
14816     uint8_t* packetBeginPtr = streamPtr;
14817     uint8_t** streamPtrPtr = &streamPtr;
14818     uint32_t opcode_vkCmdSetEvent2 = OP_vkCmdSetEvent2;
14819     memcpy(streamPtr, &opcode_vkCmdSetEvent2, sizeof(uint32_t));
14820     streamPtr += sizeof(uint32_t);
14821     memcpy(streamPtr, &packetSize_vkCmdSetEvent2, sizeof(uint32_t));
14822     streamPtr += sizeof(uint32_t);
14823     if (!queueSubmitWithCommandsEnabled) {
14824         uint64_t cgen_var_0;
14825         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
14826         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14827         *streamPtrPtr += 1 * 8;
14828     }
14829     uint64_t cgen_var_0;
14830     *&cgen_var_0 = get_host_u64_VkEvent((*&local_event));
14831     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14832     *streamPtrPtr += 1 * 8;
14833     reservedmarshal_VkDependencyInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
14834                                      (VkDependencyInfo*)(local_pDependencyInfo), streamPtrPtr);
14835     ++encodeCount;
14836     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14837         pool->freeAll();
14838         stream->clearPool();
14839     }
14840     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14841 }
14842 
vkCmdResetEvent2(VkCommandBuffer commandBuffer,VkEvent event,VkPipelineStageFlags2 stageMask,uint32_t doLock)14843 void VkEncoder::vkCmdResetEvent2(VkCommandBuffer commandBuffer, VkEvent event,
14844                                  VkPipelineStageFlags2 stageMask, uint32_t doLock) {
14845     (void)doLock;
14846     bool queueSubmitWithCommandsEnabled =
14847         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14848     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14849     auto stream = mImpl->stream();
14850     auto pool = mImpl->pool();
14851     VkCommandBuffer local_commandBuffer;
14852     VkEvent local_event;
14853     VkPipelineStageFlags2 local_stageMask;
14854     local_commandBuffer = commandBuffer;
14855     local_event = event;
14856     local_stageMask = stageMask;
14857     size_t count = 0;
14858     size_t* countPtr = &count;
14859     {
14860         uint64_t cgen_var_0;
14861         *countPtr += 1 * 8;
14862         uint64_t cgen_var_1;
14863         *countPtr += 1 * 8;
14864         *countPtr += sizeof(VkPipelineStageFlags2);
14865     }
14866     uint32_t packetSize_vkCmdResetEvent2 = 4 + 4 + count;
14867     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdResetEvent2 -= 8;
14868     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdResetEvent2);
14869     uint8_t* packetBeginPtr = streamPtr;
14870     uint8_t** streamPtrPtr = &streamPtr;
14871     uint32_t opcode_vkCmdResetEvent2 = OP_vkCmdResetEvent2;
14872     memcpy(streamPtr, &opcode_vkCmdResetEvent2, sizeof(uint32_t));
14873     streamPtr += sizeof(uint32_t);
14874     memcpy(streamPtr, &packetSize_vkCmdResetEvent2, sizeof(uint32_t));
14875     streamPtr += sizeof(uint32_t);
14876     if (!queueSubmitWithCommandsEnabled) {
14877         uint64_t cgen_var_0;
14878         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
14879         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14880         *streamPtrPtr += 1 * 8;
14881     }
14882     uint64_t cgen_var_0;
14883     *&cgen_var_0 = get_host_u64_VkEvent((*&local_event));
14884     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14885     *streamPtrPtr += 1 * 8;
14886     memcpy(*streamPtrPtr, (VkPipelineStageFlags2*)&local_stageMask, sizeof(VkPipelineStageFlags2));
14887     *streamPtrPtr += sizeof(VkPipelineStageFlags2);
14888     ++encodeCount;
14889     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14890         pool->freeAll();
14891         stream->clearPool();
14892     }
14893     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14894 }
14895 
vkCmdWaitEvents2(VkCommandBuffer commandBuffer,uint32_t eventCount,const VkEvent * pEvents,const VkDependencyInfo * pDependencyInfos,uint32_t doLock)14896 void VkEncoder::vkCmdWaitEvents2(VkCommandBuffer commandBuffer, uint32_t eventCount,
14897                                  const VkEvent* pEvents, const VkDependencyInfo* pDependencyInfos,
14898                                  uint32_t doLock) {
14899     (void)doLock;
14900     bool queueSubmitWithCommandsEnabled =
14901         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14902     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14903     auto stream = mImpl->stream();
14904     auto pool = mImpl->pool();
14905     VkCommandBuffer local_commandBuffer;
14906     uint32_t local_eventCount;
14907     VkEvent* local_pEvents;
14908     VkDependencyInfo* local_pDependencyInfos;
14909     local_commandBuffer = commandBuffer;
14910     local_eventCount = eventCount;
14911     // Avoiding deepcopy for pEvents
14912     local_pEvents = (VkEvent*)pEvents;
14913     local_pDependencyInfos = nullptr;
14914     if (pDependencyInfos) {
14915         local_pDependencyInfos =
14916             (VkDependencyInfo*)pool->alloc(((eventCount)) * sizeof(const VkDependencyInfo));
14917         for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
14918             deepcopy_VkDependencyInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDependencyInfos + i,
14919                                       (VkDependencyInfo*)(local_pDependencyInfos + i));
14920         }
14921     }
14922     if (local_pDependencyInfos) {
14923         for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
14924             transform_tohost_VkDependencyInfo(sResourceTracker,
14925                                               (VkDependencyInfo*)(local_pDependencyInfos + i));
14926         }
14927     }
14928     size_t count = 0;
14929     size_t* countPtr = &count;
14930     {
14931         uint64_t cgen_var_0;
14932         *countPtr += 1 * 8;
14933         *countPtr += sizeof(uint32_t);
14934         if (((eventCount))) {
14935             *countPtr += ((eventCount)) * 8;
14936         }
14937         for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
14938             count_VkDependencyInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
14939                                    (VkDependencyInfo*)(local_pDependencyInfos + i), countPtr);
14940         }
14941     }
14942     uint32_t packetSize_vkCmdWaitEvents2 = 4 + 4 + count;
14943     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdWaitEvents2 -= 8;
14944     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdWaitEvents2);
14945     uint8_t* packetBeginPtr = streamPtr;
14946     uint8_t** streamPtrPtr = &streamPtr;
14947     uint32_t opcode_vkCmdWaitEvents2 = OP_vkCmdWaitEvents2;
14948     memcpy(streamPtr, &opcode_vkCmdWaitEvents2, sizeof(uint32_t));
14949     streamPtr += sizeof(uint32_t);
14950     memcpy(streamPtr, &packetSize_vkCmdWaitEvents2, sizeof(uint32_t));
14951     streamPtr += sizeof(uint32_t);
14952     if (!queueSubmitWithCommandsEnabled) {
14953         uint64_t cgen_var_0;
14954         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
14955         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
14956         *streamPtrPtr += 1 * 8;
14957     }
14958     memcpy(*streamPtrPtr, (uint32_t*)&local_eventCount, sizeof(uint32_t));
14959     *streamPtrPtr += sizeof(uint32_t);
14960     if (((eventCount))) {
14961         uint8_t* cgen_var_0_ptr = (uint8_t*)(*streamPtrPtr);
14962         for (uint32_t k = 0; k < ((eventCount)); ++k) {
14963             uint64_t tmpval = get_host_u64_VkEvent(local_pEvents[k]);
14964             memcpy(cgen_var_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
14965         }
14966         *streamPtrPtr += 8 * ((eventCount));
14967     }
14968     for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
14969         reservedmarshal_VkDependencyInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
14970                                          (VkDependencyInfo*)(local_pDependencyInfos + i),
14971                                          streamPtrPtr);
14972     }
14973     ++encodeCount;
14974     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
14975         pool->freeAll();
14976         stream->clearPool();
14977     }
14978     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
14979 }
14980 
vkCmdPipelineBarrier2(VkCommandBuffer commandBuffer,const VkDependencyInfo * pDependencyInfo,uint32_t doLock)14981 void VkEncoder::vkCmdPipelineBarrier2(VkCommandBuffer commandBuffer,
14982                                       const VkDependencyInfo* pDependencyInfo, uint32_t doLock) {
14983     (void)doLock;
14984     bool queueSubmitWithCommandsEnabled =
14985         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
14986     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
14987     auto stream = mImpl->stream();
14988     auto pool = mImpl->pool();
14989     VkCommandBuffer local_commandBuffer;
14990     VkDependencyInfo* local_pDependencyInfo;
14991     local_commandBuffer = commandBuffer;
14992     local_pDependencyInfo = nullptr;
14993     if (pDependencyInfo) {
14994         local_pDependencyInfo = (VkDependencyInfo*)pool->alloc(sizeof(const VkDependencyInfo));
14995         deepcopy_VkDependencyInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDependencyInfo,
14996                                   (VkDependencyInfo*)(local_pDependencyInfo));
14997     }
14998     if (local_pDependencyInfo) {
14999         transform_tohost_VkDependencyInfo(sResourceTracker,
15000                                           (VkDependencyInfo*)(local_pDependencyInfo));
15001     }
15002     size_t count = 0;
15003     size_t* countPtr = &count;
15004     {
15005         uint64_t cgen_var_0;
15006         *countPtr += 1 * 8;
15007         count_VkDependencyInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
15008                                (VkDependencyInfo*)(local_pDependencyInfo), countPtr);
15009     }
15010     uint32_t packetSize_vkCmdPipelineBarrier2 = 4 + 4 + count;
15011     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdPipelineBarrier2 -= 8;
15012     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdPipelineBarrier2);
15013     uint8_t* packetBeginPtr = streamPtr;
15014     uint8_t** streamPtrPtr = &streamPtr;
15015     uint32_t opcode_vkCmdPipelineBarrier2 = OP_vkCmdPipelineBarrier2;
15016     memcpy(streamPtr, &opcode_vkCmdPipelineBarrier2, sizeof(uint32_t));
15017     streamPtr += sizeof(uint32_t);
15018     memcpy(streamPtr, &packetSize_vkCmdPipelineBarrier2, sizeof(uint32_t));
15019     streamPtr += sizeof(uint32_t);
15020     if (!queueSubmitWithCommandsEnabled) {
15021         uint64_t cgen_var_0;
15022         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15023         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15024         *streamPtrPtr += 1 * 8;
15025     }
15026     reservedmarshal_VkDependencyInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
15027                                      (VkDependencyInfo*)(local_pDependencyInfo), streamPtrPtr);
15028     ++encodeCount;
15029     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15030         pool->freeAll();
15031         stream->clearPool();
15032     }
15033     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15034 }
15035 
vkCmdWriteTimestamp2(VkCommandBuffer commandBuffer,VkPipelineStageFlags2 stage,VkQueryPool queryPool,uint32_t query,uint32_t doLock)15036 void VkEncoder::vkCmdWriteTimestamp2(VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage,
15037                                      VkQueryPool queryPool, uint32_t query, uint32_t doLock) {
15038     (void)doLock;
15039     bool queueSubmitWithCommandsEnabled =
15040         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15041     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15042     auto stream = mImpl->stream();
15043     auto pool = mImpl->pool();
15044     VkCommandBuffer local_commandBuffer;
15045     VkPipelineStageFlags2 local_stage;
15046     VkQueryPool local_queryPool;
15047     uint32_t local_query;
15048     local_commandBuffer = commandBuffer;
15049     local_stage = stage;
15050     local_queryPool = queryPool;
15051     local_query = query;
15052     size_t count = 0;
15053     size_t* countPtr = &count;
15054     {
15055         uint64_t cgen_var_0;
15056         *countPtr += 1 * 8;
15057         *countPtr += sizeof(VkPipelineStageFlags2);
15058         uint64_t cgen_var_1;
15059         *countPtr += 1 * 8;
15060         *countPtr += sizeof(uint32_t);
15061     }
15062     uint32_t packetSize_vkCmdWriteTimestamp2 = 4 + 4 + count;
15063     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdWriteTimestamp2 -= 8;
15064     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdWriteTimestamp2);
15065     uint8_t* packetBeginPtr = streamPtr;
15066     uint8_t** streamPtrPtr = &streamPtr;
15067     uint32_t opcode_vkCmdWriteTimestamp2 = OP_vkCmdWriteTimestamp2;
15068     memcpy(streamPtr, &opcode_vkCmdWriteTimestamp2, sizeof(uint32_t));
15069     streamPtr += sizeof(uint32_t);
15070     memcpy(streamPtr, &packetSize_vkCmdWriteTimestamp2, sizeof(uint32_t));
15071     streamPtr += sizeof(uint32_t);
15072     if (!queueSubmitWithCommandsEnabled) {
15073         uint64_t cgen_var_0;
15074         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15075         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15076         *streamPtrPtr += 1 * 8;
15077     }
15078     memcpy(*streamPtrPtr, (VkPipelineStageFlags2*)&local_stage, sizeof(VkPipelineStageFlags2));
15079     *streamPtrPtr += sizeof(VkPipelineStageFlags2);
15080     uint64_t cgen_var_0;
15081     *&cgen_var_0 = get_host_u64_VkQueryPool((*&local_queryPool));
15082     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15083     *streamPtrPtr += 1 * 8;
15084     memcpy(*streamPtrPtr, (uint32_t*)&local_query, sizeof(uint32_t));
15085     *streamPtrPtr += sizeof(uint32_t);
15086     ++encodeCount;
15087     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15088         pool->freeAll();
15089         stream->clearPool();
15090     }
15091     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15092 }
15093 
vkQueueSubmit2(VkQueue queue,uint32_t submitCount,const VkSubmitInfo2 * pSubmits,VkFence fence,uint32_t doLock)15094 VkResult VkEncoder::vkQueueSubmit2(VkQueue queue, uint32_t submitCount,
15095                                    const VkSubmitInfo2* pSubmits, VkFence fence, uint32_t doLock) {
15096     (void)doLock;
15097     bool queueSubmitWithCommandsEnabled =
15098         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15099     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15100     auto stream = mImpl->stream();
15101     auto pool = mImpl->pool();
15102     VkQueue local_queue;
15103     uint32_t local_submitCount;
15104     VkSubmitInfo2* local_pSubmits;
15105     VkFence local_fence;
15106     local_queue = queue;
15107     local_submitCount = submitCount;
15108     local_pSubmits = nullptr;
15109     if (pSubmits) {
15110         local_pSubmits = (VkSubmitInfo2*)pool->alloc(((submitCount)) * sizeof(const VkSubmitInfo2));
15111         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
15112             deepcopy_VkSubmitInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubmits + i,
15113                                    (VkSubmitInfo2*)(local_pSubmits + i));
15114         }
15115     }
15116     local_fence = fence;
15117     if (local_pSubmits) {
15118         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
15119             transform_tohost_VkSubmitInfo2(sResourceTracker, (VkSubmitInfo2*)(local_pSubmits + i));
15120         }
15121     }
15122     size_t count = 0;
15123     size_t* countPtr = &count;
15124     {
15125         uint64_t cgen_var_0;
15126         *countPtr += 1 * 8;
15127         *countPtr += sizeof(uint32_t);
15128         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
15129             count_VkSubmitInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
15130                                 (VkSubmitInfo2*)(local_pSubmits + i), countPtr);
15131         }
15132         uint64_t cgen_var_1;
15133         *countPtr += 1 * 8;
15134     }
15135     uint32_t packetSize_vkQueueSubmit2 = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
15136     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSubmit2);
15137     uint8_t* packetBeginPtr = streamPtr;
15138     uint8_t** streamPtrPtr = &streamPtr;
15139     uint32_t opcode_vkQueueSubmit2 = OP_vkQueueSubmit2;
15140     uint32_t seqno;
15141     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
15142     memcpy(streamPtr, &opcode_vkQueueSubmit2, sizeof(uint32_t));
15143     streamPtr += sizeof(uint32_t);
15144     memcpy(streamPtr, &packetSize_vkQueueSubmit2, sizeof(uint32_t));
15145     streamPtr += sizeof(uint32_t);
15146     if (queueSubmitWithCommandsEnabled) {
15147         memcpy(streamPtr, &seqno, sizeof(uint32_t));
15148         streamPtr += sizeof(uint32_t);
15149     }
15150     uint64_t cgen_var_0;
15151     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
15152     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15153     *streamPtrPtr += 1 * 8;
15154     memcpy(*streamPtrPtr, (uint32_t*)&local_submitCount, sizeof(uint32_t));
15155     *streamPtrPtr += sizeof(uint32_t);
15156     for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
15157         reservedmarshal_VkSubmitInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
15158                                       (VkSubmitInfo2*)(local_pSubmits + i), streamPtrPtr);
15159     }
15160     uint64_t cgen_var_1;
15161     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
15162     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
15163     *streamPtrPtr += 1 * 8;
15164     VkResult vkQueueSubmit2_VkResult_return = (VkResult)0;
15165     stream->read(&vkQueueSubmit2_VkResult_return, sizeof(VkResult));
15166     ++encodeCount;
15167     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15168         pool->freeAll();
15169         stream->clearPool();
15170     }
15171     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15172     return vkQueueSubmit2_VkResult_return;
15173 }
15174 
vkCmdCopyBuffer2(VkCommandBuffer commandBuffer,const VkCopyBufferInfo2 * pCopyBufferInfo,uint32_t doLock)15175 void VkEncoder::vkCmdCopyBuffer2(VkCommandBuffer commandBuffer,
15176                                  const VkCopyBufferInfo2* pCopyBufferInfo, uint32_t doLock) {
15177     (void)doLock;
15178     bool queueSubmitWithCommandsEnabled =
15179         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15180     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15181     auto stream = mImpl->stream();
15182     auto pool = mImpl->pool();
15183     VkCommandBuffer local_commandBuffer;
15184     VkCopyBufferInfo2* local_pCopyBufferInfo;
15185     local_commandBuffer = commandBuffer;
15186     local_pCopyBufferInfo = nullptr;
15187     if (pCopyBufferInfo) {
15188         local_pCopyBufferInfo = (VkCopyBufferInfo2*)pool->alloc(sizeof(const VkCopyBufferInfo2));
15189         deepcopy_VkCopyBufferInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyBufferInfo,
15190                                    (VkCopyBufferInfo2*)(local_pCopyBufferInfo));
15191     }
15192     if (local_pCopyBufferInfo) {
15193         transform_tohost_VkCopyBufferInfo2(sResourceTracker,
15194                                            (VkCopyBufferInfo2*)(local_pCopyBufferInfo));
15195     }
15196     size_t count = 0;
15197     size_t* countPtr = &count;
15198     {
15199         uint64_t cgen_var_0;
15200         *countPtr += 1 * 8;
15201         count_VkCopyBufferInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
15202                                 (VkCopyBufferInfo2*)(local_pCopyBufferInfo), countPtr);
15203     }
15204     uint32_t packetSize_vkCmdCopyBuffer2 = 4 + 4 + count;
15205     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyBuffer2 -= 8;
15206     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyBuffer2);
15207     uint8_t* packetBeginPtr = streamPtr;
15208     uint8_t** streamPtrPtr = &streamPtr;
15209     uint32_t opcode_vkCmdCopyBuffer2 = OP_vkCmdCopyBuffer2;
15210     memcpy(streamPtr, &opcode_vkCmdCopyBuffer2, sizeof(uint32_t));
15211     streamPtr += sizeof(uint32_t);
15212     memcpy(streamPtr, &packetSize_vkCmdCopyBuffer2, sizeof(uint32_t));
15213     streamPtr += sizeof(uint32_t);
15214     if (!queueSubmitWithCommandsEnabled) {
15215         uint64_t cgen_var_0;
15216         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15217         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15218         *streamPtrPtr += 1 * 8;
15219     }
15220     reservedmarshal_VkCopyBufferInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
15221                                       (VkCopyBufferInfo2*)(local_pCopyBufferInfo), streamPtrPtr);
15222     ++encodeCount;
15223     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15224         pool->freeAll();
15225         stream->clearPool();
15226     }
15227     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15228 }
15229 
vkCmdCopyImage2(VkCommandBuffer commandBuffer,const VkCopyImageInfo2 * pCopyImageInfo,uint32_t doLock)15230 void VkEncoder::vkCmdCopyImage2(VkCommandBuffer commandBuffer,
15231                                 const VkCopyImageInfo2* pCopyImageInfo, uint32_t doLock) {
15232     (void)doLock;
15233     bool queueSubmitWithCommandsEnabled =
15234         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15235     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15236     auto stream = mImpl->stream();
15237     auto pool = mImpl->pool();
15238     VkCommandBuffer local_commandBuffer;
15239     VkCopyImageInfo2* local_pCopyImageInfo;
15240     local_commandBuffer = commandBuffer;
15241     local_pCopyImageInfo = nullptr;
15242     if (pCopyImageInfo) {
15243         local_pCopyImageInfo = (VkCopyImageInfo2*)pool->alloc(sizeof(const VkCopyImageInfo2));
15244         deepcopy_VkCopyImageInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyImageInfo,
15245                                   (VkCopyImageInfo2*)(local_pCopyImageInfo));
15246     }
15247     if (local_pCopyImageInfo) {
15248         transform_tohost_VkCopyImageInfo2(sResourceTracker,
15249                                           (VkCopyImageInfo2*)(local_pCopyImageInfo));
15250     }
15251     size_t count = 0;
15252     size_t* countPtr = &count;
15253     {
15254         uint64_t cgen_var_0;
15255         *countPtr += 1 * 8;
15256         count_VkCopyImageInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
15257                                (VkCopyImageInfo2*)(local_pCopyImageInfo), countPtr);
15258     }
15259     uint32_t packetSize_vkCmdCopyImage2 = 4 + 4 + count;
15260     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyImage2 -= 8;
15261     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyImage2);
15262     uint8_t* packetBeginPtr = streamPtr;
15263     uint8_t** streamPtrPtr = &streamPtr;
15264     uint32_t opcode_vkCmdCopyImage2 = OP_vkCmdCopyImage2;
15265     memcpy(streamPtr, &opcode_vkCmdCopyImage2, sizeof(uint32_t));
15266     streamPtr += sizeof(uint32_t);
15267     memcpy(streamPtr, &packetSize_vkCmdCopyImage2, sizeof(uint32_t));
15268     streamPtr += sizeof(uint32_t);
15269     if (!queueSubmitWithCommandsEnabled) {
15270         uint64_t cgen_var_0;
15271         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15272         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15273         *streamPtrPtr += 1 * 8;
15274     }
15275     reservedmarshal_VkCopyImageInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
15276                                      (VkCopyImageInfo2*)(local_pCopyImageInfo), streamPtrPtr);
15277     ++encodeCount;
15278     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15279         pool->freeAll();
15280         stream->clearPool();
15281     }
15282     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15283 }
15284 
vkCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,const VkCopyBufferToImageInfo2 * pCopyBufferToImageInfo,uint32_t doLock)15285 void VkEncoder::vkCmdCopyBufferToImage2(VkCommandBuffer commandBuffer,
15286                                         const VkCopyBufferToImageInfo2* pCopyBufferToImageInfo,
15287                                         uint32_t doLock) {
15288     (void)doLock;
15289     bool queueSubmitWithCommandsEnabled =
15290         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15291     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15292     auto stream = mImpl->stream();
15293     auto pool = mImpl->pool();
15294     VkCommandBuffer local_commandBuffer;
15295     VkCopyBufferToImageInfo2* local_pCopyBufferToImageInfo;
15296     local_commandBuffer = commandBuffer;
15297     local_pCopyBufferToImageInfo = nullptr;
15298     if (pCopyBufferToImageInfo) {
15299         local_pCopyBufferToImageInfo =
15300             (VkCopyBufferToImageInfo2*)pool->alloc(sizeof(const VkCopyBufferToImageInfo2));
15301         deepcopy_VkCopyBufferToImageInfo2(
15302             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyBufferToImageInfo,
15303             (VkCopyBufferToImageInfo2*)(local_pCopyBufferToImageInfo));
15304     }
15305     if (local_pCopyBufferToImageInfo) {
15306         transform_tohost_VkCopyBufferToImageInfo2(
15307             sResourceTracker, (VkCopyBufferToImageInfo2*)(local_pCopyBufferToImageInfo));
15308     }
15309     size_t count = 0;
15310     size_t* countPtr = &count;
15311     {
15312         uint64_t cgen_var_0;
15313         *countPtr += 1 * 8;
15314         count_VkCopyBufferToImageInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
15315                                        (VkCopyBufferToImageInfo2*)(local_pCopyBufferToImageInfo),
15316                                        countPtr);
15317     }
15318     uint32_t packetSize_vkCmdCopyBufferToImage2 = 4 + 4 + count;
15319     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyBufferToImage2 -= 8;
15320     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyBufferToImage2);
15321     uint8_t* packetBeginPtr = streamPtr;
15322     uint8_t** streamPtrPtr = &streamPtr;
15323     uint32_t opcode_vkCmdCopyBufferToImage2 = OP_vkCmdCopyBufferToImage2;
15324     memcpy(streamPtr, &opcode_vkCmdCopyBufferToImage2, sizeof(uint32_t));
15325     streamPtr += sizeof(uint32_t);
15326     memcpy(streamPtr, &packetSize_vkCmdCopyBufferToImage2, sizeof(uint32_t));
15327     streamPtr += sizeof(uint32_t);
15328     if (!queueSubmitWithCommandsEnabled) {
15329         uint64_t cgen_var_0;
15330         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15331         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15332         *streamPtrPtr += 1 * 8;
15333     }
15334     reservedmarshal_VkCopyBufferToImageInfo2(
15335         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
15336         (VkCopyBufferToImageInfo2*)(local_pCopyBufferToImageInfo), streamPtrPtr);
15337     ++encodeCount;
15338     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15339         pool->freeAll();
15340         stream->clearPool();
15341     }
15342     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15343 }
15344 
vkCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,const VkCopyImageToBufferInfo2 * pCopyImageToBufferInfo,uint32_t doLock)15345 void VkEncoder::vkCmdCopyImageToBuffer2(VkCommandBuffer commandBuffer,
15346                                         const VkCopyImageToBufferInfo2* pCopyImageToBufferInfo,
15347                                         uint32_t doLock) {
15348     (void)doLock;
15349     bool queueSubmitWithCommandsEnabled =
15350         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15351     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15352     auto stream = mImpl->stream();
15353     auto pool = mImpl->pool();
15354     VkCommandBuffer local_commandBuffer;
15355     VkCopyImageToBufferInfo2* local_pCopyImageToBufferInfo;
15356     local_commandBuffer = commandBuffer;
15357     local_pCopyImageToBufferInfo = nullptr;
15358     if (pCopyImageToBufferInfo) {
15359         local_pCopyImageToBufferInfo =
15360             (VkCopyImageToBufferInfo2*)pool->alloc(sizeof(const VkCopyImageToBufferInfo2));
15361         deepcopy_VkCopyImageToBufferInfo2(
15362             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyImageToBufferInfo,
15363             (VkCopyImageToBufferInfo2*)(local_pCopyImageToBufferInfo));
15364     }
15365     if (local_pCopyImageToBufferInfo) {
15366         transform_tohost_VkCopyImageToBufferInfo2(
15367             sResourceTracker, (VkCopyImageToBufferInfo2*)(local_pCopyImageToBufferInfo));
15368     }
15369     size_t count = 0;
15370     size_t* countPtr = &count;
15371     {
15372         uint64_t cgen_var_0;
15373         *countPtr += 1 * 8;
15374         count_VkCopyImageToBufferInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
15375                                        (VkCopyImageToBufferInfo2*)(local_pCopyImageToBufferInfo),
15376                                        countPtr);
15377     }
15378     uint32_t packetSize_vkCmdCopyImageToBuffer2 = 4 + 4 + count;
15379     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyImageToBuffer2 -= 8;
15380     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyImageToBuffer2);
15381     uint8_t* packetBeginPtr = streamPtr;
15382     uint8_t** streamPtrPtr = &streamPtr;
15383     uint32_t opcode_vkCmdCopyImageToBuffer2 = OP_vkCmdCopyImageToBuffer2;
15384     memcpy(streamPtr, &opcode_vkCmdCopyImageToBuffer2, sizeof(uint32_t));
15385     streamPtr += sizeof(uint32_t);
15386     memcpy(streamPtr, &packetSize_vkCmdCopyImageToBuffer2, sizeof(uint32_t));
15387     streamPtr += sizeof(uint32_t);
15388     if (!queueSubmitWithCommandsEnabled) {
15389         uint64_t cgen_var_0;
15390         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15391         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15392         *streamPtrPtr += 1 * 8;
15393     }
15394     reservedmarshal_VkCopyImageToBufferInfo2(
15395         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
15396         (VkCopyImageToBufferInfo2*)(local_pCopyImageToBufferInfo), streamPtrPtr);
15397     ++encodeCount;
15398     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15399         pool->freeAll();
15400         stream->clearPool();
15401     }
15402     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15403 }
15404 
vkCmdBlitImage2(VkCommandBuffer commandBuffer,const VkBlitImageInfo2 * pBlitImageInfo,uint32_t doLock)15405 void VkEncoder::vkCmdBlitImage2(VkCommandBuffer commandBuffer,
15406                                 const VkBlitImageInfo2* pBlitImageInfo, uint32_t doLock) {
15407     (void)doLock;
15408     bool queueSubmitWithCommandsEnabled =
15409         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15410     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15411     auto stream = mImpl->stream();
15412     auto pool = mImpl->pool();
15413     VkCommandBuffer local_commandBuffer;
15414     VkBlitImageInfo2* local_pBlitImageInfo;
15415     local_commandBuffer = commandBuffer;
15416     local_pBlitImageInfo = nullptr;
15417     if (pBlitImageInfo) {
15418         local_pBlitImageInfo = (VkBlitImageInfo2*)pool->alloc(sizeof(const VkBlitImageInfo2));
15419         deepcopy_VkBlitImageInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBlitImageInfo,
15420                                   (VkBlitImageInfo2*)(local_pBlitImageInfo));
15421     }
15422     if (local_pBlitImageInfo) {
15423         transform_tohost_VkBlitImageInfo2(sResourceTracker,
15424                                           (VkBlitImageInfo2*)(local_pBlitImageInfo));
15425     }
15426     size_t count = 0;
15427     size_t* countPtr = &count;
15428     {
15429         uint64_t cgen_var_0;
15430         *countPtr += 1 * 8;
15431         count_VkBlitImageInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
15432                                (VkBlitImageInfo2*)(local_pBlitImageInfo), countPtr);
15433     }
15434     uint32_t packetSize_vkCmdBlitImage2 = 4 + 4 + count;
15435     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBlitImage2 -= 8;
15436     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBlitImage2);
15437     uint8_t* packetBeginPtr = streamPtr;
15438     uint8_t** streamPtrPtr = &streamPtr;
15439     uint32_t opcode_vkCmdBlitImage2 = OP_vkCmdBlitImage2;
15440     memcpy(streamPtr, &opcode_vkCmdBlitImage2, sizeof(uint32_t));
15441     streamPtr += sizeof(uint32_t);
15442     memcpy(streamPtr, &packetSize_vkCmdBlitImage2, sizeof(uint32_t));
15443     streamPtr += sizeof(uint32_t);
15444     if (!queueSubmitWithCommandsEnabled) {
15445         uint64_t cgen_var_0;
15446         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15447         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15448         *streamPtrPtr += 1 * 8;
15449     }
15450     reservedmarshal_VkBlitImageInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
15451                                      (VkBlitImageInfo2*)(local_pBlitImageInfo), streamPtrPtr);
15452     ++encodeCount;
15453     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15454         pool->freeAll();
15455         stream->clearPool();
15456     }
15457     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15458 }
15459 
vkCmdResolveImage2(VkCommandBuffer commandBuffer,const VkResolveImageInfo2 * pResolveImageInfo,uint32_t doLock)15460 void VkEncoder::vkCmdResolveImage2(VkCommandBuffer commandBuffer,
15461                                    const VkResolveImageInfo2* pResolveImageInfo, uint32_t doLock) {
15462     (void)doLock;
15463     bool queueSubmitWithCommandsEnabled =
15464         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15465     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15466     auto stream = mImpl->stream();
15467     auto pool = mImpl->pool();
15468     VkCommandBuffer local_commandBuffer;
15469     VkResolveImageInfo2* local_pResolveImageInfo;
15470     local_commandBuffer = commandBuffer;
15471     local_pResolveImageInfo = nullptr;
15472     if (pResolveImageInfo) {
15473         local_pResolveImageInfo =
15474             (VkResolveImageInfo2*)pool->alloc(sizeof(const VkResolveImageInfo2));
15475         deepcopy_VkResolveImageInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pResolveImageInfo,
15476                                      (VkResolveImageInfo2*)(local_pResolveImageInfo));
15477     }
15478     if (local_pResolveImageInfo) {
15479         transform_tohost_VkResolveImageInfo2(sResourceTracker,
15480                                              (VkResolveImageInfo2*)(local_pResolveImageInfo));
15481     }
15482     size_t count = 0;
15483     size_t* countPtr = &count;
15484     {
15485         uint64_t cgen_var_0;
15486         *countPtr += 1 * 8;
15487         count_VkResolveImageInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
15488                                   (VkResolveImageInfo2*)(local_pResolveImageInfo), countPtr);
15489     }
15490     uint32_t packetSize_vkCmdResolveImage2 = 4 + 4 + count;
15491     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdResolveImage2 -= 8;
15492     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdResolveImage2);
15493     uint8_t* packetBeginPtr = streamPtr;
15494     uint8_t** streamPtrPtr = &streamPtr;
15495     uint32_t opcode_vkCmdResolveImage2 = OP_vkCmdResolveImage2;
15496     memcpy(streamPtr, &opcode_vkCmdResolveImage2, sizeof(uint32_t));
15497     streamPtr += sizeof(uint32_t);
15498     memcpy(streamPtr, &packetSize_vkCmdResolveImage2, sizeof(uint32_t));
15499     streamPtr += sizeof(uint32_t);
15500     if (!queueSubmitWithCommandsEnabled) {
15501         uint64_t cgen_var_0;
15502         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15503         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15504         *streamPtrPtr += 1 * 8;
15505     }
15506     reservedmarshal_VkResolveImageInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
15507                                         (VkResolveImageInfo2*)(local_pResolveImageInfo),
15508                                         streamPtrPtr);
15509     ++encodeCount;
15510     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15511         pool->freeAll();
15512         stream->clearPool();
15513     }
15514     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15515 }
15516 
vkCmdBeginRendering(VkCommandBuffer commandBuffer,const VkRenderingInfo * pRenderingInfo,uint32_t doLock)15517 void VkEncoder::vkCmdBeginRendering(VkCommandBuffer commandBuffer,
15518                                     const VkRenderingInfo* pRenderingInfo, uint32_t doLock) {
15519     (void)doLock;
15520     bool queueSubmitWithCommandsEnabled =
15521         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15522     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15523     auto stream = mImpl->stream();
15524     auto pool = mImpl->pool();
15525     VkCommandBuffer local_commandBuffer;
15526     VkRenderingInfo* local_pRenderingInfo;
15527     local_commandBuffer = commandBuffer;
15528     local_pRenderingInfo = nullptr;
15529     if (pRenderingInfo) {
15530         local_pRenderingInfo = (VkRenderingInfo*)pool->alloc(sizeof(const VkRenderingInfo));
15531         deepcopy_VkRenderingInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRenderingInfo,
15532                                  (VkRenderingInfo*)(local_pRenderingInfo));
15533     }
15534     if (local_pRenderingInfo) {
15535         transform_tohost_VkRenderingInfo(sResourceTracker,
15536                                          (VkRenderingInfo*)(local_pRenderingInfo));
15537     }
15538     size_t count = 0;
15539     size_t* countPtr = &count;
15540     {
15541         uint64_t cgen_var_0;
15542         *countPtr += 1 * 8;
15543         count_VkRenderingInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
15544                               (VkRenderingInfo*)(local_pRenderingInfo), countPtr);
15545     }
15546     uint32_t packetSize_vkCmdBeginRendering = 4 + 4 + count;
15547     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginRendering -= 8;
15548     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginRendering);
15549     uint8_t* packetBeginPtr = streamPtr;
15550     uint8_t** streamPtrPtr = &streamPtr;
15551     uint32_t opcode_vkCmdBeginRendering = OP_vkCmdBeginRendering;
15552     memcpy(streamPtr, &opcode_vkCmdBeginRendering, sizeof(uint32_t));
15553     streamPtr += sizeof(uint32_t);
15554     memcpy(streamPtr, &packetSize_vkCmdBeginRendering, sizeof(uint32_t));
15555     streamPtr += sizeof(uint32_t);
15556     if (!queueSubmitWithCommandsEnabled) {
15557         uint64_t cgen_var_0;
15558         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15559         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15560         *streamPtrPtr += 1 * 8;
15561     }
15562     reservedmarshal_VkRenderingInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
15563                                     (VkRenderingInfo*)(local_pRenderingInfo), streamPtrPtr);
15564     ++encodeCount;
15565     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15566         pool->freeAll();
15567         stream->clearPool();
15568     }
15569     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15570 }
15571 
vkCmdEndRendering(VkCommandBuffer commandBuffer,uint32_t doLock)15572 void VkEncoder::vkCmdEndRendering(VkCommandBuffer commandBuffer, uint32_t doLock) {
15573     (void)doLock;
15574     bool queueSubmitWithCommandsEnabled =
15575         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15576     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15577     auto stream = mImpl->stream();
15578     auto pool = mImpl->pool();
15579     VkCommandBuffer local_commandBuffer;
15580     local_commandBuffer = commandBuffer;
15581     size_t count = 0;
15582     size_t* countPtr = &count;
15583     {
15584         uint64_t cgen_var_0;
15585         *countPtr += 1 * 8;
15586     }
15587     uint32_t packetSize_vkCmdEndRendering = 4 + 4 + count;
15588     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdEndRendering -= 8;
15589     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndRendering);
15590     uint8_t* packetBeginPtr = streamPtr;
15591     uint8_t** streamPtrPtr = &streamPtr;
15592     uint32_t opcode_vkCmdEndRendering = OP_vkCmdEndRendering;
15593     memcpy(streamPtr, &opcode_vkCmdEndRendering, sizeof(uint32_t));
15594     streamPtr += sizeof(uint32_t);
15595     memcpy(streamPtr, &packetSize_vkCmdEndRendering, sizeof(uint32_t));
15596     streamPtr += sizeof(uint32_t);
15597     if (!queueSubmitWithCommandsEnabled) {
15598         uint64_t cgen_var_0;
15599         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15600         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15601         *streamPtrPtr += 1 * 8;
15602     }
15603     ++encodeCount;
15604     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15605         pool->freeAll();
15606         stream->clearPool();
15607     }
15608     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15609 }
15610 
vkCmdSetCullMode(VkCommandBuffer commandBuffer,VkCullModeFlags cullMode,uint32_t doLock)15611 void VkEncoder::vkCmdSetCullMode(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode,
15612                                  uint32_t doLock) {
15613     (void)doLock;
15614     bool queueSubmitWithCommandsEnabled =
15615         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15616     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15617     auto stream = mImpl->stream();
15618     auto pool = mImpl->pool();
15619     VkCommandBuffer local_commandBuffer;
15620     VkCullModeFlags local_cullMode;
15621     local_commandBuffer = commandBuffer;
15622     local_cullMode = cullMode;
15623     size_t count = 0;
15624     size_t* countPtr = &count;
15625     {
15626         uint64_t cgen_var_0;
15627         *countPtr += 1 * 8;
15628         *countPtr += sizeof(VkCullModeFlags);
15629     }
15630     uint32_t packetSize_vkCmdSetCullMode = 4 + 4 + count;
15631     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetCullMode -= 8;
15632     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetCullMode);
15633     uint8_t* packetBeginPtr = streamPtr;
15634     uint8_t** streamPtrPtr = &streamPtr;
15635     uint32_t opcode_vkCmdSetCullMode = OP_vkCmdSetCullMode;
15636     memcpy(streamPtr, &opcode_vkCmdSetCullMode, sizeof(uint32_t));
15637     streamPtr += sizeof(uint32_t);
15638     memcpy(streamPtr, &packetSize_vkCmdSetCullMode, sizeof(uint32_t));
15639     streamPtr += sizeof(uint32_t);
15640     if (!queueSubmitWithCommandsEnabled) {
15641         uint64_t cgen_var_0;
15642         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15643         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15644         *streamPtrPtr += 1 * 8;
15645     }
15646     memcpy(*streamPtrPtr, (VkCullModeFlags*)&local_cullMode, sizeof(VkCullModeFlags));
15647     *streamPtrPtr += sizeof(VkCullModeFlags);
15648     ++encodeCount;
15649     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15650         pool->freeAll();
15651         stream->clearPool();
15652     }
15653     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15654 }
15655 
vkCmdSetFrontFace(VkCommandBuffer commandBuffer,VkFrontFace frontFace,uint32_t doLock)15656 void VkEncoder::vkCmdSetFrontFace(VkCommandBuffer commandBuffer, VkFrontFace frontFace,
15657                                   uint32_t doLock) {
15658     (void)doLock;
15659     bool queueSubmitWithCommandsEnabled =
15660         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15661     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15662     auto stream = mImpl->stream();
15663     auto pool = mImpl->pool();
15664     VkCommandBuffer local_commandBuffer;
15665     VkFrontFace local_frontFace;
15666     local_commandBuffer = commandBuffer;
15667     local_frontFace = frontFace;
15668     size_t count = 0;
15669     size_t* countPtr = &count;
15670     {
15671         uint64_t cgen_var_0;
15672         *countPtr += 1 * 8;
15673         *countPtr += sizeof(VkFrontFace);
15674     }
15675     uint32_t packetSize_vkCmdSetFrontFace = 4 + 4 + count;
15676     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetFrontFace -= 8;
15677     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetFrontFace);
15678     uint8_t* packetBeginPtr = streamPtr;
15679     uint8_t** streamPtrPtr = &streamPtr;
15680     uint32_t opcode_vkCmdSetFrontFace = OP_vkCmdSetFrontFace;
15681     memcpy(streamPtr, &opcode_vkCmdSetFrontFace, sizeof(uint32_t));
15682     streamPtr += sizeof(uint32_t);
15683     memcpy(streamPtr, &packetSize_vkCmdSetFrontFace, sizeof(uint32_t));
15684     streamPtr += sizeof(uint32_t);
15685     if (!queueSubmitWithCommandsEnabled) {
15686         uint64_t cgen_var_0;
15687         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15688         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15689         *streamPtrPtr += 1 * 8;
15690     }
15691     memcpy(*streamPtrPtr, (VkFrontFace*)&local_frontFace, sizeof(VkFrontFace));
15692     *streamPtrPtr += sizeof(VkFrontFace);
15693     ++encodeCount;
15694     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15695         pool->freeAll();
15696         stream->clearPool();
15697     }
15698     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15699 }
15700 
vkCmdSetPrimitiveTopology(VkCommandBuffer commandBuffer,VkPrimitiveTopology primitiveTopology,uint32_t doLock)15701 void VkEncoder::vkCmdSetPrimitiveTopology(VkCommandBuffer commandBuffer,
15702                                           VkPrimitiveTopology primitiveTopology, uint32_t doLock) {
15703     (void)doLock;
15704     bool queueSubmitWithCommandsEnabled =
15705         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15706     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15707     auto stream = mImpl->stream();
15708     auto pool = mImpl->pool();
15709     VkCommandBuffer local_commandBuffer;
15710     VkPrimitiveTopology local_primitiveTopology;
15711     local_commandBuffer = commandBuffer;
15712     local_primitiveTopology = primitiveTopology;
15713     size_t count = 0;
15714     size_t* countPtr = &count;
15715     {
15716         uint64_t cgen_var_0;
15717         *countPtr += 1 * 8;
15718         *countPtr += sizeof(VkPrimitiveTopology);
15719     }
15720     uint32_t packetSize_vkCmdSetPrimitiveTopology = 4 + 4 + count;
15721     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetPrimitiveTopology -= 8;
15722     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetPrimitiveTopology);
15723     uint8_t* packetBeginPtr = streamPtr;
15724     uint8_t** streamPtrPtr = &streamPtr;
15725     uint32_t opcode_vkCmdSetPrimitiveTopology = OP_vkCmdSetPrimitiveTopology;
15726     memcpy(streamPtr, &opcode_vkCmdSetPrimitiveTopology, sizeof(uint32_t));
15727     streamPtr += sizeof(uint32_t);
15728     memcpy(streamPtr, &packetSize_vkCmdSetPrimitiveTopology, sizeof(uint32_t));
15729     streamPtr += sizeof(uint32_t);
15730     if (!queueSubmitWithCommandsEnabled) {
15731         uint64_t cgen_var_0;
15732         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15733         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15734         *streamPtrPtr += 1 * 8;
15735     }
15736     memcpy(*streamPtrPtr, (VkPrimitiveTopology*)&local_primitiveTopology,
15737            sizeof(VkPrimitiveTopology));
15738     *streamPtrPtr += sizeof(VkPrimitiveTopology);
15739     ++encodeCount;
15740     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15741         pool->freeAll();
15742         stream->clearPool();
15743     }
15744     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15745 }
15746 
vkCmdSetViewportWithCount(VkCommandBuffer commandBuffer,uint32_t viewportCount,const VkViewport * pViewports,uint32_t doLock)15747 void VkEncoder::vkCmdSetViewportWithCount(VkCommandBuffer commandBuffer, uint32_t viewportCount,
15748                                           const VkViewport* pViewports, uint32_t doLock) {
15749     (void)doLock;
15750     bool queueSubmitWithCommandsEnabled =
15751         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15752     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15753     auto stream = mImpl->stream();
15754     auto pool = mImpl->pool();
15755     VkCommandBuffer local_commandBuffer;
15756     uint32_t local_viewportCount;
15757     VkViewport* local_pViewports;
15758     local_commandBuffer = commandBuffer;
15759     local_viewportCount = viewportCount;
15760     local_pViewports = nullptr;
15761     if (pViewports) {
15762         local_pViewports = (VkViewport*)pool->alloc(((viewportCount)) * sizeof(const VkViewport));
15763         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
15764             deepcopy_VkViewport(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pViewports + i,
15765                                 (VkViewport*)(local_pViewports + i));
15766         }
15767     }
15768     if (local_pViewports) {
15769         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
15770             transform_tohost_VkViewport(sResourceTracker, (VkViewport*)(local_pViewports + i));
15771         }
15772     }
15773     size_t count = 0;
15774     size_t* countPtr = &count;
15775     {
15776         uint64_t cgen_var_0;
15777         *countPtr += 1 * 8;
15778         *countPtr += sizeof(uint32_t);
15779         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
15780             count_VkViewport(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
15781                              (VkViewport*)(local_pViewports + i), countPtr);
15782         }
15783     }
15784     uint32_t packetSize_vkCmdSetViewportWithCount = 4 + 4 + count;
15785     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetViewportWithCount -= 8;
15786     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetViewportWithCount);
15787     uint8_t* packetBeginPtr = streamPtr;
15788     uint8_t** streamPtrPtr = &streamPtr;
15789     uint32_t opcode_vkCmdSetViewportWithCount = OP_vkCmdSetViewportWithCount;
15790     memcpy(streamPtr, &opcode_vkCmdSetViewportWithCount, sizeof(uint32_t));
15791     streamPtr += sizeof(uint32_t);
15792     memcpy(streamPtr, &packetSize_vkCmdSetViewportWithCount, sizeof(uint32_t));
15793     streamPtr += sizeof(uint32_t);
15794     if (!queueSubmitWithCommandsEnabled) {
15795         uint64_t cgen_var_0;
15796         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15797         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15798         *streamPtrPtr += 1 * 8;
15799     }
15800     memcpy(*streamPtrPtr, (uint32_t*)&local_viewportCount, sizeof(uint32_t));
15801     *streamPtrPtr += sizeof(uint32_t);
15802     for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
15803         reservedmarshal_VkViewport(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
15804                                    (VkViewport*)(local_pViewports + i), streamPtrPtr);
15805     }
15806     ++encodeCount;
15807     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15808         pool->freeAll();
15809         stream->clearPool();
15810     }
15811     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15812 }
15813 
vkCmdSetScissorWithCount(VkCommandBuffer commandBuffer,uint32_t scissorCount,const VkRect2D * pScissors,uint32_t doLock)15814 void VkEncoder::vkCmdSetScissorWithCount(VkCommandBuffer commandBuffer, uint32_t scissorCount,
15815                                          const VkRect2D* pScissors, uint32_t doLock) {
15816     (void)doLock;
15817     bool queueSubmitWithCommandsEnabled =
15818         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15819     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15820     auto stream = mImpl->stream();
15821     auto pool = mImpl->pool();
15822     VkCommandBuffer local_commandBuffer;
15823     uint32_t local_scissorCount;
15824     VkRect2D* local_pScissors;
15825     local_commandBuffer = commandBuffer;
15826     local_scissorCount = scissorCount;
15827     local_pScissors = nullptr;
15828     if (pScissors) {
15829         local_pScissors = (VkRect2D*)pool->alloc(((scissorCount)) * sizeof(const VkRect2D));
15830         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
15831             deepcopy_VkRect2D(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pScissors + i,
15832                               (VkRect2D*)(local_pScissors + i));
15833         }
15834     }
15835     if (local_pScissors) {
15836         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
15837             transform_tohost_VkRect2D(sResourceTracker, (VkRect2D*)(local_pScissors + i));
15838         }
15839     }
15840     size_t count = 0;
15841     size_t* countPtr = &count;
15842     {
15843         uint64_t cgen_var_0;
15844         *countPtr += 1 * 8;
15845         *countPtr += sizeof(uint32_t);
15846         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
15847             count_VkRect2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
15848                            (VkRect2D*)(local_pScissors + i), countPtr);
15849         }
15850     }
15851     uint32_t packetSize_vkCmdSetScissorWithCount = 4 + 4 + count;
15852     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetScissorWithCount -= 8;
15853     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetScissorWithCount);
15854     uint8_t* packetBeginPtr = streamPtr;
15855     uint8_t** streamPtrPtr = &streamPtr;
15856     uint32_t opcode_vkCmdSetScissorWithCount = OP_vkCmdSetScissorWithCount;
15857     memcpy(streamPtr, &opcode_vkCmdSetScissorWithCount, sizeof(uint32_t));
15858     streamPtr += sizeof(uint32_t);
15859     memcpy(streamPtr, &packetSize_vkCmdSetScissorWithCount, sizeof(uint32_t));
15860     streamPtr += sizeof(uint32_t);
15861     if (!queueSubmitWithCommandsEnabled) {
15862         uint64_t cgen_var_0;
15863         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15864         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15865         *streamPtrPtr += 1 * 8;
15866     }
15867     memcpy(*streamPtrPtr, (uint32_t*)&local_scissorCount, sizeof(uint32_t));
15868     *streamPtrPtr += sizeof(uint32_t);
15869     for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
15870         reservedmarshal_VkRect2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
15871                                  (VkRect2D*)(local_pScissors + i), streamPtrPtr);
15872     }
15873     ++encodeCount;
15874     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15875         pool->freeAll();
15876         stream->clearPool();
15877     }
15878     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15879 }
15880 
vkCmdBindVertexBuffers2(VkCommandBuffer commandBuffer,uint32_t firstBinding,uint32_t bindingCount,const VkBuffer * pBuffers,const VkDeviceSize * pOffsets,const VkDeviceSize * pSizes,const VkDeviceSize * pStrides,uint32_t doLock)15881 void VkEncoder::vkCmdBindVertexBuffers2(VkCommandBuffer commandBuffer, uint32_t firstBinding,
15882                                         uint32_t bindingCount, const VkBuffer* pBuffers,
15883                                         const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes,
15884                                         const VkDeviceSize* pStrides, uint32_t doLock) {
15885     (void)doLock;
15886     bool queueSubmitWithCommandsEnabled =
15887         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
15888     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
15889     auto stream = mImpl->stream();
15890     auto pool = mImpl->pool();
15891     VkCommandBuffer local_commandBuffer;
15892     uint32_t local_firstBinding;
15893     uint32_t local_bindingCount;
15894     VkBuffer* local_pBuffers;
15895     VkDeviceSize* local_pOffsets;
15896     VkDeviceSize* local_pSizes;
15897     VkDeviceSize* local_pStrides;
15898     local_commandBuffer = commandBuffer;
15899     local_firstBinding = firstBinding;
15900     local_bindingCount = bindingCount;
15901     // Avoiding deepcopy for pBuffers
15902     local_pBuffers = (VkBuffer*)pBuffers;
15903     // Avoiding deepcopy for pOffsets
15904     local_pOffsets = (VkDeviceSize*)pOffsets;
15905     // Avoiding deepcopy for pSizes
15906     local_pSizes = (VkDeviceSize*)pSizes;
15907     // Avoiding deepcopy for pStrides
15908     local_pStrides = (VkDeviceSize*)pStrides;
15909     size_t count = 0;
15910     size_t* countPtr = &count;
15911     {
15912         uint64_t cgen_var_0;
15913         *countPtr += 1 * 8;
15914         *countPtr += sizeof(uint32_t);
15915         *countPtr += sizeof(uint32_t);
15916         // WARNING PTR CHECK
15917         *countPtr += 8;
15918         if (local_pBuffers) {
15919             if (((bindingCount))) {
15920                 *countPtr += ((bindingCount)) * 8;
15921             }
15922         }
15923         *countPtr += ((bindingCount)) * sizeof(VkDeviceSize);
15924         // WARNING PTR CHECK
15925         *countPtr += 8;
15926         if (local_pSizes) {
15927             *countPtr += ((bindingCount)) * sizeof(VkDeviceSize);
15928         }
15929         // WARNING PTR CHECK
15930         *countPtr += 8;
15931         if (local_pStrides) {
15932             *countPtr += ((bindingCount)) * sizeof(VkDeviceSize);
15933         }
15934     }
15935     uint32_t packetSize_vkCmdBindVertexBuffers2 = 4 + 4 + count;
15936     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBindVertexBuffers2 -= 8;
15937     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindVertexBuffers2);
15938     uint8_t* packetBeginPtr = streamPtr;
15939     uint8_t** streamPtrPtr = &streamPtr;
15940     uint32_t opcode_vkCmdBindVertexBuffers2 = OP_vkCmdBindVertexBuffers2;
15941     memcpy(streamPtr, &opcode_vkCmdBindVertexBuffers2, sizeof(uint32_t));
15942     streamPtr += sizeof(uint32_t);
15943     memcpy(streamPtr, &packetSize_vkCmdBindVertexBuffers2, sizeof(uint32_t));
15944     streamPtr += sizeof(uint32_t);
15945     if (!queueSubmitWithCommandsEnabled) {
15946         uint64_t cgen_var_0;
15947         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
15948         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
15949         *streamPtrPtr += 1 * 8;
15950     }
15951     memcpy(*streamPtrPtr, (uint32_t*)&local_firstBinding, sizeof(uint32_t));
15952     *streamPtrPtr += sizeof(uint32_t);
15953     memcpy(*streamPtrPtr, (uint32_t*)&local_bindingCount, sizeof(uint32_t));
15954     *streamPtrPtr += sizeof(uint32_t);
15955     // WARNING PTR CHECK
15956     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)local_pBuffers;
15957     memcpy((*streamPtrPtr), &cgen_var_0, 8);
15958     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
15959     *streamPtrPtr += 8;
15960     if (local_pBuffers) {
15961         if (((bindingCount))) {
15962             uint8_t* cgen_var_0_0_ptr = (uint8_t*)(*streamPtrPtr);
15963             for (uint32_t k = 0; k < ((bindingCount)); ++k) {
15964                 uint64_t tmpval = get_host_u64_VkBuffer(local_pBuffers[k]);
15965                 memcpy(cgen_var_0_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
15966             }
15967             *streamPtrPtr += 8 * ((bindingCount));
15968         }
15969     }
15970     memcpy(*streamPtrPtr, (VkDeviceSize*)local_pOffsets, ((bindingCount)) * sizeof(VkDeviceSize));
15971     *streamPtrPtr += ((bindingCount)) * sizeof(VkDeviceSize);
15972     // WARNING PTR CHECK
15973     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pSizes;
15974     memcpy((*streamPtrPtr), &cgen_var_1, 8);
15975     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
15976     *streamPtrPtr += 8;
15977     if (local_pSizes) {
15978         memcpy(*streamPtrPtr, (VkDeviceSize*)local_pSizes, ((bindingCount)) * sizeof(VkDeviceSize));
15979         *streamPtrPtr += ((bindingCount)) * sizeof(VkDeviceSize);
15980     }
15981     // WARNING PTR CHECK
15982     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pStrides;
15983     memcpy((*streamPtrPtr), &cgen_var_2, 8);
15984     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
15985     *streamPtrPtr += 8;
15986     if (local_pStrides) {
15987         memcpy(*streamPtrPtr, (VkDeviceSize*)local_pStrides,
15988                ((bindingCount)) * sizeof(VkDeviceSize));
15989         *streamPtrPtr += ((bindingCount)) * sizeof(VkDeviceSize);
15990     }
15991     ++encodeCount;
15992     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
15993         pool->freeAll();
15994         stream->clearPool();
15995     }
15996     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
15997 }
15998 
vkCmdSetDepthTestEnable(VkCommandBuffer commandBuffer,VkBool32 depthTestEnable,uint32_t doLock)15999 void VkEncoder::vkCmdSetDepthTestEnable(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable,
16000                                         uint32_t doLock) {
16001     (void)doLock;
16002     bool queueSubmitWithCommandsEnabled =
16003         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16004     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16005     auto stream = mImpl->stream();
16006     auto pool = mImpl->pool();
16007     VkCommandBuffer local_commandBuffer;
16008     VkBool32 local_depthTestEnable;
16009     local_commandBuffer = commandBuffer;
16010     local_depthTestEnable = depthTestEnable;
16011     size_t count = 0;
16012     size_t* countPtr = &count;
16013     {
16014         uint64_t cgen_var_0;
16015         *countPtr += 1 * 8;
16016         *countPtr += sizeof(VkBool32);
16017     }
16018     uint32_t packetSize_vkCmdSetDepthTestEnable = 4 + 4 + count;
16019     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthTestEnable -= 8;
16020     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthTestEnable);
16021     uint8_t* packetBeginPtr = streamPtr;
16022     uint8_t** streamPtrPtr = &streamPtr;
16023     uint32_t opcode_vkCmdSetDepthTestEnable = OP_vkCmdSetDepthTestEnable;
16024     memcpy(streamPtr, &opcode_vkCmdSetDepthTestEnable, sizeof(uint32_t));
16025     streamPtr += sizeof(uint32_t);
16026     memcpy(streamPtr, &packetSize_vkCmdSetDepthTestEnable, sizeof(uint32_t));
16027     streamPtr += sizeof(uint32_t);
16028     if (!queueSubmitWithCommandsEnabled) {
16029         uint64_t cgen_var_0;
16030         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
16031         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16032         *streamPtrPtr += 1 * 8;
16033     }
16034     memcpy(*streamPtrPtr, (VkBool32*)&local_depthTestEnable, sizeof(VkBool32));
16035     *streamPtrPtr += sizeof(VkBool32);
16036     ++encodeCount;
16037     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16038         pool->freeAll();
16039         stream->clearPool();
16040     }
16041     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16042 }
16043 
vkCmdSetDepthWriteEnable(VkCommandBuffer commandBuffer,VkBool32 depthWriteEnable,uint32_t doLock)16044 void VkEncoder::vkCmdSetDepthWriteEnable(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable,
16045                                          uint32_t doLock) {
16046     (void)doLock;
16047     bool queueSubmitWithCommandsEnabled =
16048         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16049     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16050     auto stream = mImpl->stream();
16051     auto pool = mImpl->pool();
16052     VkCommandBuffer local_commandBuffer;
16053     VkBool32 local_depthWriteEnable;
16054     local_commandBuffer = commandBuffer;
16055     local_depthWriteEnable = depthWriteEnable;
16056     size_t count = 0;
16057     size_t* countPtr = &count;
16058     {
16059         uint64_t cgen_var_0;
16060         *countPtr += 1 * 8;
16061         *countPtr += sizeof(VkBool32);
16062     }
16063     uint32_t packetSize_vkCmdSetDepthWriteEnable = 4 + 4 + count;
16064     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthWriteEnable -= 8;
16065     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthWriteEnable);
16066     uint8_t* packetBeginPtr = streamPtr;
16067     uint8_t** streamPtrPtr = &streamPtr;
16068     uint32_t opcode_vkCmdSetDepthWriteEnable = OP_vkCmdSetDepthWriteEnable;
16069     memcpy(streamPtr, &opcode_vkCmdSetDepthWriteEnable, sizeof(uint32_t));
16070     streamPtr += sizeof(uint32_t);
16071     memcpy(streamPtr, &packetSize_vkCmdSetDepthWriteEnable, sizeof(uint32_t));
16072     streamPtr += sizeof(uint32_t);
16073     if (!queueSubmitWithCommandsEnabled) {
16074         uint64_t cgen_var_0;
16075         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
16076         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16077         *streamPtrPtr += 1 * 8;
16078     }
16079     memcpy(*streamPtrPtr, (VkBool32*)&local_depthWriteEnable, sizeof(VkBool32));
16080     *streamPtrPtr += sizeof(VkBool32);
16081     ++encodeCount;
16082     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16083         pool->freeAll();
16084         stream->clearPool();
16085     }
16086     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16087 }
16088 
vkCmdSetDepthCompareOp(VkCommandBuffer commandBuffer,VkCompareOp depthCompareOp,uint32_t doLock)16089 void VkEncoder::vkCmdSetDepthCompareOp(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp,
16090                                        uint32_t doLock) {
16091     (void)doLock;
16092     bool queueSubmitWithCommandsEnabled =
16093         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16094     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16095     auto stream = mImpl->stream();
16096     auto pool = mImpl->pool();
16097     VkCommandBuffer local_commandBuffer;
16098     VkCompareOp local_depthCompareOp;
16099     local_commandBuffer = commandBuffer;
16100     local_depthCompareOp = depthCompareOp;
16101     size_t count = 0;
16102     size_t* countPtr = &count;
16103     {
16104         uint64_t cgen_var_0;
16105         *countPtr += 1 * 8;
16106         *countPtr += sizeof(VkCompareOp);
16107     }
16108     uint32_t packetSize_vkCmdSetDepthCompareOp = 4 + 4 + count;
16109     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthCompareOp -= 8;
16110     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthCompareOp);
16111     uint8_t* packetBeginPtr = streamPtr;
16112     uint8_t** streamPtrPtr = &streamPtr;
16113     uint32_t opcode_vkCmdSetDepthCompareOp = OP_vkCmdSetDepthCompareOp;
16114     memcpy(streamPtr, &opcode_vkCmdSetDepthCompareOp, sizeof(uint32_t));
16115     streamPtr += sizeof(uint32_t);
16116     memcpy(streamPtr, &packetSize_vkCmdSetDepthCompareOp, sizeof(uint32_t));
16117     streamPtr += sizeof(uint32_t);
16118     if (!queueSubmitWithCommandsEnabled) {
16119         uint64_t cgen_var_0;
16120         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
16121         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16122         *streamPtrPtr += 1 * 8;
16123     }
16124     memcpy(*streamPtrPtr, (VkCompareOp*)&local_depthCompareOp, sizeof(VkCompareOp));
16125     *streamPtrPtr += sizeof(VkCompareOp);
16126     ++encodeCount;
16127     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16128         pool->freeAll();
16129         stream->clearPool();
16130     }
16131     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16132 }
16133 
vkCmdSetDepthBoundsTestEnable(VkCommandBuffer commandBuffer,VkBool32 depthBoundsTestEnable,uint32_t doLock)16134 void VkEncoder::vkCmdSetDepthBoundsTestEnable(VkCommandBuffer commandBuffer,
16135                                               VkBool32 depthBoundsTestEnable, uint32_t doLock) {
16136     (void)doLock;
16137     bool queueSubmitWithCommandsEnabled =
16138         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16139     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16140     auto stream = mImpl->stream();
16141     auto pool = mImpl->pool();
16142     VkCommandBuffer local_commandBuffer;
16143     VkBool32 local_depthBoundsTestEnable;
16144     local_commandBuffer = commandBuffer;
16145     local_depthBoundsTestEnable = depthBoundsTestEnable;
16146     size_t count = 0;
16147     size_t* countPtr = &count;
16148     {
16149         uint64_t cgen_var_0;
16150         *countPtr += 1 * 8;
16151         *countPtr += sizeof(VkBool32);
16152     }
16153     uint32_t packetSize_vkCmdSetDepthBoundsTestEnable = 4 + 4 + count;
16154     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthBoundsTestEnable -= 8;
16155     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthBoundsTestEnable);
16156     uint8_t* packetBeginPtr = streamPtr;
16157     uint8_t** streamPtrPtr = &streamPtr;
16158     uint32_t opcode_vkCmdSetDepthBoundsTestEnable = OP_vkCmdSetDepthBoundsTestEnable;
16159     memcpy(streamPtr, &opcode_vkCmdSetDepthBoundsTestEnable, sizeof(uint32_t));
16160     streamPtr += sizeof(uint32_t);
16161     memcpy(streamPtr, &packetSize_vkCmdSetDepthBoundsTestEnable, sizeof(uint32_t));
16162     streamPtr += sizeof(uint32_t);
16163     if (!queueSubmitWithCommandsEnabled) {
16164         uint64_t cgen_var_0;
16165         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
16166         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16167         *streamPtrPtr += 1 * 8;
16168     }
16169     memcpy(*streamPtrPtr, (VkBool32*)&local_depthBoundsTestEnable, sizeof(VkBool32));
16170     *streamPtrPtr += sizeof(VkBool32);
16171     ++encodeCount;
16172     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16173         pool->freeAll();
16174         stream->clearPool();
16175     }
16176     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16177 }
16178 
vkCmdSetStencilTestEnable(VkCommandBuffer commandBuffer,VkBool32 stencilTestEnable,uint32_t doLock)16179 void VkEncoder::vkCmdSetStencilTestEnable(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable,
16180                                           uint32_t doLock) {
16181     (void)doLock;
16182     bool queueSubmitWithCommandsEnabled =
16183         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16184     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16185     auto stream = mImpl->stream();
16186     auto pool = mImpl->pool();
16187     VkCommandBuffer local_commandBuffer;
16188     VkBool32 local_stencilTestEnable;
16189     local_commandBuffer = commandBuffer;
16190     local_stencilTestEnable = stencilTestEnable;
16191     size_t count = 0;
16192     size_t* countPtr = &count;
16193     {
16194         uint64_t cgen_var_0;
16195         *countPtr += 1 * 8;
16196         *countPtr += sizeof(VkBool32);
16197     }
16198     uint32_t packetSize_vkCmdSetStencilTestEnable = 4 + 4 + count;
16199     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetStencilTestEnable -= 8;
16200     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetStencilTestEnable);
16201     uint8_t* packetBeginPtr = streamPtr;
16202     uint8_t** streamPtrPtr = &streamPtr;
16203     uint32_t opcode_vkCmdSetStencilTestEnable = OP_vkCmdSetStencilTestEnable;
16204     memcpy(streamPtr, &opcode_vkCmdSetStencilTestEnable, sizeof(uint32_t));
16205     streamPtr += sizeof(uint32_t);
16206     memcpy(streamPtr, &packetSize_vkCmdSetStencilTestEnable, sizeof(uint32_t));
16207     streamPtr += sizeof(uint32_t);
16208     if (!queueSubmitWithCommandsEnabled) {
16209         uint64_t cgen_var_0;
16210         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
16211         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16212         *streamPtrPtr += 1 * 8;
16213     }
16214     memcpy(*streamPtrPtr, (VkBool32*)&local_stencilTestEnable, sizeof(VkBool32));
16215     *streamPtrPtr += sizeof(VkBool32);
16216     ++encodeCount;
16217     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16218         pool->freeAll();
16219         stream->clearPool();
16220     }
16221     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16222 }
16223 
vkCmdSetStencilOp(VkCommandBuffer commandBuffer,VkStencilFaceFlags faceMask,VkStencilOp failOp,VkStencilOp passOp,VkStencilOp depthFailOp,VkCompareOp compareOp,uint32_t doLock)16224 void VkEncoder::vkCmdSetStencilOp(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
16225                                   VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
16226                                   VkCompareOp compareOp, uint32_t doLock) {
16227     (void)doLock;
16228     bool queueSubmitWithCommandsEnabled =
16229         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16230     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16231     auto stream = mImpl->stream();
16232     auto pool = mImpl->pool();
16233     VkCommandBuffer local_commandBuffer;
16234     VkStencilFaceFlags local_faceMask;
16235     VkStencilOp local_failOp;
16236     VkStencilOp local_passOp;
16237     VkStencilOp local_depthFailOp;
16238     VkCompareOp local_compareOp;
16239     local_commandBuffer = commandBuffer;
16240     local_faceMask = faceMask;
16241     local_failOp = failOp;
16242     local_passOp = passOp;
16243     local_depthFailOp = depthFailOp;
16244     local_compareOp = compareOp;
16245     size_t count = 0;
16246     size_t* countPtr = &count;
16247     {
16248         uint64_t cgen_var_0;
16249         *countPtr += 1 * 8;
16250         *countPtr += sizeof(VkStencilFaceFlags);
16251         *countPtr += sizeof(VkStencilOp);
16252         *countPtr += sizeof(VkStencilOp);
16253         *countPtr += sizeof(VkStencilOp);
16254         *countPtr += sizeof(VkCompareOp);
16255     }
16256     uint32_t packetSize_vkCmdSetStencilOp = 4 + 4 + count;
16257     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetStencilOp -= 8;
16258     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetStencilOp);
16259     uint8_t* packetBeginPtr = streamPtr;
16260     uint8_t** streamPtrPtr = &streamPtr;
16261     uint32_t opcode_vkCmdSetStencilOp = OP_vkCmdSetStencilOp;
16262     memcpy(streamPtr, &opcode_vkCmdSetStencilOp, sizeof(uint32_t));
16263     streamPtr += sizeof(uint32_t);
16264     memcpy(streamPtr, &packetSize_vkCmdSetStencilOp, sizeof(uint32_t));
16265     streamPtr += sizeof(uint32_t);
16266     if (!queueSubmitWithCommandsEnabled) {
16267         uint64_t cgen_var_0;
16268         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
16269         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16270         *streamPtrPtr += 1 * 8;
16271     }
16272     memcpy(*streamPtrPtr, (VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
16273     *streamPtrPtr += sizeof(VkStencilFaceFlags);
16274     memcpy(*streamPtrPtr, (VkStencilOp*)&local_failOp, sizeof(VkStencilOp));
16275     *streamPtrPtr += sizeof(VkStencilOp);
16276     memcpy(*streamPtrPtr, (VkStencilOp*)&local_passOp, sizeof(VkStencilOp));
16277     *streamPtrPtr += sizeof(VkStencilOp);
16278     memcpy(*streamPtrPtr, (VkStencilOp*)&local_depthFailOp, sizeof(VkStencilOp));
16279     *streamPtrPtr += sizeof(VkStencilOp);
16280     memcpy(*streamPtrPtr, (VkCompareOp*)&local_compareOp, sizeof(VkCompareOp));
16281     *streamPtrPtr += sizeof(VkCompareOp);
16282     ++encodeCount;
16283     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16284         pool->freeAll();
16285         stream->clearPool();
16286     }
16287     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16288 }
16289 
vkCmdSetRasterizerDiscardEnable(VkCommandBuffer commandBuffer,VkBool32 rasterizerDiscardEnable,uint32_t doLock)16290 void VkEncoder::vkCmdSetRasterizerDiscardEnable(VkCommandBuffer commandBuffer,
16291                                                 VkBool32 rasterizerDiscardEnable, uint32_t doLock) {
16292     (void)doLock;
16293     bool queueSubmitWithCommandsEnabled =
16294         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16295     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16296     auto stream = mImpl->stream();
16297     auto pool = mImpl->pool();
16298     VkCommandBuffer local_commandBuffer;
16299     VkBool32 local_rasterizerDiscardEnable;
16300     local_commandBuffer = commandBuffer;
16301     local_rasterizerDiscardEnable = rasterizerDiscardEnable;
16302     size_t count = 0;
16303     size_t* countPtr = &count;
16304     {
16305         uint64_t cgen_var_0;
16306         *countPtr += 1 * 8;
16307         *countPtr += sizeof(VkBool32);
16308     }
16309     uint32_t packetSize_vkCmdSetRasterizerDiscardEnable = 4 + 4 + count;
16310     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetRasterizerDiscardEnable -= 8;
16311     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetRasterizerDiscardEnable);
16312     uint8_t* packetBeginPtr = streamPtr;
16313     uint8_t** streamPtrPtr = &streamPtr;
16314     uint32_t opcode_vkCmdSetRasterizerDiscardEnable = OP_vkCmdSetRasterizerDiscardEnable;
16315     memcpy(streamPtr, &opcode_vkCmdSetRasterizerDiscardEnable, sizeof(uint32_t));
16316     streamPtr += sizeof(uint32_t);
16317     memcpy(streamPtr, &packetSize_vkCmdSetRasterizerDiscardEnable, sizeof(uint32_t));
16318     streamPtr += sizeof(uint32_t);
16319     if (!queueSubmitWithCommandsEnabled) {
16320         uint64_t cgen_var_0;
16321         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
16322         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16323         *streamPtrPtr += 1 * 8;
16324     }
16325     memcpy(*streamPtrPtr, (VkBool32*)&local_rasterizerDiscardEnable, sizeof(VkBool32));
16326     *streamPtrPtr += sizeof(VkBool32);
16327     ++encodeCount;
16328     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16329         pool->freeAll();
16330         stream->clearPool();
16331     }
16332     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16333 }
16334 
vkCmdSetDepthBiasEnable(VkCommandBuffer commandBuffer,VkBool32 depthBiasEnable,uint32_t doLock)16335 void VkEncoder::vkCmdSetDepthBiasEnable(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable,
16336                                         uint32_t doLock) {
16337     (void)doLock;
16338     bool queueSubmitWithCommandsEnabled =
16339         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16340     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16341     auto stream = mImpl->stream();
16342     auto pool = mImpl->pool();
16343     VkCommandBuffer local_commandBuffer;
16344     VkBool32 local_depthBiasEnable;
16345     local_commandBuffer = commandBuffer;
16346     local_depthBiasEnable = depthBiasEnable;
16347     size_t count = 0;
16348     size_t* countPtr = &count;
16349     {
16350         uint64_t cgen_var_0;
16351         *countPtr += 1 * 8;
16352         *countPtr += sizeof(VkBool32);
16353     }
16354     uint32_t packetSize_vkCmdSetDepthBiasEnable = 4 + 4 + count;
16355     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthBiasEnable -= 8;
16356     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthBiasEnable);
16357     uint8_t* packetBeginPtr = streamPtr;
16358     uint8_t** streamPtrPtr = &streamPtr;
16359     uint32_t opcode_vkCmdSetDepthBiasEnable = OP_vkCmdSetDepthBiasEnable;
16360     memcpy(streamPtr, &opcode_vkCmdSetDepthBiasEnable, sizeof(uint32_t));
16361     streamPtr += sizeof(uint32_t);
16362     memcpy(streamPtr, &packetSize_vkCmdSetDepthBiasEnable, sizeof(uint32_t));
16363     streamPtr += sizeof(uint32_t);
16364     if (!queueSubmitWithCommandsEnabled) {
16365         uint64_t cgen_var_0;
16366         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
16367         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16368         *streamPtrPtr += 1 * 8;
16369     }
16370     memcpy(*streamPtrPtr, (VkBool32*)&local_depthBiasEnable, sizeof(VkBool32));
16371     *streamPtrPtr += sizeof(VkBool32);
16372     ++encodeCount;
16373     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16374         pool->freeAll();
16375         stream->clearPool();
16376     }
16377     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16378 }
16379 
vkCmdSetPrimitiveRestartEnable(VkCommandBuffer commandBuffer,VkBool32 primitiveRestartEnable,uint32_t doLock)16380 void VkEncoder::vkCmdSetPrimitiveRestartEnable(VkCommandBuffer commandBuffer,
16381                                                VkBool32 primitiveRestartEnable, uint32_t doLock) {
16382     (void)doLock;
16383     bool queueSubmitWithCommandsEnabled =
16384         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16385     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16386     auto stream = mImpl->stream();
16387     auto pool = mImpl->pool();
16388     VkCommandBuffer local_commandBuffer;
16389     VkBool32 local_primitiveRestartEnable;
16390     local_commandBuffer = commandBuffer;
16391     local_primitiveRestartEnable = primitiveRestartEnable;
16392     size_t count = 0;
16393     size_t* countPtr = &count;
16394     {
16395         uint64_t cgen_var_0;
16396         *countPtr += 1 * 8;
16397         *countPtr += sizeof(VkBool32);
16398     }
16399     uint32_t packetSize_vkCmdSetPrimitiveRestartEnable = 4 + 4 + count;
16400     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetPrimitiveRestartEnable -= 8;
16401     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetPrimitiveRestartEnable);
16402     uint8_t* packetBeginPtr = streamPtr;
16403     uint8_t** streamPtrPtr = &streamPtr;
16404     uint32_t opcode_vkCmdSetPrimitiveRestartEnable = OP_vkCmdSetPrimitiveRestartEnable;
16405     memcpy(streamPtr, &opcode_vkCmdSetPrimitiveRestartEnable, sizeof(uint32_t));
16406     streamPtr += sizeof(uint32_t);
16407     memcpy(streamPtr, &packetSize_vkCmdSetPrimitiveRestartEnable, sizeof(uint32_t));
16408     streamPtr += sizeof(uint32_t);
16409     if (!queueSubmitWithCommandsEnabled) {
16410         uint64_t cgen_var_0;
16411         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
16412         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16413         *streamPtrPtr += 1 * 8;
16414     }
16415     memcpy(*streamPtrPtr, (VkBool32*)&local_primitiveRestartEnable, sizeof(VkBool32));
16416     *streamPtrPtr += sizeof(VkBool32);
16417     ++encodeCount;
16418     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16419         pool->freeAll();
16420         stream->clearPool();
16421     }
16422     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16423 }
16424 
vkGetDeviceBufferMemoryRequirements(VkDevice device,const VkDeviceBufferMemoryRequirements * pInfo,VkMemoryRequirements2 * pMemoryRequirements,uint32_t doLock)16425 void VkEncoder::vkGetDeviceBufferMemoryRequirements(VkDevice device,
16426                                                     const VkDeviceBufferMemoryRequirements* pInfo,
16427                                                     VkMemoryRequirements2* pMemoryRequirements,
16428                                                     uint32_t doLock) {
16429     (void)doLock;
16430     bool queueSubmitWithCommandsEnabled =
16431         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16432     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16433     auto stream = mImpl->stream();
16434     auto pool = mImpl->pool();
16435     VkDevice local_device;
16436     VkDeviceBufferMemoryRequirements* local_pInfo;
16437     local_device = device;
16438     local_pInfo = nullptr;
16439     if (pInfo) {
16440         local_pInfo = (VkDeviceBufferMemoryRequirements*)pool->alloc(
16441             sizeof(const VkDeviceBufferMemoryRequirements));
16442         deepcopy_VkDeviceBufferMemoryRequirements(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
16443                                                   (VkDeviceBufferMemoryRequirements*)(local_pInfo));
16444     }
16445     if (local_pInfo) {
16446         transform_tohost_VkDeviceBufferMemoryRequirements(
16447             sResourceTracker, (VkDeviceBufferMemoryRequirements*)(local_pInfo));
16448     }
16449     size_t count = 0;
16450     size_t* countPtr = &count;
16451     {
16452         uint64_t cgen_var_0;
16453         *countPtr += 1 * 8;
16454         count_VkDeviceBufferMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
16455                                                (VkDeviceBufferMemoryRequirements*)(local_pInfo),
16456                                                countPtr);
16457         count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
16458                                     (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
16459     }
16460     uint32_t packetSize_vkGetDeviceBufferMemoryRequirements =
16461         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
16462     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceBufferMemoryRequirements);
16463     uint8_t* packetBeginPtr = streamPtr;
16464     uint8_t** streamPtrPtr = &streamPtr;
16465     uint32_t opcode_vkGetDeviceBufferMemoryRequirements = OP_vkGetDeviceBufferMemoryRequirements;
16466     uint32_t seqno;
16467     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
16468     memcpy(streamPtr, &opcode_vkGetDeviceBufferMemoryRequirements, sizeof(uint32_t));
16469     streamPtr += sizeof(uint32_t);
16470     memcpy(streamPtr, &packetSize_vkGetDeviceBufferMemoryRequirements, sizeof(uint32_t));
16471     streamPtr += sizeof(uint32_t);
16472     if (queueSubmitWithCommandsEnabled) {
16473         memcpy(streamPtr, &seqno, sizeof(uint32_t));
16474         streamPtr += sizeof(uint32_t);
16475     }
16476     uint64_t cgen_var_0;
16477     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
16478     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16479     *streamPtrPtr += 1 * 8;
16480     reservedmarshal_VkDeviceBufferMemoryRequirements(
16481         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceBufferMemoryRequirements*)(local_pInfo),
16482         streamPtrPtr);
16483     reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16484                                           (VkMemoryRequirements2*)(pMemoryRequirements),
16485                                           streamPtrPtr);
16486     unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16487                                     (VkMemoryRequirements2*)(pMemoryRequirements));
16488     if (pMemoryRequirements) {
16489         transform_fromhost_VkMemoryRequirements2(sResourceTracker,
16490                                                  (VkMemoryRequirements2*)(pMemoryRequirements));
16491     }
16492     ++encodeCount;
16493     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16494         pool->freeAll();
16495         stream->clearPool();
16496     }
16497     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16498 }
16499 
vkGetDeviceImageMemoryRequirements(VkDevice device,const VkDeviceImageMemoryRequirements * pInfo,VkMemoryRequirements2 * pMemoryRequirements,uint32_t doLock)16500 void VkEncoder::vkGetDeviceImageMemoryRequirements(VkDevice device,
16501                                                    const VkDeviceImageMemoryRequirements* pInfo,
16502                                                    VkMemoryRequirements2* pMemoryRequirements,
16503                                                    uint32_t doLock) {
16504     (void)doLock;
16505     bool queueSubmitWithCommandsEnabled =
16506         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16507     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16508     auto stream = mImpl->stream();
16509     auto pool = mImpl->pool();
16510     VkDevice local_device;
16511     VkDeviceImageMemoryRequirements* local_pInfo;
16512     local_device = device;
16513     local_pInfo = nullptr;
16514     if (pInfo) {
16515         local_pInfo = (VkDeviceImageMemoryRequirements*)pool->alloc(
16516             sizeof(const VkDeviceImageMemoryRequirements));
16517         deepcopy_VkDeviceImageMemoryRequirements(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
16518                                                  (VkDeviceImageMemoryRequirements*)(local_pInfo));
16519     }
16520     if (local_pInfo) {
16521         transform_tohost_VkDeviceImageMemoryRequirements(
16522             sResourceTracker, (VkDeviceImageMemoryRequirements*)(local_pInfo));
16523     }
16524     size_t count = 0;
16525     size_t* countPtr = &count;
16526     {
16527         uint64_t cgen_var_0;
16528         *countPtr += 1 * 8;
16529         count_VkDeviceImageMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
16530                                               (VkDeviceImageMemoryRequirements*)(local_pInfo),
16531                                               countPtr);
16532         count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
16533                                     (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
16534     }
16535     uint32_t packetSize_vkGetDeviceImageMemoryRequirements =
16536         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
16537     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceImageMemoryRequirements);
16538     uint8_t* packetBeginPtr = streamPtr;
16539     uint8_t** streamPtrPtr = &streamPtr;
16540     uint32_t opcode_vkGetDeviceImageMemoryRequirements = OP_vkGetDeviceImageMemoryRequirements;
16541     uint32_t seqno;
16542     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
16543     memcpy(streamPtr, &opcode_vkGetDeviceImageMemoryRequirements, sizeof(uint32_t));
16544     streamPtr += sizeof(uint32_t);
16545     memcpy(streamPtr, &packetSize_vkGetDeviceImageMemoryRequirements, sizeof(uint32_t));
16546     streamPtr += sizeof(uint32_t);
16547     if (queueSubmitWithCommandsEnabled) {
16548         memcpy(streamPtr, &seqno, sizeof(uint32_t));
16549         streamPtr += sizeof(uint32_t);
16550     }
16551     uint64_t cgen_var_0;
16552     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
16553     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16554     *streamPtrPtr += 1 * 8;
16555     reservedmarshal_VkDeviceImageMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16556                                                     (VkDeviceImageMemoryRequirements*)(local_pInfo),
16557                                                     streamPtrPtr);
16558     reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16559                                           (VkMemoryRequirements2*)(pMemoryRequirements),
16560                                           streamPtrPtr);
16561     unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16562                                     (VkMemoryRequirements2*)(pMemoryRequirements));
16563     if (pMemoryRequirements) {
16564         transform_fromhost_VkMemoryRequirements2(sResourceTracker,
16565                                                  (VkMemoryRequirements2*)(pMemoryRequirements));
16566     }
16567     ++encodeCount;
16568     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16569         pool->freeAll();
16570         stream->clearPool();
16571     }
16572     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16573 }
16574 
vkGetDeviceImageSparseMemoryRequirements(VkDevice device,const VkDeviceImageMemoryRequirements * pInfo,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements2 * pSparseMemoryRequirements,uint32_t doLock)16575 void VkEncoder::vkGetDeviceImageSparseMemoryRequirements(
16576     VkDevice device, const VkDeviceImageMemoryRequirements* pInfo,
16577     uint32_t* pSparseMemoryRequirementCount,
16578     VkSparseImageMemoryRequirements2* pSparseMemoryRequirements, uint32_t doLock) {
16579     (void)doLock;
16580     bool queueSubmitWithCommandsEnabled =
16581         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16582     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16583     auto stream = mImpl->stream();
16584     auto pool = mImpl->pool();
16585     VkDevice local_device;
16586     VkDeviceImageMemoryRequirements* local_pInfo;
16587     local_device = device;
16588     local_pInfo = nullptr;
16589     if (pInfo) {
16590         local_pInfo = (VkDeviceImageMemoryRequirements*)pool->alloc(
16591             sizeof(const VkDeviceImageMemoryRequirements));
16592         deepcopy_VkDeviceImageMemoryRequirements(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
16593                                                  (VkDeviceImageMemoryRequirements*)(local_pInfo));
16594     }
16595     if (local_pInfo) {
16596         transform_tohost_VkDeviceImageMemoryRequirements(
16597             sResourceTracker, (VkDeviceImageMemoryRequirements*)(local_pInfo));
16598     }
16599     size_t count = 0;
16600     size_t* countPtr = &count;
16601     {
16602         uint64_t cgen_var_0;
16603         *countPtr += 1 * 8;
16604         count_VkDeviceImageMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
16605                                               (VkDeviceImageMemoryRequirements*)(local_pInfo),
16606                                               countPtr);
16607         // WARNING PTR CHECK
16608         *countPtr += 8;
16609         if (pSparseMemoryRequirementCount) {
16610             *countPtr += sizeof(uint32_t);
16611         }
16612         // WARNING PTR CHECK
16613         *countPtr += 8;
16614         if (pSparseMemoryRequirements) {
16615             if (pSparseMemoryRequirementCount) {
16616                 for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
16617                     count_VkSparseImageMemoryRequirements2(
16618                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
16619                         (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i),
16620                         countPtr);
16621                 }
16622             }
16623         }
16624     }
16625     uint32_t packetSize_vkGetDeviceImageSparseMemoryRequirements =
16626         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
16627     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceImageSparseMemoryRequirements);
16628     uint8_t* packetBeginPtr = streamPtr;
16629     uint8_t** streamPtrPtr = &streamPtr;
16630     uint32_t opcode_vkGetDeviceImageSparseMemoryRequirements =
16631         OP_vkGetDeviceImageSparseMemoryRequirements;
16632     uint32_t seqno;
16633     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
16634     memcpy(streamPtr, &opcode_vkGetDeviceImageSparseMemoryRequirements, sizeof(uint32_t));
16635     streamPtr += sizeof(uint32_t);
16636     memcpy(streamPtr, &packetSize_vkGetDeviceImageSparseMemoryRequirements, sizeof(uint32_t));
16637     streamPtr += sizeof(uint32_t);
16638     if (queueSubmitWithCommandsEnabled) {
16639         memcpy(streamPtr, &seqno, sizeof(uint32_t));
16640         streamPtr += sizeof(uint32_t);
16641     }
16642     uint64_t cgen_var_0;
16643     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
16644     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16645     *streamPtrPtr += 1 * 8;
16646     reservedmarshal_VkDeviceImageMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16647                                                     (VkDeviceImageMemoryRequirements*)(local_pInfo),
16648                                                     streamPtrPtr);
16649     // WARNING PTR CHECK
16650     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
16651     memcpy((*streamPtrPtr), &cgen_var_1, 8);
16652     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
16653     *streamPtrPtr += 8;
16654     if (pSparseMemoryRequirementCount) {
16655         memcpy(*streamPtrPtr, (uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
16656         *streamPtrPtr += sizeof(uint32_t);
16657     }
16658     // WARNING PTR CHECK
16659     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
16660     memcpy((*streamPtrPtr), &cgen_var_2, 8);
16661     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
16662     *streamPtrPtr += 8;
16663     if (pSparseMemoryRequirements) {
16664         for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
16665             reservedmarshal_VkSparseImageMemoryRequirements2(
16666                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16667                 (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), streamPtrPtr);
16668         }
16669     }
16670     // WARNING PTR CHECK
16671     uint32_t* check_pSparseMemoryRequirementCount;
16672     check_pSparseMemoryRequirementCount = (uint32_t*)(uintptr_t)stream->getBe64();
16673     if (pSparseMemoryRequirementCount) {
16674         if (!(check_pSparseMemoryRequirementCount)) {
16675             fprintf(stderr,
16676                     "fatal: pSparseMemoryRequirementCount inconsistent between guest and host\n");
16677         }
16678         stream->read((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
16679     }
16680     // WARNING PTR CHECK
16681     VkSparseImageMemoryRequirements2* check_pSparseMemoryRequirements;
16682     check_pSparseMemoryRequirements =
16683         (VkSparseImageMemoryRequirements2*)(uintptr_t)stream->getBe64();
16684     if (pSparseMemoryRequirements) {
16685         if (!(check_pSparseMemoryRequirements)) {
16686             fprintf(stderr,
16687                     "fatal: pSparseMemoryRequirements inconsistent between guest and host\n");
16688         }
16689         if (pSparseMemoryRequirementCount) {
16690             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
16691                 unmarshal_VkSparseImageMemoryRequirements2(
16692                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16693                     (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
16694             }
16695         }
16696     }
16697     if (pSparseMemoryRequirementCount) {
16698         if (pSparseMemoryRequirements) {
16699             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
16700                 transform_fromhost_VkSparseImageMemoryRequirements2(
16701                     sResourceTracker,
16702                     (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
16703             }
16704         }
16705     }
16706     ++encodeCount;
16707     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16708         pool->freeAll();
16709         stream->clearPool();
16710     }
16711     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16712 }
16713 
16714 #endif
16715 #ifdef VK_KHR_dynamic_rendering
vkCmdBeginRenderingKHR(VkCommandBuffer commandBuffer,const VkRenderingInfo * pRenderingInfo,uint32_t doLock)16716 void VkEncoder::vkCmdBeginRenderingKHR(VkCommandBuffer commandBuffer,
16717                                        const VkRenderingInfo* pRenderingInfo, uint32_t doLock) {
16718     (void)doLock;
16719     bool queueSubmitWithCommandsEnabled =
16720         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16721     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16722     auto stream = mImpl->stream();
16723     auto pool = mImpl->pool();
16724     VkCommandBuffer local_commandBuffer;
16725     VkRenderingInfo* local_pRenderingInfo;
16726     local_commandBuffer = commandBuffer;
16727     local_pRenderingInfo = nullptr;
16728     if (pRenderingInfo) {
16729         local_pRenderingInfo = (VkRenderingInfo*)pool->alloc(sizeof(const VkRenderingInfo));
16730         deepcopy_VkRenderingInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRenderingInfo,
16731                                  (VkRenderingInfo*)(local_pRenderingInfo));
16732     }
16733     if (local_pRenderingInfo) {
16734         transform_tohost_VkRenderingInfo(sResourceTracker,
16735                                          (VkRenderingInfo*)(local_pRenderingInfo));
16736     }
16737     size_t count = 0;
16738     size_t* countPtr = &count;
16739     {
16740         uint64_t cgen_var_0;
16741         *countPtr += 1 * 8;
16742         count_VkRenderingInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
16743                               (VkRenderingInfo*)(local_pRenderingInfo), countPtr);
16744     }
16745     uint32_t packetSize_vkCmdBeginRenderingKHR = 4 + 4 + count;
16746     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginRenderingKHR -= 8;
16747     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginRenderingKHR);
16748     uint8_t* packetBeginPtr = streamPtr;
16749     uint8_t** streamPtrPtr = &streamPtr;
16750     uint32_t opcode_vkCmdBeginRenderingKHR = OP_vkCmdBeginRenderingKHR;
16751     memcpy(streamPtr, &opcode_vkCmdBeginRenderingKHR, sizeof(uint32_t));
16752     streamPtr += sizeof(uint32_t);
16753     memcpy(streamPtr, &packetSize_vkCmdBeginRenderingKHR, sizeof(uint32_t));
16754     streamPtr += sizeof(uint32_t);
16755     if (!queueSubmitWithCommandsEnabled) {
16756         uint64_t cgen_var_0;
16757         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
16758         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16759         *streamPtrPtr += 1 * 8;
16760     }
16761     reservedmarshal_VkRenderingInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16762                                     (VkRenderingInfo*)(local_pRenderingInfo), streamPtrPtr);
16763     ++encodeCount;
16764     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16765         pool->freeAll();
16766         stream->clearPool();
16767     }
16768     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16769 }
16770 
vkCmdEndRenderingKHR(VkCommandBuffer commandBuffer,uint32_t doLock)16771 void VkEncoder::vkCmdEndRenderingKHR(VkCommandBuffer commandBuffer, uint32_t doLock) {
16772     (void)doLock;
16773     bool queueSubmitWithCommandsEnabled =
16774         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16775     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16776     auto stream = mImpl->stream();
16777     auto pool = mImpl->pool();
16778     VkCommandBuffer local_commandBuffer;
16779     local_commandBuffer = commandBuffer;
16780     size_t count = 0;
16781     size_t* countPtr = &count;
16782     {
16783         uint64_t cgen_var_0;
16784         *countPtr += 1 * 8;
16785     }
16786     uint32_t packetSize_vkCmdEndRenderingKHR = 4 + 4 + count;
16787     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdEndRenderingKHR -= 8;
16788     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndRenderingKHR);
16789     uint8_t* packetBeginPtr = streamPtr;
16790     uint8_t** streamPtrPtr = &streamPtr;
16791     uint32_t opcode_vkCmdEndRenderingKHR = OP_vkCmdEndRenderingKHR;
16792     memcpy(streamPtr, &opcode_vkCmdEndRenderingKHR, sizeof(uint32_t));
16793     streamPtr += sizeof(uint32_t);
16794     memcpy(streamPtr, &packetSize_vkCmdEndRenderingKHR, sizeof(uint32_t));
16795     streamPtr += sizeof(uint32_t);
16796     if (!queueSubmitWithCommandsEnabled) {
16797         uint64_t cgen_var_0;
16798         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
16799         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16800         *streamPtrPtr += 1 * 8;
16801     }
16802     ++encodeCount;
16803     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16804         pool->freeAll();
16805         stream->clearPool();
16806     }
16807     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16808 }
16809 
16810 #endif
16811 #ifdef VK_KHR_get_physical_device_properties2
vkGetPhysicalDeviceFeatures2KHR(VkPhysicalDevice physicalDevice,VkPhysicalDeviceFeatures2 * pFeatures,uint32_t doLock)16812 void VkEncoder::vkGetPhysicalDeviceFeatures2KHR(VkPhysicalDevice physicalDevice,
16813                                                 VkPhysicalDeviceFeatures2* pFeatures,
16814                                                 uint32_t doLock) {
16815     (void)doLock;
16816     bool queueSubmitWithCommandsEnabled =
16817         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16818     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16819     auto stream = mImpl->stream();
16820     auto pool = mImpl->pool();
16821     VkPhysicalDevice local_physicalDevice;
16822     local_physicalDevice = physicalDevice;
16823     size_t count = 0;
16824     size_t* countPtr = &count;
16825     {
16826         uint64_t cgen_var_0;
16827         *countPtr += 1 * 8;
16828         count_VkPhysicalDeviceFeatures2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
16829                                         (VkPhysicalDeviceFeatures2*)(pFeatures), countPtr);
16830     }
16831     uint32_t packetSize_vkGetPhysicalDeviceFeatures2KHR =
16832         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
16833     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFeatures2KHR);
16834     uint8_t* packetBeginPtr = streamPtr;
16835     uint8_t** streamPtrPtr = &streamPtr;
16836     uint32_t opcode_vkGetPhysicalDeviceFeatures2KHR = OP_vkGetPhysicalDeviceFeatures2KHR;
16837     uint32_t seqno;
16838     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
16839     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFeatures2KHR, sizeof(uint32_t));
16840     streamPtr += sizeof(uint32_t);
16841     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFeatures2KHR, sizeof(uint32_t));
16842     streamPtr += sizeof(uint32_t);
16843     if (queueSubmitWithCommandsEnabled) {
16844         memcpy(streamPtr, &seqno, sizeof(uint32_t));
16845         streamPtr += sizeof(uint32_t);
16846     }
16847     uint64_t cgen_var_0;
16848     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
16849     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16850     *streamPtrPtr += 1 * 8;
16851     reservedmarshal_VkPhysicalDeviceFeatures2(
16852         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceFeatures2*)(pFeatures), streamPtrPtr);
16853     unmarshal_VkPhysicalDeviceFeatures2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16854                                         (VkPhysicalDeviceFeatures2*)(pFeatures));
16855     if (pFeatures) {
16856         transform_fromhost_VkPhysicalDeviceFeatures2(sResourceTracker,
16857                                                      (VkPhysicalDeviceFeatures2*)(pFeatures));
16858     }
16859     sResourceTracker->on_vkGetPhysicalDeviceFeatures2KHR(this, physicalDevice, pFeatures);
16860     ++encodeCount;
16861     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16862         pool->freeAll();
16863         stream->clearPool();
16864     }
16865     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16866 }
16867 
vkGetPhysicalDeviceProperties2KHR(VkPhysicalDevice physicalDevice,VkPhysicalDeviceProperties2 * pProperties,uint32_t doLock)16868 void VkEncoder::vkGetPhysicalDeviceProperties2KHR(VkPhysicalDevice physicalDevice,
16869                                                   VkPhysicalDeviceProperties2* pProperties,
16870                                                   uint32_t doLock) {
16871     (void)doLock;
16872     bool queueSubmitWithCommandsEnabled =
16873         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16874     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16875     auto stream = mImpl->stream();
16876     auto pool = mImpl->pool();
16877     VkPhysicalDevice local_physicalDevice;
16878     local_physicalDevice = physicalDevice;
16879     size_t count = 0;
16880     size_t* countPtr = &count;
16881     {
16882         uint64_t cgen_var_0;
16883         *countPtr += 1 * 8;
16884         count_VkPhysicalDeviceProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
16885                                           (VkPhysicalDeviceProperties2*)(pProperties), countPtr);
16886     }
16887     uint32_t packetSize_vkGetPhysicalDeviceProperties2KHR =
16888         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
16889     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceProperties2KHR);
16890     uint8_t* packetBeginPtr = streamPtr;
16891     uint8_t** streamPtrPtr = &streamPtr;
16892     uint32_t opcode_vkGetPhysicalDeviceProperties2KHR = OP_vkGetPhysicalDeviceProperties2KHR;
16893     uint32_t seqno;
16894     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
16895     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceProperties2KHR, sizeof(uint32_t));
16896     streamPtr += sizeof(uint32_t);
16897     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceProperties2KHR, sizeof(uint32_t));
16898     streamPtr += sizeof(uint32_t);
16899     if (queueSubmitWithCommandsEnabled) {
16900         memcpy(streamPtr, &seqno, sizeof(uint32_t));
16901         streamPtr += sizeof(uint32_t);
16902     }
16903     uint64_t cgen_var_0;
16904     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
16905     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16906     *streamPtrPtr += 1 * 8;
16907     reservedmarshal_VkPhysicalDeviceProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16908                                                 (VkPhysicalDeviceProperties2*)(pProperties),
16909                                                 streamPtrPtr);
16910     unmarshal_VkPhysicalDeviceProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16911                                           (VkPhysicalDeviceProperties2*)(pProperties));
16912     if (pProperties) {
16913         transform_fromhost_VkPhysicalDeviceProperties2(sResourceTracker,
16914                                                        (VkPhysicalDeviceProperties2*)(pProperties));
16915     }
16916     sResourceTracker->on_vkGetPhysicalDeviceProperties2KHR(this, physicalDevice, pProperties);
16917     ++encodeCount;
16918     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16919         pool->freeAll();
16920         stream->clearPool();
16921     }
16922     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16923 }
16924 
vkGetPhysicalDeviceFormatProperties2KHR(VkPhysicalDevice physicalDevice,VkFormat format,VkFormatProperties2 * pFormatProperties,uint32_t doLock)16925 void VkEncoder::vkGetPhysicalDeviceFormatProperties2KHR(VkPhysicalDevice physicalDevice,
16926                                                         VkFormat format,
16927                                                         VkFormatProperties2* pFormatProperties,
16928                                                         uint32_t doLock) {
16929     (void)doLock;
16930     bool queueSubmitWithCommandsEnabled =
16931         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16932     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16933     auto stream = mImpl->stream();
16934     auto pool = mImpl->pool();
16935     VkPhysicalDevice local_physicalDevice;
16936     VkFormat local_format;
16937     local_physicalDevice = physicalDevice;
16938     local_format = format;
16939     size_t count = 0;
16940     size_t* countPtr = &count;
16941     {
16942         uint64_t cgen_var_0;
16943         *countPtr += 1 * 8;
16944         *countPtr += sizeof(VkFormat);
16945         count_VkFormatProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
16946                                   (VkFormatProperties2*)(pFormatProperties), countPtr);
16947     }
16948     uint32_t packetSize_vkGetPhysicalDeviceFormatProperties2KHR =
16949         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
16950     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceFormatProperties2KHR);
16951     uint8_t* packetBeginPtr = streamPtr;
16952     uint8_t** streamPtrPtr = &streamPtr;
16953     uint32_t opcode_vkGetPhysicalDeviceFormatProperties2KHR =
16954         OP_vkGetPhysicalDeviceFormatProperties2KHR;
16955     uint32_t seqno;
16956     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
16957     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceFormatProperties2KHR, sizeof(uint32_t));
16958     streamPtr += sizeof(uint32_t);
16959     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceFormatProperties2KHR, sizeof(uint32_t));
16960     streamPtr += sizeof(uint32_t);
16961     if (queueSubmitWithCommandsEnabled) {
16962         memcpy(streamPtr, &seqno, sizeof(uint32_t));
16963         streamPtr += sizeof(uint32_t);
16964     }
16965     uint64_t cgen_var_0;
16966     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
16967     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
16968     *streamPtrPtr += 1 * 8;
16969     memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
16970     *streamPtrPtr += sizeof(VkFormat);
16971     reservedmarshal_VkFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16972                                         (VkFormatProperties2*)(pFormatProperties), streamPtrPtr);
16973     unmarshal_VkFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
16974                                   (VkFormatProperties2*)(pFormatProperties));
16975     if (pFormatProperties) {
16976         transform_fromhost_VkFormatProperties2(sResourceTracker,
16977                                                (VkFormatProperties2*)(pFormatProperties));
16978     }
16979     ++encodeCount;
16980     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
16981         pool->freeAll();
16982         stream->clearPool();
16983     }
16984     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
16985 }
16986 
vkGetPhysicalDeviceImageFormatProperties2KHR(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceImageFormatInfo2 * pImageFormatInfo,VkImageFormatProperties2 * pImageFormatProperties,uint32_t doLock)16987 VkResult VkEncoder::vkGetPhysicalDeviceImageFormatProperties2KHR(
16988     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
16989     VkImageFormatProperties2* pImageFormatProperties, uint32_t doLock) {
16990     (void)doLock;
16991     bool queueSubmitWithCommandsEnabled =
16992         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
16993     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
16994     auto stream = mImpl->stream();
16995     auto pool = mImpl->pool();
16996     VkPhysicalDevice local_physicalDevice;
16997     VkPhysicalDeviceImageFormatInfo2* local_pImageFormatInfo;
16998     local_physicalDevice = physicalDevice;
16999     local_pImageFormatInfo = nullptr;
17000     if (pImageFormatInfo) {
17001         local_pImageFormatInfo = (VkPhysicalDeviceImageFormatInfo2*)pool->alloc(
17002             sizeof(const VkPhysicalDeviceImageFormatInfo2));
17003         deepcopy_VkPhysicalDeviceImageFormatInfo2(
17004             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImageFormatInfo,
17005             (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
17006     }
17007     if (local_pImageFormatInfo) {
17008         transform_tohost_VkPhysicalDeviceImageFormatInfo2(
17009             sResourceTracker, (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo));
17010     }
17011     size_t count = 0;
17012     size_t* countPtr = &count;
17013     {
17014         uint64_t cgen_var_0;
17015         *countPtr += 1 * 8;
17016         count_VkPhysicalDeviceImageFormatInfo2(
17017             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17018             (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), countPtr);
17019         count_VkImageFormatProperties2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17020                                        (VkImageFormatProperties2*)(pImageFormatProperties),
17021                                        countPtr);
17022     }
17023     uint32_t packetSize_vkGetPhysicalDeviceImageFormatProperties2KHR =
17024         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17025     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceImageFormatProperties2KHR);
17026     uint8_t* packetBeginPtr = streamPtr;
17027     uint8_t** streamPtrPtr = &streamPtr;
17028     uint32_t opcode_vkGetPhysicalDeviceImageFormatProperties2KHR =
17029         OP_vkGetPhysicalDeviceImageFormatProperties2KHR;
17030     uint32_t seqno;
17031     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17032     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceImageFormatProperties2KHR, sizeof(uint32_t));
17033     streamPtr += sizeof(uint32_t);
17034     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceImageFormatProperties2KHR, sizeof(uint32_t));
17035     streamPtr += sizeof(uint32_t);
17036     if (queueSubmitWithCommandsEnabled) {
17037         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17038         streamPtr += sizeof(uint32_t);
17039     }
17040     uint64_t cgen_var_0;
17041     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
17042     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17043     *streamPtrPtr += 1 * 8;
17044     reservedmarshal_VkPhysicalDeviceImageFormatInfo2(
17045         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17046         (VkPhysicalDeviceImageFormatInfo2*)(local_pImageFormatInfo), streamPtrPtr);
17047     reservedmarshal_VkImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17048                                              (VkImageFormatProperties2*)(pImageFormatProperties),
17049                                              streamPtrPtr);
17050     unmarshal_VkImageFormatProperties2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17051                                        (VkImageFormatProperties2*)(pImageFormatProperties));
17052     if (pImageFormatProperties) {
17053         transform_fromhost_VkImageFormatProperties2(
17054             sResourceTracker, (VkImageFormatProperties2*)(pImageFormatProperties));
17055     }
17056     VkResult vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return = (VkResult)0;
17057     stream->read(&vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return, sizeof(VkResult));
17058     ++encodeCount;
17059     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
17060         pool->freeAll();
17061         stream->clearPool();
17062     }
17063     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
17064     return vkGetPhysicalDeviceImageFormatProperties2KHR_VkResult_return;
17065 }
17066 
vkGetPhysicalDeviceQueueFamilyProperties2KHR(VkPhysicalDevice physicalDevice,uint32_t * pQueueFamilyPropertyCount,VkQueueFamilyProperties2 * pQueueFamilyProperties,uint32_t doLock)17067 void VkEncoder::vkGetPhysicalDeviceQueueFamilyProperties2KHR(
17068     VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount,
17069     VkQueueFamilyProperties2* pQueueFamilyProperties, uint32_t doLock) {
17070     (void)doLock;
17071     bool queueSubmitWithCommandsEnabled =
17072         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
17073     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
17074     auto stream = mImpl->stream();
17075     auto pool = mImpl->pool();
17076     VkPhysicalDevice local_physicalDevice;
17077     local_physicalDevice = physicalDevice;
17078     size_t count = 0;
17079     size_t* countPtr = &count;
17080     {
17081         uint64_t cgen_var_0;
17082         *countPtr += 1 * 8;
17083         // WARNING PTR CHECK
17084         *countPtr += 8;
17085         if (pQueueFamilyPropertyCount) {
17086             *countPtr += sizeof(uint32_t);
17087         }
17088         // WARNING PTR CHECK
17089         *countPtr += 8;
17090         if (pQueueFamilyProperties) {
17091             if (pQueueFamilyPropertyCount) {
17092                 for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
17093                     count_VkQueueFamilyProperties2(
17094                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17095                         (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), countPtr);
17096                 }
17097             }
17098         }
17099     }
17100     uint32_t packetSize_vkGetPhysicalDeviceQueueFamilyProperties2KHR =
17101         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17102     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceQueueFamilyProperties2KHR);
17103     uint8_t* packetBeginPtr = streamPtr;
17104     uint8_t** streamPtrPtr = &streamPtr;
17105     uint32_t opcode_vkGetPhysicalDeviceQueueFamilyProperties2KHR =
17106         OP_vkGetPhysicalDeviceQueueFamilyProperties2KHR;
17107     uint32_t seqno;
17108     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17109     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceQueueFamilyProperties2KHR, sizeof(uint32_t));
17110     streamPtr += sizeof(uint32_t);
17111     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceQueueFamilyProperties2KHR, sizeof(uint32_t));
17112     streamPtr += sizeof(uint32_t);
17113     if (queueSubmitWithCommandsEnabled) {
17114         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17115         streamPtr += sizeof(uint32_t);
17116     }
17117     uint64_t cgen_var_0;
17118     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
17119     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17120     *streamPtrPtr += 1 * 8;
17121     // WARNING PTR CHECK
17122     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pQueueFamilyPropertyCount;
17123     memcpy((*streamPtrPtr), &cgen_var_1, 8);
17124     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
17125     *streamPtrPtr += 8;
17126     if (pQueueFamilyPropertyCount) {
17127         memcpy(*streamPtrPtr, (uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
17128         *streamPtrPtr += sizeof(uint32_t);
17129     }
17130     // WARNING PTR CHECK
17131     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pQueueFamilyProperties;
17132     memcpy((*streamPtrPtr), &cgen_var_2, 8);
17133     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
17134     *streamPtrPtr += 8;
17135     if (pQueueFamilyProperties) {
17136         for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
17137             reservedmarshal_VkQueueFamilyProperties2(
17138                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17139                 (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i), streamPtrPtr);
17140         }
17141     }
17142     // WARNING PTR CHECK
17143     uint32_t* check_pQueueFamilyPropertyCount;
17144     check_pQueueFamilyPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
17145     if (pQueueFamilyPropertyCount) {
17146         if (!(check_pQueueFamilyPropertyCount)) {
17147             fprintf(stderr,
17148                     "fatal: pQueueFamilyPropertyCount inconsistent between guest and host\n");
17149         }
17150         stream->read((uint32_t*)pQueueFamilyPropertyCount, sizeof(uint32_t));
17151     }
17152     // WARNING PTR CHECK
17153     VkQueueFamilyProperties2* check_pQueueFamilyProperties;
17154     check_pQueueFamilyProperties = (VkQueueFamilyProperties2*)(uintptr_t)stream->getBe64();
17155     if (pQueueFamilyProperties) {
17156         if (!(check_pQueueFamilyProperties)) {
17157             fprintf(stderr, "fatal: pQueueFamilyProperties inconsistent between guest and host\n");
17158         }
17159         if (pQueueFamilyPropertyCount) {
17160             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
17161                 unmarshal_VkQueueFamilyProperties2(
17162                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17163                     (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
17164             }
17165         }
17166     }
17167     if (pQueueFamilyPropertyCount) {
17168         if (pQueueFamilyProperties) {
17169             for (uint32_t i = 0; i < (uint32_t)(*(pQueueFamilyPropertyCount)); ++i) {
17170                 transform_fromhost_VkQueueFamilyProperties2(
17171                     sResourceTracker, (VkQueueFamilyProperties2*)(pQueueFamilyProperties + i));
17172             }
17173         }
17174     }
17175     ++encodeCount;
17176     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
17177         pool->freeAll();
17178         stream->clearPool();
17179     }
17180     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
17181 }
17182 
vkGetPhysicalDeviceMemoryProperties2KHR(VkPhysicalDevice physicalDevice,VkPhysicalDeviceMemoryProperties2 * pMemoryProperties,uint32_t doLock)17183 void VkEncoder::vkGetPhysicalDeviceMemoryProperties2KHR(
17184     VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties,
17185     uint32_t doLock) {
17186     (void)doLock;
17187     bool queueSubmitWithCommandsEnabled =
17188         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
17189     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
17190     auto stream = mImpl->stream();
17191     auto pool = mImpl->pool();
17192     VkPhysicalDevice local_physicalDevice;
17193     local_physicalDevice = physicalDevice;
17194     size_t count = 0;
17195     size_t* countPtr = &count;
17196     {
17197         uint64_t cgen_var_0;
17198         *countPtr += 1 * 8;
17199         count_VkPhysicalDeviceMemoryProperties2(
17200             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17201             (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties), countPtr);
17202     }
17203     uint32_t packetSize_vkGetPhysicalDeviceMemoryProperties2KHR =
17204         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17205     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceMemoryProperties2KHR);
17206     uint8_t* packetBeginPtr = streamPtr;
17207     uint8_t** streamPtrPtr = &streamPtr;
17208     uint32_t opcode_vkGetPhysicalDeviceMemoryProperties2KHR =
17209         OP_vkGetPhysicalDeviceMemoryProperties2KHR;
17210     uint32_t seqno;
17211     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17212     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceMemoryProperties2KHR, sizeof(uint32_t));
17213     streamPtr += sizeof(uint32_t);
17214     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceMemoryProperties2KHR, sizeof(uint32_t));
17215     streamPtr += sizeof(uint32_t);
17216     if (queueSubmitWithCommandsEnabled) {
17217         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17218         streamPtr += sizeof(uint32_t);
17219     }
17220     uint64_t cgen_var_0;
17221     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
17222     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17223     *streamPtrPtr += 1 * 8;
17224     reservedmarshal_VkPhysicalDeviceMemoryProperties2(
17225         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties),
17226         streamPtrPtr);
17227     unmarshal_VkPhysicalDeviceMemoryProperties2(
17228         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17229         (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
17230     if (pMemoryProperties) {
17231         transform_fromhost_VkPhysicalDeviceMemoryProperties2(
17232             sResourceTracker, (VkPhysicalDeviceMemoryProperties2*)(pMemoryProperties));
17233     }
17234     ++encodeCount;
17235     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
17236         pool->freeAll();
17237         stream->clearPool();
17238     }
17239     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
17240 }
17241 
vkGetPhysicalDeviceSparseImageFormatProperties2KHR(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceSparseImageFormatInfo2 * pFormatInfo,uint32_t * pPropertyCount,VkSparseImageFormatProperties2 * pProperties,uint32_t doLock)17242 void VkEncoder::vkGetPhysicalDeviceSparseImageFormatProperties2KHR(
17243     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo,
17244     uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties, uint32_t doLock) {
17245     (void)doLock;
17246     bool queueSubmitWithCommandsEnabled =
17247         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
17248     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
17249     auto stream = mImpl->stream();
17250     auto pool = mImpl->pool();
17251     VkPhysicalDevice local_physicalDevice;
17252     VkPhysicalDeviceSparseImageFormatInfo2* local_pFormatInfo;
17253     local_physicalDevice = physicalDevice;
17254     local_pFormatInfo = nullptr;
17255     if (pFormatInfo) {
17256         local_pFormatInfo = (VkPhysicalDeviceSparseImageFormatInfo2*)pool->alloc(
17257             sizeof(const VkPhysicalDeviceSparseImageFormatInfo2));
17258         deepcopy_VkPhysicalDeviceSparseImageFormatInfo2(
17259             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pFormatInfo,
17260             (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
17261     }
17262     if (local_pFormatInfo) {
17263         transform_tohost_VkPhysicalDeviceSparseImageFormatInfo2(
17264             sResourceTracker, (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo));
17265     }
17266     size_t count = 0;
17267     size_t* countPtr = &count;
17268     {
17269         uint64_t cgen_var_0;
17270         *countPtr += 1 * 8;
17271         count_VkPhysicalDeviceSparseImageFormatInfo2(
17272             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17273             (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), countPtr);
17274         // WARNING PTR CHECK
17275         *countPtr += 8;
17276         if (pPropertyCount) {
17277             *countPtr += sizeof(uint32_t);
17278         }
17279         // WARNING PTR CHECK
17280         *countPtr += 8;
17281         if (pProperties) {
17282             if (pPropertyCount) {
17283                 for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
17284                     count_VkSparseImageFormatProperties2(
17285                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17286                         (VkSparseImageFormatProperties2*)(pProperties + i), countPtr);
17287                 }
17288             }
17289         }
17290     }
17291     uint32_t packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2KHR =
17292         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17293     uint8_t* streamPtr =
17294         stream->reserve(packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2KHR);
17295     uint8_t* packetBeginPtr = streamPtr;
17296     uint8_t** streamPtrPtr = &streamPtr;
17297     uint32_t opcode_vkGetPhysicalDeviceSparseImageFormatProperties2KHR =
17298         OP_vkGetPhysicalDeviceSparseImageFormatProperties2KHR;
17299     uint32_t seqno;
17300     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17301     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceSparseImageFormatProperties2KHR, sizeof(uint32_t));
17302     streamPtr += sizeof(uint32_t);
17303     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceSparseImageFormatProperties2KHR,
17304            sizeof(uint32_t));
17305     streamPtr += sizeof(uint32_t);
17306     if (queueSubmitWithCommandsEnabled) {
17307         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17308         streamPtr += sizeof(uint32_t);
17309     }
17310     uint64_t cgen_var_0;
17311     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
17312     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17313     *streamPtrPtr += 1 * 8;
17314     reservedmarshal_VkPhysicalDeviceSparseImageFormatInfo2(
17315         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17316         (VkPhysicalDeviceSparseImageFormatInfo2*)(local_pFormatInfo), streamPtrPtr);
17317     // WARNING PTR CHECK
17318     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pPropertyCount;
17319     memcpy((*streamPtrPtr), &cgen_var_1, 8);
17320     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
17321     *streamPtrPtr += 8;
17322     if (pPropertyCount) {
17323         memcpy(*streamPtrPtr, (uint32_t*)pPropertyCount, sizeof(uint32_t));
17324         *streamPtrPtr += sizeof(uint32_t);
17325     }
17326     // WARNING PTR CHECK
17327     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pProperties;
17328     memcpy((*streamPtrPtr), &cgen_var_2, 8);
17329     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
17330     *streamPtrPtr += 8;
17331     if (pProperties) {
17332         for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
17333             reservedmarshal_VkSparseImageFormatProperties2(
17334                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17335                 (VkSparseImageFormatProperties2*)(pProperties + i), streamPtrPtr);
17336         }
17337     }
17338     // WARNING PTR CHECK
17339     uint32_t* check_pPropertyCount;
17340     check_pPropertyCount = (uint32_t*)(uintptr_t)stream->getBe64();
17341     if (pPropertyCount) {
17342         if (!(check_pPropertyCount)) {
17343             fprintf(stderr, "fatal: pPropertyCount inconsistent between guest and host\n");
17344         }
17345         stream->read((uint32_t*)pPropertyCount, sizeof(uint32_t));
17346     }
17347     // WARNING PTR CHECK
17348     VkSparseImageFormatProperties2* check_pProperties;
17349     check_pProperties = (VkSparseImageFormatProperties2*)(uintptr_t)stream->getBe64();
17350     if (pProperties) {
17351         if (!(check_pProperties)) {
17352             fprintf(stderr, "fatal: pProperties inconsistent between guest and host\n");
17353         }
17354         if (pPropertyCount) {
17355             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
17356                 unmarshal_VkSparseImageFormatProperties2(
17357                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17358                     (VkSparseImageFormatProperties2*)(pProperties + i));
17359             }
17360         }
17361     }
17362     if (pPropertyCount) {
17363         if (pProperties) {
17364             for (uint32_t i = 0; i < (uint32_t)(*(pPropertyCount)); ++i) {
17365                 transform_fromhost_VkSparseImageFormatProperties2(
17366                     sResourceTracker, (VkSparseImageFormatProperties2*)(pProperties + i));
17367             }
17368         }
17369     }
17370     ++encodeCount;
17371     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
17372         pool->freeAll();
17373         stream->clearPool();
17374     }
17375     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
17376 }
17377 
17378 #endif
17379 #ifdef VK_KHR_maintenance1
vkTrimCommandPoolKHR(VkDevice device,VkCommandPool commandPool,VkCommandPoolTrimFlags flags,uint32_t doLock)17380 void VkEncoder::vkTrimCommandPoolKHR(VkDevice device, VkCommandPool commandPool,
17381                                      VkCommandPoolTrimFlags flags, uint32_t doLock) {
17382     (void)doLock;
17383     bool queueSubmitWithCommandsEnabled =
17384         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
17385     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
17386     auto stream = mImpl->stream();
17387     auto pool = mImpl->pool();
17388     VkDevice local_device;
17389     VkCommandPool local_commandPool;
17390     VkCommandPoolTrimFlags local_flags;
17391     local_device = device;
17392     local_commandPool = commandPool;
17393     local_flags = flags;
17394     size_t count = 0;
17395     size_t* countPtr = &count;
17396     {
17397         uint64_t cgen_var_0;
17398         *countPtr += 1 * 8;
17399         uint64_t cgen_var_1;
17400         *countPtr += 1 * 8;
17401         *countPtr += sizeof(VkCommandPoolTrimFlags);
17402     }
17403     uint32_t packetSize_vkTrimCommandPoolKHR =
17404         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17405     uint8_t* streamPtr = stream->reserve(packetSize_vkTrimCommandPoolKHR);
17406     uint8_t* packetBeginPtr = streamPtr;
17407     uint8_t** streamPtrPtr = &streamPtr;
17408     uint32_t opcode_vkTrimCommandPoolKHR = OP_vkTrimCommandPoolKHR;
17409     uint32_t seqno;
17410     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17411     memcpy(streamPtr, &opcode_vkTrimCommandPoolKHR, sizeof(uint32_t));
17412     streamPtr += sizeof(uint32_t);
17413     memcpy(streamPtr, &packetSize_vkTrimCommandPoolKHR, sizeof(uint32_t));
17414     streamPtr += sizeof(uint32_t);
17415     if (queueSubmitWithCommandsEnabled) {
17416         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17417         streamPtr += sizeof(uint32_t);
17418     }
17419     uint64_t cgen_var_0;
17420     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
17421     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17422     *streamPtrPtr += 1 * 8;
17423     uint64_t cgen_var_1;
17424     *&cgen_var_1 = get_host_u64_VkCommandPool((*&local_commandPool));
17425     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
17426     *streamPtrPtr += 1 * 8;
17427     memcpy(*streamPtrPtr, (VkCommandPoolTrimFlags*)&local_flags, sizeof(VkCommandPoolTrimFlags));
17428     *streamPtrPtr += sizeof(VkCommandPoolTrimFlags);
17429     stream->flush();
17430     ++encodeCount;
17431     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
17432         pool->freeAll();
17433         stream->clearPool();
17434     }
17435     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
17436 }
17437 
17438 #endif
17439 #ifdef VK_KHR_external_memory_capabilities
vkGetPhysicalDeviceExternalBufferPropertiesKHR(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalBufferInfo * pExternalBufferInfo,VkExternalBufferProperties * pExternalBufferProperties,uint32_t doLock)17440 void VkEncoder::vkGetPhysicalDeviceExternalBufferPropertiesKHR(
17441     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo,
17442     VkExternalBufferProperties* pExternalBufferProperties, uint32_t doLock) {
17443     (void)doLock;
17444     bool queueSubmitWithCommandsEnabled =
17445         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
17446     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
17447     auto stream = mImpl->stream();
17448     auto pool = mImpl->pool();
17449     VkPhysicalDevice local_physicalDevice;
17450     VkPhysicalDeviceExternalBufferInfo* local_pExternalBufferInfo;
17451     local_physicalDevice = physicalDevice;
17452     local_pExternalBufferInfo = nullptr;
17453     if (pExternalBufferInfo) {
17454         local_pExternalBufferInfo = (VkPhysicalDeviceExternalBufferInfo*)pool->alloc(
17455             sizeof(const VkPhysicalDeviceExternalBufferInfo));
17456         deepcopy_VkPhysicalDeviceExternalBufferInfo(
17457             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalBufferInfo,
17458             (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
17459     }
17460     if (local_pExternalBufferInfo) {
17461         sResourceTracker->transformImpl_VkPhysicalDeviceExternalBufferInfo_tohost(
17462             local_pExternalBufferInfo, 1);
17463         transform_tohost_VkPhysicalDeviceExternalBufferInfo(
17464             sResourceTracker, (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo));
17465     }
17466     size_t count = 0;
17467     size_t* countPtr = &count;
17468     {
17469         uint64_t cgen_var_0;
17470         *countPtr += 1 * 8;
17471         count_VkPhysicalDeviceExternalBufferInfo(
17472             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17473             (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), countPtr);
17474         count_VkExternalBufferProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17475                                          (VkExternalBufferProperties*)(pExternalBufferProperties),
17476                                          countPtr);
17477     }
17478     uint32_t packetSize_vkGetPhysicalDeviceExternalBufferPropertiesKHR =
17479         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17480     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalBufferPropertiesKHR);
17481     uint8_t* packetBeginPtr = streamPtr;
17482     uint8_t** streamPtrPtr = &streamPtr;
17483     uint32_t opcode_vkGetPhysicalDeviceExternalBufferPropertiesKHR =
17484         OP_vkGetPhysicalDeviceExternalBufferPropertiesKHR;
17485     uint32_t seqno;
17486     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17487     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalBufferPropertiesKHR, sizeof(uint32_t));
17488     streamPtr += sizeof(uint32_t);
17489     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalBufferPropertiesKHR, sizeof(uint32_t));
17490     streamPtr += sizeof(uint32_t);
17491     if (queueSubmitWithCommandsEnabled) {
17492         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17493         streamPtr += sizeof(uint32_t);
17494     }
17495     uint64_t cgen_var_0;
17496     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
17497     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17498     *streamPtrPtr += 1 * 8;
17499     reservedmarshal_VkPhysicalDeviceExternalBufferInfo(
17500         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17501         (VkPhysicalDeviceExternalBufferInfo*)(local_pExternalBufferInfo), streamPtrPtr);
17502     reservedmarshal_VkExternalBufferProperties(
17503         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17504         (VkExternalBufferProperties*)(pExternalBufferProperties), streamPtrPtr);
17505     unmarshal_VkExternalBufferProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17506                                          (VkExternalBufferProperties*)(pExternalBufferProperties));
17507     if (pExternalBufferProperties) {
17508         sResourceTracker->transformImpl_VkExternalBufferProperties_fromhost(
17509             pExternalBufferProperties, 1);
17510         transform_fromhost_VkExternalBufferProperties(
17511             sResourceTracker, (VkExternalBufferProperties*)(pExternalBufferProperties));
17512     }
17513     ++encodeCount;
17514     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
17515         pool->freeAll();
17516         stream->clearPool();
17517     }
17518     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
17519 }
17520 
17521 #endif
17522 #ifdef VK_KHR_external_semaphore_capabilities
vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalSemaphoreInfo * pExternalSemaphoreInfo,VkExternalSemaphoreProperties * pExternalSemaphoreProperties,uint32_t doLock)17523 void VkEncoder::vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
17524     VkPhysicalDevice physicalDevice,
17525     const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo,
17526     VkExternalSemaphoreProperties* pExternalSemaphoreProperties, uint32_t doLock) {
17527     (void)doLock;
17528     bool queueSubmitWithCommandsEnabled =
17529         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
17530     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
17531     auto stream = mImpl->stream();
17532     auto pool = mImpl->pool();
17533     VkPhysicalDevice local_physicalDevice;
17534     VkPhysicalDeviceExternalSemaphoreInfo* local_pExternalSemaphoreInfo;
17535     local_physicalDevice = physicalDevice;
17536     local_pExternalSemaphoreInfo = nullptr;
17537     if (pExternalSemaphoreInfo) {
17538         local_pExternalSemaphoreInfo = (VkPhysicalDeviceExternalSemaphoreInfo*)pool->alloc(
17539             sizeof(const VkPhysicalDeviceExternalSemaphoreInfo));
17540         deepcopy_VkPhysicalDeviceExternalSemaphoreInfo(
17541             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalSemaphoreInfo,
17542             (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
17543     }
17544     if (local_pExternalSemaphoreInfo) {
17545         transform_tohost_VkPhysicalDeviceExternalSemaphoreInfo(
17546             sResourceTracker,
17547             (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo));
17548     }
17549     size_t count = 0;
17550     size_t* countPtr = &count;
17551     {
17552         uint64_t cgen_var_0;
17553         *countPtr += 1 * 8;
17554         count_VkPhysicalDeviceExternalSemaphoreInfo(
17555             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17556             (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), countPtr);
17557         count_VkExternalSemaphoreProperties(
17558             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17559             (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), countPtr);
17560     }
17561     uint32_t packetSize_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR =
17562         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17563     uint8_t* streamPtr =
17564         stream->reserve(packetSize_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR);
17565     uint8_t* packetBeginPtr = streamPtr;
17566     uint8_t** streamPtrPtr = &streamPtr;
17567     uint32_t opcode_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR =
17568         OP_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;
17569     uint32_t seqno;
17570     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17571     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR, sizeof(uint32_t));
17572     streamPtr += sizeof(uint32_t);
17573     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR,
17574            sizeof(uint32_t));
17575     streamPtr += sizeof(uint32_t);
17576     if (queueSubmitWithCommandsEnabled) {
17577         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17578         streamPtr += sizeof(uint32_t);
17579     }
17580     uint64_t cgen_var_0;
17581     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
17582     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17583     *streamPtrPtr += 1 * 8;
17584     reservedmarshal_VkPhysicalDeviceExternalSemaphoreInfo(
17585         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17586         (VkPhysicalDeviceExternalSemaphoreInfo*)(local_pExternalSemaphoreInfo), streamPtrPtr);
17587     reservedmarshal_VkExternalSemaphoreProperties(
17588         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17589         (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties), streamPtrPtr);
17590     unmarshal_VkExternalSemaphoreProperties(
17591         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17592         (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
17593     if (pExternalSemaphoreProperties) {
17594         transform_fromhost_VkExternalSemaphoreProperties(
17595             sResourceTracker, (VkExternalSemaphoreProperties*)(pExternalSemaphoreProperties));
17596     }
17597     sResourceTracker->on_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR(
17598         this, physicalDevice, pExternalSemaphoreInfo, pExternalSemaphoreProperties);
17599     ++encodeCount;
17600     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
17601         pool->freeAll();
17602         stream->clearPool();
17603     }
17604     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
17605 }
17606 
17607 #endif
17608 #ifdef VK_KHR_external_semaphore_fd
vkImportSemaphoreFdKHR(VkDevice device,const VkImportSemaphoreFdInfoKHR * pImportSemaphoreFdInfo,uint32_t doLock)17609 VkResult VkEncoder::vkImportSemaphoreFdKHR(VkDevice device,
17610                                            const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo,
17611                                            uint32_t doLock) {
17612     (void)doLock;
17613     bool queueSubmitWithCommandsEnabled =
17614         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
17615     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
17616     auto stream = mImpl->stream();
17617     auto pool = mImpl->pool();
17618     VkDevice local_device;
17619     VkImportSemaphoreFdInfoKHR* local_pImportSemaphoreFdInfo;
17620     local_device = device;
17621     local_pImportSemaphoreFdInfo = nullptr;
17622     if (pImportSemaphoreFdInfo) {
17623         local_pImportSemaphoreFdInfo =
17624             (VkImportSemaphoreFdInfoKHR*)pool->alloc(sizeof(const VkImportSemaphoreFdInfoKHR));
17625         deepcopy_VkImportSemaphoreFdInfoKHR(
17626             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImportSemaphoreFdInfo,
17627             (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo));
17628     }
17629     if (local_pImportSemaphoreFdInfo) {
17630         transform_tohost_VkImportSemaphoreFdInfoKHR(
17631             sResourceTracker, (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo));
17632     }
17633     size_t count = 0;
17634     size_t* countPtr = &count;
17635     {
17636         uint64_t cgen_var_0;
17637         *countPtr += 1 * 8;
17638         count_VkImportSemaphoreFdInfoKHR(
17639             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17640             (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo), countPtr);
17641     }
17642     uint32_t packetSize_vkImportSemaphoreFdKHR =
17643         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17644     uint8_t* streamPtr = stream->reserve(packetSize_vkImportSemaphoreFdKHR);
17645     uint8_t* packetBeginPtr = streamPtr;
17646     uint8_t** streamPtrPtr = &streamPtr;
17647     uint32_t opcode_vkImportSemaphoreFdKHR = OP_vkImportSemaphoreFdKHR;
17648     uint32_t seqno;
17649     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17650     memcpy(streamPtr, &opcode_vkImportSemaphoreFdKHR, sizeof(uint32_t));
17651     streamPtr += sizeof(uint32_t);
17652     memcpy(streamPtr, &packetSize_vkImportSemaphoreFdKHR, sizeof(uint32_t));
17653     streamPtr += sizeof(uint32_t);
17654     if (queueSubmitWithCommandsEnabled) {
17655         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17656         streamPtr += sizeof(uint32_t);
17657     }
17658     uint64_t cgen_var_0;
17659     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
17660     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17661     *streamPtrPtr += 1 * 8;
17662     reservedmarshal_VkImportSemaphoreFdInfoKHR(
17663         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17664         (VkImportSemaphoreFdInfoKHR*)(local_pImportSemaphoreFdInfo), streamPtrPtr);
17665     VkResult vkImportSemaphoreFdKHR_VkResult_return = (VkResult)0;
17666     stream->read(&vkImportSemaphoreFdKHR_VkResult_return, sizeof(VkResult));
17667     ++encodeCount;
17668     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
17669         pool->freeAll();
17670         stream->clearPool();
17671     }
17672     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
17673     return vkImportSemaphoreFdKHR_VkResult_return;
17674 }
17675 
vkGetSemaphoreFdKHR(VkDevice device,const VkSemaphoreGetFdInfoKHR * pGetFdInfo,int * pFd,uint32_t doLock)17676 VkResult VkEncoder::vkGetSemaphoreFdKHR(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo,
17677                                         int* pFd, uint32_t doLock) {
17678     (void)doLock;
17679     bool queueSubmitWithCommandsEnabled =
17680         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
17681     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
17682     auto stream = mImpl->stream();
17683     auto pool = mImpl->pool();
17684     VkDevice local_device;
17685     VkSemaphoreGetFdInfoKHR* local_pGetFdInfo;
17686     local_device = device;
17687     local_pGetFdInfo = nullptr;
17688     if (pGetFdInfo) {
17689         local_pGetFdInfo =
17690             (VkSemaphoreGetFdInfoKHR*)pool->alloc(sizeof(const VkSemaphoreGetFdInfoKHR));
17691         deepcopy_VkSemaphoreGetFdInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pGetFdInfo,
17692                                          (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo));
17693     }
17694     if (local_pGetFdInfo) {
17695         transform_tohost_VkSemaphoreGetFdInfoKHR(sResourceTracker,
17696                                                  (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo));
17697     }
17698     size_t count = 0;
17699     size_t* countPtr = &count;
17700     {
17701         uint64_t cgen_var_0;
17702         *countPtr += 1 * 8;
17703         count_VkSemaphoreGetFdInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17704                                       (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo), countPtr);
17705         *countPtr += sizeof(int);
17706     }
17707     uint32_t packetSize_vkGetSemaphoreFdKHR =
17708         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17709     uint8_t* streamPtr = stream->reserve(packetSize_vkGetSemaphoreFdKHR);
17710     uint8_t* packetBeginPtr = streamPtr;
17711     uint8_t** streamPtrPtr = &streamPtr;
17712     uint32_t opcode_vkGetSemaphoreFdKHR = OP_vkGetSemaphoreFdKHR;
17713     uint32_t seqno;
17714     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17715     memcpy(streamPtr, &opcode_vkGetSemaphoreFdKHR, sizeof(uint32_t));
17716     streamPtr += sizeof(uint32_t);
17717     memcpy(streamPtr, &packetSize_vkGetSemaphoreFdKHR, sizeof(uint32_t));
17718     streamPtr += sizeof(uint32_t);
17719     if (queueSubmitWithCommandsEnabled) {
17720         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17721         streamPtr += sizeof(uint32_t);
17722     }
17723     uint64_t cgen_var_0;
17724     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
17725     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17726     *streamPtrPtr += 1 * 8;
17727     reservedmarshal_VkSemaphoreGetFdInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17728                                             (VkSemaphoreGetFdInfoKHR*)(local_pGetFdInfo),
17729                                             streamPtrPtr);
17730     memcpy(*streamPtrPtr, (int*)pFd, sizeof(int));
17731     *streamPtrPtr += sizeof(int);
17732     stream->read((int*)pFd, sizeof(int));
17733     VkResult vkGetSemaphoreFdKHR_VkResult_return = (VkResult)0;
17734     stream->read(&vkGetSemaphoreFdKHR_VkResult_return, sizeof(VkResult));
17735     ++encodeCount;
17736     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
17737         pool->freeAll();
17738         stream->clearPool();
17739     }
17740     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
17741     return vkGetSemaphoreFdKHR_VkResult_return;
17742 }
17743 
17744 #endif
17745 #ifdef VK_KHR_descriptor_update_template
vkCreateDescriptorUpdateTemplateKHR(VkDevice device,const VkDescriptorUpdateTemplateCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkDescriptorUpdateTemplate * pDescriptorUpdateTemplate,uint32_t doLock)17746 VkResult VkEncoder::vkCreateDescriptorUpdateTemplateKHR(
17747     VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
17748     const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate,
17749     uint32_t doLock) {
17750     (void)doLock;
17751     bool queueSubmitWithCommandsEnabled =
17752         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
17753     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
17754     auto stream = mImpl->stream();
17755     auto pool = mImpl->pool();
17756     VkDevice local_device;
17757     VkDescriptorUpdateTemplateCreateInfo* local_pCreateInfo;
17758     VkAllocationCallbacks* local_pAllocator;
17759     local_device = device;
17760     local_pCreateInfo = nullptr;
17761     if (pCreateInfo) {
17762         local_pCreateInfo = (VkDescriptorUpdateTemplateCreateInfo*)pool->alloc(
17763             sizeof(const VkDescriptorUpdateTemplateCreateInfo));
17764         deepcopy_VkDescriptorUpdateTemplateCreateInfo(
17765             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
17766             (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
17767     }
17768     local_pAllocator = nullptr;
17769     if (pAllocator) {
17770         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
17771         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
17772                                        (VkAllocationCallbacks*)(local_pAllocator));
17773     }
17774     local_pAllocator = nullptr;
17775     if (local_pCreateInfo) {
17776         transform_tohost_VkDescriptorUpdateTemplateCreateInfo(
17777             sResourceTracker, (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo));
17778     }
17779     if (local_pAllocator) {
17780         transform_tohost_VkAllocationCallbacks(sResourceTracker,
17781                                                (VkAllocationCallbacks*)(local_pAllocator));
17782     }
17783     size_t count = 0;
17784     size_t* countPtr = &count;
17785     {
17786         uint64_t cgen_var_0;
17787         *countPtr += 1 * 8;
17788         count_VkDescriptorUpdateTemplateCreateInfo(
17789             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17790             (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), countPtr);
17791         // WARNING PTR CHECK
17792         *countPtr += 8;
17793         if (local_pAllocator) {
17794             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17795                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
17796         }
17797         uint64_t cgen_var_1;
17798         *countPtr += 8;
17799     }
17800     uint32_t packetSize_vkCreateDescriptorUpdateTemplateKHR =
17801         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17802     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateDescriptorUpdateTemplateKHR);
17803     uint8_t* packetBeginPtr = streamPtr;
17804     uint8_t** streamPtrPtr = &streamPtr;
17805     uint32_t opcode_vkCreateDescriptorUpdateTemplateKHR = OP_vkCreateDescriptorUpdateTemplateKHR;
17806     uint32_t seqno;
17807     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17808     memcpy(streamPtr, &opcode_vkCreateDescriptorUpdateTemplateKHR, sizeof(uint32_t));
17809     streamPtr += sizeof(uint32_t);
17810     memcpy(streamPtr, &packetSize_vkCreateDescriptorUpdateTemplateKHR, sizeof(uint32_t));
17811     streamPtr += sizeof(uint32_t);
17812     if (queueSubmitWithCommandsEnabled) {
17813         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17814         streamPtr += sizeof(uint32_t);
17815     }
17816     uint64_t cgen_var_0;
17817     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
17818     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17819     *streamPtrPtr += 1 * 8;
17820     reservedmarshal_VkDescriptorUpdateTemplateCreateInfo(
17821         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17822         (VkDescriptorUpdateTemplateCreateInfo*)(local_pCreateInfo), streamPtrPtr);
17823     // WARNING PTR CHECK
17824     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
17825     memcpy((*streamPtrPtr), &cgen_var_1, 8);
17826     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
17827     *streamPtrPtr += 8;
17828     if (local_pAllocator) {
17829         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17830                                               (VkAllocationCallbacks*)(local_pAllocator),
17831                                               streamPtrPtr);
17832     }
17833     /* is handle, possibly out */;
17834     uint64_t cgen_var_2;
17835     *&cgen_var_2 = (uint64_t)((*pDescriptorUpdateTemplate));
17836     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
17837     *streamPtrPtr += 8;
17838     /* is handle, possibly out */;
17839     stream->setHandleMapping(sResourceTracker->createMapping());
17840     uint64_t cgen_var_3;
17841     stream->read((uint64_t*)&cgen_var_3, 8);
17842     stream->handleMapping()->mapHandles_u64_VkDescriptorUpdateTemplate(
17843         &cgen_var_3, (VkDescriptorUpdateTemplate*)pDescriptorUpdateTemplate, 1);
17844     stream->unsetHandleMapping();
17845     VkResult vkCreateDescriptorUpdateTemplateKHR_VkResult_return = (VkResult)0;
17846     stream->read(&vkCreateDescriptorUpdateTemplateKHR_VkResult_return, sizeof(VkResult));
17847     sResourceTracker->on_vkCreateDescriptorUpdateTemplateKHR(
17848         this, vkCreateDescriptorUpdateTemplateKHR_VkResult_return, device, pCreateInfo, pAllocator,
17849         pDescriptorUpdateTemplate);
17850     ++encodeCount;
17851     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
17852         pool->freeAll();
17853         stream->clearPool();
17854     }
17855     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
17856     return vkCreateDescriptorUpdateTemplateKHR_VkResult_return;
17857 }
17858 
vkDestroyDescriptorUpdateTemplateKHR(VkDevice device,VkDescriptorUpdateTemplate descriptorUpdateTemplate,const VkAllocationCallbacks * pAllocator,uint32_t doLock)17859 void VkEncoder::vkDestroyDescriptorUpdateTemplateKHR(
17860     VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate,
17861     const VkAllocationCallbacks* pAllocator, uint32_t doLock) {
17862     (void)doLock;
17863     bool queueSubmitWithCommandsEnabled =
17864         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
17865     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
17866     auto stream = mImpl->stream();
17867     auto pool = mImpl->pool();
17868     VkDevice local_device;
17869     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
17870     VkAllocationCallbacks* local_pAllocator;
17871     local_device = device;
17872     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
17873     local_pAllocator = nullptr;
17874     if (pAllocator) {
17875         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
17876         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
17877                                        (VkAllocationCallbacks*)(local_pAllocator));
17878     }
17879     local_pAllocator = nullptr;
17880     if (local_pAllocator) {
17881         transform_tohost_VkAllocationCallbacks(sResourceTracker,
17882                                                (VkAllocationCallbacks*)(local_pAllocator));
17883     }
17884     size_t count = 0;
17885     size_t* countPtr = &count;
17886     {
17887         uint64_t cgen_var_0;
17888         *countPtr += 1 * 8;
17889         uint64_t cgen_var_1;
17890         *countPtr += 1 * 8;
17891         // WARNING PTR CHECK
17892         *countPtr += 8;
17893         if (local_pAllocator) {
17894             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
17895                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
17896         }
17897     }
17898     uint32_t packetSize_vkDestroyDescriptorUpdateTemplateKHR =
17899         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17900     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyDescriptorUpdateTemplateKHR);
17901     uint8_t* packetBeginPtr = streamPtr;
17902     uint8_t** streamPtrPtr = &streamPtr;
17903     uint32_t opcode_vkDestroyDescriptorUpdateTemplateKHR = OP_vkDestroyDescriptorUpdateTemplateKHR;
17904     uint32_t seqno;
17905     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17906     memcpy(streamPtr, &opcode_vkDestroyDescriptorUpdateTemplateKHR, sizeof(uint32_t));
17907     streamPtr += sizeof(uint32_t);
17908     memcpy(streamPtr, &packetSize_vkDestroyDescriptorUpdateTemplateKHR, sizeof(uint32_t));
17909     streamPtr += sizeof(uint32_t);
17910     if (queueSubmitWithCommandsEnabled) {
17911         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17912         streamPtr += sizeof(uint32_t);
17913     }
17914     uint64_t cgen_var_0;
17915     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
17916     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17917     *streamPtrPtr += 1 * 8;
17918     uint64_t cgen_var_1;
17919     *&cgen_var_1 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
17920     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
17921     *streamPtrPtr += 1 * 8;
17922     // WARNING PTR CHECK
17923     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
17924     memcpy((*streamPtrPtr), &cgen_var_2, 8);
17925     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
17926     *streamPtrPtr += 8;
17927     if (local_pAllocator) {
17928         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
17929                                               (VkAllocationCallbacks*)(local_pAllocator),
17930                                               streamPtrPtr);
17931     }
17932     sResourceTracker->destroyMapping()->mapHandles_VkDescriptorUpdateTemplate(
17933         (VkDescriptorUpdateTemplate*)&descriptorUpdateTemplate);
17934     stream->flush();
17935     ++encodeCount;
17936     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
17937         pool->freeAll();
17938         stream->clearPool();
17939     }
17940     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
17941 }
17942 
vkUpdateDescriptorSetWithTemplateKHR(VkDevice device,VkDescriptorSet descriptorSet,VkDescriptorUpdateTemplate descriptorUpdateTemplate,const void * pData,uint32_t doLock)17943 void VkEncoder::vkUpdateDescriptorSetWithTemplateKHR(
17944     VkDevice device, VkDescriptorSet descriptorSet,
17945     VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData, uint32_t doLock) {
17946     (void)doLock;
17947     bool queueSubmitWithCommandsEnabled =
17948         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
17949     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
17950     auto stream = mImpl->stream();
17951     auto pool = mImpl->pool();
17952     VkDevice local_device;
17953     VkDescriptorSet local_descriptorSet;
17954     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
17955     void* local_pData;
17956     local_device = device;
17957     local_descriptorSet = descriptorSet;
17958     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
17959     // Avoiding deepcopy for pData
17960     local_pData = (void*)pData;
17961     size_t count = 0;
17962     size_t* countPtr = &count;
17963     {
17964         uint64_t cgen_var_0;
17965         *countPtr += 1 * 8;
17966         uint64_t cgen_var_1;
17967         *countPtr += 1 * 8;
17968         uint64_t cgen_var_2;
17969         *countPtr += 1 * 8;
17970         // WARNING PTR CHECK
17971         *countPtr += 8;
17972         if (local_pData) {
17973             *countPtr += sizeof(uint8_t);
17974         }
17975     }
17976     uint32_t packetSize_vkUpdateDescriptorSetWithTemplateKHR =
17977         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
17978     uint8_t* streamPtr = stream->reserve(packetSize_vkUpdateDescriptorSetWithTemplateKHR);
17979     uint8_t* packetBeginPtr = streamPtr;
17980     uint8_t** streamPtrPtr = &streamPtr;
17981     uint32_t opcode_vkUpdateDescriptorSetWithTemplateKHR = OP_vkUpdateDescriptorSetWithTemplateKHR;
17982     uint32_t seqno;
17983     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
17984     memcpy(streamPtr, &opcode_vkUpdateDescriptorSetWithTemplateKHR, sizeof(uint32_t));
17985     streamPtr += sizeof(uint32_t);
17986     memcpy(streamPtr, &packetSize_vkUpdateDescriptorSetWithTemplateKHR, sizeof(uint32_t));
17987     streamPtr += sizeof(uint32_t);
17988     if (queueSubmitWithCommandsEnabled) {
17989         memcpy(streamPtr, &seqno, sizeof(uint32_t));
17990         streamPtr += sizeof(uint32_t);
17991     }
17992     uint64_t cgen_var_0;
17993     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
17994     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
17995     *streamPtrPtr += 1 * 8;
17996     uint64_t cgen_var_1;
17997     *&cgen_var_1 = get_host_u64_VkDescriptorSet((*&local_descriptorSet));
17998     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
17999     *streamPtrPtr += 1 * 8;
18000     uint64_t cgen_var_2;
18001     *&cgen_var_2 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
18002     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
18003     *streamPtrPtr += 1 * 8;
18004     // WARNING PTR CHECK
18005     uint64_t cgen_var_3 = (uint64_t)(uintptr_t)local_pData;
18006     memcpy((*streamPtrPtr), &cgen_var_3, 8);
18007     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
18008     *streamPtrPtr += 8;
18009     if (local_pData) {
18010         memcpy(*streamPtrPtr, (void*)local_pData, sizeof(uint8_t));
18011         *streamPtrPtr += sizeof(uint8_t);
18012     }
18013     stream->flush();
18014     ++encodeCount;
18015     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18016         pool->freeAll();
18017         stream->clearPool();
18018     }
18019     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18020 }
18021 
18022 #endif
18023 #ifdef VK_KHR_create_renderpass2
vkCreateRenderPass2KHR(VkDevice device,const VkRenderPassCreateInfo2 * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkRenderPass * pRenderPass,uint32_t doLock)18024 VkResult VkEncoder::vkCreateRenderPass2KHR(VkDevice device,
18025                                            const VkRenderPassCreateInfo2* pCreateInfo,
18026                                            const VkAllocationCallbacks* pAllocator,
18027                                            VkRenderPass* pRenderPass, uint32_t doLock) {
18028     (void)doLock;
18029     bool queueSubmitWithCommandsEnabled =
18030         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18031     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18032     auto stream = mImpl->stream();
18033     auto pool = mImpl->pool();
18034     VkDevice local_device;
18035     VkRenderPassCreateInfo2* local_pCreateInfo;
18036     VkAllocationCallbacks* local_pAllocator;
18037     local_device = device;
18038     local_pCreateInfo = nullptr;
18039     if (pCreateInfo) {
18040         local_pCreateInfo =
18041             (VkRenderPassCreateInfo2*)pool->alloc(sizeof(const VkRenderPassCreateInfo2));
18042         deepcopy_VkRenderPassCreateInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
18043                                          (VkRenderPassCreateInfo2*)(local_pCreateInfo));
18044     }
18045     local_pAllocator = nullptr;
18046     if (pAllocator) {
18047         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
18048         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
18049                                        (VkAllocationCallbacks*)(local_pAllocator));
18050     }
18051     local_pAllocator = nullptr;
18052     if (local_pCreateInfo) {
18053         transform_tohost_VkRenderPassCreateInfo2(sResourceTracker,
18054                                                  (VkRenderPassCreateInfo2*)(local_pCreateInfo));
18055     }
18056     if (local_pAllocator) {
18057         transform_tohost_VkAllocationCallbacks(sResourceTracker,
18058                                                (VkAllocationCallbacks*)(local_pAllocator));
18059     }
18060     size_t count = 0;
18061     size_t* countPtr = &count;
18062     {
18063         uint64_t cgen_var_0;
18064         *countPtr += 1 * 8;
18065         count_VkRenderPassCreateInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18066                                       (VkRenderPassCreateInfo2*)(local_pCreateInfo), countPtr);
18067         // WARNING PTR CHECK
18068         *countPtr += 8;
18069         if (local_pAllocator) {
18070             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18071                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
18072         }
18073         uint64_t cgen_var_1;
18074         *countPtr += 8;
18075     }
18076     uint32_t packetSize_vkCreateRenderPass2KHR =
18077         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
18078     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateRenderPass2KHR);
18079     uint8_t* packetBeginPtr = streamPtr;
18080     uint8_t** streamPtrPtr = &streamPtr;
18081     uint32_t opcode_vkCreateRenderPass2KHR = OP_vkCreateRenderPass2KHR;
18082     uint32_t seqno;
18083     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
18084     memcpy(streamPtr, &opcode_vkCreateRenderPass2KHR, sizeof(uint32_t));
18085     streamPtr += sizeof(uint32_t);
18086     memcpy(streamPtr, &packetSize_vkCreateRenderPass2KHR, sizeof(uint32_t));
18087     streamPtr += sizeof(uint32_t);
18088     if (queueSubmitWithCommandsEnabled) {
18089         memcpy(streamPtr, &seqno, sizeof(uint32_t));
18090         streamPtr += sizeof(uint32_t);
18091     }
18092     uint64_t cgen_var_0;
18093     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
18094     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
18095     *streamPtrPtr += 1 * 8;
18096     reservedmarshal_VkRenderPassCreateInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18097                                             (VkRenderPassCreateInfo2*)(local_pCreateInfo),
18098                                             streamPtrPtr);
18099     // WARNING PTR CHECK
18100     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
18101     memcpy((*streamPtrPtr), &cgen_var_1, 8);
18102     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
18103     *streamPtrPtr += 8;
18104     if (local_pAllocator) {
18105         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18106                                               (VkAllocationCallbacks*)(local_pAllocator),
18107                                               streamPtrPtr);
18108     }
18109     /* is handle, possibly out */;
18110     uint64_t cgen_var_2;
18111     *&cgen_var_2 = (uint64_t)((*pRenderPass));
18112     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
18113     *streamPtrPtr += 8;
18114     /* is handle, possibly out */;
18115     stream->setHandleMapping(sResourceTracker->createMapping());
18116     uint64_t cgen_var_3;
18117     stream->read((uint64_t*)&cgen_var_3, 8);
18118     stream->handleMapping()->mapHandles_u64_VkRenderPass(&cgen_var_3, (VkRenderPass*)pRenderPass,
18119                                                          1);
18120     stream->unsetHandleMapping();
18121     VkResult vkCreateRenderPass2KHR_VkResult_return = (VkResult)0;
18122     stream->read(&vkCreateRenderPass2KHR_VkResult_return, sizeof(VkResult));
18123     ++encodeCount;
18124     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18125         pool->freeAll();
18126         stream->clearPool();
18127     }
18128     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18129     return vkCreateRenderPass2KHR_VkResult_return;
18130 }
18131 
vkCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,const VkRenderPassBeginInfo * pRenderPassBegin,const VkSubpassBeginInfo * pSubpassBeginInfo,uint32_t doLock)18132 void VkEncoder::vkCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
18133                                          const VkRenderPassBeginInfo* pRenderPassBegin,
18134                                          const VkSubpassBeginInfo* pSubpassBeginInfo,
18135                                          uint32_t doLock) {
18136     (void)doLock;
18137     bool queueSubmitWithCommandsEnabled =
18138         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18139     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18140     auto stream = mImpl->stream();
18141     auto pool = mImpl->pool();
18142     VkCommandBuffer local_commandBuffer;
18143     VkRenderPassBeginInfo* local_pRenderPassBegin;
18144     VkSubpassBeginInfo* local_pSubpassBeginInfo;
18145     local_commandBuffer = commandBuffer;
18146     local_pRenderPassBegin = nullptr;
18147     if (pRenderPassBegin) {
18148         local_pRenderPassBegin =
18149             (VkRenderPassBeginInfo*)pool->alloc(sizeof(const VkRenderPassBeginInfo));
18150         deepcopy_VkRenderPassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRenderPassBegin,
18151                                        (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
18152     }
18153     local_pSubpassBeginInfo = nullptr;
18154     if (pSubpassBeginInfo) {
18155         local_pSubpassBeginInfo =
18156             (VkSubpassBeginInfo*)pool->alloc(sizeof(const VkSubpassBeginInfo));
18157         deepcopy_VkSubpassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassBeginInfo,
18158                                     (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
18159     }
18160     if (local_pRenderPassBegin) {
18161         transform_tohost_VkRenderPassBeginInfo(sResourceTracker,
18162                                                (VkRenderPassBeginInfo*)(local_pRenderPassBegin));
18163     }
18164     if (local_pSubpassBeginInfo) {
18165         transform_tohost_VkSubpassBeginInfo(sResourceTracker,
18166                                             (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
18167     }
18168     size_t count = 0;
18169     size_t* countPtr = &count;
18170     {
18171         uint64_t cgen_var_0;
18172         *countPtr += 1 * 8;
18173         count_VkRenderPassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18174                                     (VkRenderPassBeginInfo*)(local_pRenderPassBegin), countPtr);
18175         count_VkSubpassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18176                                  (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
18177     }
18178     uint32_t packetSize_vkCmdBeginRenderPass2KHR = 4 + 4 + count;
18179     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginRenderPass2KHR -= 8;
18180     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginRenderPass2KHR);
18181     uint8_t* packetBeginPtr = streamPtr;
18182     uint8_t** streamPtrPtr = &streamPtr;
18183     uint32_t opcode_vkCmdBeginRenderPass2KHR = OP_vkCmdBeginRenderPass2KHR;
18184     memcpy(streamPtr, &opcode_vkCmdBeginRenderPass2KHR, sizeof(uint32_t));
18185     streamPtr += sizeof(uint32_t);
18186     memcpy(streamPtr, &packetSize_vkCmdBeginRenderPass2KHR, sizeof(uint32_t));
18187     streamPtr += sizeof(uint32_t);
18188     if (!queueSubmitWithCommandsEnabled) {
18189         uint64_t cgen_var_0;
18190         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
18191         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
18192         *streamPtrPtr += 1 * 8;
18193     }
18194     reservedmarshal_VkRenderPassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18195                                           (VkRenderPassBeginInfo*)(local_pRenderPassBegin),
18196                                           streamPtrPtr);
18197     reservedmarshal_VkSubpassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18198                                        (VkSubpassBeginInfo*)(local_pSubpassBeginInfo),
18199                                        streamPtrPtr);
18200     ++encodeCount;
18201     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18202         pool->freeAll();
18203         stream->clearPool();
18204     }
18205     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18206 }
18207 
vkCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,const VkSubpassBeginInfo * pSubpassBeginInfo,const VkSubpassEndInfo * pSubpassEndInfo,uint32_t doLock)18208 void VkEncoder::vkCmdNextSubpass2KHR(VkCommandBuffer commandBuffer,
18209                                      const VkSubpassBeginInfo* pSubpassBeginInfo,
18210                                      const VkSubpassEndInfo* pSubpassEndInfo, uint32_t doLock) {
18211     (void)doLock;
18212     bool queueSubmitWithCommandsEnabled =
18213         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18214     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18215     auto stream = mImpl->stream();
18216     auto pool = mImpl->pool();
18217     VkCommandBuffer local_commandBuffer;
18218     VkSubpassBeginInfo* local_pSubpassBeginInfo;
18219     VkSubpassEndInfo* local_pSubpassEndInfo;
18220     local_commandBuffer = commandBuffer;
18221     local_pSubpassBeginInfo = nullptr;
18222     if (pSubpassBeginInfo) {
18223         local_pSubpassBeginInfo =
18224             (VkSubpassBeginInfo*)pool->alloc(sizeof(const VkSubpassBeginInfo));
18225         deepcopy_VkSubpassBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassBeginInfo,
18226                                     (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
18227     }
18228     local_pSubpassEndInfo = nullptr;
18229     if (pSubpassEndInfo) {
18230         local_pSubpassEndInfo = (VkSubpassEndInfo*)pool->alloc(sizeof(const VkSubpassEndInfo));
18231         deepcopy_VkSubpassEndInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassEndInfo,
18232                                   (VkSubpassEndInfo*)(local_pSubpassEndInfo));
18233     }
18234     if (local_pSubpassBeginInfo) {
18235         transform_tohost_VkSubpassBeginInfo(sResourceTracker,
18236                                             (VkSubpassBeginInfo*)(local_pSubpassBeginInfo));
18237     }
18238     if (local_pSubpassEndInfo) {
18239         transform_tohost_VkSubpassEndInfo(sResourceTracker,
18240                                           (VkSubpassEndInfo*)(local_pSubpassEndInfo));
18241     }
18242     size_t count = 0;
18243     size_t* countPtr = &count;
18244     {
18245         uint64_t cgen_var_0;
18246         *countPtr += 1 * 8;
18247         count_VkSubpassBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18248                                  (VkSubpassBeginInfo*)(local_pSubpassBeginInfo), countPtr);
18249         count_VkSubpassEndInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18250                                (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
18251     }
18252     uint32_t packetSize_vkCmdNextSubpass2KHR = 4 + 4 + count;
18253     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdNextSubpass2KHR -= 8;
18254     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdNextSubpass2KHR);
18255     uint8_t* packetBeginPtr = streamPtr;
18256     uint8_t** streamPtrPtr = &streamPtr;
18257     uint32_t opcode_vkCmdNextSubpass2KHR = OP_vkCmdNextSubpass2KHR;
18258     memcpy(streamPtr, &opcode_vkCmdNextSubpass2KHR, sizeof(uint32_t));
18259     streamPtr += sizeof(uint32_t);
18260     memcpy(streamPtr, &packetSize_vkCmdNextSubpass2KHR, sizeof(uint32_t));
18261     streamPtr += sizeof(uint32_t);
18262     if (!queueSubmitWithCommandsEnabled) {
18263         uint64_t cgen_var_0;
18264         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
18265         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
18266         *streamPtrPtr += 1 * 8;
18267     }
18268     reservedmarshal_VkSubpassBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18269                                        (VkSubpassBeginInfo*)(local_pSubpassBeginInfo),
18270                                        streamPtrPtr);
18271     reservedmarshal_VkSubpassEndInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18272                                      (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
18273     ++encodeCount;
18274     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18275         pool->freeAll();
18276         stream->clearPool();
18277     }
18278     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18279 }
18280 
vkCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,const VkSubpassEndInfo * pSubpassEndInfo,uint32_t doLock)18281 void VkEncoder::vkCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
18282                                        const VkSubpassEndInfo* pSubpassEndInfo, uint32_t doLock) {
18283     (void)doLock;
18284     bool queueSubmitWithCommandsEnabled =
18285         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18286     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18287     auto stream = mImpl->stream();
18288     auto pool = mImpl->pool();
18289     VkCommandBuffer local_commandBuffer;
18290     VkSubpassEndInfo* local_pSubpassEndInfo;
18291     local_commandBuffer = commandBuffer;
18292     local_pSubpassEndInfo = nullptr;
18293     if (pSubpassEndInfo) {
18294         local_pSubpassEndInfo = (VkSubpassEndInfo*)pool->alloc(sizeof(const VkSubpassEndInfo));
18295         deepcopy_VkSubpassEndInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubpassEndInfo,
18296                                   (VkSubpassEndInfo*)(local_pSubpassEndInfo));
18297     }
18298     if (local_pSubpassEndInfo) {
18299         transform_tohost_VkSubpassEndInfo(sResourceTracker,
18300                                           (VkSubpassEndInfo*)(local_pSubpassEndInfo));
18301     }
18302     size_t count = 0;
18303     size_t* countPtr = &count;
18304     {
18305         uint64_t cgen_var_0;
18306         *countPtr += 1 * 8;
18307         count_VkSubpassEndInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18308                                (VkSubpassEndInfo*)(local_pSubpassEndInfo), countPtr);
18309     }
18310     uint32_t packetSize_vkCmdEndRenderPass2KHR = 4 + 4 + count;
18311     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdEndRenderPass2KHR -= 8;
18312     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndRenderPass2KHR);
18313     uint8_t* packetBeginPtr = streamPtr;
18314     uint8_t** streamPtrPtr = &streamPtr;
18315     uint32_t opcode_vkCmdEndRenderPass2KHR = OP_vkCmdEndRenderPass2KHR;
18316     memcpy(streamPtr, &opcode_vkCmdEndRenderPass2KHR, sizeof(uint32_t));
18317     streamPtr += sizeof(uint32_t);
18318     memcpy(streamPtr, &packetSize_vkCmdEndRenderPass2KHR, sizeof(uint32_t));
18319     streamPtr += sizeof(uint32_t);
18320     if (!queueSubmitWithCommandsEnabled) {
18321         uint64_t cgen_var_0;
18322         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
18323         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
18324         *streamPtrPtr += 1 * 8;
18325     }
18326     reservedmarshal_VkSubpassEndInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18327                                      (VkSubpassEndInfo*)(local_pSubpassEndInfo), streamPtrPtr);
18328     ++encodeCount;
18329     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18330         pool->freeAll();
18331         stream->clearPool();
18332     }
18333     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18334 }
18335 
18336 #endif
18337 #ifdef VK_KHR_external_fence_capabilities
vkGetPhysicalDeviceExternalFencePropertiesKHR(VkPhysicalDevice physicalDevice,const VkPhysicalDeviceExternalFenceInfo * pExternalFenceInfo,VkExternalFenceProperties * pExternalFenceProperties,uint32_t doLock)18338 void VkEncoder::vkGetPhysicalDeviceExternalFencePropertiesKHR(
18339     VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo,
18340     VkExternalFenceProperties* pExternalFenceProperties, uint32_t doLock) {
18341     (void)doLock;
18342     bool queueSubmitWithCommandsEnabled =
18343         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18344     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18345     auto stream = mImpl->stream();
18346     auto pool = mImpl->pool();
18347     VkPhysicalDevice local_physicalDevice;
18348     VkPhysicalDeviceExternalFenceInfo* local_pExternalFenceInfo;
18349     local_physicalDevice = physicalDevice;
18350     local_pExternalFenceInfo = nullptr;
18351     if (pExternalFenceInfo) {
18352         local_pExternalFenceInfo = (VkPhysicalDeviceExternalFenceInfo*)pool->alloc(
18353             sizeof(const VkPhysicalDeviceExternalFenceInfo));
18354         deepcopy_VkPhysicalDeviceExternalFenceInfo(
18355             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExternalFenceInfo,
18356             (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
18357     }
18358     if (local_pExternalFenceInfo) {
18359         transform_tohost_VkPhysicalDeviceExternalFenceInfo(
18360             sResourceTracker, (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo));
18361     }
18362     size_t count = 0;
18363     size_t* countPtr = &count;
18364     {
18365         uint64_t cgen_var_0;
18366         *countPtr += 1 * 8;
18367         count_VkPhysicalDeviceExternalFenceInfo(
18368             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18369             (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), countPtr);
18370         count_VkExternalFenceProperties(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18371                                         (VkExternalFenceProperties*)(pExternalFenceProperties),
18372                                         countPtr);
18373     }
18374     uint32_t packetSize_vkGetPhysicalDeviceExternalFencePropertiesKHR =
18375         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
18376     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceExternalFencePropertiesKHR);
18377     uint8_t* packetBeginPtr = streamPtr;
18378     uint8_t** streamPtrPtr = &streamPtr;
18379     uint32_t opcode_vkGetPhysicalDeviceExternalFencePropertiesKHR =
18380         OP_vkGetPhysicalDeviceExternalFencePropertiesKHR;
18381     uint32_t seqno;
18382     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
18383     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceExternalFencePropertiesKHR, sizeof(uint32_t));
18384     streamPtr += sizeof(uint32_t);
18385     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceExternalFencePropertiesKHR, sizeof(uint32_t));
18386     streamPtr += sizeof(uint32_t);
18387     if (queueSubmitWithCommandsEnabled) {
18388         memcpy(streamPtr, &seqno, sizeof(uint32_t));
18389         streamPtr += sizeof(uint32_t);
18390     }
18391     uint64_t cgen_var_0;
18392     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
18393     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
18394     *streamPtrPtr += 1 * 8;
18395     reservedmarshal_VkPhysicalDeviceExternalFenceInfo(
18396         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18397         (VkPhysicalDeviceExternalFenceInfo*)(local_pExternalFenceInfo), streamPtrPtr);
18398     reservedmarshal_VkExternalFenceProperties(
18399         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExternalFenceProperties*)(pExternalFenceProperties),
18400         streamPtrPtr);
18401     unmarshal_VkExternalFenceProperties(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18402                                         (VkExternalFenceProperties*)(pExternalFenceProperties));
18403     if (pExternalFenceProperties) {
18404         transform_fromhost_VkExternalFenceProperties(
18405             sResourceTracker, (VkExternalFenceProperties*)(pExternalFenceProperties));
18406     }
18407     ++encodeCount;
18408     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18409         pool->freeAll();
18410         stream->clearPool();
18411     }
18412     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18413 }
18414 
18415 #endif
18416 #ifdef VK_KHR_external_fence_fd
vkImportFenceFdKHR(VkDevice device,const VkImportFenceFdInfoKHR * pImportFenceFdInfo,uint32_t doLock)18417 VkResult VkEncoder::vkImportFenceFdKHR(VkDevice device,
18418                                        const VkImportFenceFdInfoKHR* pImportFenceFdInfo,
18419                                        uint32_t doLock) {
18420     (void)doLock;
18421     bool queueSubmitWithCommandsEnabled =
18422         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18423     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18424     auto stream = mImpl->stream();
18425     auto pool = mImpl->pool();
18426     VkDevice local_device;
18427     VkImportFenceFdInfoKHR* local_pImportFenceFdInfo;
18428     local_device = device;
18429     local_pImportFenceFdInfo = nullptr;
18430     if (pImportFenceFdInfo) {
18431         local_pImportFenceFdInfo =
18432             (VkImportFenceFdInfoKHR*)pool->alloc(sizeof(const VkImportFenceFdInfoKHR));
18433         deepcopy_VkImportFenceFdInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImportFenceFdInfo,
18434                                         (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo));
18435     }
18436     if (local_pImportFenceFdInfo) {
18437         transform_tohost_VkImportFenceFdInfoKHR(
18438             sResourceTracker, (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo));
18439     }
18440     size_t count = 0;
18441     size_t* countPtr = &count;
18442     {
18443         uint64_t cgen_var_0;
18444         *countPtr += 1 * 8;
18445         count_VkImportFenceFdInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18446                                      (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo), countPtr);
18447     }
18448     uint32_t packetSize_vkImportFenceFdKHR =
18449         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
18450     uint8_t* streamPtr = stream->reserve(packetSize_vkImportFenceFdKHR);
18451     uint8_t* packetBeginPtr = streamPtr;
18452     uint8_t** streamPtrPtr = &streamPtr;
18453     uint32_t opcode_vkImportFenceFdKHR = OP_vkImportFenceFdKHR;
18454     uint32_t seqno;
18455     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
18456     memcpy(streamPtr, &opcode_vkImportFenceFdKHR, sizeof(uint32_t));
18457     streamPtr += sizeof(uint32_t);
18458     memcpy(streamPtr, &packetSize_vkImportFenceFdKHR, sizeof(uint32_t));
18459     streamPtr += sizeof(uint32_t);
18460     if (queueSubmitWithCommandsEnabled) {
18461         memcpy(streamPtr, &seqno, sizeof(uint32_t));
18462         streamPtr += sizeof(uint32_t);
18463     }
18464     uint64_t cgen_var_0;
18465     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
18466     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
18467     *streamPtrPtr += 1 * 8;
18468     reservedmarshal_VkImportFenceFdInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18469                                            (VkImportFenceFdInfoKHR*)(local_pImportFenceFdInfo),
18470                                            streamPtrPtr);
18471     VkResult vkImportFenceFdKHR_VkResult_return = (VkResult)0;
18472     stream->read(&vkImportFenceFdKHR_VkResult_return, sizeof(VkResult));
18473     ++encodeCount;
18474     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18475         pool->freeAll();
18476         stream->clearPool();
18477     }
18478     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18479     return vkImportFenceFdKHR_VkResult_return;
18480 }
18481 
vkGetFenceFdKHR(VkDevice device,const VkFenceGetFdInfoKHR * pGetFdInfo,int * pFd,uint32_t doLock)18482 VkResult VkEncoder::vkGetFenceFdKHR(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo,
18483                                     int* pFd, uint32_t doLock) {
18484     (void)doLock;
18485     bool queueSubmitWithCommandsEnabled =
18486         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18487     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18488     auto stream = mImpl->stream();
18489     auto pool = mImpl->pool();
18490     VkDevice local_device;
18491     VkFenceGetFdInfoKHR* local_pGetFdInfo;
18492     local_device = device;
18493     local_pGetFdInfo = nullptr;
18494     if (pGetFdInfo) {
18495         local_pGetFdInfo = (VkFenceGetFdInfoKHR*)pool->alloc(sizeof(const VkFenceGetFdInfoKHR));
18496         deepcopy_VkFenceGetFdInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pGetFdInfo,
18497                                      (VkFenceGetFdInfoKHR*)(local_pGetFdInfo));
18498     }
18499     if (local_pGetFdInfo) {
18500         transform_tohost_VkFenceGetFdInfoKHR(sResourceTracker,
18501                                              (VkFenceGetFdInfoKHR*)(local_pGetFdInfo));
18502     }
18503     size_t count = 0;
18504     size_t* countPtr = &count;
18505     {
18506         uint64_t cgen_var_0;
18507         *countPtr += 1 * 8;
18508         count_VkFenceGetFdInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18509                                   (VkFenceGetFdInfoKHR*)(local_pGetFdInfo), countPtr);
18510         *countPtr += sizeof(int);
18511     }
18512     uint32_t packetSize_vkGetFenceFdKHR = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
18513     uint8_t* streamPtr = stream->reserve(packetSize_vkGetFenceFdKHR);
18514     uint8_t* packetBeginPtr = streamPtr;
18515     uint8_t** streamPtrPtr = &streamPtr;
18516     uint32_t opcode_vkGetFenceFdKHR = OP_vkGetFenceFdKHR;
18517     uint32_t seqno;
18518     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
18519     memcpy(streamPtr, &opcode_vkGetFenceFdKHR, sizeof(uint32_t));
18520     streamPtr += sizeof(uint32_t);
18521     memcpy(streamPtr, &packetSize_vkGetFenceFdKHR, sizeof(uint32_t));
18522     streamPtr += sizeof(uint32_t);
18523     if (queueSubmitWithCommandsEnabled) {
18524         memcpy(streamPtr, &seqno, sizeof(uint32_t));
18525         streamPtr += sizeof(uint32_t);
18526     }
18527     uint64_t cgen_var_0;
18528     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
18529     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
18530     *streamPtrPtr += 1 * 8;
18531     reservedmarshal_VkFenceGetFdInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18532                                         (VkFenceGetFdInfoKHR*)(local_pGetFdInfo), streamPtrPtr);
18533     memcpy(*streamPtrPtr, (int*)pFd, sizeof(int));
18534     *streamPtrPtr += sizeof(int);
18535     stream->read((int*)pFd, sizeof(int));
18536     VkResult vkGetFenceFdKHR_VkResult_return = (VkResult)0;
18537     stream->read(&vkGetFenceFdKHR_VkResult_return, sizeof(VkResult));
18538     ++encodeCount;
18539     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18540         pool->freeAll();
18541         stream->clearPool();
18542     }
18543     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18544     return vkGetFenceFdKHR_VkResult_return;
18545 }
18546 
18547 #endif
18548 #ifdef VK_KHR_get_memory_requirements2
vkGetImageMemoryRequirements2KHR(VkDevice device,const VkImageMemoryRequirementsInfo2 * pInfo,VkMemoryRequirements2 * pMemoryRequirements,uint32_t doLock)18549 void VkEncoder::vkGetImageMemoryRequirements2KHR(VkDevice device,
18550                                                  const VkImageMemoryRequirementsInfo2* pInfo,
18551                                                  VkMemoryRequirements2* pMemoryRequirements,
18552                                                  uint32_t doLock) {
18553     (void)doLock;
18554     bool queueSubmitWithCommandsEnabled =
18555         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18556     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18557     auto stream = mImpl->stream();
18558     auto pool = mImpl->pool();
18559     VkDevice local_device;
18560     VkImageMemoryRequirementsInfo2* local_pInfo;
18561     local_device = device;
18562     local_pInfo = nullptr;
18563     if (pInfo) {
18564         local_pInfo = (VkImageMemoryRequirementsInfo2*)pool->alloc(
18565             sizeof(const VkImageMemoryRequirementsInfo2));
18566         deepcopy_VkImageMemoryRequirementsInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
18567                                                 (VkImageMemoryRequirementsInfo2*)(local_pInfo));
18568     }
18569     if (local_pInfo) {
18570         transform_tohost_VkImageMemoryRequirementsInfo2(
18571             sResourceTracker, (VkImageMemoryRequirementsInfo2*)(local_pInfo));
18572     }
18573     size_t count = 0;
18574     size_t* countPtr = &count;
18575     {
18576         uint64_t cgen_var_0;
18577         *countPtr += 1 * 8;
18578         count_VkImageMemoryRequirementsInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18579                                              (VkImageMemoryRequirementsInfo2*)(local_pInfo),
18580                                              countPtr);
18581         count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18582                                     (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
18583     }
18584     uint32_t packetSize_vkGetImageMemoryRequirements2KHR =
18585         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
18586     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageMemoryRequirements2KHR);
18587     uint8_t* packetBeginPtr = streamPtr;
18588     uint8_t** streamPtrPtr = &streamPtr;
18589     uint32_t opcode_vkGetImageMemoryRequirements2KHR = OP_vkGetImageMemoryRequirements2KHR;
18590     uint32_t seqno;
18591     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
18592     memcpy(streamPtr, &opcode_vkGetImageMemoryRequirements2KHR, sizeof(uint32_t));
18593     streamPtr += sizeof(uint32_t);
18594     memcpy(streamPtr, &packetSize_vkGetImageMemoryRequirements2KHR, sizeof(uint32_t));
18595     streamPtr += sizeof(uint32_t);
18596     if (queueSubmitWithCommandsEnabled) {
18597         memcpy(streamPtr, &seqno, sizeof(uint32_t));
18598         streamPtr += sizeof(uint32_t);
18599     }
18600     uint64_t cgen_var_0;
18601     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
18602     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
18603     *streamPtrPtr += 1 * 8;
18604     reservedmarshal_VkImageMemoryRequirementsInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18605                                                    (VkImageMemoryRequirementsInfo2*)(local_pInfo),
18606                                                    streamPtrPtr);
18607     reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18608                                           (VkMemoryRequirements2*)(pMemoryRequirements),
18609                                           streamPtrPtr);
18610     unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18611                                     (VkMemoryRequirements2*)(pMemoryRequirements));
18612     if (pMemoryRequirements) {
18613         transform_fromhost_VkMemoryRequirements2(sResourceTracker,
18614                                                  (VkMemoryRequirements2*)(pMemoryRequirements));
18615     }
18616     ++encodeCount;
18617     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18618         pool->freeAll();
18619         stream->clearPool();
18620     }
18621     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18622 }
18623 
vkGetBufferMemoryRequirements2KHR(VkDevice device,const VkBufferMemoryRequirementsInfo2 * pInfo,VkMemoryRequirements2 * pMemoryRequirements,uint32_t doLock)18624 void VkEncoder::vkGetBufferMemoryRequirements2KHR(VkDevice device,
18625                                                   const VkBufferMemoryRequirementsInfo2* pInfo,
18626                                                   VkMemoryRequirements2* pMemoryRequirements,
18627                                                   uint32_t doLock) {
18628     (void)doLock;
18629     bool queueSubmitWithCommandsEnabled =
18630         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18631     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18632     auto stream = mImpl->stream();
18633     auto pool = mImpl->pool();
18634     VkDevice local_device;
18635     VkBufferMemoryRequirementsInfo2* local_pInfo;
18636     local_device = device;
18637     local_pInfo = nullptr;
18638     if (pInfo) {
18639         local_pInfo = (VkBufferMemoryRequirementsInfo2*)pool->alloc(
18640             sizeof(const VkBufferMemoryRequirementsInfo2));
18641         deepcopy_VkBufferMemoryRequirementsInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
18642                                                  (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
18643     }
18644     if (local_pInfo) {
18645         transform_tohost_VkBufferMemoryRequirementsInfo2(
18646             sResourceTracker, (VkBufferMemoryRequirementsInfo2*)(local_pInfo));
18647     }
18648     size_t count = 0;
18649     size_t* countPtr = &count;
18650     {
18651         uint64_t cgen_var_0;
18652         *countPtr += 1 * 8;
18653         count_VkBufferMemoryRequirementsInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18654                                               (VkBufferMemoryRequirementsInfo2*)(local_pInfo),
18655                                               countPtr);
18656         count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18657                                     (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
18658     }
18659     uint32_t packetSize_vkGetBufferMemoryRequirements2KHR =
18660         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
18661     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferMemoryRequirements2KHR);
18662     uint8_t* packetBeginPtr = streamPtr;
18663     uint8_t** streamPtrPtr = &streamPtr;
18664     uint32_t opcode_vkGetBufferMemoryRequirements2KHR = OP_vkGetBufferMemoryRequirements2KHR;
18665     uint32_t seqno;
18666     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
18667     memcpy(streamPtr, &opcode_vkGetBufferMemoryRequirements2KHR, sizeof(uint32_t));
18668     streamPtr += sizeof(uint32_t);
18669     memcpy(streamPtr, &packetSize_vkGetBufferMemoryRequirements2KHR, sizeof(uint32_t));
18670     streamPtr += sizeof(uint32_t);
18671     if (queueSubmitWithCommandsEnabled) {
18672         memcpy(streamPtr, &seqno, sizeof(uint32_t));
18673         streamPtr += sizeof(uint32_t);
18674     }
18675     uint64_t cgen_var_0;
18676     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
18677     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
18678     *streamPtrPtr += 1 * 8;
18679     reservedmarshal_VkBufferMemoryRequirementsInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18680                                                     (VkBufferMemoryRequirementsInfo2*)(local_pInfo),
18681                                                     streamPtrPtr);
18682     reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18683                                           (VkMemoryRequirements2*)(pMemoryRequirements),
18684                                           streamPtrPtr);
18685     unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18686                                     (VkMemoryRequirements2*)(pMemoryRequirements));
18687     if (pMemoryRequirements) {
18688         transform_fromhost_VkMemoryRequirements2(sResourceTracker,
18689                                                  (VkMemoryRequirements2*)(pMemoryRequirements));
18690     }
18691     ++encodeCount;
18692     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18693         pool->freeAll();
18694         stream->clearPool();
18695     }
18696     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18697 }
18698 
vkGetImageSparseMemoryRequirements2KHR(VkDevice device,const VkImageSparseMemoryRequirementsInfo2 * pInfo,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements2 * pSparseMemoryRequirements,uint32_t doLock)18699 void VkEncoder::vkGetImageSparseMemoryRequirements2KHR(
18700     VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo,
18701     uint32_t* pSparseMemoryRequirementCount,
18702     VkSparseImageMemoryRequirements2* pSparseMemoryRequirements, uint32_t doLock) {
18703     (void)doLock;
18704     bool queueSubmitWithCommandsEnabled =
18705         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18706     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18707     auto stream = mImpl->stream();
18708     auto pool = mImpl->pool();
18709     VkDevice local_device;
18710     VkImageSparseMemoryRequirementsInfo2* local_pInfo;
18711     local_device = device;
18712     local_pInfo = nullptr;
18713     if (pInfo) {
18714         local_pInfo = (VkImageSparseMemoryRequirementsInfo2*)pool->alloc(
18715             sizeof(const VkImageSparseMemoryRequirementsInfo2));
18716         deepcopy_VkImageSparseMemoryRequirementsInfo2(
18717             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
18718             (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
18719     }
18720     if (local_pInfo) {
18721         transform_tohost_VkImageSparseMemoryRequirementsInfo2(
18722             sResourceTracker, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo));
18723     }
18724     size_t count = 0;
18725     size_t* countPtr = &count;
18726     {
18727         uint64_t cgen_var_0;
18728         *countPtr += 1 * 8;
18729         count_VkImageSparseMemoryRequirementsInfo2(
18730             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18731             (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo), countPtr);
18732         // WARNING PTR CHECK
18733         *countPtr += 8;
18734         if (pSparseMemoryRequirementCount) {
18735             *countPtr += sizeof(uint32_t);
18736         }
18737         // WARNING PTR CHECK
18738         *countPtr += 8;
18739         if (pSparseMemoryRequirements) {
18740             if (pSparseMemoryRequirementCount) {
18741                 for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
18742                     count_VkSparseImageMemoryRequirements2(
18743                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18744                         (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i),
18745                         countPtr);
18746                 }
18747             }
18748         }
18749     }
18750     uint32_t packetSize_vkGetImageSparseMemoryRequirements2KHR =
18751         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
18752     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageSparseMemoryRequirements2KHR);
18753     uint8_t* packetBeginPtr = streamPtr;
18754     uint8_t** streamPtrPtr = &streamPtr;
18755     uint32_t opcode_vkGetImageSparseMemoryRequirements2KHR =
18756         OP_vkGetImageSparseMemoryRequirements2KHR;
18757     uint32_t seqno;
18758     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
18759     memcpy(streamPtr, &opcode_vkGetImageSparseMemoryRequirements2KHR, sizeof(uint32_t));
18760     streamPtr += sizeof(uint32_t);
18761     memcpy(streamPtr, &packetSize_vkGetImageSparseMemoryRequirements2KHR, sizeof(uint32_t));
18762     streamPtr += sizeof(uint32_t);
18763     if (queueSubmitWithCommandsEnabled) {
18764         memcpy(streamPtr, &seqno, sizeof(uint32_t));
18765         streamPtr += sizeof(uint32_t);
18766     }
18767     uint64_t cgen_var_0;
18768     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
18769     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
18770     *streamPtrPtr += 1 * 8;
18771     reservedmarshal_VkImageSparseMemoryRequirementsInfo2(
18772         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageSparseMemoryRequirementsInfo2*)(local_pInfo),
18773         streamPtrPtr);
18774     // WARNING PTR CHECK
18775     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
18776     memcpy((*streamPtrPtr), &cgen_var_1, 8);
18777     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
18778     *streamPtrPtr += 8;
18779     if (pSparseMemoryRequirementCount) {
18780         memcpy(*streamPtrPtr, (uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
18781         *streamPtrPtr += sizeof(uint32_t);
18782     }
18783     // WARNING PTR CHECK
18784     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
18785     memcpy((*streamPtrPtr), &cgen_var_2, 8);
18786     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
18787     *streamPtrPtr += 8;
18788     if (pSparseMemoryRequirements) {
18789         for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
18790             reservedmarshal_VkSparseImageMemoryRequirements2(
18791                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18792                 (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), streamPtrPtr);
18793         }
18794     }
18795     // WARNING PTR CHECK
18796     uint32_t* check_pSparseMemoryRequirementCount;
18797     check_pSparseMemoryRequirementCount = (uint32_t*)(uintptr_t)stream->getBe64();
18798     if (pSparseMemoryRequirementCount) {
18799         if (!(check_pSparseMemoryRequirementCount)) {
18800             fprintf(stderr,
18801                     "fatal: pSparseMemoryRequirementCount inconsistent between guest and host\n");
18802         }
18803         stream->read((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
18804     }
18805     // WARNING PTR CHECK
18806     VkSparseImageMemoryRequirements2* check_pSparseMemoryRequirements;
18807     check_pSparseMemoryRequirements =
18808         (VkSparseImageMemoryRequirements2*)(uintptr_t)stream->getBe64();
18809     if (pSparseMemoryRequirements) {
18810         if (!(check_pSparseMemoryRequirements)) {
18811             fprintf(stderr,
18812                     "fatal: pSparseMemoryRequirements inconsistent between guest and host\n");
18813         }
18814         if (pSparseMemoryRequirementCount) {
18815             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
18816                 unmarshal_VkSparseImageMemoryRequirements2(
18817                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18818                     (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
18819             }
18820         }
18821     }
18822     if (pSparseMemoryRequirementCount) {
18823         if (pSparseMemoryRequirements) {
18824             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
18825                 transform_fromhost_VkSparseImageMemoryRequirements2(
18826                     sResourceTracker,
18827                     (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
18828             }
18829         }
18830     }
18831     ++encodeCount;
18832     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18833         pool->freeAll();
18834         stream->clearPool();
18835     }
18836     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18837 }
18838 
18839 #endif
18840 #ifdef VK_KHR_sampler_ycbcr_conversion
vkCreateSamplerYcbcrConversionKHR(VkDevice device,const VkSamplerYcbcrConversionCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkSamplerYcbcrConversion * pYcbcrConversion,uint32_t doLock)18841 VkResult VkEncoder::vkCreateSamplerYcbcrConversionKHR(
18842     VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
18843     const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversion* pYcbcrConversion,
18844     uint32_t doLock) {
18845     (void)doLock;
18846     bool queueSubmitWithCommandsEnabled =
18847         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18848     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18849     auto stream = mImpl->stream();
18850     auto pool = mImpl->pool();
18851     VkDevice local_device;
18852     VkSamplerYcbcrConversionCreateInfo* local_pCreateInfo;
18853     VkAllocationCallbacks* local_pAllocator;
18854     local_device = device;
18855     local_pCreateInfo = nullptr;
18856     if (pCreateInfo) {
18857         local_pCreateInfo = (VkSamplerYcbcrConversionCreateInfo*)pool->alloc(
18858             sizeof(const VkSamplerYcbcrConversionCreateInfo));
18859         deepcopy_VkSamplerYcbcrConversionCreateInfo(
18860             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
18861             (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
18862     }
18863     local_pAllocator = nullptr;
18864     if (pAllocator) {
18865         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
18866         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
18867                                        (VkAllocationCallbacks*)(local_pAllocator));
18868     }
18869     local_pAllocator = nullptr;
18870     if (local_pCreateInfo) {
18871         transform_tohost_VkSamplerYcbcrConversionCreateInfo(
18872             sResourceTracker, (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo));
18873     }
18874     if (local_pAllocator) {
18875         transform_tohost_VkAllocationCallbacks(sResourceTracker,
18876                                                (VkAllocationCallbacks*)(local_pAllocator));
18877     }
18878     size_t count = 0;
18879     size_t* countPtr = &count;
18880     {
18881         uint64_t cgen_var_0;
18882         *countPtr += 1 * 8;
18883         count_VkSamplerYcbcrConversionCreateInfo(
18884             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18885             (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), countPtr);
18886         // WARNING PTR CHECK
18887         *countPtr += 8;
18888         if (local_pAllocator) {
18889             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18890                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
18891         }
18892         uint64_t cgen_var_1;
18893         *countPtr += 8;
18894     }
18895     uint32_t packetSize_vkCreateSamplerYcbcrConversionKHR =
18896         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
18897     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateSamplerYcbcrConversionKHR);
18898     uint8_t* packetBeginPtr = streamPtr;
18899     uint8_t** streamPtrPtr = &streamPtr;
18900     uint32_t opcode_vkCreateSamplerYcbcrConversionKHR = OP_vkCreateSamplerYcbcrConversionKHR;
18901     uint32_t seqno;
18902     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
18903     memcpy(streamPtr, &opcode_vkCreateSamplerYcbcrConversionKHR, sizeof(uint32_t));
18904     streamPtr += sizeof(uint32_t);
18905     memcpy(streamPtr, &packetSize_vkCreateSamplerYcbcrConversionKHR, sizeof(uint32_t));
18906     streamPtr += sizeof(uint32_t);
18907     if (queueSubmitWithCommandsEnabled) {
18908         memcpy(streamPtr, &seqno, sizeof(uint32_t));
18909         streamPtr += sizeof(uint32_t);
18910     }
18911     uint64_t cgen_var_0;
18912     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
18913     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
18914     *streamPtrPtr += 1 * 8;
18915     reservedmarshal_VkSamplerYcbcrConversionCreateInfo(
18916         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18917         (VkSamplerYcbcrConversionCreateInfo*)(local_pCreateInfo), streamPtrPtr);
18918     // WARNING PTR CHECK
18919     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
18920     memcpy((*streamPtrPtr), &cgen_var_1, 8);
18921     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
18922     *streamPtrPtr += 8;
18923     if (local_pAllocator) {
18924         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
18925                                               (VkAllocationCallbacks*)(local_pAllocator),
18926                                               streamPtrPtr);
18927     }
18928     /* is handle, possibly out */;
18929     uint64_t cgen_var_2;
18930     *&cgen_var_2 = (uint64_t)((*pYcbcrConversion));
18931     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
18932     *streamPtrPtr += 8;
18933     /* is handle, possibly out */;
18934     stream->setHandleMapping(sResourceTracker->createMapping());
18935     uint64_t cgen_var_3;
18936     stream->read((uint64_t*)&cgen_var_3, 8);
18937     stream->handleMapping()->mapHandles_u64_VkSamplerYcbcrConversion(
18938         &cgen_var_3, (VkSamplerYcbcrConversion*)pYcbcrConversion, 1);
18939     stream->unsetHandleMapping();
18940     VkResult vkCreateSamplerYcbcrConversionKHR_VkResult_return = (VkResult)0;
18941     stream->read(&vkCreateSamplerYcbcrConversionKHR_VkResult_return, sizeof(VkResult));
18942     ++encodeCount;
18943     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
18944         pool->freeAll();
18945         stream->clearPool();
18946     }
18947     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
18948     return vkCreateSamplerYcbcrConversionKHR_VkResult_return;
18949 }
18950 
vkDestroySamplerYcbcrConversionKHR(VkDevice device,VkSamplerYcbcrConversion ycbcrConversion,const VkAllocationCallbacks * pAllocator,uint32_t doLock)18951 void VkEncoder::vkDestroySamplerYcbcrConversionKHR(VkDevice device,
18952                                                    VkSamplerYcbcrConversion ycbcrConversion,
18953                                                    const VkAllocationCallbacks* pAllocator,
18954                                                    uint32_t doLock) {
18955     (void)doLock;
18956     bool queueSubmitWithCommandsEnabled =
18957         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
18958     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
18959     auto stream = mImpl->stream();
18960     auto pool = mImpl->pool();
18961     VkDevice local_device;
18962     VkSamplerYcbcrConversion local_ycbcrConversion;
18963     VkAllocationCallbacks* local_pAllocator;
18964     local_device = device;
18965     local_ycbcrConversion = ycbcrConversion;
18966     local_pAllocator = nullptr;
18967     if (pAllocator) {
18968         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
18969         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
18970                                        (VkAllocationCallbacks*)(local_pAllocator));
18971     }
18972     local_pAllocator = nullptr;
18973     if (local_pAllocator) {
18974         transform_tohost_VkAllocationCallbacks(sResourceTracker,
18975                                                (VkAllocationCallbacks*)(local_pAllocator));
18976     }
18977     size_t count = 0;
18978     size_t* countPtr = &count;
18979     {
18980         uint64_t cgen_var_0;
18981         *countPtr += 1 * 8;
18982         uint64_t cgen_var_1;
18983         *countPtr += 1 * 8;
18984         // WARNING PTR CHECK
18985         *countPtr += 8;
18986         if (local_pAllocator) {
18987             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
18988                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
18989         }
18990     }
18991     uint32_t packetSize_vkDestroySamplerYcbcrConversionKHR =
18992         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
18993     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroySamplerYcbcrConversionKHR);
18994     uint8_t* packetBeginPtr = streamPtr;
18995     uint8_t** streamPtrPtr = &streamPtr;
18996     uint32_t opcode_vkDestroySamplerYcbcrConversionKHR = OP_vkDestroySamplerYcbcrConversionKHR;
18997     uint32_t seqno;
18998     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
18999     memcpy(streamPtr, &opcode_vkDestroySamplerYcbcrConversionKHR, sizeof(uint32_t));
19000     streamPtr += sizeof(uint32_t);
19001     memcpy(streamPtr, &packetSize_vkDestroySamplerYcbcrConversionKHR, sizeof(uint32_t));
19002     streamPtr += sizeof(uint32_t);
19003     if (queueSubmitWithCommandsEnabled) {
19004         memcpy(streamPtr, &seqno, sizeof(uint32_t));
19005         streamPtr += sizeof(uint32_t);
19006     }
19007     uint64_t cgen_var_0;
19008     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
19009     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19010     *streamPtrPtr += 1 * 8;
19011     uint64_t cgen_var_1;
19012     *&cgen_var_1 = get_host_u64_VkSamplerYcbcrConversion((*&local_ycbcrConversion));
19013     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
19014     *streamPtrPtr += 1 * 8;
19015     // WARNING PTR CHECK
19016     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
19017     memcpy((*streamPtrPtr), &cgen_var_2, 8);
19018     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
19019     *streamPtrPtr += 8;
19020     if (local_pAllocator) {
19021         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19022                                               (VkAllocationCallbacks*)(local_pAllocator),
19023                                               streamPtrPtr);
19024     }
19025     sResourceTracker->destroyMapping()->mapHandles_VkSamplerYcbcrConversion(
19026         (VkSamplerYcbcrConversion*)&ycbcrConversion);
19027     stream->flush();
19028     ++encodeCount;
19029     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19030         pool->freeAll();
19031         stream->clearPool();
19032     }
19033     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
19034 }
19035 
19036 #endif
19037 #ifdef VK_KHR_bind_memory2
vkBindBufferMemory2KHR(VkDevice device,uint32_t bindInfoCount,const VkBindBufferMemoryInfo * pBindInfos,uint32_t doLock)19038 VkResult VkEncoder::vkBindBufferMemory2KHR(VkDevice device, uint32_t bindInfoCount,
19039                                            const VkBindBufferMemoryInfo* pBindInfos,
19040                                            uint32_t doLock) {
19041     (void)doLock;
19042     bool queueSubmitWithCommandsEnabled =
19043         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
19044     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
19045     auto stream = mImpl->stream();
19046     auto pool = mImpl->pool();
19047     VkDevice local_device;
19048     uint32_t local_bindInfoCount;
19049     VkBindBufferMemoryInfo* local_pBindInfos;
19050     local_device = device;
19051     local_bindInfoCount = bindInfoCount;
19052     local_pBindInfos = nullptr;
19053     if (pBindInfos) {
19054         local_pBindInfos = (VkBindBufferMemoryInfo*)pool->alloc(
19055             ((bindInfoCount)) * sizeof(const VkBindBufferMemoryInfo));
19056         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
19057             deepcopy_VkBindBufferMemoryInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfos + i,
19058                                             (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
19059         }
19060     }
19061     if (local_pBindInfos) {
19062         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
19063             transform_tohost_VkBindBufferMemoryInfo(
19064                 sResourceTracker, (VkBindBufferMemoryInfo*)(local_pBindInfos + i));
19065         }
19066     }
19067     size_t count = 0;
19068     size_t* countPtr = &count;
19069     {
19070         uint64_t cgen_var_0;
19071         *countPtr += 1 * 8;
19072         *countPtr += sizeof(uint32_t);
19073         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
19074             count_VkBindBufferMemoryInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19075                                          (VkBindBufferMemoryInfo*)(local_pBindInfos + i), countPtr);
19076         }
19077     }
19078     uint32_t packetSize_vkBindBufferMemory2KHR =
19079         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
19080     uint8_t* streamPtr = stream->reserve(packetSize_vkBindBufferMemory2KHR);
19081     uint8_t* packetBeginPtr = streamPtr;
19082     uint8_t** streamPtrPtr = &streamPtr;
19083     uint32_t opcode_vkBindBufferMemory2KHR = OP_vkBindBufferMemory2KHR;
19084     uint32_t seqno;
19085     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
19086     memcpy(streamPtr, &opcode_vkBindBufferMemory2KHR, sizeof(uint32_t));
19087     streamPtr += sizeof(uint32_t);
19088     memcpy(streamPtr, &packetSize_vkBindBufferMemory2KHR, sizeof(uint32_t));
19089     streamPtr += sizeof(uint32_t);
19090     if (queueSubmitWithCommandsEnabled) {
19091         memcpy(streamPtr, &seqno, sizeof(uint32_t));
19092         streamPtr += sizeof(uint32_t);
19093     }
19094     uint64_t cgen_var_0;
19095     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
19096     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19097     *streamPtrPtr += 1 * 8;
19098     memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
19099     *streamPtrPtr += sizeof(uint32_t);
19100     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
19101         reservedmarshal_VkBindBufferMemoryInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19102                                                (VkBindBufferMemoryInfo*)(local_pBindInfos + i),
19103                                                streamPtrPtr);
19104     }
19105     VkResult vkBindBufferMemory2KHR_VkResult_return = (VkResult)0;
19106     stream->read(&vkBindBufferMemory2KHR_VkResult_return, sizeof(VkResult));
19107     ++encodeCount;
19108     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19109         pool->freeAll();
19110         stream->clearPool();
19111     }
19112     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
19113     return vkBindBufferMemory2KHR_VkResult_return;
19114 }
19115 
vkBindImageMemory2KHR(VkDevice device,uint32_t bindInfoCount,const VkBindImageMemoryInfo * pBindInfos,uint32_t doLock)19116 VkResult VkEncoder::vkBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
19117                                           const VkBindImageMemoryInfo* pBindInfos,
19118                                           uint32_t doLock) {
19119     (void)doLock;
19120     bool queueSubmitWithCommandsEnabled =
19121         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
19122     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
19123     auto stream = mImpl->stream();
19124     auto pool = mImpl->pool();
19125     VkDevice local_device;
19126     uint32_t local_bindInfoCount;
19127     VkBindImageMemoryInfo* local_pBindInfos;
19128     local_device = device;
19129     local_bindInfoCount = bindInfoCount;
19130     local_pBindInfos = nullptr;
19131     if (pBindInfos) {
19132         local_pBindInfos = (VkBindImageMemoryInfo*)pool->alloc(((bindInfoCount)) *
19133                                                                sizeof(const VkBindImageMemoryInfo));
19134         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
19135             deepcopy_VkBindImageMemoryInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfos + i,
19136                                            (VkBindImageMemoryInfo*)(local_pBindInfos + i));
19137         }
19138     }
19139     if (local_pBindInfos) {
19140         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
19141             transform_tohost_VkBindImageMemoryInfo(sResourceTracker,
19142                                                    (VkBindImageMemoryInfo*)(local_pBindInfos + i));
19143         }
19144     }
19145     size_t count = 0;
19146     size_t* countPtr = &count;
19147     {
19148         uint64_t cgen_var_0;
19149         *countPtr += 1 * 8;
19150         *countPtr += sizeof(uint32_t);
19151         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
19152             count_VkBindImageMemoryInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19153                                         (VkBindImageMemoryInfo*)(local_pBindInfos + i), countPtr);
19154         }
19155     }
19156     uint32_t packetSize_vkBindImageMemory2KHR =
19157         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
19158     uint8_t* streamPtr = stream->reserve(packetSize_vkBindImageMemory2KHR);
19159     uint8_t* packetBeginPtr = streamPtr;
19160     uint8_t** streamPtrPtr = &streamPtr;
19161     uint32_t opcode_vkBindImageMemory2KHR = OP_vkBindImageMemory2KHR;
19162     uint32_t seqno;
19163     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
19164     memcpy(streamPtr, &opcode_vkBindImageMemory2KHR, sizeof(uint32_t));
19165     streamPtr += sizeof(uint32_t);
19166     memcpy(streamPtr, &packetSize_vkBindImageMemory2KHR, sizeof(uint32_t));
19167     streamPtr += sizeof(uint32_t);
19168     if (queueSubmitWithCommandsEnabled) {
19169         memcpy(streamPtr, &seqno, sizeof(uint32_t));
19170         streamPtr += sizeof(uint32_t);
19171     }
19172     uint64_t cgen_var_0;
19173     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
19174     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19175     *streamPtrPtr += 1 * 8;
19176     memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
19177     *streamPtrPtr += sizeof(uint32_t);
19178     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
19179         reservedmarshal_VkBindImageMemoryInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19180                                               (VkBindImageMemoryInfo*)(local_pBindInfos + i),
19181                                               streamPtrPtr);
19182     }
19183     VkResult vkBindImageMemory2KHR_VkResult_return = (VkResult)0;
19184     stream->read(&vkBindImageMemory2KHR_VkResult_return, sizeof(VkResult));
19185     ++encodeCount;
19186     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19187         pool->freeAll();
19188         stream->clearPool();
19189     }
19190     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
19191     return vkBindImageMemory2KHR_VkResult_return;
19192 }
19193 
19194 #endif
19195 #ifdef VK_KHR_maintenance3
vkGetDescriptorSetLayoutSupportKHR(VkDevice device,const VkDescriptorSetLayoutCreateInfo * pCreateInfo,VkDescriptorSetLayoutSupport * pSupport,uint32_t doLock)19196 void VkEncoder::vkGetDescriptorSetLayoutSupportKHR(
19197     VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
19198     VkDescriptorSetLayoutSupport* pSupport, uint32_t doLock) {
19199     (void)doLock;
19200     bool queueSubmitWithCommandsEnabled =
19201         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
19202     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
19203     auto stream = mImpl->stream();
19204     auto pool = mImpl->pool();
19205     VkDevice local_device;
19206     VkDescriptorSetLayoutCreateInfo* local_pCreateInfo;
19207     local_device = device;
19208     local_pCreateInfo = nullptr;
19209     if (pCreateInfo) {
19210         local_pCreateInfo = (VkDescriptorSetLayoutCreateInfo*)pool->alloc(
19211             sizeof(const VkDescriptorSetLayoutCreateInfo));
19212         deepcopy_VkDescriptorSetLayoutCreateInfo(
19213             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
19214             (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
19215     }
19216     if (local_pCreateInfo) {
19217         transform_tohost_VkDescriptorSetLayoutCreateInfo(
19218             sResourceTracker, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo));
19219     }
19220     size_t count = 0;
19221     size_t* countPtr = &count;
19222     {
19223         uint64_t cgen_var_0;
19224         *countPtr += 1 * 8;
19225         count_VkDescriptorSetLayoutCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19226                                               (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo),
19227                                               countPtr);
19228         count_VkDescriptorSetLayoutSupport(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19229                                            (VkDescriptorSetLayoutSupport*)(pSupport), countPtr);
19230     }
19231     uint32_t packetSize_vkGetDescriptorSetLayoutSupportKHR =
19232         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
19233     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDescriptorSetLayoutSupportKHR);
19234     uint8_t* packetBeginPtr = streamPtr;
19235     uint8_t** streamPtrPtr = &streamPtr;
19236     uint32_t opcode_vkGetDescriptorSetLayoutSupportKHR = OP_vkGetDescriptorSetLayoutSupportKHR;
19237     uint32_t seqno;
19238     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
19239     memcpy(streamPtr, &opcode_vkGetDescriptorSetLayoutSupportKHR, sizeof(uint32_t));
19240     streamPtr += sizeof(uint32_t);
19241     memcpy(streamPtr, &packetSize_vkGetDescriptorSetLayoutSupportKHR, sizeof(uint32_t));
19242     streamPtr += sizeof(uint32_t);
19243     if (queueSubmitWithCommandsEnabled) {
19244         memcpy(streamPtr, &seqno, sizeof(uint32_t));
19245         streamPtr += sizeof(uint32_t);
19246     }
19247     uint64_t cgen_var_0;
19248     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
19249     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19250     *streamPtrPtr += 1 * 8;
19251     reservedmarshal_VkDescriptorSetLayoutCreateInfo(
19252         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDescriptorSetLayoutCreateInfo*)(local_pCreateInfo),
19253         streamPtrPtr);
19254     reservedmarshal_VkDescriptorSetLayoutSupport(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19255                                                  (VkDescriptorSetLayoutSupport*)(pSupport),
19256                                                  streamPtrPtr);
19257     unmarshal_VkDescriptorSetLayoutSupport(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19258                                            (VkDescriptorSetLayoutSupport*)(pSupport));
19259     if (pSupport) {
19260         transform_fromhost_VkDescriptorSetLayoutSupport(sResourceTracker,
19261                                                         (VkDescriptorSetLayoutSupport*)(pSupport));
19262     }
19263     ++encodeCount;
19264     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19265         pool->freeAll();
19266         stream->clearPool();
19267     }
19268     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
19269 }
19270 
19271 #endif
19272 #ifdef VK_KHR_buffer_device_address
vkGetBufferDeviceAddressKHR(VkDevice device,const VkBufferDeviceAddressInfo * pInfo,uint32_t doLock)19273 VkDeviceAddress VkEncoder::vkGetBufferDeviceAddressKHR(VkDevice device,
19274                                                        const VkBufferDeviceAddressInfo* pInfo,
19275                                                        uint32_t doLock) {
19276     (void)doLock;
19277     bool queueSubmitWithCommandsEnabled =
19278         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
19279     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
19280     auto stream = mImpl->stream();
19281     auto pool = mImpl->pool();
19282     VkDevice local_device;
19283     VkBufferDeviceAddressInfo* local_pInfo;
19284     local_device = device;
19285     local_pInfo = nullptr;
19286     if (pInfo) {
19287         local_pInfo =
19288             (VkBufferDeviceAddressInfo*)pool->alloc(sizeof(const VkBufferDeviceAddressInfo));
19289         deepcopy_VkBufferDeviceAddressInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
19290                                            (VkBufferDeviceAddressInfo*)(local_pInfo));
19291     }
19292     if (local_pInfo) {
19293         transform_tohost_VkBufferDeviceAddressInfo(sResourceTracker,
19294                                                    (VkBufferDeviceAddressInfo*)(local_pInfo));
19295     }
19296     size_t count = 0;
19297     size_t* countPtr = &count;
19298     {
19299         uint64_t cgen_var_0;
19300         *countPtr += 1 * 8;
19301         count_VkBufferDeviceAddressInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19302                                         (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
19303     }
19304     uint32_t packetSize_vkGetBufferDeviceAddressKHR =
19305         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
19306     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferDeviceAddressKHR);
19307     uint8_t* packetBeginPtr = streamPtr;
19308     uint8_t** streamPtrPtr = &streamPtr;
19309     uint32_t opcode_vkGetBufferDeviceAddressKHR = OP_vkGetBufferDeviceAddressKHR;
19310     uint32_t seqno;
19311     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
19312     memcpy(streamPtr, &opcode_vkGetBufferDeviceAddressKHR, sizeof(uint32_t));
19313     streamPtr += sizeof(uint32_t);
19314     memcpy(streamPtr, &packetSize_vkGetBufferDeviceAddressKHR, sizeof(uint32_t));
19315     streamPtr += sizeof(uint32_t);
19316     if (queueSubmitWithCommandsEnabled) {
19317         memcpy(streamPtr, &seqno, sizeof(uint32_t));
19318         streamPtr += sizeof(uint32_t);
19319     }
19320     uint64_t cgen_var_0;
19321     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
19322     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19323     *streamPtrPtr += 1 * 8;
19324     reservedmarshal_VkBufferDeviceAddressInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19325                                               (VkBufferDeviceAddressInfo*)(local_pInfo),
19326                                               streamPtrPtr);
19327     VkDeviceAddress vkGetBufferDeviceAddressKHR_VkDeviceAddress_return = (VkDeviceAddress)0;
19328     stream->read(&vkGetBufferDeviceAddressKHR_VkDeviceAddress_return, sizeof(VkDeviceAddress));
19329     ++encodeCount;
19330     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19331         pool->freeAll();
19332         stream->clearPool();
19333     }
19334     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
19335     return vkGetBufferDeviceAddressKHR_VkDeviceAddress_return;
19336 }
19337 
vkGetBufferOpaqueCaptureAddressKHR(VkDevice device,const VkBufferDeviceAddressInfo * pInfo,uint32_t doLock)19338 uint64_t VkEncoder::vkGetBufferOpaqueCaptureAddressKHR(VkDevice device,
19339                                                        const VkBufferDeviceAddressInfo* pInfo,
19340                                                        uint32_t doLock) {
19341     (void)doLock;
19342     bool queueSubmitWithCommandsEnabled =
19343         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
19344     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
19345     auto stream = mImpl->stream();
19346     auto pool = mImpl->pool();
19347     VkDevice local_device;
19348     VkBufferDeviceAddressInfo* local_pInfo;
19349     local_device = device;
19350     local_pInfo = nullptr;
19351     if (pInfo) {
19352         local_pInfo =
19353             (VkBufferDeviceAddressInfo*)pool->alloc(sizeof(const VkBufferDeviceAddressInfo));
19354         deepcopy_VkBufferDeviceAddressInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
19355                                            (VkBufferDeviceAddressInfo*)(local_pInfo));
19356     }
19357     if (local_pInfo) {
19358         transform_tohost_VkBufferDeviceAddressInfo(sResourceTracker,
19359                                                    (VkBufferDeviceAddressInfo*)(local_pInfo));
19360     }
19361     size_t count = 0;
19362     size_t* countPtr = &count;
19363     {
19364         uint64_t cgen_var_0;
19365         *countPtr += 1 * 8;
19366         count_VkBufferDeviceAddressInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19367                                         (VkBufferDeviceAddressInfo*)(local_pInfo), countPtr);
19368     }
19369     uint32_t packetSize_vkGetBufferOpaqueCaptureAddressKHR =
19370         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
19371     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBufferOpaqueCaptureAddressKHR);
19372     uint8_t* packetBeginPtr = streamPtr;
19373     uint8_t** streamPtrPtr = &streamPtr;
19374     uint32_t opcode_vkGetBufferOpaqueCaptureAddressKHR = OP_vkGetBufferOpaqueCaptureAddressKHR;
19375     uint32_t seqno;
19376     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
19377     memcpy(streamPtr, &opcode_vkGetBufferOpaqueCaptureAddressKHR, sizeof(uint32_t));
19378     streamPtr += sizeof(uint32_t);
19379     memcpy(streamPtr, &packetSize_vkGetBufferOpaqueCaptureAddressKHR, sizeof(uint32_t));
19380     streamPtr += sizeof(uint32_t);
19381     if (queueSubmitWithCommandsEnabled) {
19382         memcpy(streamPtr, &seqno, sizeof(uint32_t));
19383         streamPtr += sizeof(uint32_t);
19384     }
19385     uint64_t cgen_var_0;
19386     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
19387     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19388     *streamPtrPtr += 1 * 8;
19389     reservedmarshal_VkBufferDeviceAddressInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19390                                               (VkBufferDeviceAddressInfo*)(local_pInfo),
19391                                               streamPtrPtr);
19392     uint64_t vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return = (uint64_t)0;
19393     stream->read(&vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return, sizeof(uint64_t));
19394     ++encodeCount;
19395     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19396         pool->freeAll();
19397         stream->clearPool();
19398     }
19399     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
19400     return vkGetBufferOpaqueCaptureAddressKHR_uint64_t_return;
19401 }
19402 
vkGetDeviceMemoryOpaqueCaptureAddressKHR(VkDevice device,const VkDeviceMemoryOpaqueCaptureAddressInfo * pInfo,uint32_t doLock)19403 uint64_t VkEncoder::vkGetDeviceMemoryOpaqueCaptureAddressKHR(
19404     VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo, uint32_t doLock) {
19405     (void)doLock;
19406     bool queueSubmitWithCommandsEnabled =
19407         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
19408     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
19409     auto stream = mImpl->stream();
19410     auto pool = mImpl->pool();
19411     VkDevice local_device;
19412     VkDeviceMemoryOpaqueCaptureAddressInfo* local_pInfo;
19413     local_device = device;
19414     local_pInfo = nullptr;
19415     if (pInfo) {
19416         local_pInfo = (VkDeviceMemoryOpaqueCaptureAddressInfo*)pool->alloc(
19417             sizeof(const VkDeviceMemoryOpaqueCaptureAddressInfo));
19418         deepcopy_VkDeviceMemoryOpaqueCaptureAddressInfo(
19419             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
19420             (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo));
19421     }
19422     if (local_pInfo) {
19423         transform_tohost_VkDeviceMemoryOpaqueCaptureAddressInfo(
19424             sResourceTracker, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo));
19425     }
19426     size_t count = 0;
19427     size_t* countPtr = &count;
19428     {
19429         uint64_t cgen_var_0;
19430         *countPtr += 1 * 8;
19431         count_VkDeviceMemoryOpaqueCaptureAddressInfo(
19432             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19433             (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo), countPtr);
19434     }
19435     uint32_t packetSize_vkGetDeviceMemoryOpaqueCaptureAddressKHR =
19436         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
19437     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceMemoryOpaqueCaptureAddressKHR);
19438     uint8_t* packetBeginPtr = streamPtr;
19439     uint8_t** streamPtrPtr = &streamPtr;
19440     uint32_t opcode_vkGetDeviceMemoryOpaqueCaptureAddressKHR =
19441         OP_vkGetDeviceMemoryOpaqueCaptureAddressKHR;
19442     uint32_t seqno;
19443     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
19444     memcpy(streamPtr, &opcode_vkGetDeviceMemoryOpaqueCaptureAddressKHR, sizeof(uint32_t));
19445     streamPtr += sizeof(uint32_t);
19446     memcpy(streamPtr, &packetSize_vkGetDeviceMemoryOpaqueCaptureAddressKHR, sizeof(uint32_t));
19447     streamPtr += sizeof(uint32_t);
19448     if (queueSubmitWithCommandsEnabled) {
19449         memcpy(streamPtr, &seqno, sizeof(uint32_t));
19450         streamPtr += sizeof(uint32_t);
19451     }
19452     uint64_t cgen_var_0;
19453     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
19454     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19455     *streamPtrPtr += 1 * 8;
19456     reservedmarshal_VkDeviceMemoryOpaqueCaptureAddressInfo(
19457         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceMemoryOpaqueCaptureAddressInfo*)(local_pInfo),
19458         streamPtrPtr);
19459     uint64_t vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return = (uint64_t)0;
19460     stream->read(&vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return, sizeof(uint64_t));
19461     ++encodeCount;
19462     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19463         pool->freeAll();
19464         stream->clearPool();
19465     }
19466     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
19467     return vkGetDeviceMemoryOpaqueCaptureAddressKHR_uint64_t_return;
19468 }
19469 
19470 #endif
19471 #ifdef VK_KHR_pipeline_executable_properties
vkGetPipelineExecutablePropertiesKHR(VkDevice device,const VkPipelineInfoKHR * pPipelineInfo,uint32_t * pExecutableCount,VkPipelineExecutablePropertiesKHR * pProperties,uint32_t doLock)19472 VkResult VkEncoder::vkGetPipelineExecutablePropertiesKHR(
19473     VkDevice device, const VkPipelineInfoKHR* pPipelineInfo, uint32_t* pExecutableCount,
19474     VkPipelineExecutablePropertiesKHR* pProperties, uint32_t doLock) {
19475     (void)doLock;
19476     bool queueSubmitWithCommandsEnabled =
19477         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
19478     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
19479     auto stream = mImpl->stream();
19480     auto pool = mImpl->pool();
19481     VkDevice local_device;
19482     VkPipelineInfoKHR* local_pPipelineInfo;
19483     local_device = device;
19484     local_pPipelineInfo = nullptr;
19485     if (pPipelineInfo) {
19486         local_pPipelineInfo = (VkPipelineInfoKHR*)pool->alloc(sizeof(const VkPipelineInfoKHR));
19487         deepcopy_VkPipelineInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pPipelineInfo,
19488                                    (VkPipelineInfoKHR*)(local_pPipelineInfo));
19489     }
19490     if (local_pPipelineInfo) {
19491         transform_tohost_VkPipelineInfoKHR(sResourceTracker,
19492                                            (VkPipelineInfoKHR*)(local_pPipelineInfo));
19493     }
19494     size_t count = 0;
19495     size_t* countPtr = &count;
19496     {
19497         uint64_t cgen_var_0;
19498         *countPtr += 1 * 8;
19499         count_VkPipelineInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19500                                 (VkPipelineInfoKHR*)(local_pPipelineInfo), countPtr);
19501         // WARNING PTR CHECK
19502         *countPtr += 8;
19503         if (pExecutableCount) {
19504             *countPtr += sizeof(uint32_t);
19505         }
19506         // WARNING PTR CHECK
19507         *countPtr += 8;
19508         if (pProperties) {
19509             if (pExecutableCount) {
19510                 for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i) {
19511                     count_VkPipelineExecutablePropertiesKHR(
19512                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19513                         (VkPipelineExecutablePropertiesKHR*)(pProperties + i), countPtr);
19514                 }
19515             }
19516         }
19517     }
19518     uint32_t packetSize_vkGetPipelineExecutablePropertiesKHR =
19519         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
19520     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPipelineExecutablePropertiesKHR);
19521     uint8_t* packetBeginPtr = streamPtr;
19522     uint8_t** streamPtrPtr = &streamPtr;
19523     uint32_t opcode_vkGetPipelineExecutablePropertiesKHR = OP_vkGetPipelineExecutablePropertiesKHR;
19524     uint32_t seqno;
19525     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
19526     memcpy(streamPtr, &opcode_vkGetPipelineExecutablePropertiesKHR, sizeof(uint32_t));
19527     streamPtr += sizeof(uint32_t);
19528     memcpy(streamPtr, &packetSize_vkGetPipelineExecutablePropertiesKHR, sizeof(uint32_t));
19529     streamPtr += sizeof(uint32_t);
19530     if (queueSubmitWithCommandsEnabled) {
19531         memcpy(streamPtr, &seqno, sizeof(uint32_t));
19532         streamPtr += sizeof(uint32_t);
19533     }
19534     uint64_t cgen_var_0;
19535     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
19536     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19537     *streamPtrPtr += 1 * 8;
19538     reservedmarshal_VkPipelineInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19539                                       (VkPipelineInfoKHR*)(local_pPipelineInfo), streamPtrPtr);
19540     // WARNING PTR CHECK
19541     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pExecutableCount;
19542     memcpy((*streamPtrPtr), &cgen_var_1, 8);
19543     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
19544     *streamPtrPtr += 8;
19545     if (pExecutableCount) {
19546         memcpy(*streamPtrPtr, (uint32_t*)pExecutableCount, sizeof(uint32_t));
19547         *streamPtrPtr += sizeof(uint32_t);
19548     }
19549     // WARNING PTR CHECK
19550     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pProperties;
19551     memcpy((*streamPtrPtr), &cgen_var_2, 8);
19552     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
19553     *streamPtrPtr += 8;
19554     if (pProperties) {
19555         for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i) {
19556             reservedmarshal_VkPipelineExecutablePropertiesKHR(
19557                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19558                 (VkPipelineExecutablePropertiesKHR*)(pProperties + i), streamPtrPtr);
19559         }
19560     }
19561     // WARNING PTR CHECK
19562     uint32_t* check_pExecutableCount;
19563     check_pExecutableCount = (uint32_t*)(uintptr_t)stream->getBe64();
19564     if (pExecutableCount) {
19565         if (!(check_pExecutableCount)) {
19566             fprintf(stderr, "fatal: pExecutableCount inconsistent between guest and host\n");
19567         }
19568         stream->read((uint32_t*)pExecutableCount, sizeof(uint32_t));
19569     }
19570     // WARNING PTR CHECK
19571     VkPipelineExecutablePropertiesKHR* check_pProperties;
19572     check_pProperties = (VkPipelineExecutablePropertiesKHR*)(uintptr_t)stream->getBe64();
19573     if (pProperties) {
19574         if (!(check_pProperties)) {
19575             fprintf(stderr, "fatal: pProperties inconsistent between guest and host\n");
19576         }
19577         if (pExecutableCount) {
19578             for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i) {
19579                 unmarshal_VkPipelineExecutablePropertiesKHR(
19580                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19581                     (VkPipelineExecutablePropertiesKHR*)(pProperties + i));
19582             }
19583         }
19584     }
19585     if (pExecutableCount) {
19586         if (pProperties) {
19587             for (uint32_t i = 0; i < (uint32_t)(*(pExecutableCount)); ++i) {
19588                 transform_fromhost_VkPipelineExecutablePropertiesKHR(
19589                     sResourceTracker, (VkPipelineExecutablePropertiesKHR*)(pProperties + i));
19590             }
19591         }
19592     }
19593     VkResult vkGetPipelineExecutablePropertiesKHR_VkResult_return = (VkResult)0;
19594     stream->read(&vkGetPipelineExecutablePropertiesKHR_VkResult_return, sizeof(VkResult));
19595     ++encodeCount;
19596     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19597         pool->freeAll();
19598         stream->clearPool();
19599     }
19600     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
19601     return vkGetPipelineExecutablePropertiesKHR_VkResult_return;
19602 }
19603 
vkGetPipelineExecutableStatisticsKHR(VkDevice device,const VkPipelineExecutableInfoKHR * pExecutableInfo,uint32_t * pStatisticCount,VkPipelineExecutableStatisticKHR * pStatistics,uint32_t doLock)19604 VkResult VkEncoder::vkGetPipelineExecutableStatisticsKHR(
19605     VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo, uint32_t* pStatisticCount,
19606     VkPipelineExecutableStatisticKHR* pStatistics, uint32_t doLock) {
19607     (void)doLock;
19608     bool queueSubmitWithCommandsEnabled =
19609         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
19610     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
19611     auto stream = mImpl->stream();
19612     auto pool = mImpl->pool();
19613     VkDevice local_device;
19614     VkPipelineExecutableInfoKHR* local_pExecutableInfo;
19615     local_device = device;
19616     local_pExecutableInfo = nullptr;
19617     if (pExecutableInfo) {
19618         local_pExecutableInfo =
19619             (VkPipelineExecutableInfoKHR*)pool->alloc(sizeof(const VkPipelineExecutableInfoKHR));
19620         deepcopy_VkPipelineExecutableInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExecutableInfo,
19621                                              (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo));
19622     }
19623     if (local_pExecutableInfo) {
19624         transform_tohost_VkPipelineExecutableInfoKHR(
19625             sResourceTracker, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo));
19626     }
19627     size_t count = 0;
19628     size_t* countPtr = &count;
19629     {
19630         uint64_t cgen_var_0;
19631         *countPtr += 1 * 8;
19632         count_VkPipelineExecutableInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19633                                           (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo),
19634                                           countPtr);
19635         // WARNING PTR CHECK
19636         *countPtr += 8;
19637         if (pStatisticCount) {
19638             *countPtr += sizeof(uint32_t);
19639         }
19640         // WARNING PTR CHECK
19641         *countPtr += 8;
19642         if (pStatistics) {
19643             if (pStatisticCount) {
19644                 for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i) {
19645                     count_VkPipelineExecutableStatisticKHR(
19646                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19647                         (VkPipelineExecutableStatisticKHR*)(pStatistics + i), countPtr);
19648                 }
19649             }
19650         }
19651     }
19652     uint32_t packetSize_vkGetPipelineExecutableStatisticsKHR =
19653         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
19654     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPipelineExecutableStatisticsKHR);
19655     uint8_t* packetBeginPtr = streamPtr;
19656     uint8_t** streamPtrPtr = &streamPtr;
19657     uint32_t opcode_vkGetPipelineExecutableStatisticsKHR = OP_vkGetPipelineExecutableStatisticsKHR;
19658     uint32_t seqno;
19659     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
19660     memcpy(streamPtr, &opcode_vkGetPipelineExecutableStatisticsKHR, sizeof(uint32_t));
19661     streamPtr += sizeof(uint32_t);
19662     memcpy(streamPtr, &packetSize_vkGetPipelineExecutableStatisticsKHR, sizeof(uint32_t));
19663     streamPtr += sizeof(uint32_t);
19664     if (queueSubmitWithCommandsEnabled) {
19665         memcpy(streamPtr, &seqno, sizeof(uint32_t));
19666         streamPtr += sizeof(uint32_t);
19667     }
19668     uint64_t cgen_var_0;
19669     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
19670     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19671     *streamPtrPtr += 1 * 8;
19672     reservedmarshal_VkPipelineExecutableInfoKHR(
19673         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo),
19674         streamPtrPtr);
19675     // WARNING PTR CHECK
19676     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pStatisticCount;
19677     memcpy((*streamPtrPtr), &cgen_var_1, 8);
19678     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
19679     *streamPtrPtr += 8;
19680     if (pStatisticCount) {
19681         memcpy(*streamPtrPtr, (uint32_t*)pStatisticCount, sizeof(uint32_t));
19682         *streamPtrPtr += sizeof(uint32_t);
19683     }
19684     // WARNING PTR CHECK
19685     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pStatistics;
19686     memcpy((*streamPtrPtr), &cgen_var_2, 8);
19687     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
19688     *streamPtrPtr += 8;
19689     if (pStatistics) {
19690         for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i) {
19691             reservedmarshal_VkPipelineExecutableStatisticKHR(
19692                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19693                 (VkPipelineExecutableStatisticKHR*)(pStatistics + i), streamPtrPtr);
19694         }
19695     }
19696     // WARNING PTR CHECK
19697     uint32_t* check_pStatisticCount;
19698     check_pStatisticCount = (uint32_t*)(uintptr_t)stream->getBe64();
19699     if (pStatisticCount) {
19700         if (!(check_pStatisticCount)) {
19701             fprintf(stderr, "fatal: pStatisticCount inconsistent between guest and host\n");
19702         }
19703         stream->read((uint32_t*)pStatisticCount, sizeof(uint32_t));
19704     }
19705     // WARNING PTR CHECK
19706     VkPipelineExecutableStatisticKHR* check_pStatistics;
19707     check_pStatistics = (VkPipelineExecutableStatisticKHR*)(uintptr_t)stream->getBe64();
19708     if (pStatistics) {
19709         if (!(check_pStatistics)) {
19710             fprintf(stderr, "fatal: pStatistics inconsistent between guest and host\n");
19711         }
19712         if (pStatisticCount) {
19713             for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i) {
19714                 unmarshal_VkPipelineExecutableStatisticKHR(
19715                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19716                     (VkPipelineExecutableStatisticKHR*)(pStatistics + i));
19717             }
19718         }
19719     }
19720     if (pStatisticCount) {
19721         if (pStatistics) {
19722             for (uint32_t i = 0; i < (uint32_t)(*(pStatisticCount)); ++i) {
19723                 transform_fromhost_VkPipelineExecutableStatisticKHR(
19724                     sResourceTracker, (VkPipelineExecutableStatisticKHR*)(pStatistics + i));
19725             }
19726         }
19727     }
19728     VkResult vkGetPipelineExecutableStatisticsKHR_VkResult_return = (VkResult)0;
19729     stream->read(&vkGetPipelineExecutableStatisticsKHR_VkResult_return, sizeof(VkResult));
19730     ++encodeCount;
19731     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19732         pool->freeAll();
19733         stream->clearPool();
19734     }
19735     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
19736     return vkGetPipelineExecutableStatisticsKHR_VkResult_return;
19737 }
19738 
vkGetPipelineExecutableInternalRepresentationsKHR(VkDevice device,const VkPipelineExecutableInfoKHR * pExecutableInfo,uint32_t * pInternalRepresentationCount,VkPipelineExecutableInternalRepresentationKHR * pInternalRepresentations,uint32_t doLock)19739 VkResult VkEncoder::vkGetPipelineExecutableInternalRepresentationsKHR(
19740     VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo,
19741     uint32_t* pInternalRepresentationCount,
19742     VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations, uint32_t doLock) {
19743     (void)doLock;
19744     bool queueSubmitWithCommandsEnabled =
19745         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
19746     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
19747     auto stream = mImpl->stream();
19748     auto pool = mImpl->pool();
19749     VkDevice local_device;
19750     VkPipelineExecutableInfoKHR* local_pExecutableInfo;
19751     local_device = device;
19752     local_pExecutableInfo = nullptr;
19753     if (pExecutableInfo) {
19754         local_pExecutableInfo =
19755             (VkPipelineExecutableInfoKHR*)pool->alloc(sizeof(const VkPipelineExecutableInfoKHR));
19756         deepcopy_VkPipelineExecutableInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pExecutableInfo,
19757                                              (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo));
19758     }
19759     if (local_pExecutableInfo) {
19760         transform_tohost_VkPipelineExecutableInfoKHR(
19761             sResourceTracker, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo));
19762     }
19763     size_t count = 0;
19764     size_t* countPtr = &count;
19765     {
19766         uint64_t cgen_var_0;
19767         *countPtr += 1 * 8;
19768         count_VkPipelineExecutableInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19769                                           (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo),
19770                                           countPtr);
19771         // WARNING PTR CHECK
19772         *countPtr += 8;
19773         if (pInternalRepresentationCount) {
19774             *countPtr += sizeof(uint32_t);
19775         }
19776         // WARNING PTR CHECK
19777         *countPtr += 8;
19778         if (pInternalRepresentations) {
19779             if (pInternalRepresentationCount) {
19780                 for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i) {
19781                     count_VkPipelineExecutableInternalRepresentationKHR(
19782                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19783                         (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations +
19784                                                                          i),
19785                         countPtr);
19786                 }
19787             }
19788         }
19789     }
19790     uint32_t packetSize_vkGetPipelineExecutableInternalRepresentationsKHR =
19791         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
19792     uint8_t* streamPtr =
19793         stream->reserve(packetSize_vkGetPipelineExecutableInternalRepresentationsKHR);
19794     uint8_t* packetBeginPtr = streamPtr;
19795     uint8_t** streamPtrPtr = &streamPtr;
19796     uint32_t opcode_vkGetPipelineExecutableInternalRepresentationsKHR =
19797         OP_vkGetPipelineExecutableInternalRepresentationsKHR;
19798     uint32_t seqno;
19799     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
19800     memcpy(streamPtr, &opcode_vkGetPipelineExecutableInternalRepresentationsKHR, sizeof(uint32_t));
19801     streamPtr += sizeof(uint32_t);
19802     memcpy(streamPtr, &packetSize_vkGetPipelineExecutableInternalRepresentationsKHR,
19803            sizeof(uint32_t));
19804     streamPtr += sizeof(uint32_t);
19805     if (queueSubmitWithCommandsEnabled) {
19806         memcpy(streamPtr, &seqno, sizeof(uint32_t));
19807         streamPtr += sizeof(uint32_t);
19808     }
19809     uint64_t cgen_var_0;
19810     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
19811     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19812     *streamPtrPtr += 1 * 8;
19813     reservedmarshal_VkPipelineExecutableInfoKHR(
19814         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkPipelineExecutableInfoKHR*)(local_pExecutableInfo),
19815         streamPtrPtr);
19816     // WARNING PTR CHECK
19817     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pInternalRepresentationCount;
19818     memcpy((*streamPtrPtr), &cgen_var_1, 8);
19819     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
19820     *streamPtrPtr += 8;
19821     if (pInternalRepresentationCount) {
19822         memcpy(*streamPtrPtr, (uint32_t*)pInternalRepresentationCount, sizeof(uint32_t));
19823         *streamPtrPtr += sizeof(uint32_t);
19824     }
19825     // WARNING PTR CHECK
19826     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pInternalRepresentations;
19827     memcpy((*streamPtrPtr), &cgen_var_2, 8);
19828     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
19829     *streamPtrPtr += 8;
19830     if (pInternalRepresentations) {
19831         for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i) {
19832             reservedmarshal_VkPipelineExecutableInternalRepresentationKHR(
19833                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19834                 (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i),
19835                 streamPtrPtr);
19836         }
19837     }
19838     // WARNING PTR CHECK
19839     uint32_t* check_pInternalRepresentationCount;
19840     check_pInternalRepresentationCount = (uint32_t*)(uintptr_t)stream->getBe64();
19841     if (pInternalRepresentationCount) {
19842         if (!(check_pInternalRepresentationCount)) {
19843             fprintf(stderr,
19844                     "fatal: pInternalRepresentationCount inconsistent between guest and host\n");
19845         }
19846         stream->read((uint32_t*)pInternalRepresentationCount, sizeof(uint32_t));
19847     }
19848     // WARNING PTR CHECK
19849     VkPipelineExecutableInternalRepresentationKHR* check_pInternalRepresentations;
19850     check_pInternalRepresentations =
19851         (VkPipelineExecutableInternalRepresentationKHR*)(uintptr_t)stream->getBe64();
19852     if (pInternalRepresentations) {
19853         if (!(check_pInternalRepresentations)) {
19854             fprintf(stderr,
19855                     "fatal: pInternalRepresentations inconsistent between guest and host\n");
19856         }
19857         if (pInternalRepresentationCount) {
19858             for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i) {
19859                 unmarshal_VkPipelineExecutableInternalRepresentationKHR(
19860                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19861                     (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i));
19862             }
19863         }
19864     }
19865     if (pInternalRepresentationCount) {
19866         if (pInternalRepresentations) {
19867             for (uint32_t i = 0; i < (uint32_t)(*(pInternalRepresentationCount)); ++i) {
19868                 transform_fromhost_VkPipelineExecutableInternalRepresentationKHR(
19869                     sResourceTracker,
19870                     (VkPipelineExecutableInternalRepresentationKHR*)(pInternalRepresentations + i));
19871             }
19872         }
19873     }
19874     VkResult vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return = (VkResult)0;
19875     stream->read(&vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return,
19876                  sizeof(VkResult));
19877     ++encodeCount;
19878     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19879         pool->freeAll();
19880         stream->clearPool();
19881     }
19882     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
19883     return vkGetPipelineExecutableInternalRepresentationsKHR_VkResult_return;
19884 }
19885 
19886 #endif
19887 #ifdef VK_KHR_synchronization2
vkCmdSetEvent2KHR(VkCommandBuffer commandBuffer,VkEvent event,const VkDependencyInfo * pDependencyInfo,uint32_t doLock)19888 void VkEncoder::vkCmdSetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
19889                                   const VkDependencyInfo* pDependencyInfo, uint32_t doLock) {
19890     (void)doLock;
19891     bool queueSubmitWithCommandsEnabled =
19892         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
19893     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
19894     auto stream = mImpl->stream();
19895     auto pool = mImpl->pool();
19896     VkCommandBuffer local_commandBuffer;
19897     VkEvent local_event;
19898     VkDependencyInfo* local_pDependencyInfo;
19899     local_commandBuffer = commandBuffer;
19900     local_event = event;
19901     local_pDependencyInfo = nullptr;
19902     if (pDependencyInfo) {
19903         local_pDependencyInfo = (VkDependencyInfo*)pool->alloc(sizeof(const VkDependencyInfo));
19904         deepcopy_VkDependencyInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDependencyInfo,
19905                                   (VkDependencyInfo*)(local_pDependencyInfo));
19906     }
19907     if (local_pDependencyInfo) {
19908         transform_tohost_VkDependencyInfo(sResourceTracker,
19909                                           (VkDependencyInfo*)(local_pDependencyInfo));
19910     }
19911     size_t count = 0;
19912     size_t* countPtr = &count;
19913     {
19914         uint64_t cgen_var_0;
19915         *countPtr += 1 * 8;
19916         uint64_t cgen_var_1;
19917         *countPtr += 1 * 8;
19918         count_VkDependencyInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
19919                                (VkDependencyInfo*)(local_pDependencyInfo), countPtr);
19920     }
19921     uint32_t packetSize_vkCmdSetEvent2KHR = 4 + 4 + count;
19922     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetEvent2KHR -= 8;
19923     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetEvent2KHR);
19924     uint8_t* packetBeginPtr = streamPtr;
19925     uint8_t** streamPtrPtr = &streamPtr;
19926     uint32_t opcode_vkCmdSetEvent2KHR = OP_vkCmdSetEvent2KHR;
19927     memcpy(streamPtr, &opcode_vkCmdSetEvent2KHR, sizeof(uint32_t));
19928     streamPtr += sizeof(uint32_t);
19929     memcpy(streamPtr, &packetSize_vkCmdSetEvent2KHR, sizeof(uint32_t));
19930     streamPtr += sizeof(uint32_t);
19931     if (!queueSubmitWithCommandsEnabled) {
19932         uint64_t cgen_var_0;
19933         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
19934         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19935         *streamPtrPtr += 1 * 8;
19936     }
19937     uint64_t cgen_var_0;
19938     *&cgen_var_0 = get_host_u64_VkEvent((*&local_event));
19939     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19940     *streamPtrPtr += 1 * 8;
19941     reservedmarshal_VkDependencyInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
19942                                      (VkDependencyInfo*)(local_pDependencyInfo), streamPtrPtr);
19943     ++encodeCount;
19944     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19945         pool->freeAll();
19946         stream->clearPool();
19947     }
19948     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
19949 }
19950 
vkCmdResetEvent2KHR(VkCommandBuffer commandBuffer,VkEvent event,VkPipelineStageFlags2 stageMask,uint32_t doLock)19951 void VkEncoder::vkCmdResetEvent2KHR(VkCommandBuffer commandBuffer, VkEvent event,
19952                                     VkPipelineStageFlags2 stageMask, uint32_t doLock) {
19953     (void)doLock;
19954     bool queueSubmitWithCommandsEnabled =
19955         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
19956     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
19957     auto stream = mImpl->stream();
19958     auto pool = mImpl->pool();
19959     VkCommandBuffer local_commandBuffer;
19960     VkEvent local_event;
19961     VkPipelineStageFlags2 local_stageMask;
19962     local_commandBuffer = commandBuffer;
19963     local_event = event;
19964     local_stageMask = stageMask;
19965     size_t count = 0;
19966     size_t* countPtr = &count;
19967     {
19968         uint64_t cgen_var_0;
19969         *countPtr += 1 * 8;
19970         uint64_t cgen_var_1;
19971         *countPtr += 1 * 8;
19972         *countPtr += sizeof(VkPipelineStageFlags2);
19973     }
19974     uint32_t packetSize_vkCmdResetEvent2KHR = 4 + 4 + count;
19975     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdResetEvent2KHR -= 8;
19976     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdResetEvent2KHR);
19977     uint8_t* packetBeginPtr = streamPtr;
19978     uint8_t** streamPtrPtr = &streamPtr;
19979     uint32_t opcode_vkCmdResetEvent2KHR = OP_vkCmdResetEvent2KHR;
19980     memcpy(streamPtr, &opcode_vkCmdResetEvent2KHR, sizeof(uint32_t));
19981     streamPtr += sizeof(uint32_t);
19982     memcpy(streamPtr, &packetSize_vkCmdResetEvent2KHR, sizeof(uint32_t));
19983     streamPtr += sizeof(uint32_t);
19984     if (!queueSubmitWithCommandsEnabled) {
19985         uint64_t cgen_var_0;
19986         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
19987         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19988         *streamPtrPtr += 1 * 8;
19989     }
19990     uint64_t cgen_var_0;
19991     *&cgen_var_0 = get_host_u64_VkEvent((*&local_event));
19992     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
19993     *streamPtrPtr += 1 * 8;
19994     memcpy(*streamPtrPtr, (VkPipelineStageFlags2*)&local_stageMask, sizeof(VkPipelineStageFlags2));
19995     *streamPtrPtr += sizeof(VkPipelineStageFlags2);
19996     ++encodeCount;
19997     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
19998         pool->freeAll();
19999         stream->clearPool();
20000     }
20001     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20002 }
20003 
vkCmdWaitEvents2KHR(VkCommandBuffer commandBuffer,uint32_t eventCount,const VkEvent * pEvents,const VkDependencyInfo * pDependencyInfos,uint32_t doLock)20004 void VkEncoder::vkCmdWaitEvents2KHR(VkCommandBuffer commandBuffer, uint32_t eventCount,
20005                                     const VkEvent* pEvents,
20006                                     const VkDependencyInfo* pDependencyInfos, uint32_t doLock) {
20007     (void)doLock;
20008     bool queueSubmitWithCommandsEnabled =
20009         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20010     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20011     auto stream = mImpl->stream();
20012     auto pool = mImpl->pool();
20013     VkCommandBuffer local_commandBuffer;
20014     uint32_t local_eventCount;
20015     VkEvent* local_pEvents;
20016     VkDependencyInfo* local_pDependencyInfos;
20017     local_commandBuffer = commandBuffer;
20018     local_eventCount = eventCount;
20019     // Avoiding deepcopy for pEvents
20020     local_pEvents = (VkEvent*)pEvents;
20021     local_pDependencyInfos = nullptr;
20022     if (pDependencyInfos) {
20023         local_pDependencyInfos =
20024             (VkDependencyInfo*)pool->alloc(((eventCount)) * sizeof(const VkDependencyInfo));
20025         for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
20026             deepcopy_VkDependencyInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDependencyInfos + i,
20027                                       (VkDependencyInfo*)(local_pDependencyInfos + i));
20028         }
20029     }
20030     if (local_pDependencyInfos) {
20031         for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
20032             transform_tohost_VkDependencyInfo(sResourceTracker,
20033                                               (VkDependencyInfo*)(local_pDependencyInfos + i));
20034         }
20035     }
20036     size_t count = 0;
20037     size_t* countPtr = &count;
20038     {
20039         uint64_t cgen_var_0;
20040         *countPtr += 1 * 8;
20041         *countPtr += sizeof(uint32_t);
20042         if (((eventCount))) {
20043             *countPtr += ((eventCount)) * 8;
20044         }
20045         for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
20046             count_VkDependencyInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20047                                    (VkDependencyInfo*)(local_pDependencyInfos + i), countPtr);
20048         }
20049     }
20050     uint32_t packetSize_vkCmdWaitEvents2KHR = 4 + 4 + count;
20051     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdWaitEvents2KHR -= 8;
20052     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdWaitEvents2KHR);
20053     uint8_t* packetBeginPtr = streamPtr;
20054     uint8_t** streamPtrPtr = &streamPtr;
20055     uint32_t opcode_vkCmdWaitEvents2KHR = OP_vkCmdWaitEvents2KHR;
20056     memcpy(streamPtr, &opcode_vkCmdWaitEvents2KHR, sizeof(uint32_t));
20057     streamPtr += sizeof(uint32_t);
20058     memcpy(streamPtr, &packetSize_vkCmdWaitEvents2KHR, sizeof(uint32_t));
20059     streamPtr += sizeof(uint32_t);
20060     if (!queueSubmitWithCommandsEnabled) {
20061         uint64_t cgen_var_0;
20062         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
20063         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20064         *streamPtrPtr += 1 * 8;
20065     }
20066     memcpy(*streamPtrPtr, (uint32_t*)&local_eventCount, sizeof(uint32_t));
20067     *streamPtrPtr += sizeof(uint32_t);
20068     if (((eventCount))) {
20069         uint8_t* cgen_var_0_ptr = (uint8_t*)(*streamPtrPtr);
20070         for (uint32_t k = 0; k < ((eventCount)); ++k) {
20071             uint64_t tmpval = get_host_u64_VkEvent(local_pEvents[k]);
20072             memcpy(cgen_var_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
20073         }
20074         *streamPtrPtr += 8 * ((eventCount));
20075     }
20076     for (uint32_t i = 0; i < (uint32_t)((eventCount)); ++i) {
20077         reservedmarshal_VkDependencyInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20078                                          (VkDependencyInfo*)(local_pDependencyInfos + i),
20079                                          streamPtrPtr);
20080     }
20081     ++encodeCount;
20082     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20083         pool->freeAll();
20084         stream->clearPool();
20085     }
20086     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20087 }
20088 
vkCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,const VkDependencyInfo * pDependencyInfo,uint32_t doLock)20089 void VkEncoder::vkCmdPipelineBarrier2KHR(VkCommandBuffer commandBuffer,
20090                                          const VkDependencyInfo* pDependencyInfo, uint32_t doLock) {
20091     (void)doLock;
20092     bool queueSubmitWithCommandsEnabled =
20093         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20094     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20095     auto stream = mImpl->stream();
20096     auto pool = mImpl->pool();
20097     VkCommandBuffer local_commandBuffer;
20098     VkDependencyInfo* local_pDependencyInfo;
20099     local_commandBuffer = commandBuffer;
20100     local_pDependencyInfo = nullptr;
20101     if (pDependencyInfo) {
20102         local_pDependencyInfo = (VkDependencyInfo*)pool->alloc(sizeof(const VkDependencyInfo));
20103         deepcopy_VkDependencyInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pDependencyInfo,
20104                                   (VkDependencyInfo*)(local_pDependencyInfo));
20105     }
20106     if (local_pDependencyInfo) {
20107         transform_tohost_VkDependencyInfo(sResourceTracker,
20108                                           (VkDependencyInfo*)(local_pDependencyInfo));
20109     }
20110     size_t count = 0;
20111     size_t* countPtr = &count;
20112     {
20113         uint64_t cgen_var_0;
20114         *countPtr += 1 * 8;
20115         count_VkDependencyInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20116                                (VkDependencyInfo*)(local_pDependencyInfo), countPtr);
20117     }
20118     uint32_t packetSize_vkCmdPipelineBarrier2KHR = 4 + 4 + count;
20119     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdPipelineBarrier2KHR -= 8;
20120     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdPipelineBarrier2KHR);
20121     uint8_t* packetBeginPtr = streamPtr;
20122     uint8_t** streamPtrPtr = &streamPtr;
20123     uint32_t opcode_vkCmdPipelineBarrier2KHR = OP_vkCmdPipelineBarrier2KHR;
20124     memcpy(streamPtr, &opcode_vkCmdPipelineBarrier2KHR, sizeof(uint32_t));
20125     streamPtr += sizeof(uint32_t);
20126     memcpy(streamPtr, &packetSize_vkCmdPipelineBarrier2KHR, sizeof(uint32_t));
20127     streamPtr += sizeof(uint32_t);
20128     if (!queueSubmitWithCommandsEnabled) {
20129         uint64_t cgen_var_0;
20130         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
20131         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20132         *streamPtrPtr += 1 * 8;
20133     }
20134     reservedmarshal_VkDependencyInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20135                                      (VkDependencyInfo*)(local_pDependencyInfo), streamPtrPtr);
20136     ++encodeCount;
20137     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20138         pool->freeAll();
20139         stream->clearPool();
20140     }
20141     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20142 }
20143 
vkCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer,VkPipelineStageFlags2 stage,VkQueryPool queryPool,uint32_t query,uint32_t doLock)20144 void VkEncoder::vkCmdWriteTimestamp2KHR(VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage,
20145                                         VkQueryPool queryPool, uint32_t query, uint32_t doLock) {
20146     (void)doLock;
20147     bool queueSubmitWithCommandsEnabled =
20148         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20149     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20150     auto stream = mImpl->stream();
20151     auto pool = mImpl->pool();
20152     VkCommandBuffer local_commandBuffer;
20153     VkPipelineStageFlags2 local_stage;
20154     VkQueryPool local_queryPool;
20155     uint32_t local_query;
20156     local_commandBuffer = commandBuffer;
20157     local_stage = stage;
20158     local_queryPool = queryPool;
20159     local_query = query;
20160     size_t count = 0;
20161     size_t* countPtr = &count;
20162     {
20163         uint64_t cgen_var_0;
20164         *countPtr += 1 * 8;
20165         *countPtr += sizeof(VkPipelineStageFlags2);
20166         uint64_t cgen_var_1;
20167         *countPtr += 1 * 8;
20168         *countPtr += sizeof(uint32_t);
20169     }
20170     uint32_t packetSize_vkCmdWriteTimestamp2KHR = 4 + 4 + count;
20171     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdWriteTimestamp2KHR -= 8;
20172     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdWriteTimestamp2KHR);
20173     uint8_t* packetBeginPtr = streamPtr;
20174     uint8_t** streamPtrPtr = &streamPtr;
20175     uint32_t opcode_vkCmdWriteTimestamp2KHR = OP_vkCmdWriteTimestamp2KHR;
20176     memcpy(streamPtr, &opcode_vkCmdWriteTimestamp2KHR, sizeof(uint32_t));
20177     streamPtr += sizeof(uint32_t);
20178     memcpy(streamPtr, &packetSize_vkCmdWriteTimestamp2KHR, sizeof(uint32_t));
20179     streamPtr += sizeof(uint32_t);
20180     if (!queueSubmitWithCommandsEnabled) {
20181         uint64_t cgen_var_0;
20182         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
20183         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20184         *streamPtrPtr += 1 * 8;
20185     }
20186     memcpy(*streamPtrPtr, (VkPipelineStageFlags2*)&local_stage, sizeof(VkPipelineStageFlags2));
20187     *streamPtrPtr += sizeof(VkPipelineStageFlags2);
20188     uint64_t cgen_var_0;
20189     *&cgen_var_0 = get_host_u64_VkQueryPool((*&local_queryPool));
20190     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20191     *streamPtrPtr += 1 * 8;
20192     memcpy(*streamPtrPtr, (uint32_t*)&local_query, sizeof(uint32_t));
20193     *streamPtrPtr += sizeof(uint32_t);
20194     ++encodeCount;
20195     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20196         pool->freeAll();
20197         stream->clearPool();
20198     }
20199     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20200 }
20201 
vkQueueSubmit2KHR(VkQueue queue,uint32_t submitCount,const VkSubmitInfo2 * pSubmits,VkFence fence,uint32_t doLock)20202 VkResult VkEncoder::vkQueueSubmit2KHR(VkQueue queue, uint32_t submitCount,
20203                                       const VkSubmitInfo2* pSubmits, VkFence fence,
20204                                       uint32_t doLock) {
20205     (void)doLock;
20206     bool queueSubmitWithCommandsEnabled =
20207         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20208     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20209     auto stream = mImpl->stream();
20210     auto pool = mImpl->pool();
20211     VkQueue local_queue;
20212     uint32_t local_submitCount;
20213     VkSubmitInfo2* local_pSubmits;
20214     VkFence local_fence;
20215     local_queue = queue;
20216     local_submitCount = submitCount;
20217     local_pSubmits = nullptr;
20218     if (pSubmits) {
20219         local_pSubmits = (VkSubmitInfo2*)pool->alloc(((submitCount)) * sizeof(const VkSubmitInfo2));
20220         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
20221             deepcopy_VkSubmitInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubmits + i,
20222                                    (VkSubmitInfo2*)(local_pSubmits + i));
20223         }
20224     }
20225     local_fence = fence;
20226     if (local_pSubmits) {
20227         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
20228             transform_tohost_VkSubmitInfo2(sResourceTracker, (VkSubmitInfo2*)(local_pSubmits + i));
20229         }
20230     }
20231     size_t count = 0;
20232     size_t* countPtr = &count;
20233     {
20234         uint64_t cgen_var_0;
20235         *countPtr += 1 * 8;
20236         *countPtr += sizeof(uint32_t);
20237         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
20238             count_VkSubmitInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20239                                 (VkSubmitInfo2*)(local_pSubmits + i), countPtr);
20240         }
20241         uint64_t cgen_var_1;
20242         *countPtr += 1 * 8;
20243     }
20244     uint32_t packetSize_vkQueueSubmit2KHR =
20245         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
20246     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSubmit2KHR);
20247     uint8_t* packetBeginPtr = streamPtr;
20248     uint8_t** streamPtrPtr = &streamPtr;
20249     uint32_t opcode_vkQueueSubmit2KHR = OP_vkQueueSubmit2KHR;
20250     uint32_t seqno;
20251     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
20252     memcpy(streamPtr, &opcode_vkQueueSubmit2KHR, sizeof(uint32_t));
20253     streamPtr += sizeof(uint32_t);
20254     memcpy(streamPtr, &packetSize_vkQueueSubmit2KHR, sizeof(uint32_t));
20255     streamPtr += sizeof(uint32_t);
20256     if (queueSubmitWithCommandsEnabled) {
20257         memcpy(streamPtr, &seqno, sizeof(uint32_t));
20258         streamPtr += sizeof(uint32_t);
20259     }
20260     uint64_t cgen_var_0;
20261     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
20262     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20263     *streamPtrPtr += 1 * 8;
20264     memcpy(*streamPtrPtr, (uint32_t*)&local_submitCount, sizeof(uint32_t));
20265     *streamPtrPtr += sizeof(uint32_t);
20266     for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
20267         reservedmarshal_VkSubmitInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20268                                       (VkSubmitInfo2*)(local_pSubmits + i), streamPtrPtr);
20269     }
20270     uint64_t cgen_var_1;
20271     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
20272     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
20273     *streamPtrPtr += 1 * 8;
20274     VkResult vkQueueSubmit2KHR_VkResult_return = (VkResult)0;
20275     stream->read(&vkQueueSubmit2KHR_VkResult_return, sizeof(VkResult));
20276     ++encodeCount;
20277     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20278         pool->freeAll();
20279         stream->clearPool();
20280     }
20281     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20282     return vkQueueSubmit2KHR_VkResult_return;
20283 }
20284 
vkCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer,VkPipelineStageFlags2 stage,VkBuffer dstBuffer,VkDeviceSize dstOffset,uint32_t marker,uint32_t doLock)20285 void VkEncoder::vkCmdWriteBufferMarker2AMD(VkCommandBuffer commandBuffer,
20286                                            VkPipelineStageFlags2 stage, VkBuffer dstBuffer,
20287                                            VkDeviceSize dstOffset, uint32_t marker,
20288                                            uint32_t doLock) {
20289     (void)doLock;
20290     bool queueSubmitWithCommandsEnabled =
20291         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20292     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20293     auto stream = mImpl->stream();
20294     auto pool = mImpl->pool();
20295     VkCommandBuffer local_commandBuffer;
20296     VkPipelineStageFlags2 local_stage;
20297     VkBuffer local_dstBuffer;
20298     VkDeviceSize local_dstOffset;
20299     uint32_t local_marker;
20300     local_commandBuffer = commandBuffer;
20301     local_stage = stage;
20302     local_dstBuffer = dstBuffer;
20303     local_dstOffset = dstOffset;
20304     local_marker = marker;
20305     size_t count = 0;
20306     size_t* countPtr = &count;
20307     {
20308         uint64_t cgen_var_0;
20309         *countPtr += 1 * 8;
20310         *countPtr += sizeof(VkPipelineStageFlags2);
20311         uint64_t cgen_var_1;
20312         *countPtr += 1 * 8;
20313         *countPtr += sizeof(VkDeviceSize);
20314         *countPtr += sizeof(uint32_t);
20315     }
20316     uint32_t packetSize_vkCmdWriteBufferMarker2AMD = 4 + 4 + count;
20317     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdWriteBufferMarker2AMD -= 8;
20318     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdWriteBufferMarker2AMD);
20319     uint8_t* packetBeginPtr = streamPtr;
20320     uint8_t** streamPtrPtr = &streamPtr;
20321     uint32_t opcode_vkCmdWriteBufferMarker2AMD = OP_vkCmdWriteBufferMarker2AMD;
20322     memcpy(streamPtr, &opcode_vkCmdWriteBufferMarker2AMD, sizeof(uint32_t));
20323     streamPtr += sizeof(uint32_t);
20324     memcpy(streamPtr, &packetSize_vkCmdWriteBufferMarker2AMD, sizeof(uint32_t));
20325     streamPtr += sizeof(uint32_t);
20326     if (!queueSubmitWithCommandsEnabled) {
20327         uint64_t cgen_var_0;
20328         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
20329         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20330         *streamPtrPtr += 1 * 8;
20331     }
20332     memcpy(*streamPtrPtr, (VkPipelineStageFlags2*)&local_stage, sizeof(VkPipelineStageFlags2));
20333     *streamPtrPtr += sizeof(VkPipelineStageFlags2);
20334     uint64_t cgen_var_0;
20335     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_dstBuffer));
20336     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20337     *streamPtrPtr += 1 * 8;
20338     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dstOffset, sizeof(VkDeviceSize));
20339     *streamPtrPtr += sizeof(VkDeviceSize);
20340     memcpy(*streamPtrPtr, (uint32_t*)&local_marker, sizeof(uint32_t));
20341     *streamPtrPtr += sizeof(uint32_t);
20342     ++encodeCount;
20343     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20344         pool->freeAll();
20345         stream->clearPool();
20346     }
20347     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20348 }
20349 
vkGetQueueCheckpointData2NV(VkQueue queue,uint32_t * pCheckpointDataCount,VkCheckpointData2NV * pCheckpointData,uint32_t doLock)20350 void VkEncoder::vkGetQueueCheckpointData2NV(VkQueue queue, uint32_t* pCheckpointDataCount,
20351                                             VkCheckpointData2NV* pCheckpointData, uint32_t doLock) {
20352     (void)doLock;
20353     bool queueSubmitWithCommandsEnabled =
20354         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20355     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20356     auto stream = mImpl->stream();
20357     auto pool = mImpl->pool();
20358     VkQueue local_queue;
20359     local_queue = queue;
20360     size_t count = 0;
20361     size_t* countPtr = &count;
20362     {
20363         uint64_t cgen_var_0;
20364         *countPtr += 1 * 8;
20365         // WARNING PTR CHECK
20366         *countPtr += 8;
20367         if (pCheckpointDataCount) {
20368             *countPtr += sizeof(uint32_t);
20369         }
20370         // WARNING PTR CHECK
20371         *countPtr += 8;
20372         if (pCheckpointData) {
20373             if (pCheckpointDataCount) {
20374                 for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
20375                     count_VkCheckpointData2NV(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20376                                               (VkCheckpointData2NV*)(pCheckpointData + i),
20377                                               countPtr);
20378                 }
20379             }
20380         }
20381     }
20382     uint32_t packetSize_vkGetQueueCheckpointData2NV =
20383         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
20384     uint8_t* streamPtr = stream->reserve(packetSize_vkGetQueueCheckpointData2NV);
20385     uint8_t* packetBeginPtr = streamPtr;
20386     uint8_t** streamPtrPtr = &streamPtr;
20387     uint32_t opcode_vkGetQueueCheckpointData2NV = OP_vkGetQueueCheckpointData2NV;
20388     uint32_t seqno;
20389     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
20390     memcpy(streamPtr, &opcode_vkGetQueueCheckpointData2NV, sizeof(uint32_t));
20391     streamPtr += sizeof(uint32_t);
20392     memcpy(streamPtr, &packetSize_vkGetQueueCheckpointData2NV, sizeof(uint32_t));
20393     streamPtr += sizeof(uint32_t);
20394     if (queueSubmitWithCommandsEnabled) {
20395         memcpy(streamPtr, &seqno, sizeof(uint32_t));
20396         streamPtr += sizeof(uint32_t);
20397     }
20398     uint64_t cgen_var_0;
20399     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
20400     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20401     *streamPtrPtr += 1 * 8;
20402     // WARNING PTR CHECK
20403     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pCheckpointDataCount;
20404     memcpy((*streamPtrPtr), &cgen_var_1, 8);
20405     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
20406     *streamPtrPtr += 8;
20407     if (pCheckpointDataCount) {
20408         memcpy(*streamPtrPtr, (uint32_t*)pCheckpointDataCount, sizeof(uint32_t));
20409         *streamPtrPtr += sizeof(uint32_t);
20410     }
20411     // WARNING PTR CHECK
20412     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pCheckpointData;
20413     memcpy((*streamPtrPtr), &cgen_var_2, 8);
20414     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
20415     *streamPtrPtr += 8;
20416     if (pCheckpointData) {
20417         for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
20418             reservedmarshal_VkCheckpointData2NV(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20419                                                 (VkCheckpointData2NV*)(pCheckpointData + i),
20420                                                 streamPtrPtr);
20421         }
20422     }
20423     // WARNING PTR CHECK
20424     uint32_t* check_pCheckpointDataCount;
20425     check_pCheckpointDataCount = (uint32_t*)(uintptr_t)stream->getBe64();
20426     if (pCheckpointDataCount) {
20427         if (!(check_pCheckpointDataCount)) {
20428             fprintf(stderr, "fatal: pCheckpointDataCount inconsistent between guest and host\n");
20429         }
20430         stream->read((uint32_t*)pCheckpointDataCount, sizeof(uint32_t));
20431     }
20432     // WARNING PTR CHECK
20433     VkCheckpointData2NV* check_pCheckpointData;
20434     check_pCheckpointData = (VkCheckpointData2NV*)(uintptr_t)stream->getBe64();
20435     if (pCheckpointData) {
20436         if (!(check_pCheckpointData)) {
20437             fprintf(stderr, "fatal: pCheckpointData inconsistent between guest and host\n");
20438         }
20439         if (pCheckpointDataCount) {
20440             for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
20441                 unmarshal_VkCheckpointData2NV(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20442                                               (VkCheckpointData2NV*)(pCheckpointData + i));
20443             }
20444         }
20445     }
20446     if (pCheckpointDataCount) {
20447         if (pCheckpointData) {
20448             for (uint32_t i = 0; i < (uint32_t)(*(pCheckpointDataCount)); ++i) {
20449                 transform_fromhost_VkCheckpointData2NV(sResourceTracker,
20450                                                        (VkCheckpointData2NV*)(pCheckpointData + i));
20451             }
20452         }
20453     }
20454     ++encodeCount;
20455     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20456         pool->freeAll();
20457         stream->clearPool();
20458     }
20459     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20460 }
20461 
20462 #endif
20463 #ifdef VK_KHR_copy_commands2
vkCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer,const VkCopyBufferInfo2 * pCopyBufferInfo,uint32_t doLock)20464 void VkEncoder::vkCmdCopyBuffer2KHR(VkCommandBuffer commandBuffer,
20465                                     const VkCopyBufferInfo2* pCopyBufferInfo, uint32_t doLock) {
20466     (void)doLock;
20467     bool queueSubmitWithCommandsEnabled =
20468         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20469     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20470     auto stream = mImpl->stream();
20471     auto pool = mImpl->pool();
20472     VkCommandBuffer local_commandBuffer;
20473     VkCopyBufferInfo2* local_pCopyBufferInfo;
20474     local_commandBuffer = commandBuffer;
20475     local_pCopyBufferInfo = nullptr;
20476     if (pCopyBufferInfo) {
20477         local_pCopyBufferInfo = (VkCopyBufferInfo2*)pool->alloc(sizeof(const VkCopyBufferInfo2));
20478         deepcopy_VkCopyBufferInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyBufferInfo,
20479                                    (VkCopyBufferInfo2*)(local_pCopyBufferInfo));
20480     }
20481     if (local_pCopyBufferInfo) {
20482         transform_tohost_VkCopyBufferInfo2(sResourceTracker,
20483                                            (VkCopyBufferInfo2*)(local_pCopyBufferInfo));
20484     }
20485     size_t count = 0;
20486     size_t* countPtr = &count;
20487     {
20488         uint64_t cgen_var_0;
20489         *countPtr += 1 * 8;
20490         count_VkCopyBufferInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20491                                 (VkCopyBufferInfo2*)(local_pCopyBufferInfo), countPtr);
20492     }
20493     uint32_t packetSize_vkCmdCopyBuffer2KHR = 4 + 4 + count;
20494     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyBuffer2KHR -= 8;
20495     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyBuffer2KHR);
20496     uint8_t* packetBeginPtr = streamPtr;
20497     uint8_t** streamPtrPtr = &streamPtr;
20498     uint32_t opcode_vkCmdCopyBuffer2KHR = OP_vkCmdCopyBuffer2KHR;
20499     memcpy(streamPtr, &opcode_vkCmdCopyBuffer2KHR, sizeof(uint32_t));
20500     streamPtr += sizeof(uint32_t);
20501     memcpy(streamPtr, &packetSize_vkCmdCopyBuffer2KHR, sizeof(uint32_t));
20502     streamPtr += sizeof(uint32_t);
20503     if (!queueSubmitWithCommandsEnabled) {
20504         uint64_t cgen_var_0;
20505         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
20506         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20507         *streamPtrPtr += 1 * 8;
20508     }
20509     reservedmarshal_VkCopyBufferInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20510                                       (VkCopyBufferInfo2*)(local_pCopyBufferInfo), streamPtrPtr);
20511     ++encodeCount;
20512     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20513         pool->freeAll();
20514         stream->clearPool();
20515     }
20516     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20517 }
20518 
vkCmdCopyImage2KHR(VkCommandBuffer commandBuffer,const VkCopyImageInfo2 * pCopyImageInfo,uint32_t doLock)20519 void VkEncoder::vkCmdCopyImage2KHR(VkCommandBuffer commandBuffer,
20520                                    const VkCopyImageInfo2* pCopyImageInfo, uint32_t doLock) {
20521     (void)doLock;
20522     bool queueSubmitWithCommandsEnabled =
20523         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20524     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20525     auto stream = mImpl->stream();
20526     auto pool = mImpl->pool();
20527     VkCommandBuffer local_commandBuffer;
20528     VkCopyImageInfo2* local_pCopyImageInfo;
20529     local_commandBuffer = commandBuffer;
20530     local_pCopyImageInfo = nullptr;
20531     if (pCopyImageInfo) {
20532         local_pCopyImageInfo = (VkCopyImageInfo2*)pool->alloc(sizeof(const VkCopyImageInfo2));
20533         deepcopy_VkCopyImageInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyImageInfo,
20534                                   (VkCopyImageInfo2*)(local_pCopyImageInfo));
20535     }
20536     if (local_pCopyImageInfo) {
20537         transform_tohost_VkCopyImageInfo2(sResourceTracker,
20538                                           (VkCopyImageInfo2*)(local_pCopyImageInfo));
20539     }
20540     size_t count = 0;
20541     size_t* countPtr = &count;
20542     {
20543         uint64_t cgen_var_0;
20544         *countPtr += 1 * 8;
20545         count_VkCopyImageInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20546                                (VkCopyImageInfo2*)(local_pCopyImageInfo), countPtr);
20547     }
20548     uint32_t packetSize_vkCmdCopyImage2KHR = 4 + 4 + count;
20549     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyImage2KHR -= 8;
20550     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyImage2KHR);
20551     uint8_t* packetBeginPtr = streamPtr;
20552     uint8_t** streamPtrPtr = &streamPtr;
20553     uint32_t opcode_vkCmdCopyImage2KHR = OP_vkCmdCopyImage2KHR;
20554     memcpy(streamPtr, &opcode_vkCmdCopyImage2KHR, sizeof(uint32_t));
20555     streamPtr += sizeof(uint32_t);
20556     memcpy(streamPtr, &packetSize_vkCmdCopyImage2KHR, sizeof(uint32_t));
20557     streamPtr += sizeof(uint32_t);
20558     if (!queueSubmitWithCommandsEnabled) {
20559         uint64_t cgen_var_0;
20560         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
20561         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20562         *streamPtrPtr += 1 * 8;
20563     }
20564     reservedmarshal_VkCopyImageInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20565                                      (VkCopyImageInfo2*)(local_pCopyImageInfo), streamPtrPtr);
20566     ++encodeCount;
20567     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20568         pool->freeAll();
20569         stream->clearPool();
20570     }
20571     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20572 }
20573 
vkCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,const VkCopyBufferToImageInfo2 * pCopyBufferToImageInfo,uint32_t doLock)20574 void VkEncoder::vkCmdCopyBufferToImage2KHR(VkCommandBuffer commandBuffer,
20575                                            const VkCopyBufferToImageInfo2* pCopyBufferToImageInfo,
20576                                            uint32_t doLock) {
20577     (void)doLock;
20578     bool queueSubmitWithCommandsEnabled =
20579         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20580     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20581     auto stream = mImpl->stream();
20582     auto pool = mImpl->pool();
20583     VkCommandBuffer local_commandBuffer;
20584     VkCopyBufferToImageInfo2* local_pCopyBufferToImageInfo;
20585     local_commandBuffer = commandBuffer;
20586     local_pCopyBufferToImageInfo = nullptr;
20587     if (pCopyBufferToImageInfo) {
20588         local_pCopyBufferToImageInfo =
20589             (VkCopyBufferToImageInfo2*)pool->alloc(sizeof(const VkCopyBufferToImageInfo2));
20590         deepcopy_VkCopyBufferToImageInfo2(
20591             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyBufferToImageInfo,
20592             (VkCopyBufferToImageInfo2*)(local_pCopyBufferToImageInfo));
20593     }
20594     if (local_pCopyBufferToImageInfo) {
20595         transform_tohost_VkCopyBufferToImageInfo2(
20596             sResourceTracker, (VkCopyBufferToImageInfo2*)(local_pCopyBufferToImageInfo));
20597     }
20598     size_t count = 0;
20599     size_t* countPtr = &count;
20600     {
20601         uint64_t cgen_var_0;
20602         *countPtr += 1 * 8;
20603         count_VkCopyBufferToImageInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20604                                        (VkCopyBufferToImageInfo2*)(local_pCopyBufferToImageInfo),
20605                                        countPtr);
20606     }
20607     uint32_t packetSize_vkCmdCopyBufferToImage2KHR = 4 + 4 + count;
20608     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyBufferToImage2KHR -= 8;
20609     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyBufferToImage2KHR);
20610     uint8_t* packetBeginPtr = streamPtr;
20611     uint8_t** streamPtrPtr = &streamPtr;
20612     uint32_t opcode_vkCmdCopyBufferToImage2KHR = OP_vkCmdCopyBufferToImage2KHR;
20613     memcpy(streamPtr, &opcode_vkCmdCopyBufferToImage2KHR, sizeof(uint32_t));
20614     streamPtr += sizeof(uint32_t);
20615     memcpy(streamPtr, &packetSize_vkCmdCopyBufferToImage2KHR, sizeof(uint32_t));
20616     streamPtr += sizeof(uint32_t);
20617     if (!queueSubmitWithCommandsEnabled) {
20618         uint64_t cgen_var_0;
20619         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
20620         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20621         *streamPtrPtr += 1 * 8;
20622     }
20623     reservedmarshal_VkCopyBufferToImageInfo2(
20624         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20625         (VkCopyBufferToImageInfo2*)(local_pCopyBufferToImageInfo), streamPtrPtr);
20626     ++encodeCount;
20627     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20628         pool->freeAll();
20629         stream->clearPool();
20630     }
20631     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20632 }
20633 
vkCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,const VkCopyImageToBufferInfo2 * pCopyImageToBufferInfo,uint32_t doLock)20634 void VkEncoder::vkCmdCopyImageToBuffer2KHR(VkCommandBuffer commandBuffer,
20635                                            const VkCopyImageToBufferInfo2* pCopyImageToBufferInfo,
20636                                            uint32_t doLock) {
20637     (void)doLock;
20638     bool queueSubmitWithCommandsEnabled =
20639         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20640     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20641     auto stream = mImpl->stream();
20642     auto pool = mImpl->pool();
20643     VkCommandBuffer local_commandBuffer;
20644     VkCopyImageToBufferInfo2* local_pCopyImageToBufferInfo;
20645     local_commandBuffer = commandBuffer;
20646     local_pCopyImageToBufferInfo = nullptr;
20647     if (pCopyImageToBufferInfo) {
20648         local_pCopyImageToBufferInfo =
20649             (VkCopyImageToBufferInfo2*)pool->alloc(sizeof(const VkCopyImageToBufferInfo2));
20650         deepcopy_VkCopyImageToBufferInfo2(
20651             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyImageToBufferInfo,
20652             (VkCopyImageToBufferInfo2*)(local_pCopyImageToBufferInfo));
20653     }
20654     if (local_pCopyImageToBufferInfo) {
20655         transform_tohost_VkCopyImageToBufferInfo2(
20656             sResourceTracker, (VkCopyImageToBufferInfo2*)(local_pCopyImageToBufferInfo));
20657     }
20658     size_t count = 0;
20659     size_t* countPtr = &count;
20660     {
20661         uint64_t cgen_var_0;
20662         *countPtr += 1 * 8;
20663         count_VkCopyImageToBufferInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20664                                        (VkCopyImageToBufferInfo2*)(local_pCopyImageToBufferInfo),
20665                                        countPtr);
20666     }
20667     uint32_t packetSize_vkCmdCopyImageToBuffer2KHR = 4 + 4 + count;
20668     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdCopyImageToBuffer2KHR -= 8;
20669     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdCopyImageToBuffer2KHR);
20670     uint8_t* packetBeginPtr = streamPtr;
20671     uint8_t** streamPtrPtr = &streamPtr;
20672     uint32_t opcode_vkCmdCopyImageToBuffer2KHR = OP_vkCmdCopyImageToBuffer2KHR;
20673     memcpy(streamPtr, &opcode_vkCmdCopyImageToBuffer2KHR, sizeof(uint32_t));
20674     streamPtr += sizeof(uint32_t);
20675     memcpy(streamPtr, &packetSize_vkCmdCopyImageToBuffer2KHR, sizeof(uint32_t));
20676     streamPtr += sizeof(uint32_t);
20677     if (!queueSubmitWithCommandsEnabled) {
20678         uint64_t cgen_var_0;
20679         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
20680         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20681         *streamPtrPtr += 1 * 8;
20682     }
20683     reservedmarshal_VkCopyImageToBufferInfo2(
20684         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20685         (VkCopyImageToBufferInfo2*)(local_pCopyImageToBufferInfo), streamPtrPtr);
20686     ++encodeCount;
20687     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20688         pool->freeAll();
20689         stream->clearPool();
20690     }
20691     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20692 }
20693 
vkCmdBlitImage2KHR(VkCommandBuffer commandBuffer,const VkBlitImageInfo2 * pBlitImageInfo,uint32_t doLock)20694 void VkEncoder::vkCmdBlitImage2KHR(VkCommandBuffer commandBuffer,
20695                                    const VkBlitImageInfo2* pBlitImageInfo, uint32_t doLock) {
20696     (void)doLock;
20697     bool queueSubmitWithCommandsEnabled =
20698         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20699     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20700     auto stream = mImpl->stream();
20701     auto pool = mImpl->pool();
20702     VkCommandBuffer local_commandBuffer;
20703     VkBlitImageInfo2* local_pBlitImageInfo;
20704     local_commandBuffer = commandBuffer;
20705     local_pBlitImageInfo = nullptr;
20706     if (pBlitImageInfo) {
20707         local_pBlitImageInfo = (VkBlitImageInfo2*)pool->alloc(sizeof(const VkBlitImageInfo2));
20708         deepcopy_VkBlitImageInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBlitImageInfo,
20709                                   (VkBlitImageInfo2*)(local_pBlitImageInfo));
20710     }
20711     if (local_pBlitImageInfo) {
20712         transform_tohost_VkBlitImageInfo2(sResourceTracker,
20713                                           (VkBlitImageInfo2*)(local_pBlitImageInfo));
20714     }
20715     size_t count = 0;
20716     size_t* countPtr = &count;
20717     {
20718         uint64_t cgen_var_0;
20719         *countPtr += 1 * 8;
20720         count_VkBlitImageInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20721                                (VkBlitImageInfo2*)(local_pBlitImageInfo), countPtr);
20722     }
20723     uint32_t packetSize_vkCmdBlitImage2KHR = 4 + 4 + count;
20724     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBlitImage2KHR -= 8;
20725     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBlitImage2KHR);
20726     uint8_t* packetBeginPtr = streamPtr;
20727     uint8_t** streamPtrPtr = &streamPtr;
20728     uint32_t opcode_vkCmdBlitImage2KHR = OP_vkCmdBlitImage2KHR;
20729     memcpy(streamPtr, &opcode_vkCmdBlitImage2KHR, sizeof(uint32_t));
20730     streamPtr += sizeof(uint32_t);
20731     memcpy(streamPtr, &packetSize_vkCmdBlitImage2KHR, sizeof(uint32_t));
20732     streamPtr += sizeof(uint32_t);
20733     if (!queueSubmitWithCommandsEnabled) {
20734         uint64_t cgen_var_0;
20735         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
20736         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20737         *streamPtrPtr += 1 * 8;
20738     }
20739     reservedmarshal_VkBlitImageInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20740                                      (VkBlitImageInfo2*)(local_pBlitImageInfo), streamPtrPtr);
20741     ++encodeCount;
20742     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20743         pool->freeAll();
20744         stream->clearPool();
20745     }
20746     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20747 }
20748 
vkCmdResolveImage2KHR(VkCommandBuffer commandBuffer,const VkResolveImageInfo2 * pResolveImageInfo,uint32_t doLock)20749 void VkEncoder::vkCmdResolveImage2KHR(VkCommandBuffer commandBuffer,
20750                                       const VkResolveImageInfo2* pResolveImageInfo,
20751                                       uint32_t doLock) {
20752     (void)doLock;
20753     bool queueSubmitWithCommandsEnabled =
20754         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20755     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20756     auto stream = mImpl->stream();
20757     auto pool = mImpl->pool();
20758     VkCommandBuffer local_commandBuffer;
20759     VkResolveImageInfo2* local_pResolveImageInfo;
20760     local_commandBuffer = commandBuffer;
20761     local_pResolveImageInfo = nullptr;
20762     if (pResolveImageInfo) {
20763         local_pResolveImageInfo =
20764             (VkResolveImageInfo2*)pool->alloc(sizeof(const VkResolveImageInfo2));
20765         deepcopy_VkResolveImageInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pResolveImageInfo,
20766                                      (VkResolveImageInfo2*)(local_pResolveImageInfo));
20767     }
20768     if (local_pResolveImageInfo) {
20769         transform_tohost_VkResolveImageInfo2(sResourceTracker,
20770                                              (VkResolveImageInfo2*)(local_pResolveImageInfo));
20771     }
20772     size_t count = 0;
20773     size_t* countPtr = &count;
20774     {
20775         uint64_t cgen_var_0;
20776         *countPtr += 1 * 8;
20777         count_VkResolveImageInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20778                                   (VkResolveImageInfo2*)(local_pResolveImageInfo), countPtr);
20779     }
20780     uint32_t packetSize_vkCmdResolveImage2KHR = 4 + 4 + count;
20781     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdResolveImage2KHR -= 8;
20782     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdResolveImage2KHR);
20783     uint8_t* packetBeginPtr = streamPtr;
20784     uint8_t** streamPtrPtr = &streamPtr;
20785     uint32_t opcode_vkCmdResolveImage2KHR = OP_vkCmdResolveImage2KHR;
20786     memcpy(streamPtr, &opcode_vkCmdResolveImage2KHR, sizeof(uint32_t));
20787     streamPtr += sizeof(uint32_t);
20788     memcpy(streamPtr, &packetSize_vkCmdResolveImage2KHR, sizeof(uint32_t));
20789     streamPtr += sizeof(uint32_t);
20790     if (!queueSubmitWithCommandsEnabled) {
20791         uint64_t cgen_var_0;
20792         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
20793         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20794         *streamPtrPtr += 1 * 8;
20795     }
20796     reservedmarshal_VkResolveImageInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20797                                         (VkResolveImageInfo2*)(local_pResolveImageInfo),
20798                                         streamPtrPtr);
20799     ++encodeCount;
20800     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20801         pool->freeAll();
20802         stream->clearPool();
20803     }
20804     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20805 }
20806 
20807 #endif
20808 #ifdef VK_KHR_maintenance4
vkGetDeviceBufferMemoryRequirementsKHR(VkDevice device,const VkDeviceBufferMemoryRequirements * pInfo,VkMemoryRequirements2 * pMemoryRequirements,uint32_t doLock)20809 void VkEncoder::vkGetDeviceBufferMemoryRequirementsKHR(
20810     VkDevice device, const VkDeviceBufferMemoryRequirements* pInfo,
20811     VkMemoryRequirements2* pMemoryRequirements, uint32_t doLock) {
20812     (void)doLock;
20813     bool queueSubmitWithCommandsEnabled =
20814         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20815     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20816     auto stream = mImpl->stream();
20817     auto pool = mImpl->pool();
20818     VkDevice local_device;
20819     VkDeviceBufferMemoryRequirements* local_pInfo;
20820     local_device = device;
20821     local_pInfo = nullptr;
20822     if (pInfo) {
20823         local_pInfo = (VkDeviceBufferMemoryRequirements*)pool->alloc(
20824             sizeof(const VkDeviceBufferMemoryRequirements));
20825         deepcopy_VkDeviceBufferMemoryRequirements(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
20826                                                   (VkDeviceBufferMemoryRequirements*)(local_pInfo));
20827     }
20828     if (local_pInfo) {
20829         transform_tohost_VkDeviceBufferMemoryRequirements(
20830             sResourceTracker, (VkDeviceBufferMemoryRequirements*)(local_pInfo));
20831     }
20832     size_t count = 0;
20833     size_t* countPtr = &count;
20834     {
20835         uint64_t cgen_var_0;
20836         *countPtr += 1 * 8;
20837         count_VkDeviceBufferMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20838                                                (VkDeviceBufferMemoryRequirements*)(local_pInfo),
20839                                                countPtr);
20840         count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20841                                     (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
20842     }
20843     uint32_t packetSize_vkGetDeviceBufferMemoryRequirementsKHR =
20844         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
20845     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceBufferMemoryRequirementsKHR);
20846     uint8_t* packetBeginPtr = streamPtr;
20847     uint8_t** streamPtrPtr = &streamPtr;
20848     uint32_t opcode_vkGetDeviceBufferMemoryRequirementsKHR =
20849         OP_vkGetDeviceBufferMemoryRequirementsKHR;
20850     uint32_t seqno;
20851     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
20852     memcpy(streamPtr, &opcode_vkGetDeviceBufferMemoryRequirementsKHR, sizeof(uint32_t));
20853     streamPtr += sizeof(uint32_t);
20854     memcpy(streamPtr, &packetSize_vkGetDeviceBufferMemoryRequirementsKHR, sizeof(uint32_t));
20855     streamPtr += sizeof(uint32_t);
20856     if (queueSubmitWithCommandsEnabled) {
20857         memcpy(streamPtr, &seqno, sizeof(uint32_t));
20858         streamPtr += sizeof(uint32_t);
20859     }
20860     uint64_t cgen_var_0;
20861     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
20862     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20863     *streamPtrPtr += 1 * 8;
20864     reservedmarshal_VkDeviceBufferMemoryRequirements(
20865         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkDeviceBufferMemoryRequirements*)(local_pInfo),
20866         streamPtrPtr);
20867     reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20868                                           (VkMemoryRequirements2*)(pMemoryRequirements),
20869                                           streamPtrPtr);
20870     unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20871                                     (VkMemoryRequirements2*)(pMemoryRequirements));
20872     if (pMemoryRequirements) {
20873         transform_fromhost_VkMemoryRequirements2(sResourceTracker,
20874                                                  (VkMemoryRequirements2*)(pMemoryRequirements));
20875     }
20876     ++encodeCount;
20877     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20878         pool->freeAll();
20879         stream->clearPool();
20880     }
20881     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20882 }
20883 
vkGetDeviceImageMemoryRequirementsKHR(VkDevice device,const VkDeviceImageMemoryRequirements * pInfo,VkMemoryRequirements2 * pMemoryRequirements,uint32_t doLock)20884 void VkEncoder::vkGetDeviceImageMemoryRequirementsKHR(VkDevice device,
20885                                                       const VkDeviceImageMemoryRequirements* pInfo,
20886                                                       VkMemoryRequirements2* pMemoryRequirements,
20887                                                       uint32_t doLock) {
20888     (void)doLock;
20889     bool queueSubmitWithCommandsEnabled =
20890         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20891     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20892     auto stream = mImpl->stream();
20893     auto pool = mImpl->pool();
20894     VkDevice local_device;
20895     VkDeviceImageMemoryRequirements* local_pInfo;
20896     local_device = device;
20897     local_pInfo = nullptr;
20898     if (pInfo) {
20899         local_pInfo = (VkDeviceImageMemoryRequirements*)pool->alloc(
20900             sizeof(const VkDeviceImageMemoryRequirements));
20901         deepcopy_VkDeviceImageMemoryRequirements(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
20902                                                  (VkDeviceImageMemoryRequirements*)(local_pInfo));
20903     }
20904     if (local_pInfo) {
20905         transform_tohost_VkDeviceImageMemoryRequirements(
20906             sResourceTracker, (VkDeviceImageMemoryRequirements*)(local_pInfo));
20907     }
20908     size_t count = 0;
20909     size_t* countPtr = &count;
20910     {
20911         uint64_t cgen_var_0;
20912         *countPtr += 1 * 8;
20913         count_VkDeviceImageMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20914                                               (VkDeviceImageMemoryRequirements*)(local_pInfo),
20915                                               countPtr);
20916         count_VkMemoryRequirements2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20917                                     (VkMemoryRequirements2*)(pMemoryRequirements), countPtr);
20918     }
20919     uint32_t packetSize_vkGetDeviceImageMemoryRequirementsKHR =
20920         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
20921     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceImageMemoryRequirementsKHR);
20922     uint8_t* packetBeginPtr = streamPtr;
20923     uint8_t** streamPtrPtr = &streamPtr;
20924     uint32_t opcode_vkGetDeviceImageMemoryRequirementsKHR =
20925         OP_vkGetDeviceImageMemoryRequirementsKHR;
20926     uint32_t seqno;
20927     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
20928     memcpy(streamPtr, &opcode_vkGetDeviceImageMemoryRequirementsKHR, sizeof(uint32_t));
20929     streamPtr += sizeof(uint32_t);
20930     memcpy(streamPtr, &packetSize_vkGetDeviceImageMemoryRequirementsKHR, sizeof(uint32_t));
20931     streamPtr += sizeof(uint32_t);
20932     if (queueSubmitWithCommandsEnabled) {
20933         memcpy(streamPtr, &seqno, sizeof(uint32_t));
20934         streamPtr += sizeof(uint32_t);
20935     }
20936     uint64_t cgen_var_0;
20937     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
20938     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
20939     *streamPtrPtr += 1 * 8;
20940     reservedmarshal_VkDeviceImageMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20941                                                     (VkDeviceImageMemoryRequirements*)(local_pInfo),
20942                                                     streamPtrPtr);
20943     reservedmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20944                                           (VkMemoryRequirements2*)(pMemoryRequirements),
20945                                           streamPtrPtr);
20946     unmarshal_VkMemoryRequirements2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
20947                                     (VkMemoryRequirements2*)(pMemoryRequirements));
20948     if (pMemoryRequirements) {
20949         transform_fromhost_VkMemoryRequirements2(sResourceTracker,
20950                                                  (VkMemoryRequirements2*)(pMemoryRequirements));
20951     }
20952     ++encodeCount;
20953     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
20954         pool->freeAll();
20955         stream->clearPool();
20956     }
20957     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
20958 }
20959 
vkGetDeviceImageSparseMemoryRequirementsKHR(VkDevice device,const VkDeviceImageMemoryRequirements * pInfo,uint32_t * pSparseMemoryRequirementCount,VkSparseImageMemoryRequirements2 * pSparseMemoryRequirements,uint32_t doLock)20960 void VkEncoder::vkGetDeviceImageSparseMemoryRequirementsKHR(
20961     VkDevice device, const VkDeviceImageMemoryRequirements* pInfo,
20962     uint32_t* pSparseMemoryRequirementCount,
20963     VkSparseImageMemoryRequirements2* pSparseMemoryRequirements, uint32_t doLock) {
20964     (void)doLock;
20965     bool queueSubmitWithCommandsEnabled =
20966         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
20967     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
20968     auto stream = mImpl->stream();
20969     auto pool = mImpl->pool();
20970     VkDevice local_device;
20971     VkDeviceImageMemoryRequirements* local_pInfo;
20972     local_device = device;
20973     local_pInfo = nullptr;
20974     if (pInfo) {
20975         local_pInfo = (VkDeviceImageMemoryRequirements*)pool->alloc(
20976             sizeof(const VkDeviceImageMemoryRequirements));
20977         deepcopy_VkDeviceImageMemoryRequirements(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
20978                                                  (VkDeviceImageMemoryRequirements*)(local_pInfo));
20979     }
20980     if (local_pInfo) {
20981         transform_tohost_VkDeviceImageMemoryRequirements(
20982             sResourceTracker, (VkDeviceImageMemoryRequirements*)(local_pInfo));
20983     }
20984     size_t count = 0;
20985     size_t* countPtr = &count;
20986     {
20987         uint64_t cgen_var_0;
20988         *countPtr += 1 * 8;
20989         count_VkDeviceImageMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
20990                                               (VkDeviceImageMemoryRequirements*)(local_pInfo),
20991                                               countPtr);
20992         // WARNING PTR CHECK
20993         *countPtr += 8;
20994         if (pSparseMemoryRequirementCount) {
20995             *countPtr += sizeof(uint32_t);
20996         }
20997         // WARNING PTR CHECK
20998         *countPtr += 8;
20999         if (pSparseMemoryRequirements) {
21000             if (pSparseMemoryRequirementCount) {
21001                 for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
21002                     count_VkSparseImageMemoryRequirements2(
21003                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
21004                         (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i),
21005                         countPtr);
21006                 }
21007             }
21008         }
21009     }
21010     uint32_t packetSize_vkGetDeviceImageSparseMemoryRequirementsKHR =
21011         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
21012     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceImageSparseMemoryRequirementsKHR);
21013     uint8_t* packetBeginPtr = streamPtr;
21014     uint8_t** streamPtrPtr = &streamPtr;
21015     uint32_t opcode_vkGetDeviceImageSparseMemoryRequirementsKHR =
21016         OP_vkGetDeviceImageSparseMemoryRequirementsKHR;
21017     uint32_t seqno;
21018     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
21019     memcpy(streamPtr, &opcode_vkGetDeviceImageSparseMemoryRequirementsKHR, sizeof(uint32_t));
21020     streamPtr += sizeof(uint32_t);
21021     memcpy(streamPtr, &packetSize_vkGetDeviceImageSparseMemoryRequirementsKHR, sizeof(uint32_t));
21022     streamPtr += sizeof(uint32_t);
21023     if (queueSubmitWithCommandsEnabled) {
21024         memcpy(streamPtr, &seqno, sizeof(uint32_t));
21025         streamPtr += sizeof(uint32_t);
21026     }
21027     uint64_t cgen_var_0;
21028     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
21029     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21030     *streamPtrPtr += 1 * 8;
21031     reservedmarshal_VkDeviceImageMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
21032                                                     (VkDeviceImageMemoryRequirements*)(local_pInfo),
21033                                                     streamPtrPtr);
21034     // WARNING PTR CHECK
21035     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pSparseMemoryRequirementCount;
21036     memcpy((*streamPtrPtr), &cgen_var_1, 8);
21037     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
21038     *streamPtrPtr += 8;
21039     if (pSparseMemoryRequirementCount) {
21040         memcpy(*streamPtrPtr, (uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
21041         *streamPtrPtr += sizeof(uint32_t);
21042     }
21043     // WARNING PTR CHECK
21044     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pSparseMemoryRequirements;
21045     memcpy((*streamPtrPtr), &cgen_var_2, 8);
21046     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
21047     *streamPtrPtr += 8;
21048     if (pSparseMemoryRequirements) {
21049         for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
21050             reservedmarshal_VkSparseImageMemoryRequirements2(
21051                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
21052                 (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i), streamPtrPtr);
21053         }
21054     }
21055     // WARNING PTR CHECK
21056     uint32_t* check_pSparseMemoryRequirementCount;
21057     check_pSparseMemoryRequirementCount = (uint32_t*)(uintptr_t)stream->getBe64();
21058     if (pSparseMemoryRequirementCount) {
21059         if (!(check_pSparseMemoryRequirementCount)) {
21060             fprintf(stderr,
21061                     "fatal: pSparseMemoryRequirementCount inconsistent between guest and host\n");
21062         }
21063         stream->read((uint32_t*)pSparseMemoryRequirementCount, sizeof(uint32_t));
21064     }
21065     // WARNING PTR CHECK
21066     VkSparseImageMemoryRequirements2* check_pSparseMemoryRequirements;
21067     check_pSparseMemoryRequirements =
21068         (VkSparseImageMemoryRequirements2*)(uintptr_t)stream->getBe64();
21069     if (pSparseMemoryRequirements) {
21070         if (!(check_pSparseMemoryRequirements)) {
21071             fprintf(stderr,
21072                     "fatal: pSparseMemoryRequirements inconsistent between guest and host\n");
21073         }
21074         if (pSparseMemoryRequirementCount) {
21075             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
21076                 unmarshal_VkSparseImageMemoryRequirements2(
21077                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
21078                     (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
21079             }
21080         }
21081     }
21082     if (pSparseMemoryRequirementCount) {
21083         if (pSparseMemoryRequirements) {
21084             for (uint32_t i = 0; i < (uint32_t)(*(pSparseMemoryRequirementCount)); ++i) {
21085                 transform_fromhost_VkSparseImageMemoryRequirements2(
21086                     sResourceTracker,
21087                     (VkSparseImageMemoryRequirements2*)(pSparseMemoryRequirements + i));
21088             }
21089         }
21090     }
21091     ++encodeCount;
21092     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21093         pool->freeAll();
21094         stream->clearPool();
21095     }
21096     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21097 }
21098 
21099 #endif
21100 #ifdef VK_KHR_maintenance5
vkCmdBindIndexBuffer2KHR(VkCommandBuffer commandBuffer,VkBuffer buffer,VkDeviceSize offset,VkDeviceSize size,VkIndexType indexType,uint32_t doLock)21101 void VkEncoder::vkCmdBindIndexBuffer2KHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
21102                                          VkDeviceSize offset, VkDeviceSize size,
21103                                          VkIndexType indexType, uint32_t doLock) {
21104     (void)doLock;
21105     bool queueSubmitWithCommandsEnabled =
21106         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21107     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21108     auto stream = mImpl->stream();
21109     auto pool = mImpl->pool();
21110     VkCommandBuffer local_commandBuffer;
21111     VkBuffer local_buffer;
21112     VkDeviceSize local_offset;
21113     VkDeviceSize local_size;
21114     VkIndexType local_indexType;
21115     local_commandBuffer = commandBuffer;
21116     local_buffer = buffer;
21117     local_offset = offset;
21118     local_size = size;
21119     local_indexType = indexType;
21120     size_t count = 0;
21121     size_t* countPtr = &count;
21122     {
21123         uint64_t cgen_var_0;
21124         *countPtr += 1 * 8;
21125         uint64_t cgen_var_1;
21126         *countPtr += 1 * 8;
21127         *countPtr += sizeof(VkDeviceSize);
21128         *countPtr += sizeof(VkDeviceSize);
21129         *countPtr += sizeof(VkIndexType);
21130     }
21131     uint32_t packetSize_vkCmdBindIndexBuffer2KHR = 4 + 4 + count;
21132     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBindIndexBuffer2KHR -= 8;
21133     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindIndexBuffer2KHR);
21134     uint8_t* packetBeginPtr = streamPtr;
21135     uint8_t** streamPtrPtr = &streamPtr;
21136     uint32_t opcode_vkCmdBindIndexBuffer2KHR = OP_vkCmdBindIndexBuffer2KHR;
21137     memcpy(streamPtr, &opcode_vkCmdBindIndexBuffer2KHR, sizeof(uint32_t));
21138     streamPtr += sizeof(uint32_t);
21139     memcpy(streamPtr, &packetSize_vkCmdBindIndexBuffer2KHR, sizeof(uint32_t));
21140     streamPtr += sizeof(uint32_t);
21141     if (!queueSubmitWithCommandsEnabled) {
21142         uint64_t cgen_var_0;
21143         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
21144         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21145         *streamPtrPtr += 1 * 8;
21146     }
21147     uint64_t cgen_var_0;
21148     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_buffer));
21149     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21150     *streamPtrPtr += 1 * 8;
21151     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_offset, sizeof(VkDeviceSize));
21152     *streamPtrPtr += sizeof(VkDeviceSize);
21153     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_size, sizeof(VkDeviceSize));
21154     *streamPtrPtr += sizeof(VkDeviceSize);
21155     memcpy(*streamPtrPtr, (VkIndexType*)&local_indexType, sizeof(VkIndexType));
21156     *streamPtrPtr += sizeof(VkIndexType);
21157     ++encodeCount;
21158     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21159         pool->freeAll();
21160         stream->clearPool();
21161     }
21162     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21163 }
21164 
vkGetRenderingAreaGranularityKHR(VkDevice device,const VkRenderingAreaInfoKHR * pRenderingAreaInfo,VkExtent2D * pGranularity,uint32_t doLock)21165 void VkEncoder::vkGetRenderingAreaGranularityKHR(VkDevice device,
21166                                                  const VkRenderingAreaInfoKHR* pRenderingAreaInfo,
21167                                                  VkExtent2D* pGranularity, uint32_t doLock) {
21168     (void)doLock;
21169     bool queueSubmitWithCommandsEnabled =
21170         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21171     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21172     auto stream = mImpl->stream();
21173     auto pool = mImpl->pool();
21174     VkDevice local_device;
21175     VkRenderingAreaInfoKHR* local_pRenderingAreaInfo;
21176     local_device = device;
21177     local_pRenderingAreaInfo = nullptr;
21178     if (pRenderingAreaInfo) {
21179         local_pRenderingAreaInfo =
21180             (VkRenderingAreaInfoKHR*)pool->alloc(sizeof(const VkRenderingAreaInfoKHR));
21181         deepcopy_VkRenderingAreaInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pRenderingAreaInfo,
21182                                         (VkRenderingAreaInfoKHR*)(local_pRenderingAreaInfo));
21183     }
21184     if (local_pRenderingAreaInfo) {
21185         transform_tohost_VkRenderingAreaInfoKHR(
21186             sResourceTracker, (VkRenderingAreaInfoKHR*)(local_pRenderingAreaInfo));
21187     }
21188     size_t count = 0;
21189     size_t* countPtr = &count;
21190     {
21191         uint64_t cgen_var_0;
21192         *countPtr += 1 * 8;
21193         count_VkRenderingAreaInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
21194                                      (VkRenderingAreaInfoKHR*)(local_pRenderingAreaInfo), countPtr);
21195         count_VkExtent2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pGranularity),
21196                          countPtr);
21197     }
21198     uint32_t packetSize_vkGetRenderingAreaGranularityKHR =
21199         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
21200     uint8_t* streamPtr = stream->reserve(packetSize_vkGetRenderingAreaGranularityKHR);
21201     uint8_t* packetBeginPtr = streamPtr;
21202     uint8_t** streamPtrPtr = &streamPtr;
21203     uint32_t opcode_vkGetRenderingAreaGranularityKHR = OP_vkGetRenderingAreaGranularityKHR;
21204     uint32_t seqno;
21205     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
21206     memcpy(streamPtr, &opcode_vkGetRenderingAreaGranularityKHR, sizeof(uint32_t));
21207     streamPtr += sizeof(uint32_t);
21208     memcpy(streamPtr, &packetSize_vkGetRenderingAreaGranularityKHR, sizeof(uint32_t));
21209     streamPtr += sizeof(uint32_t);
21210     if (queueSubmitWithCommandsEnabled) {
21211         memcpy(streamPtr, &seqno, sizeof(uint32_t));
21212         streamPtr += sizeof(uint32_t);
21213     }
21214     uint64_t cgen_var_0;
21215     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
21216     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21217     *streamPtrPtr += 1 * 8;
21218     reservedmarshal_VkRenderingAreaInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
21219                                            (VkRenderingAreaInfoKHR*)(local_pRenderingAreaInfo),
21220                                            streamPtrPtr);
21221     reservedmarshal_VkExtent2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pGranularity),
21222                                streamPtrPtr);
21223     unmarshal_VkExtent2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkExtent2D*)(pGranularity));
21224     if (pGranularity) {
21225         transform_fromhost_VkExtent2D(sResourceTracker, (VkExtent2D*)(pGranularity));
21226     }
21227     ++encodeCount;
21228     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21229         pool->freeAll();
21230         stream->clearPool();
21231     }
21232     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21233 }
21234 
vkGetDeviceImageSubresourceLayoutKHR(VkDevice device,const VkDeviceImageSubresourceInfoKHR * pInfo,VkSubresourceLayout2KHR * pLayout,uint32_t doLock)21235 void VkEncoder::vkGetDeviceImageSubresourceLayoutKHR(VkDevice device,
21236                                                      const VkDeviceImageSubresourceInfoKHR* pInfo,
21237                                                      VkSubresourceLayout2KHR* pLayout,
21238                                                      uint32_t doLock) {
21239     (void)doLock;
21240     bool queueSubmitWithCommandsEnabled =
21241         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21242     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21243     auto stream = mImpl->stream();
21244     auto pool = mImpl->pool();
21245     VkDevice local_device;
21246     VkDeviceImageSubresourceInfoKHR* local_pInfo;
21247     local_device = device;
21248     local_pInfo = nullptr;
21249     if (pInfo) {
21250         local_pInfo = (VkDeviceImageSubresourceInfoKHR*)pool->alloc(
21251             sizeof(const VkDeviceImageSubresourceInfoKHR));
21252         deepcopy_VkDeviceImageSubresourceInfoKHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pInfo,
21253                                                  (VkDeviceImageSubresourceInfoKHR*)(local_pInfo));
21254     }
21255     if (local_pInfo) {
21256         transform_tohost_VkDeviceImageSubresourceInfoKHR(
21257             sResourceTracker, (VkDeviceImageSubresourceInfoKHR*)(local_pInfo));
21258     }
21259     size_t count = 0;
21260     size_t* countPtr = &count;
21261     {
21262         uint64_t cgen_var_0;
21263         *countPtr += 1 * 8;
21264         count_VkDeviceImageSubresourceInfoKHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
21265                                               (VkDeviceImageSubresourceInfoKHR*)(local_pInfo),
21266                                               countPtr);
21267         count_VkSubresourceLayout2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
21268                                       (VkSubresourceLayout2KHR*)(pLayout), countPtr);
21269     }
21270     uint32_t packetSize_vkGetDeviceImageSubresourceLayoutKHR =
21271         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
21272     uint8_t* streamPtr = stream->reserve(packetSize_vkGetDeviceImageSubresourceLayoutKHR);
21273     uint8_t* packetBeginPtr = streamPtr;
21274     uint8_t** streamPtrPtr = &streamPtr;
21275     uint32_t opcode_vkGetDeviceImageSubresourceLayoutKHR = OP_vkGetDeviceImageSubresourceLayoutKHR;
21276     uint32_t seqno;
21277     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
21278     memcpy(streamPtr, &opcode_vkGetDeviceImageSubresourceLayoutKHR, sizeof(uint32_t));
21279     streamPtr += sizeof(uint32_t);
21280     memcpy(streamPtr, &packetSize_vkGetDeviceImageSubresourceLayoutKHR, sizeof(uint32_t));
21281     streamPtr += sizeof(uint32_t);
21282     if (queueSubmitWithCommandsEnabled) {
21283         memcpy(streamPtr, &seqno, sizeof(uint32_t));
21284         streamPtr += sizeof(uint32_t);
21285     }
21286     uint64_t cgen_var_0;
21287     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
21288     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21289     *streamPtrPtr += 1 * 8;
21290     reservedmarshal_VkDeviceImageSubresourceInfoKHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
21291                                                     (VkDeviceImageSubresourceInfoKHR*)(local_pInfo),
21292                                                     streamPtrPtr);
21293     reservedmarshal_VkSubresourceLayout2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
21294                                             (VkSubresourceLayout2KHR*)(pLayout), streamPtrPtr);
21295     unmarshal_VkSubresourceLayout2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
21296                                       (VkSubresourceLayout2KHR*)(pLayout));
21297     if (pLayout) {
21298         transform_fromhost_VkSubresourceLayout2KHR(sResourceTracker,
21299                                                    (VkSubresourceLayout2KHR*)(pLayout));
21300     }
21301     ++encodeCount;
21302     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21303         pool->freeAll();
21304         stream->clearPool();
21305     }
21306     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21307 }
21308 
vkGetImageSubresourceLayout2KHR(VkDevice device,VkImage image,const VkImageSubresource2KHR * pSubresource,VkSubresourceLayout2KHR * pLayout,uint32_t doLock)21309 void VkEncoder::vkGetImageSubresourceLayout2KHR(VkDevice device, VkImage image,
21310                                                 const VkImageSubresource2KHR* pSubresource,
21311                                                 VkSubresourceLayout2KHR* pLayout, uint32_t doLock) {
21312     (void)doLock;
21313     bool queueSubmitWithCommandsEnabled =
21314         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21315     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21316     auto stream = mImpl->stream();
21317     auto pool = mImpl->pool();
21318     VkDevice local_device;
21319     VkImage local_image;
21320     VkImageSubresource2KHR* local_pSubresource;
21321     local_device = device;
21322     local_image = image;
21323     local_pSubresource = nullptr;
21324     if (pSubresource) {
21325         local_pSubresource =
21326             (VkImageSubresource2KHR*)pool->alloc(sizeof(const VkImageSubresource2KHR));
21327         deepcopy_VkImageSubresource2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubresource,
21328                                         (VkImageSubresource2KHR*)(local_pSubresource));
21329     }
21330     if (local_pSubresource) {
21331         transform_tohost_VkImageSubresource2KHR(sResourceTracker,
21332                                                 (VkImageSubresource2KHR*)(local_pSubresource));
21333     }
21334     size_t count = 0;
21335     size_t* countPtr = &count;
21336     {
21337         uint64_t cgen_var_0;
21338         *countPtr += 1 * 8;
21339         uint64_t cgen_var_1;
21340         *countPtr += 1 * 8;
21341         count_VkImageSubresource2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
21342                                      (VkImageSubresource2KHR*)(local_pSubresource), countPtr);
21343         count_VkSubresourceLayout2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
21344                                       (VkSubresourceLayout2KHR*)(pLayout), countPtr);
21345     }
21346     uint32_t packetSize_vkGetImageSubresourceLayout2KHR =
21347         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
21348     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageSubresourceLayout2KHR);
21349     uint8_t* packetBeginPtr = streamPtr;
21350     uint8_t** streamPtrPtr = &streamPtr;
21351     uint32_t opcode_vkGetImageSubresourceLayout2KHR = OP_vkGetImageSubresourceLayout2KHR;
21352     uint32_t seqno;
21353     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
21354     memcpy(streamPtr, &opcode_vkGetImageSubresourceLayout2KHR, sizeof(uint32_t));
21355     streamPtr += sizeof(uint32_t);
21356     memcpy(streamPtr, &packetSize_vkGetImageSubresourceLayout2KHR, sizeof(uint32_t));
21357     streamPtr += sizeof(uint32_t);
21358     if (queueSubmitWithCommandsEnabled) {
21359         memcpy(streamPtr, &seqno, sizeof(uint32_t));
21360         streamPtr += sizeof(uint32_t);
21361     }
21362     uint64_t cgen_var_0;
21363     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
21364     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21365     *streamPtrPtr += 1 * 8;
21366     uint64_t cgen_var_1;
21367     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
21368     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
21369     *streamPtrPtr += 1 * 8;
21370     reservedmarshal_VkImageSubresource2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
21371                                            (VkImageSubresource2KHR*)(local_pSubresource),
21372                                            streamPtrPtr);
21373     reservedmarshal_VkSubresourceLayout2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
21374                                             (VkSubresourceLayout2KHR*)(pLayout), streamPtrPtr);
21375     unmarshal_VkSubresourceLayout2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
21376                                       (VkSubresourceLayout2KHR*)(pLayout));
21377     if (pLayout) {
21378         transform_fromhost_VkSubresourceLayout2KHR(sResourceTracker,
21379                                                    (VkSubresourceLayout2KHR*)(pLayout));
21380     }
21381     ++encodeCount;
21382     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21383         pool->freeAll();
21384         stream->clearPool();
21385     }
21386     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21387 }
21388 
21389 #endif
21390 #ifdef VK_KHR_line_rasterization
vkCmdSetLineStippleKHR(VkCommandBuffer commandBuffer,uint32_t lineStippleFactor,uint16_t lineStipplePattern,uint32_t doLock)21391 void VkEncoder::vkCmdSetLineStippleKHR(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
21392                                        uint16_t lineStipplePattern, uint32_t doLock) {
21393     (void)doLock;
21394     bool queueSubmitWithCommandsEnabled =
21395         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21396     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21397     auto stream = mImpl->stream();
21398     auto pool = mImpl->pool();
21399     VkCommandBuffer local_commandBuffer;
21400     uint32_t local_lineStippleFactor;
21401     uint16_t local_lineStipplePattern;
21402     local_commandBuffer = commandBuffer;
21403     local_lineStippleFactor = lineStippleFactor;
21404     local_lineStipplePattern = lineStipplePattern;
21405     size_t count = 0;
21406     size_t* countPtr = &count;
21407     {
21408         uint64_t cgen_var_0;
21409         *countPtr += 1 * 8;
21410         *countPtr += sizeof(uint32_t);
21411         *countPtr += sizeof(uint16_t);
21412     }
21413     uint32_t packetSize_vkCmdSetLineStippleKHR = 4 + 4 + count;
21414     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetLineStippleKHR -= 8;
21415     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetLineStippleKHR);
21416     uint8_t* packetBeginPtr = streamPtr;
21417     uint8_t** streamPtrPtr = &streamPtr;
21418     uint32_t opcode_vkCmdSetLineStippleKHR = OP_vkCmdSetLineStippleKHR;
21419     memcpy(streamPtr, &opcode_vkCmdSetLineStippleKHR, sizeof(uint32_t));
21420     streamPtr += sizeof(uint32_t);
21421     memcpy(streamPtr, &packetSize_vkCmdSetLineStippleKHR, sizeof(uint32_t));
21422     streamPtr += sizeof(uint32_t);
21423     if (!queueSubmitWithCommandsEnabled) {
21424         uint64_t cgen_var_0;
21425         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
21426         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21427         *streamPtrPtr += 1 * 8;
21428     }
21429     memcpy(*streamPtrPtr, (uint32_t*)&local_lineStippleFactor, sizeof(uint32_t));
21430     *streamPtrPtr += sizeof(uint32_t);
21431     memcpy(*streamPtrPtr, (uint16_t*)&local_lineStipplePattern, sizeof(uint16_t));
21432     *streamPtrPtr += sizeof(uint16_t);
21433     ++encodeCount;
21434     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21435         pool->freeAll();
21436         stream->clearPool();
21437     }
21438     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21439 }
21440 
21441 #endif
21442 #ifdef VK_ANDROID_native_buffer
vkGetSwapchainGrallocUsageANDROID(VkDevice device,VkFormat format,VkImageUsageFlags imageUsage,int * grallocUsage,uint32_t doLock)21443 VkResult VkEncoder::vkGetSwapchainGrallocUsageANDROID(VkDevice device, VkFormat format,
21444                                                       VkImageUsageFlags imageUsage,
21445                                                       int* grallocUsage, uint32_t doLock) {
21446     (void)doLock;
21447     bool queueSubmitWithCommandsEnabled =
21448         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21449     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21450     auto stream = mImpl->stream();
21451     auto pool = mImpl->pool();
21452     VkDevice local_device;
21453     VkFormat local_format;
21454     VkImageUsageFlags local_imageUsage;
21455     local_device = device;
21456     local_format = format;
21457     local_imageUsage = imageUsage;
21458     size_t count = 0;
21459     size_t* countPtr = &count;
21460     {
21461         uint64_t cgen_var_0;
21462         *countPtr += 1 * 8;
21463         *countPtr += sizeof(VkFormat);
21464         *countPtr += sizeof(VkImageUsageFlags);
21465         *countPtr += sizeof(int);
21466     }
21467     uint32_t packetSize_vkGetSwapchainGrallocUsageANDROID =
21468         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
21469     uint8_t* streamPtr = stream->reserve(packetSize_vkGetSwapchainGrallocUsageANDROID);
21470     uint8_t* packetBeginPtr = streamPtr;
21471     uint8_t** streamPtrPtr = &streamPtr;
21472     uint32_t opcode_vkGetSwapchainGrallocUsageANDROID = OP_vkGetSwapchainGrallocUsageANDROID;
21473     uint32_t seqno;
21474     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
21475     memcpy(streamPtr, &opcode_vkGetSwapchainGrallocUsageANDROID, sizeof(uint32_t));
21476     streamPtr += sizeof(uint32_t);
21477     memcpy(streamPtr, &packetSize_vkGetSwapchainGrallocUsageANDROID, sizeof(uint32_t));
21478     streamPtr += sizeof(uint32_t);
21479     if (queueSubmitWithCommandsEnabled) {
21480         memcpy(streamPtr, &seqno, sizeof(uint32_t));
21481         streamPtr += sizeof(uint32_t);
21482     }
21483     uint64_t cgen_var_0;
21484     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
21485     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21486     *streamPtrPtr += 1 * 8;
21487     memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
21488     *streamPtrPtr += sizeof(VkFormat);
21489     memcpy(*streamPtrPtr, (VkImageUsageFlags*)&local_imageUsage, sizeof(VkImageUsageFlags));
21490     *streamPtrPtr += sizeof(VkImageUsageFlags);
21491     memcpy(*streamPtrPtr, (int*)grallocUsage, sizeof(int));
21492     *streamPtrPtr += sizeof(int);
21493     stream->read((int*)grallocUsage, sizeof(int));
21494     VkResult vkGetSwapchainGrallocUsageANDROID_VkResult_return = (VkResult)0;
21495     stream->read(&vkGetSwapchainGrallocUsageANDROID_VkResult_return, sizeof(VkResult));
21496     ++encodeCount;
21497     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21498         pool->freeAll();
21499         stream->clearPool();
21500     }
21501     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21502     return vkGetSwapchainGrallocUsageANDROID_VkResult_return;
21503 }
21504 
vkAcquireImageANDROID(VkDevice device,VkImage image,int nativeFenceFd,VkSemaphore semaphore,VkFence fence,uint32_t doLock)21505 VkResult VkEncoder::vkAcquireImageANDROID(VkDevice device, VkImage image, int nativeFenceFd,
21506                                           VkSemaphore semaphore, VkFence fence, uint32_t doLock) {
21507     (void)doLock;
21508     bool queueSubmitWithCommandsEnabled =
21509         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21510     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21511     auto stream = mImpl->stream();
21512     auto pool = mImpl->pool();
21513     VkDevice local_device;
21514     VkImage local_image;
21515     int local_nativeFenceFd;
21516     VkSemaphore local_semaphore;
21517     VkFence local_fence;
21518     local_device = device;
21519     local_image = image;
21520     local_nativeFenceFd = nativeFenceFd;
21521     local_semaphore = semaphore;
21522     local_fence = fence;
21523     sResourceTracker->unwrap_vkAcquireImageANDROID_nativeFenceFd(nativeFenceFd,
21524                                                                  &local_nativeFenceFd);
21525     size_t count = 0;
21526     size_t* countPtr = &count;
21527     {
21528         uint64_t cgen_var_0;
21529         *countPtr += 1 * 8;
21530         uint64_t cgen_var_1;
21531         *countPtr += 1 * 8;
21532         *countPtr += sizeof(int);
21533         uint64_t cgen_var_2;
21534         *countPtr += 1 * 8;
21535         uint64_t cgen_var_3;
21536         *countPtr += 1 * 8;
21537     }
21538     uint32_t packetSize_vkAcquireImageANDROID =
21539         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
21540     uint8_t* streamPtr = stream->reserve(packetSize_vkAcquireImageANDROID);
21541     uint8_t* packetBeginPtr = streamPtr;
21542     uint8_t** streamPtrPtr = &streamPtr;
21543     uint32_t opcode_vkAcquireImageANDROID = OP_vkAcquireImageANDROID;
21544     uint32_t seqno;
21545     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
21546     memcpy(streamPtr, &opcode_vkAcquireImageANDROID, sizeof(uint32_t));
21547     streamPtr += sizeof(uint32_t);
21548     memcpy(streamPtr, &packetSize_vkAcquireImageANDROID, sizeof(uint32_t));
21549     streamPtr += sizeof(uint32_t);
21550     if (queueSubmitWithCommandsEnabled) {
21551         memcpy(streamPtr, &seqno, sizeof(uint32_t));
21552         streamPtr += sizeof(uint32_t);
21553     }
21554     uint64_t cgen_var_0;
21555     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
21556     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21557     *streamPtrPtr += 1 * 8;
21558     uint64_t cgen_var_1;
21559     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
21560     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
21561     *streamPtrPtr += 1 * 8;
21562     memcpy(*streamPtrPtr, (int*)&local_nativeFenceFd, sizeof(int));
21563     *streamPtrPtr += sizeof(int);
21564     uint64_t cgen_var_2;
21565     *&cgen_var_2 = get_host_u64_VkSemaphore((*&local_semaphore));
21566     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
21567     *streamPtrPtr += 1 * 8;
21568     uint64_t cgen_var_3;
21569     *&cgen_var_3 = get_host_u64_VkFence((*&local_fence));
21570     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_3, 1 * 8);
21571     *streamPtrPtr += 1 * 8;
21572     VkResult vkAcquireImageANDROID_VkResult_return = (VkResult)0;
21573     stream->read(&vkAcquireImageANDROID_VkResult_return, sizeof(VkResult));
21574     ++encodeCount;
21575     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21576         pool->freeAll();
21577         stream->clearPool();
21578     }
21579     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21580     return vkAcquireImageANDROID_VkResult_return;
21581 }
21582 
vkQueueSignalReleaseImageANDROID(VkQueue queue,uint32_t waitSemaphoreCount,const VkSemaphore * pWaitSemaphores,VkImage image,int * pNativeFenceFd,uint32_t doLock)21583 VkResult VkEncoder::vkQueueSignalReleaseImageANDROID(VkQueue queue, uint32_t waitSemaphoreCount,
21584                                                      const VkSemaphore* pWaitSemaphores,
21585                                                      VkImage image, int* pNativeFenceFd,
21586                                                      uint32_t doLock) {
21587     (void)doLock;
21588     bool queueSubmitWithCommandsEnabled =
21589         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21590     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21591     auto stream = mImpl->stream();
21592     auto pool = mImpl->pool();
21593     VkQueue local_queue;
21594     uint32_t local_waitSemaphoreCount;
21595     VkSemaphore* local_pWaitSemaphores;
21596     VkImage local_image;
21597     local_queue = queue;
21598     local_waitSemaphoreCount = waitSemaphoreCount;
21599     // Avoiding deepcopy for pWaitSemaphores
21600     local_pWaitSemaphores = (VkSemaphore*)pWaitSemaphores;
21601     local_image = image;
21602     size_t count = 0;
21603     size_t* countPtr = &count;
21604     {
21605         uint64_t cgen_var_0;
21606         *countPtr += 1 * 8;
21607         *countPtr += sizeof(uint32_t);
21608         // WARNING PTR CHECK
21609         *countPtr += 8;
21610         if (local_pWaitSemaphores) {
21611             if (((waitSemaphoreCount))) {
21612                 *countPtr += ((waitSemaphoreCount)) * 8;
21613             }
21614         }
21615         uint64_t cgen_var_1;
21616         *countPtr += 1 * 8;
21617         *countPtr += sizeof(int);
21618     }
21619     uint32_t packetSize_vkQueueSignalReleaseImageANDROID =
21620         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
21621     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSignalReleaseImageANDROID);
21622     uint8_t* packetBeginPtr = streamPtr;
21623     uint8_t** streamPtrPtr = &streamPtr;
21624     uint32_t opcode_vkQueueSignalReleaseImageANDROID = OP_vkQueueSignalReleaseImageANDROID;
21625     uint32_t seqno;
21626     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
21627     memcpy(streamPtr, &opcode_vkQueueSignalReleaseImageANDROID, sizeof(uint32_t));
21628     streamPtr += sizeof(uint32_t);
21629     memcpy(streamPtr, &packetSize_vkQueueSignalReleaseImageANDROID, sizeof(uint32_t));
21630     streamPtr += sizeof(uint32_t);
21631     if (queueSubmitWithCommandsEnabled) {
21632         memcpy(streamPtr, &seqno, sizeof(uint32_t));
21633         streamPtr += sizeof(uint32_t);
21634     }
21635     uint64_t cgen_var_0;
21636     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
21637     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21638     *streamPtrPtr += 1 * 8;
21639     memcpy(*streamPtrPtr, (uint32_t*)&local_waitSemaphoreCount, sizeof(uint32_t));
21640     *streamPtrPtr += sizeof(uint32_t);
21641     // WARNING PTR CHECK
21642     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pWaitSemaphores;
21643     memcpy((*streamPtrPtr), &cgen_var_1, 8);
21644     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
21645     *streamPtrPtr += 8;
21646     if (local_pWaitSemaphores) {
21647         if (((waitSemaphoreCount))) {
21648             uint8_t* cgen_var_1_0_ptr = (uint8_t*)(*streamPtrPtr);
21649             for (uint32_t k = 0; k < ((waitSemaphoreCount)); ++k) {
21650                 uint64_t tmpval = get_host_u64_VkSemaphore(local_pWaitSemaphores[k]);
21651                 memcpy(cgen_var_1_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
21652             }
21653             *streamPtrPtr += 8 * ((waitSemaphoreCount));
21654         }
21655     }
21656     uint64_t cgen_var_2;
21657     *&cgen_var_2 = get_host_u64_VkImage((*&local_image));
21658     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
21659     *streamPtrPtr += 1 * 8;
21660     memcpy(*streamPtrPtr, (int*)pNativeFenceFd, sizeof(int));
21661     *streamPtrPtr += sizeof(int);
21662     stream->read((int*)pNativeFenceFd, sizeof(int));
21663     VkResult vkQueueSignalReleaseImageANDROID_VkResult_return = (VkResult)0;
21664     stream->read(&vkQueueSignalReleaseImageANDROID_VkResult_return, sizeof(VkResult));
21665     stream->flush();
21666     ++encodeCount;
21667     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21668         pool->freeAll();
21669         stream->clearPool();
21670     }
21671     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21672     return vkQueueSignalReleaseImageANDROID_VkResult_return;
21673 }
21674 
vkGetSwapchainGrallocUsage2ANDROID(VkDevice device,VkFormat format,VkImageUsageFlags imageUsage,VkSwapchainImageUsageFlagsANDROID swapchainImageUsage,uint64_t * grallocConsumerUsage,uint64_t * grallocProducerUsage,uint32_t doLock)21675 VkResult VkEncoder::vkGetSwapchainGrallocUsage2ANDROID(
21676     VkDevice device, VkFormat format, VkImageUsageFlags imageUsage,
21677     VkSwapchainImageUsageFlagsANDROID swapchainImageUsage, uint64_t* grallocConsumerUsage,
21678     uint64_t* grallocProducerUsage, uint32_t doLock) {
21679     (void)doLock;
21680     bool queueSubmitWithCommandsEnabled =
21681         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21682     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21683     auto stream = mImpl->stream();
21684     auto pool = mImpl->pool();
21685     VkDevice local_device;
21686     VkFormat local_format;
21687     VkImageUsageFlags local_imageUsage;
21688     VkSwapchainImageUsageFlagsANDROID local_swapchainImageUsage;
21689     local_device = device;
21690     local_format = format;
21691     local_imageUsage = imageUsage;
21692     local_swapchainImageUsage = swapchainImageUsage;
21693     size_t count = 0;
21694     size_t* countPtr = &count;
21695     {
21696         uint64_t cgen_var_0;
21697         *countPtr += 1 * 8;
21698         *countPtr += sizeof(VkFormat);
21699         *countPtr += sizeof(VkImageUsageFlags);
21700         *countPtr += sizeof(VkSwapchainImageUsageFlagsANDROID);
21701         *countPtr += sizeof(uint64_t);
21702         *countPtr += sizeof(uint64_t);
21703     }
21704     uint32_t packetSize_vkGetSwapchainGrallocUsage2ANDROID =
21705         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
21706     uint8_t* streamPtr = stream->reserve(packetSize_vkGetSwapchainGrallocUsage2ANDROID);
21707     uint8_t* packetBeginPtr = streamPtr;
21708     uint8_t** streamPtrPtr = &streamPtr;
21709     uint32_t opcode_vkGetSwapchainGrallocUsage2ANDROID = OP_vkGetSwapchainGrallocUsage2ANDROID;
21710     uint32_t seqno;
21711     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
21712     memcpy(streamPtr, &opcode_vkGetSwapchainGrallocUsage2ANDROID, sizeof(uint32_t));
21713     streamPtr += sizeof(uint32_t);
21714     memcpy(streamPtr, &packetSize_vkGetSwapchainGrallocUsage2ANDROID, sizeof(uint32_t));
21715     streamPtr += sizeof(uint32_t);
21716     if (queueSubmitWithCommandsEnabled) {
21717         memcpy(streamPtr, &seqno, sizeof(uint32_t));
21718         streamPtr += sizeof(uint32_t);
21719     }
21720     uint64_t cgen_var_0;
21721     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
21722     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21723     *streamPtrPtr += 1 * 8;
21724     memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
21725     *streamPtrPtr += sizeof(VkFormat);
21726     memcpy(*streamPtrPtr, (VkImageUsageFlags*)&local_imageUsage, sizeof(VkImageUsageFlags));
21727     *streamPtrPtr += sizeof(VkImageUsageFlags);
21728     memcpy(*streamPtrPtr, (VkSwapchainImageUsageFlagsANDROID*)&local_swapchainImageUsage,
21729            sizeof(VkSwapchainImageUsageFlagsANDROID));
21730     *streamPtrPtr += sizeof(VkSwapchainImageUsageFlagsANDROID);
21731     memcpy(*streamPtrPtr, (uint64_t*)grallocConsumerUsage, sizeof(uint64_t));
21732     *streamPtrPtr += sizeof(uint64_t);
21733     memcpy(*streamPtrPtr, (uint64_t*)grallocProducerUsage, sizeof(uint64_t));
21734     *streamPtrPtr += sizeof(uint64_t);
21735     stream->read((uint64_t*)grallocConsumerUsage, sizeof(uint64_t));
21736     stream->read((uint64_t*)grallocProducerUsage, sizeof(uint64_t));
21737     VkResult vkGetSwapchainGrallocUsage2ANDROID_VkResult_return = (VkResult)0;
21738     stream->read(&vkGetSwapchainGrallocUsage2ANDROID_VkResult_return, sizeof(VkResult));
21739     ++encodeCount;
21740     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21741         pool->freeAll();
21742         stream->clearPool();
21743     }
21744     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21745     return vkGetSwapchainGrallocUsage2ANDROID_VkResult_return;
21746 }
21747 
21748 #endif
21749 #ifdef VK_EXT_transform_feedback
vkCmdBindTransformFeedbackBuffersEXT(VkCommandBuffer commandBuffer,uint32_t firstBinding,uint32_t bindingCount,const VkBuffer * pBuffers,const VkDeviceSize * pOffsets,const VkDeviceSize * pSizes,uint32_t doLock)21750 void VkEncoder::vkCmdBindTransformFeedbackBuffersEXT(VkCommandBuffer commandBuffer,
21751                                                      uint32_t firstBinding, uint32_t bindingCount,
21752                                                      const VkBuffer* pBuffers,
21753                                                      const VkDeviceSize* pOffsets,
21754                                                      const VkDeviceSize* pSizes, uint32_t doLock) {
21755     (void)doLock;
21756     bool queueSubmitWithCommandsEnabled =
21757         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21758     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21759     auto stream = mImpl->stream();
21760     auto pool = mImpl->pool();
21761     VkCommandBuffer local_commandBuffer;
21762     uint32_t local_firstBinding;
21763     uint32_t local_bindingCount;
21764     VkBuffer* local_pBuffers;
21765     VkDeviceSize* local_pOffsets;
21766     VkDeviceSize* local_pSizes;
21767     local_commandBuffer = commandBuffer;
21768     local_firstBinding = firstBinding;
21769     local_bindingCount = bindingCount;
21770     // Avoiding deepcopy for pBuffers
21771     local_pBuffers = (VkBuffer*)pBuffers;
21772     // Avoiding deepcopy for pOffsets
21773     local_pOffsets = (VkDeviceSize*)pOffsets;
21774     // Avoiding deepcopy for pSizes
21775     local_pSizes = (VkDeviceSize*)pSizes;
21776     size_t count = 0;
21777     size_t* countPtr = &count;
21778     {
21779         uint64_t cgen_var_0;
21780         *countPtr += 1 * 8;
21781         *countPtr += sizeof(uint32_t);
21782         *countPtr += sizeof(uint32_t);
21783         if (((bindingCount))) {
21784             *countPtr += ((bindingCount)) * 8;
21785         }
21786         *countPtr += ((bindingCount)) * sizeof(VkDeviceSize);
21787         // WARNING PTR CHECK
21788         *countPtr += 8;
21789         if (local_pSizes) {
21790             *countPtr += ((bindingCount)) * sizeof(VkDeviceSize);
21791         }
21792     }
21793     uint32_t packetSize_vkCmdBindTransformFeedbackBuffersEXT = 4 + 4 + count;
21794     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBindTransformFeedbackBuffersEXT -= 8;
21795     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindTransformFeedbackBuffersEXT);
21796     uint8_t* packetBeginPtr = streamPtr;
21797     uint8_t** streamPtrPtr = &streamPtr;
21798     uint32_t opcode_vkCmdBindTransformFeedbackBuffersEXT = OP_vkCmdBindTransformFeedbackBuffersEXT;
21799     memcpy(streamPtr, &opcode_vkCmdBindTransformFeedbackBuffersEXT, sizeof(uint32_t));
21800     streamPtr += sizeof(uint32_t);
21801     memcpy(streamPtr, &packetSize_vkCmdBindTransformFeedbackBuffersEXT, sizeof(uint32_t));
21802     streamPtr += sizeof(uint32_t);
21803     if (!queueSubmitWithCommandsEnabled) {
21804         uint64_t cgen_var_0;
21805         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
21806         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21807         *streamPtrPtr += 1 * 8;
21808     }
21809     memcpy(*streamPtrPtr, (uint32_t*)&local_firstBinding, sizeof(uint32_t));
21810     *streamPtrPtr += sizeof(uint32_t);
21811     memcpy(*streamPtrPtr, (uint32_t*)&local_bindingCount, sizeof(uint32_t));
21812     *streamPtrPtr += sizeof(uint32_t);
21813     if (((bindingCount))) {
21814         uint8_t* cgen_var_0_ptr = (uint8_t*)(*streamPtrPtr);
21815         for (uint32_t k = 0; k < ((bindingCount)); ++k) {
21816             uint64_t tmpval = get_host_u64_VkBuffer(local_pBuffers[k]);
21817             memcpy(cgen_var_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
21818         }
21819         *streamPtrPtr += 8 * ((bindingCount));
21820     }
21821     memcpy(*streamPtrPtr, (VkDeviceSize*)local_pOffsets, ((bindingCount)) * sizeof(VkDeviceSize));
21822     *streamPtrPtr += ((bindingCount)) * sizeof(VkDeviceSize);
21823     // WARNING PTR CHECK
21824     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pSizes;
21825     memcpy((*streamPtrPtr), &cgen_var_1, 8);
21826     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
21827     *streamPtrPtr += 8;
21828     if (local_pSizes) {
21829         memcpy(*streamPtrPtr, (VkDeviceSize*)local_pSizes, ((bindingCount)) * sizeof(VkDeviceSize));
21830         *streamPtrPtr += ((bindingCount)) * sizeof(VkDeviceSize);
21831     }
21832     ++encodeCount;
21833     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21834         pool->freeAll();
21835         stream->clearPool();
21836     }
21837     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21838 }
21839 
vkCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer,uint32_t firstCounterBuffer,uint32_t counterBufferCount,const VkBuffer * pCounterBuffers,const VkDeviceSize * pCounterBufferOffsets,uint32_t doLock)21840 void VkEncoder::vkCmdBeginTransformFeedbackEXT(
21841     VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer, uint32_t counterBufferCount,
21842     const VkBuffer* pCounterBuffers, const VkDeviceSize* pCounterBufferOffsets, uint32_t doLock) {
21843     (void)doLock;
21844     bool queueSubmitWithCommandsEnabled =
21845         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21846     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21847     auto stream = mImpl->stream();
21848     auto pool = mImpl->pool();
21849     VkCommandBuffer local_commandBuffer;
21850     uint32_t local_firstCounterBuffer;
21851     uint32_t local_counterBufferCount;
21852     VkBuffer* local_pCounterBuffers;
21853     VkDeviceSize* local_pCounterBufferOffsets;
21854     local_commandBuffer = commandBuffer;
21855     local_firstCounterBuffer = firstCounterBuffer;
21856     local_counterBufferCount = counterBufferCount;
21857     // Avoiding deepcopy for pCounterBuffers
21858     local_pCounterBuffers = (VkBuffer*)pCounterBuffers;
21859     // Avoiding deepcopy for pCounterBufferOffsets
21860     local_pCounterBufferOffsets = (VkDeviceSize*)pCounterBufferOffsets;
21861     size_t count = 0;
21862     size_t* countPtr = &count;
21863     {
21864         uint64_t cgen_var_0;
21865         *countPtr += 1 * 8;
21866         *countPtr += sizeof(uint32_t);
21867         *countPtr += sizeof(uint32_t);
21868         // WARNING PTR CHECK
21869         *countPtr += 8;
21870         if (local_pCounterBuffers) {
21871             if (((counterBufferCount))) {
21872                 *countPtr += ((counterBufferCount)) * 8;
21873             }
21874         }
21875         // WARNING PTR CHECK
21876         *countPtr += 8;
21877         if (local_pCounterBufferOffsets) {
21878             *countPtr += ((counterBufferCount)) * sizeof(VkDeviceSize);
21879         }
21880     }
21881     uint32_t packetSize_vkCmdBeginTransformFeedbackEXT = 4 + 4 + count;
21882     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginTransformFeedbackEXT -= 8;
21883     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginTransformFeedbackEXT);
21884     uint8_t* packetBeginPtr = streamPtr;
21885     uint8_t** streamPtrPtr = &streamPtr;
21886     uint32_t opcode_vkCmdBeginTransformFeedbackEXT = OP_vkCmdBeginTransformFeedbackEXT;
21887     memcpy(streamPtr, &opcode_vkCmdBeginTransformFeedbackEXT, sizeof(uint32_t));
21888     streamPtr += sizeof(uint32_t);
21889     memcpy(streamPtr, &packetSize_vkCmdBeginTransformFeedbackEXT, sizeof(uint32_t));
21890     streamPtr += sizeof(uint32_t);
21891     if (!queueSubmitWithCommandsEnabled) {
21892         uint64_t cgen_var_0;
21893         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
21894         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21895         *streamPtrPtr += 1 * 8;
21896     }
21897     memcpy(*streamPtrPtr, (uint32_t*)&local_firstCounterBuffer, sizeof(uint32_t));
21898     *streamPtrPtr += sizeof(uint32_t);
21899     memcpy(*streamPtrPtr, (uint32_t*)&local_counterBufferCount, sizeof(uint32_t));
21900     *streamPtrPtr += sizeof(uint32_t);
21901     // WARNING PTR CHECK
21902     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)local_pCounterBuffers;
21903     memcpy((*streamPtrPtr), &cgen_var_0, 8);
21904     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
21905     *streamPtrPtr += 8;
21906     if (local_pCounterBuffers) {
21907         if (((counterBufferCount))) {
21908             uint8_t* cgen_var_0_0_ptr = (uint8_t*)(*streamPtrPtr);
21909             for (uint32_t k = 0; k < ((counterBufferCount)); ++k) {
21910                 uint64_t tmpval = get_host_u64_VkBuffer(local_pCounterBuffers[k]);
21911                 memcpy(cgen_var_0_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
21912             }
21913             *streamPtrPtr += 8 * ((counterBufferCount));
21914         }
21915     }
21916     // WARNING PTR CHECK
21917     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pCounterBufferOffsets;
21918     memcpy((*streamPtrPtr), &cgen_var_1, 8);
21919     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
21920     *streamPtrPtr += 8;
21921     if (local_pCounterBufferOffsets) {
21922         memcpy(*streamPtrPtr, (VkDeviceSize*)local_pCounterBufferOffsets,
21923                ((counterBufferCount)) * sizeof(VkDeviceSize));
21924         *streamPtrPtr += ((counterBufferCount)) * sizeof(VkDeviceSize);
21925     }
21926     ++encodeCount;
21927     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
21928         pool->freeAll();
21929         stream->clearPool();
21930     }
21931     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
21932 }
21933 
vkCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer,uint32_t firstCounterBuffer,uint32_t counterBufferCount,const VkBuffer * pCounterBuffers,const VkDeviceSize * pCounterBufferOffsets,uint32_t doLock)21934 void VkEncoder::vkCmdEndTransformFeedbackEXT(
21935     VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer, uint32_t counterBufferCount,
21936     const VkBuffer* pCounterBuffers, const VkDeviceSize* pCounterBufferOffsets, uint32_t doLock) {
21937     (void)doLock;
21938     bool queueSubmitWithCommandsEnabled =
21939         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
21940     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
21941     auto stream = mImpl->stream();
21942     auto pool = mImpl->pool();
21943     VkCommandBuffer local_commandBuffer;
21944     uint32_t local_firstCounterBuffer;
21945     uint32_t local_counterBufferCount;
21946     VkBuffer* local_pCounterBuffers;
21947     VkDeviceSize* local_pCounterBufferOffsets;
21948     local_commandBuffer = commandBuffer;
21949     local_firstCounterBuffer = firstCounterBuffer;
21950     local_counterBufferCount = counterBufferCount;
21951     // Avoiding deepcopy for pCounterBuffers
21952     local_pCounterBuffers = (VkBuffer*)pCounterBuffers;
21953     // Avoiding deepcopy for pCounterBufferOffsets
21954     local_pCounterBufferOffsets = (VkDeviceSize*)pCounterBufferOffsets;
21955     size_t count = 0;
21956     size_t* countPtr = &count;
21957     {
21958         uint64_t cgen_var_0;
21959         *countPtr += 1 * 8;
21960         *countPtr += sizeof(uint32_t);
21961         *countPtr += sizeof(uint32_t);
21962         // WARNING PTR CHECK
21963         *countPtr += 8;
21964         if (local_pCounterBuffers) {
21965             if (((counterBufferCount))) {
21966                 *countPtr += ((counterBufferCount)) * 8;
21967             }
21968         }
21969         // WARNING PTR CHECK
21970         *countPtr += 8;
21971         if (local_pCounterBufferOffsets) {
21972             *countPtr += ((counterBufferCount)) * sizeof(VkDeviceSize);
21973         }
21974     }
21975     uint32_t packetSize_vkCmdEndTransformFeedbackEXT = 4 + 4 + count;
21976     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdEndTransformFeedbackEXT -= 8;
21977     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndTransformFeedbackEXT);
21978     uint8_t* packetBeginPtr = streamPtr;
21979     uint8_t** streamPtrPtr = &streamPtr;
21980     uint32_t opcode_vkCmdEndTransformFeedbackEXT = OP_vkCmdEndTransformFeedbackEXT;
21981     memcpy(streamPtr, &opcode_vkCmdEndTransformFeedbackEXT, sizeof(uint32_t));
21982     streamPtr += sizeof(uint32_t);
21983     memcpy(streamPtr, &packetSize_vkCmdEndTransformFeedbackEXT, sizeof(uint32_t));
21984     streamPtr += sizeof(uint32_t);
21985     if (!queueSubmitWithCommandsEnabled) {
21986         uint64_t cgen_var_0;
21987         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
21988         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
21989         *streamPtrPtr += 1 * 8;
21990     }
21991     memcpy(*streamPtrPtr, (uint32_t*)&local_firstCounterBuffer, sizeof(uint32_t));
21992     *streamPtrPtr += sizeof(uint32_t);
21993     memcpy(*streamPtrPtr, (uint32_t*)&local_counterBufferCount, sizeof(uint32_t));
21994     *streamPtrPtr += sizeof(uint32_t);
21995     // WARNING PTR CHECK
21996     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)local_pCounterBuffers;
21997     memcpy((*streamPtrPtr), &cgen_var_0, 8);
21998     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
21999     *streamPtrPtr += 8;
22000     if (local_pCounterBuffers) {
22001         if (((counterBufferCount))) {
22002             uint8_t* cgen_var_0_0_ptr = (uint8_t*)(*streamPtrPtr);
22003             for (uint32_t k = 0; k < ((counterBufferCount)); ++k) {
22004                 uint64_t tmpval = get_host_u64_VkBuffer(local_pCounterBuffers[k]);
22005                 memcpy(cgen_var_0_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
22006             }
22007             *streamPtrPtr += 8 * ((counterBufferCount));
22008         }
22009     }
22010     // WARNING PTR CHECK
22011     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pCounterBufferOffsets;
22012     memcpy((*streamPtrPtr), &cgen_var_1, 8);
22013     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
22014     *streamPtrPtr += 8;
22015     if (local_pCounterBufferOffsets) {
22016         memcpy(*streamPtrPtr, (VkDeviceSize*)local_pCounterBufferOffsets,
22017                ((counterBufferCount)) * sizeof(VkDeviceSize));
22018         *streamPtrPtr += ((counterBufferCount)) * sizeof(VkDeviceSize);
22019     }
22020     ++encodeCount;
22021     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22022         pool->freeAll();
22023         stream->clearPool();
22024     }
22025     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22026 }
22027 
vkCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer,VkQueryPool queryPool,uint32_t query,VkQueryControlFlags flags,uint32_t index,uint32_t doLock)22028 void VkEncoder::vkCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
22029                                           uint32_t query, VkQueryControlFlags flags, uint32_t index,
22030                                           uint32_t doLock) {
22031     (void)doLock;
22032     bool queueSubmitWithCommandsEnabled =
22033         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22034     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22035     auto stream = mImpl->stream();
22036     auto pool = mImpl->pool();
22037     VkCommandBuffer local_commandBuffer;
22038     VkQueryPool local_queryPool;
22039     uint32_t local_query;
22040     VkQueryControlFlags local_flags;
22041     uint32_t local_index;
22042     local_commandBuffer = commandBuffer;
22043     local_queryPool = queryPool;
22044     local_query = query;
22045     local_flags = flags;
22046     local_index = index;
22047     size_t count = 0;
22048     size_t* countPtr = &count;
22049     {
22050         uint64_t cgen_var_0;
22051         *countPtr += 1 * 8;
22052         uint64_t cgen_var_1;
22053         *countPtr += 1 * 8;
22054         *countPtr += sizeof(uint32_t);
22055         *countPtr += sizeof(VkQueryControlFlags);
22056         *countPtr += sizeof(uint32_t);
22057     }
22058     uint32_t packetSize_vkCmdBeginQueryIndexedEXT = 4 + 4 + count;
22059     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBeginQueryIndexedEXT -= 8;
22060     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBeginQueryIndexedEXT);
22061     uint8_t* packetBeginPtr = streamPtr;
22062     uint8_t** streamPtrPtr = &streamPtr;
22063     uint32_t opcode_vkCmdBeginQueryIndexedEXT = OP_vkCmdBeginQueryIndexedEXT;
22064     memcpy(streamPtr, &opcode_vkCmdBeginQueryIndexedEXT, sizeof(uint32_t));
22065     streamPtr += sizeof(uint32_t);
22066     memcpy(streamPtr, &packetSize_vkCmdBeginQueryIndexedEXT, sizeof(uint32_t));
22067     streamPtr += sizeof(uint32_t);
22068     if (!queueSubmitWithCommandsEnabled) {
22069         uint64_t cgen_var_0;
22070         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22071         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22072         *streamPtrPtr += 1 * 8;
22073     }
22074     uint64_t cgen_var_0;
22075     *&cgen_var_0 = get_host_u64_VkQueryPool((*&local_queryPool));
22076     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22077     *streamPtrPtr += 1 * 8;
22078     memcpy(*streamPtrPtr, (uint32_t*)&local_query, sizeof(uint32_t));
22079     *streamPtrPtr += sizeof(uint32_t);
22080     memcpy(*streamPtrPtr, (VkQueryControlFlags*)&local_flags, sizeof(VkQueryControlFlags));
22081     *streamPtrPtr += sizeof(VkQueryControlFlags);
22082     memcpy(*streamPtrPtr, (uint32_t*)&local_index, sizeof(uint32_t));
22083     *streamPtrPtr += sizeof(uint32_t);
22084     ++encodeCount;
22085     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22086         pool->freeAll();
22087         stream->clearPool();
22088     }
22089     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22090 }
22091 
vkCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer,VkQueryPool queryPool,uint32_t query,uint32_t index,uint32_t doLock)22092 void VkEncoder::vkCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
22093                                         uint32_t query, uint32_t index, uint32_t doLock) {
22094     (void)doLock;
22095     bool queueSubmitWithCommandsEnabled =
22096         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22097     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22098     auto stream = mImpl->stream();
22099     auto pool = mImpl->pool();
22100     VkCommandBuffer local_commandBuffer;
22101     VkQueryPool local_queryPool;
22102     uint32_t local_query;
22103     uint32_t local_index;
22104     local_commandBuffer = commandBuffer;
22105     local_queryPool = queryPool;
22106     local_query = query;
22107     local_index = index;
22108     size_t count = 0;
22109     size_t* countPtr = &count;
22110     {
22111         uint64_t cgen_var_0;
22112         *countPtr += 1 * 8;
22113         uint64_t cgen_var_1;
22114         *countPtr += 1 * 8;
22115         *countPtr += sizeof(uint32_t);
22116         *countPtr += sizeof(uint32_t);
22117     }
22118     uint32_t packetSize_vkCmdEndQueryIndexedEXT = 4 + 4 + count;
22119     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdEndQueryIndexedEXT -= 8;
22120     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdEndQueryIndexedEXT);
22121     uint8_t* packetBeginPtr = streamPtr;
22122     uint8_t** streamPtrPtr = &streamPtr;
22123     uint32_t opcode_vkCmdEndQueryIndexedEXT = OP_vkCmdEndQueryIndexedEXT;
22124     memcpy(streamPtr, &opcode_vkCmdEndQueryIndexedEXT, sizeof(uint32_t));
22125     streamPtr += sizeof(uint32_t);
22126     memcpy(streamPtr, &packetSize_vkCmdEndQueryIndexedEXT, sizeof(uint32_t));
22127     streamPtr += sizeof(uint32_t);
22128     if (!queueSubmitWithCommandsEnabled) {
22129         uint64_t cgen_var_0;
22130         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22131         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22132         *streamPtrPtr += 1 * 8;
22133     }
22134     uint64_t cgen_var_0;
22135     *&cgen_var_0 = get_host_u64_VkQueryPool((*&local_queryPool));
22136     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22137     *streamPtrPtr += 1 * 8;
22138     memcpy(*streamPtrPtr, (uint32_t*)&local_query, sizeof(uint32_t));
22139     *streamPtrPtr += sizeof(uint32_t);
22140     memcpy(*streamPtrPtr, (uint32_t*)&local_index, sizeof(uint32_t));
22141     *streamPtrPtr += sizeof(uint32_t);
22142     ++encodeCount;
22143     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22144         pool->freeAll();
22145         stream->clearPool();
22146     }
22147     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22148 }
22149 
vkCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer,uint32_t instanceCount,uint32_t firstInstance,VkBuffer counterBuffer,VkDeviceSize counterBufferOffset,uint32_t counterOffset,uint32_t vertexStride,uint32_t doLock)22150 void VkEncoder::vkCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount,
22151                                               uint32_t firstInstance, VkBuffer counterBuffer,
22152                                               VkDeviceSize counterBufferOffset,
22153                                               uint32_t counterOffset, uint32_t vertexStride,
22154                                               uint32_t doLock) {
22155     (void)doLock;
22156     bool queueSubmitWithCommandsEnabled =
22157         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22158     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22159     auto stream = mImpl->stream();
22160     auto pool = mImpl->pool();
22161     VkCommandBuffer local_commandBuffer;
22162     uint32_t local_instanceCount;
22163     uint32_t local_firstInstance;
22164     VkBuffer local_counterBuffer;
22165     VkDeviceSize local_counterBufferOffset;
22166     uint32_t local_counterOffset;
22167     uint32_t local_vertexStride;
22168     local_commandBuffer = commandBuffer;
22169     local_instanceCount = instanceCount;
22170     local_firstInstance = firstInstance;
22171     local_counterBuffer = counterBuffer;
22172     local_counterBufferOffset = counterBufferOffset;
22173     local_counterOffset = counterOffset;
22174     local_vertexStride = vertexStride;
22175     size_t count = 0;
22176     size_t* countPtr = &count;
22177     {
22178         uint64_t cgen_var_0;
22179         *countPtr += 1 * 8;
22180         *countPtr += sizeof(uint32_t);
22181         *countPtr += sizeof(uint32_t);
22182         uint64_t cgen_var_1;
22183         *countPtr += 1 * 8;
22184         *countPtr += sizeof(VkDeviceSize);
22185         *countPtr += sizeof(uint32_t);
22186         *countPtr += sizeof(uint32_t);
22187     }
22188     uint32_t packetSize_vkCmdDrawIndirectByteCountEXT = 4 + 4 + count;
22189     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdDrawIndirectByteCountEXT -= 8;
22190     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdDrawIndirectByteCountEXT);
22191     uint8_t* packetBeginPtr = streamPtr;
22192     uint8_t** streamPtrPtr = &streamPtr;
22193     uint32_t opcode_vkCmdDrawIndirectByteCountEXT = OP_vkCmdDrawIndirectByteCountEXT;
22194     memcpy(streamPtr, &opcode_vkCmdDrawIndirectByteCountEXT, sizeof(uint32_t));
22195     streamPtr += sizeof(uint32_t);
22196     memcpy(streamPtr, &packetSize_vkCmdDrawIndirectByteCountEXT, sizeof(uint32_t));
22197     streamPtr += sizeof(uint32_t);
22198     if (!queueSubmitWithCommandsEnabled) {
22199         uint64_t cgen_var_0;
22200         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22201         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22202         *streamPtrPtr += 1 * 8;
22203     }
22204     memcpy(*streamPtrPtr, (uint32_t*)&local_instanceCount, sizeof(uint32_t));
22205     *streamPtrPtr += sizeof(uint32_t);
22206     memcpy(*streamPtrPtr, (uint32_t*)&local_firstInstance, sizeof(uint32_t));
22207     *streamPtrPtr += sizeof(uint32_t);
22208     uint64_t cgen_var_0;
22209     *&cgen_var_0 = get_host_u64_VkBuffer((*&local_counterBuffer));
22210     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22211     *streamPtrPtr += 1 * 8;
22212     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_counterBufferOffset, sizeof(VkDeviceSize));
22213     *streamPtrPtr += sizeof(VkDeviceSize);
22214     memcpy(*streamPtrPtr, (uint32_t*)&local_counterOffset, sizeof(uint32_t));
22215     *streamPtrPtr += sizeof(uint32_t);
22216     memcpy(*streamPtrPtr, (uint32_t*)&local_vertexStride, sizeof(uint32_t));
22217     *streamPtrPtr += sizeof(uint32_t);
22218     ++encodeCount;
22219     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22220         pool->freeAll();
22221         stream->clearPool();
22222     }
22223     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22224 }
22225 
22226 #endif
22227 #ifdef VK_EXT_image_drm_format_modifier
vkGetImageDrmFormatModifierPropertiesEXT(VkDevice device,VkImage image,VkImageDrmFormatModifierPropertiesEXT * pProperties,uint32_t doLock)22228 VkResult VkEncoder::vkGetImageDrmFormatModifierPropertiesEXT(
22229     VkDevice device, VkImage image, VkImageDrmFormatModifierPropertiesEXT* pProperties,
22230     uint32_t doLock) {
22231     (void)doLock;
22232     bool queueSubmitWithCommandsEnabled =
22233         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22234     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22235     auto stream = mImpl->stream();
22236     auto pool = mImpl->pool();
22237     VkDevice local_device;
22238     VkImage local_image;
22239     local_device = device;
22240     local_image = image;
22241     size_t count = 0;
22242     size_t* countPtr = &count;
22243     {
22244         uint64_t cgen_var_0;
22245         *countPtr += 1 * 8;
22246         uint64_t cgen_var_1;
22247         *countPtr += 1 * 8;
22248         count_VkImageDrmFormatModifierPropertiesEXT(
22249             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
22250             (VkImageDrmFormatModifierPropertiesEXT*)(pProperties), countPtr);
22251     }
22252     uint32_t packetSize_vkGetImageDrmFormatModifierPropertiesEXT =
22253         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
22254     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageDrmFormatModifierPropertiesEXT);
22255     uint8_t* packetBeginPtr = streamPtr;
22256     uint8_t** streamPtrPtr = &streamPtr;
22257     uint32_t opcode_vkGetImageDrmFormatModifierPropertiesEXT =
22258         OP_vkGetImageDrmFormatModifierPropertiesEXT;
22259     uint32_t seqno;
22260     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
22261     memcpy(streamPtr, &opcode_vkGetImageDrmFormatModifierPropertiesEXT, sizeof(uint32_t));
22262     streamPtr += sizeof(uint32_t);
22263     memcpy(streamPtr, &packetSize_vkGetImageDrmFormatModifierPropertiesEXT, sizeof(uint32_t));
22264     streamPtr += sizeof(uint32_t);
22265     if (queueSubmitWithCommandsEnabled) {
22266         memcpy(streamPtr, &seqno, sizeof(uint32_t));
22267         streamPtr += sizeof(uint32_t);
22268     }
22269     uint64_t cgen_var_0;
22270     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
22271     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22272     *streamPtrPtr += 1 * 8;
22273     uint64_t cgen_var_1;
22274     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
22275     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
22276     *streamPtrPtr += 1 * 8;
22277     reservedmarshal_VkImageDrmFormatModifierPropertiesEXT(
22278         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties),
22279         streamPtrPtr);
22280     unmarshal_VkImageDrmFormatModifierPropertiesEXT(
22281         stream, VK_STRUCTURE_TYPE_MAX_ENUM, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties));
22282     if (pProperties) {
22283         transform_fromhost_VkImageDrmFormatModifierPropertiesEXT(
22284             sResourceTracker, (VkImageDrmFormatModifierPropertiesEXT*)(pProperties));
22285     }
22286     VkResult vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return = (VkResult)0;
22287     stream->read(&vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return, sizeof(VkResult));
22288     ++encodeCount;
22289     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22290         pool->freeAll();
22291         stream->clearPool();
22292     }
22293     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22294     return vkGetImageDrmFormatModifierPropertiesEXT_VkResult_return;
22295 }
22296 
22297 #endif
22298 #ifdef VK_EXT_tooling_info
vkGetPhysicalDeviceToolPropertiesEXT(VkPhysicalDevice physicalDevice,uint32_t * pToolCount,VkPhysicalDeviceToolProperties * pToolProperties,uint32_t doLock)22299 VkResult VkEncoder::vkGetPhysicalDeviceToolPropertiesEXT(
22300     VkPhysicalDevice physicalDevice, uint32_t* pToolCount,
22301     VkPhysicalDeviceToolProperties* pToolProperties, uint32_t doLock) {
22302     (void)doLock;
22303     bool queueSubmitWithCommandsEnabled =
22304         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22305     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22306     auto stream = mImpl->stream();
22307     auto pool = mImpl->pool();
22308     VkPhysicalDevice local_physicalDevice;
22309     local_physicalDevice = physicalDevice;
22310     size_t count = 0;
22311     size_t* countPtr = &count;
22312     {
22313         uint64_t cgen_var_0;
22314         *countPtr += 1 * 8;
22315         // WARNING PTR CHECK
22316         *countPtr += 8;
22317         if (pToolCount) {
22318             *countPtr += sizeof(uint32_t);
22319         }
22320         // WARNING PTR CHECK
22321         *countPtr += 8;
22322         if (pToolProperties) {
22323             if (pToolCount) {
22324                 for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
22325                     count_VkPhysicalDeviceToolProperties(
22326                         sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
22327                         (VkPhysicalDeviceToolProperties*)(pToolProperties + i), countPtr);
22328                 }
22329             }
22330         }
22331     }
22332     uint32_t packetSize_vkGetPhysicalDeviceToolPropertiesEXT =
22333         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
22334     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPhysicalDeviceToolPropertiesEXT);
22335     uint8_t* packetBeginPtr = streamPtr;
22336     uint8_t** streamPtrPtr = &streamPtr;
22337     uint32_t opcode_vkGetPhysicalDeviceToolPropertiesEXT = OP_vkGetPhysicalDeviceToolPropertiesEXT;
22338     uint32_t seqno;
22339     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
22340     memcpy(streamPtr, &opcode_vkGetPhysicalDeviceToolPropertiesEXT, sizeof(uint32_t));
22341     streamPtr += sizeof(uint32_t);
22342     memcpy(streamPtr, &packetSize_vkGetPhysicalDeviceToolPropertiesEXT, sizeof(uint32_t));
22343     streamPtr += sizeof(uint32_t);
22344     if (queueSubmitWithCommandsEnabled) {
22345         memcpy(streamPtr, &seqno, sizeof(uint32_t));
22346         streamPtr += sizeof(uint32_t);
22347     }
22348     uint64_t cgen_var_0;
22349     *&cgen_var_0 = get_host_u64_VkPhysicalDevice((*&local_physicalDevice));
22350     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22351     *streamPtrPtr += 1 * 8;
22352     // WARNING PTR CHECK
22353     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)pToolCount;
22354     memcpy((*streamPtrPtr), &cgen_var_1, 8);
22355     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
22356     *streamPtrPtr += 8;
22357     if (pToolCount) {
22358         memcpy(*streamPtrPtr, (uint32_t*)pToolCount, sizeof(uint32_t));
22359         *streamPtrPtr += sizeof(uint32_t);
22360     }
22361     // WARNING PTR CHECK
22362     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pToolProperties;
22363     memcpy((*streamPtrPtr), &cgen_var_2, 8);
22364     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
22365     *streamPtrPtr += 8;
22366     if (pToolProperties) {
22367         for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
22368             reservedmarshal_VkPhysicalDeviceToolProperties(
22369                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
22370                 (VkPhysicalDeviceToolProperties*)(pToolProperties + i), streamPtrPtr);
22371         }
22372     }
22373     // WARNING PTR CHECK
22374     uint32_t* check_pToolCount;
22375     check_pToolCount = (uint32_t*)(uintptr_t)stream->getBe64();
22376     if (pToolCount) {
22377         if (!(check_pToolCount)) {
22378             fprintf(stderr, "fatal: pToolCount inconsistent between guest and host\n");
22379         }
22380         stream->read((uint32_t*)pToolCount, sizeof(uint32_t));
22381     }
22382     // WARNING PTR CHECK
22383     VkPhysicalDeviceToolProperties* check_pToolProperties;
22384     check_pToolProperties = (VkPhysicalDeviceToolProperties*)(uintptr_t)stream->getBe64();
22385     if (pToolProperties) {
22386         if (!(check_pToolProperties)) {
22387             fprintf(stderr, "fatal: pToolProperties inconsistent between guest and host\n");
22388         }
22389         if (pToolCount) {
22390             for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
22391                 unmarshal_VkPhysicalDeviceToolProperties(
22392                     stream, VK_STRUCTURE_TYPE_MAX_ENUM,
22393                     (VkPhysicalDeviceToolProperties*)(pToolProperties + i));
22394             }
22395         }
22396     }
22397     if (pToolCount) {
22398         if (pToolProperties) {
22399             for (uint32_t i = 0; i < (uint32_t)(*(pToolCount)); ++i) {
22400                 transform_fromhost_VkPhysicalDeviceToolProperties(
22401                     sResourceTracker, (VkPhysicalDeviceToolProperties*)(pToolProperties + i));
22402             }
22403         }
22404     }
22405     VkResult vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return = (VkResult)0;
22406     stream->read(&vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return, sizeof(VkResult));
22407     ++encodeCount;
22408     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22409         pool->freeAll();
22410         stream->clearPool();
22411     }
22412     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22413     return vkGetPhysicalDeviceToolPropertiesEXT_VkResult_return;
22414 }
22415 
22416 #endif
22417 #ifdef VK_EXT_line_rasterization
vkCmdSetLineStippleEXT(VkCommandBuffer commandBuffer,uint32_t lineStippleFactor,uint16_t lineStipplePattern,uint32_t doLock)22418 void VkEncoder::vkCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
22419                                        uint16_t lineStipplePattern, uint32_t doLock) {
22420     (void)doLock;
22421     bool queueSubmitWithCommandsEnabled =
22422         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22423     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22424     auto stream = mImpl->stream();
22425     auto pool = mImpl->pool();
22426     VkCommandBuffer local_commandBuffer;
22427     uint32_t local_lineStippleFactor;
22428     uint16_t local_lineStipplePattern;
22429     local_commandBuffer = commandBuffer;
22430     local_lineStippleFactor = lineStippleFactor;
22431     local_lineStipplePattern = lineStipplePattern;
22432     size_t count = 0;
22433     size_t* countPtr = &count;
22434     {
22435         uint64_t cgen_var_0;
22436         *countPtr += 1 * 8;
22437         *countPtr += sizeof(uint32_t);
22438         *countPtr += sizeof(uint16_t);
22439     }
22440     uint32_t packetSize_vkCmdSetLineStippleEXT = 4 + 4 + count;
22441     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetLineStippleEXT -= 8;
22442     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetLineStippleEXT);
22443     uint8_t* packetBeginPtr = streamPtr;
22444     uint8_t** streamPtrPtr = &streamPtr;
22445     uint32_t opcode_vkCmdSetLineStippleEXT = OP_vkCmdSetLineStippleEXT;
22446     memcpy(streamPtr, &opcode_vkCmdSetLineStippleEXT, sizeof(uint32_t));
22447     streamPtr += sizeof(uint32_t);
22448     memcpy(streamPtr, &packetSize_vkCmdSetLineStippleEXT, sizeof(uint32_t));
22449     streamPtr += sizeof(uint32_t);
22450     if (!queueSubmitWithCommandsEnabled) {
22451         uint64_t cgen_var_0;
22452         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22453         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22454         *streamPtrPtr += 1 * 8;
22455     }
22456     memcpy(*streamPtrPtr, (uint32_t*)&local_lineStippleFactor, sizeof(uint32_t));
22457     *streamPtrPtr += sizeof(uint32_t);
22458     memcpy(*streamPtrPtr, (uint16_t*)&local_lineStipplePattern, sizeof(uint16_t));
22459     *streamPtrPtr += sizeof(uint16_t);
22460     ++encodeCount;
22461     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22462         pool->freeAll();
22463         stream->clearPool();
22464     }
22465     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22466 }
22467 
22468 #endif
22469 #ifdef VK_EXT_extended_dynamic_state
vkCmdSetCullModeEXT(VkCommandBuffer commandBuffer,VkCullModeFlags cullMode,uint32_t doLock)22470 void VkEncoder::vkCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode,
22471                                     uint32_t doLock) {
22472     (void)doLock;
22473     bool queueSubmitWithCommandsEnabled =
22474         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22475     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22476     auto stream = mImpl->stream();
22477     auto pool = mImpl->pool();
22478     VkCommandBuffer local_commandBuffer;
22479     VkCullModeFlags local_cullMode;
22480     local_commandBuffer = commandBuffer;
22481     local_cullMode = cullMode;
22482     size_t count = 0;
22483     size_t* countPtr = &count;
22484     {
22485         uint64_t cgen_var_0;
22486         *countPtr += 1 * 8;
22487         *countPtr += sizeof(VkCullModeFlags);
22488     }
22489     uint32_t packetSize_vkCmdSetCullModeEXT = 4 + 4 + count;
22490     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetCullModeEXT -= 8;
22491     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetCullModeEXT);
22492     uint8_t* packetBeginPtr = streamPtr;
22493     uint8_t** streamPtrPtr = &streamPtr;
22494     uint32_t opcode_vkCmdSetCullModeEXT = OP_vkCmdSetCullModeEXT;
22495     memcpy(streamPtr, &opcode_vkCmdSetCullModeEXT, sizeof(uint32_t));
22496     streamPtr += sizeof(uint32_t);
22497     memcpy(streamPtr, &packetSize_vkCmdSetCullModeEXT, sizeof(uint32_t));
22498     streamPtr += sizeof(uint32_t);
22499     if (!queueSubmitWithCommandsEnabled) {
22500         uint64_t cgen_var_0;
22501         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22502         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22503         *streamPtrPtr += 1 * 8;
22504     }
22505     memcpy(*streamPtrPtr, (VkCullModeFlags*)&local_cullMode, sizeof(VkCullModeFlags));
22506     *streamPtrPtr += sizeof(VkCullModeFlags);
22507     ++encodeCount;
22508     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22509         pool->freeAll();
22510         stream->clearPool();
22511     }
22512     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22513 }
22514 
vkCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer,VkFrontFace frontFace,uint32_t doLock)22515 void VkEncoder::vkCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace,
22516                                      uint32_t doLock) {
22517     (void)doLock;
22518     bool queueSubmitWithCommandsEnabled =
22519         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22520     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22521     auto stream = mImpl->stream();
22522     auto pool = mImpl->pool();
22523     VkCommandBuffer local_commandBuffer;
22524     VkFrontFace local_frontFace;
22525     local_commandBuffer = commandBuffer;
22526     local_frontFace = frontFace;
22527     size_t count = 0;
22528     size_t* countPtr = &count;
22529     {
22530         uint64_t cgen_var_0;
22531         *countPtr += 1 * 8;
22532         *countPtr += sizeof(VkFrontFace);
22533     }
22534     uint32_t packetSize_vkCmdSetFrontFaceEXT = 4 + 4 + count;
22535     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetFrontFaceEXT -= 8;
22536     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetFrontFaceEXT);
22537     uint8_t* packetBeginPtr = streamPtr;
22538     uint8_t** streamPtrPtr = &streamPtr;
22539     uint32_t opcode_vkCmdSetFrontFaceEXT = OP_vkCmdSetFrontFaceEXT;
22540     memcpy(streamPtr, &opcode_vkCmdSetFrontFaceEXT, sizeof(uint32_t));
22541     streamPtr += sizeof(uint32_t);
22542     memcpy(streamPtr, &packetSize_vkCmdSetFrontFaceEXT, sizeof(uint32_t));
22543     streamPtr += sizeof(uint32_t);
22544     if (!queueSubmitWithCommandsEnabled) {
22545         uint64_t cgen_var_0;
22546         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22547         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22548         *streamPtrPtr += 1 * 8;
22549     }
22550     memcpy(*streamPtrPtr, (VkFrontFace*)&local_frontFace, sizeof(VkFrontFace));
22551     *streamPtrPtr += sizeof(VkFrontFace);
22552     ++encodeCount;
22553     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22554         pool->freeAll();
22555         stream->clearPool();
22556     }
22557     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22558 }
22559 
vkCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,VkPrimitiveTopology primitiveTopology,uint32_t doLock)22560 void VkEncoder::vkCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
22561                                              VkPrimitiveTopology primitiveTopology,
22562                                              uint32_t doLock) {
22563     (void)doLock;
22564     bool queueSubmitWithCommandsEnabled =
22565         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22566     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22567     auto stream = mImpl->stream();
22568     auto pool = mImpl->pool();
22569     VkCommandBuffer local_commandBuffer;
22570     VkPrimitiveTopology local_primitiveTopology;
22571     local_commandBuffer = commandBuffer;
22572     local_primitiveTopology = primitiveTopology;
22573     size_t count = 0;
22574     size_t* countPtr = &count;
22575     {
22576         uint64_t cgen_var_0;
22577         *countPtr += 1 * 8;
22578         *countPtr += sizeof(VkPrimitiveTopology);
22579     }
22580     uint32_t packetSize_vkCmdSetPrimitiveTopologyEXT = 4 + 4 + count;
22581     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetPrimitiveTopologyEXT -= 8;
22582     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetPrimitiveTopologyEXT);
22583     uint8_t* packetBeginPtr = streamPtr;
22584     uint8_t** streamPtrPtr = &streamPtr;
22585     uint32_t opcode_vkCmdSetPrimitiveTopologyEXT = OP_vkCmdSetPrimitiveTopologyEXT;
22586     memcpy(streamPtr, &opcode_vkCmdSetPrimitiveTopologyEXT, sizeof(uint32_t));
22587     streamPtr += sizeof(uint32_t);
22588     memcpy(streamPtr, &packetSize_vkCmdSetPrimitiveTopologyEXT, sizeof(uint32_t));
22589     streamPtr += sizeof(uint32_t);
22590     if (!queueSubmitWithCommandsEnabled) {
22591         uint64_t cgen_var_0;
22592         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22593         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22594         *streamPtrPtr += 1 * 8;
22595     }
22596     memcpy(*streamPtrPtr, (VkPrimitiveTopology*)&local_primitiveTopology,
22597            sizeof(VkPrimitiveTopology));
22598     *streamPtrPtr += sizeof(VkPrimitiveTopology);
22599     ++encodeCount;
22600     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22601         pool->freeAll();
22602         stream->clearPool();
22603     }
22604     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22605 }
22606 
vkCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer,uint32_t viewportCount,const VkViewport * pViewports,uint32_t doLock)22607 void VkEncoder::vkCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
22608                                              const VkViewport* pViewports, uint32_t doLock) {
22609     (void)doLock;
22610     bool queueSubmitWithCommandsEnabled =
22611         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22612     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22613     auto stream = mImpl->stream();
22614     auto pool = mImpl->pool();
22615     VkCommandBuffer local_commandBuffer;
22616     uint32_t local_viewportCount;
22617     VkViewport* local_pViewports;
22618     local_commandBuffer = commandBuffer;
22619     local_viewportCount = viewportCount;
22620     local_pViewports = nullptr;
22621     if (pViewports) {
22622         local_pViewports = (VkViewport*)pool->alloc(((viewportCount)) * sizeof(const VkViewport));
22623         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
22624             deepcopy_VkViewport(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pViewports + i,
22625                                 (VkViewport*)(local_pViewports + i));
22626         }
22627     }
22628     if (local_pViewports) {
22629         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
22630             transform_tohost_VkViewport(sResourceTracker, (VkViewport*)(local_pViewports + i));
22631         }
22632     }
22633     size_t count = 0;
22634     size_t* countPtr = &count;
22635     {
22636         uint64_t cgen_var_0;
22637         *countPtr += 1 * 8;
22638         *countPtr += sizeof(uint32_t);
22639         for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
22640             count_VkViewport(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
22641                              (VkViewport*)(local_pViewports + i), countPtr);
22642         }
22643     }
22644     uint32_t packetSize_vkCmdSetViewportWithCountEXT = 4 + 4 + count;
22645     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetViewportWithCountEXT -= 8;
22646     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetViewportWithCountEXT);
22647     uint8_t* packetBeginPtr = streamPtr;
22648     uint8_t** streamPtrPtr = &streamPtr;
22649     uint32_t opcode_vkCmdSetViewportWithCountEXT = OP_vkCmdSetViewportWithCountEXT;
22650     memcpy(streamPtr, &opcode_vkCmdSetViewportWithCountEXT, sizeof(uint32_t));
22651     streamPtr += sizeof(uint32_t);
22652     memcpy(streamPtr, &packetSize_vkCmdSetViewportWithCountEXT, sizeof(uint32_t));
22653     streamPtr += sizeof(uint32_t);
22654     if (!queueSubmitWithCommandsEnabled) {
22655         uint64_t cgen_var_0;
22656         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22657         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22658         *streamPtrPtr += 1 * 8;
22659     }
22660     memcpy(*streamPtrPtr, (uint32_t*)&local_viewportCount, sizeof(uint32_t));
22661     *streamPtrPtr += sizeof(uint32_t);
22662     for (uint32_t i = 0; i < (uint32_t)((viewportCount)); ++i) {
22663         reservedmarshal_VkViewport(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
22664                                    (VkViewport*)(local_pViewports + i), streamPtrPtr);
22665     }
22666     ++encodeCount;
22667     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22668         pool->freeAll();
22669         stream->clearPool();
22670     }
22671     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22672 }
22673 
vkCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer,uint32_t scissorCount,const VkRect2D * pScissors,uint32_t doLock)22674 void VkEncoder::vkCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
22675                                             const VkRect2D* pScissors, uint32_t doLock) {
22676     (void)doLock;
22677     bool queueSubmitWithCommandsEnabled =
22678         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22679     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22680     auto stream = mImpl->stream();
22681     auto pool = mImpl->pool();
22682     VkCommandBuffer local_commandBuffer;
22683     uint32_t local_scissorCount;
22684     VkRect2D* local_pScissors;
22685     local_commandBuffer = commandBuffer;
22686     local_scissorCount = scissorCount;
22687     local_pScissors = nullptr;
22688     if (pScissors) {
22689         local_pScissors = (VkRect2D*)pool->alloc(((scissorCount)) * sizeof(const VkRect2D));
22690         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
22691             deepcopy_VkRect2D(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pScissors + i,
22692                               (VkRect2D*)(local_pScissors + i));
22693         }
22694     }
22695     if (local_pScissors) {
22696         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
22697             transform_tohost_VkRect2D(sResourceTracker, (VkRect2D*)(local_pScissors + i));
22698         }
22699     }
22700     size_t count = 0;
22701     size_t* countPtr = &count;
22702     {
22703         uint64_t cgen_var_0;
22704         *countPtr += 1 * 8;
22705         *countPtr += sizeof(uint32_t);
22706         for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
22707             count_VkRect2D(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
22708                            (VkRect2D*)(local_pScissors + i), countPtr);
22709         }
22710     }
22711     uint32_t packetSize_vkCmdSetScissorWithCountEXT = 4 + 4 + count;
22712     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetScissorWithCountEXT -= 8;
22713     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetScissorWithCountEXT);
22714     uint8_t* packetBeginPtr = streamPtr;
22715     uint8_t** streamPtrPtr = &streamPtr;
22716     uint32_t opcode_vkCmdSetScissorWithCountEXT = OP_vkCmdSetScissorWithCountEXT;
22717     memcpy(streamPtr, &opcode_vkCmdSetScissorWithCountEXT, sizeof(uint32_t));
22718     streamPtr += sizeof(uint32_t);
22719     memcpy(streamPtr, &packetSize_vkCmdSetScissorWithCountEXT, sizeof(uint32_t));
22720     streamPtr += sizeof(uint32_t);
22721     if (!queueSubmitWithCommandsEnabled) {
22722         uint64_t cgen_var_0;
22723         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22724         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22725         *streamPtrPtr += 1 * 8;
22726     }
22727     memcpy(*streamPtrPtr, (uint32_t*)&local_scissorCount, sizeof(uint32_t));
22728     *streamPtrPtr += sizeof(uint32_t);
22729     for (uint32_t i = 0; i < (uint32_t)((scissorCount)); ++i) {
22730         reservedmarshal_VkRect2D(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
22731                                  (VkRect2D*)(local_pScissors + i), streamPtrPtr);
22732     }
22733     ++encodeCount;
22734     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22735         pool->freeAll();
22736         stream->clearPool();
22737     }
22738     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22739 }
22740 
vkCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer,uint32_t firstBinding,uint32_t bindingCount,const VkBuffer * pBuffers,const VkDeviceSize * pOffsets,const VkDeviceSize * pSizes,const VkDeviceSize * pStrides,uint32_t doLock)22741 void VkEncoder::vkCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
22742                                            uint32_t bindingCount, const VkBuffer* pBuffers,
22743                                            const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes,
22744                                            const VkDeviceSize* pStrides, uint32_t doLock) {
22745     (void)doLock;
22746     bool queueSubmitWithCommandsEnabled =
22747         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22748     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22749     auto stream = mImpl->stream();
22750     auto pool = mImpl->pool();
22751     VkCommandBuffer local_commandBuffer;
22752     uint32_t local_firstBinding;
22753     uint32_t local_bindingCount;
22754     VkBuffer* local_pBuffers;
22755     VkDeviceSize* local_pOffsets;
22756     VkDeviceSize* local_pSizes;
22757     VkDeviceSize* local_pStrides;
22758     local_commandBuffer = commandBuffer;
22759     local_firstBinding = firstBinding;
22760     local_bindingCount = bindingCount;
22761     // Avoiding deepcopy for pBuffers
22762     local_pBuffers = (VkBuffer*)pBuffers;
22763     // Avoiding deepcopy for pOffsets
22764     local_pOffsets = (VkDeviceSize*)pOffsets;
22765     // Avoiding deepcopy for pSizes
22766     local_pSizes = (VkDeviceSize*)pSizes;
22767     // Avoiding deepcopy for pStrides
22768     local_pStrides = (VkDeviceSize*)pStrides;
22769     size_t count = 0;
22770     size_t* countPtr = &count;
22771     {
22772         uint64_t cgen_var_0;
22773         *countPtr += 1 * 8;
22774         *countPtr += sizeof(uint32_t);
22775         *countPtr += sizeof(uint32_t);
22776         // WARNING PTR CHECK
22777         *countPtr += 8;
22778         if (local_pBuffers) {
22779             if (((bindingCount))) {
22780                 *countPtr += ((bindingCount)) * 8;
22781             }
22782         }
22783         *countPtr += ((bindingCount)) * sizeof(VkDeviceSize);
22784         // WARNING PTR CHECK
22785         *countPtr += 8;
22786         if (local_pSizes) {
22787             *countPtr += ((bindingCount)) * sizeof(VkDeviceSize);
22788         }
22789         // WARNING PTR CHECK
22790         *countPtr += 8;
22791         if (local_pStrides) {
22792             *countPtr += ((bindingCount)) * sizeof(VkDeviceSize);
22793         }
22794     }
22795     uint32_t packetSize_vkCmdBindVertexBuffers2EXT = 4 + 4 + count;
22796     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdBindVertexBuffers2EXT -= 8;
22797     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdBindVertexBuffers2EXT);
22798     uint8_t* packetBeginPtr = streamPtr;
22799     uint8_t** streamPtrPtr = &streamPtr;
22800     uint32_t opcode_vkCmdBindVertexBuffers2EXT = OP_vkCmdBindVertexBuffers2EXT;
22801     memcpy(streamPtr, &opcode_vkCmdBindVertexBuffers2EXT, sizeof(uint32_t));
22802     streamPtr += sizeof(uint32_t);
22803     memcpy(streamPtr, &packetSize_vkCmdBindVertexBuffers2EXT, sizeof(uint32_t));
22804     streamPtr += sizeof(uint32_t);
22805     if (!queueSubmitWithCommandsEnabled) {
22806         uint64_t cgen_var_0;
22807         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22808         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22809         *streamPtrPtr += 1 * 8;
22810     }
22811     memcpy(*streamPtrPtr, (uint32_t*)&local_firstBinding, sizeof(uint32_t));
22812     *streamPtrPtr += sizeof(uint32_t);
22813     memcpy(*streamPtrPtr, (uint32_t*)&local_bindingCount, sizeof(uint32_t));
22814     *streamPtrPtr += sizeof(uint32_t);
22815     // WARNING PTR CHECK
22816     uint64_t cgen_var_0 = (uint64_t)(uintptr_t)local_pBuffers;
22817     memcpy((*streamPtrPtr), &cgen_var_0, 8);
22818     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
22819     *streamPtrPtr += 8;
22820     if (local_pBuffers) {
22821         if (((bindingCount))) {
22822             uint8_t* cgen_var_0_0_ptr = (uint8_t*)(*streamPtrPtr);
22823             for (uint32_t k = 0; k < ((bindingCount)); ++k) {
22824                 uint64_t tmpval = get_host_u64_VkBuffer(local_pBuffers[k]);
22825                 memcpy(cgen_var_0_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
22826             }
22827             *streamPtrPtr += 8 * ((bindingCount));
22828         }
22829     }
22830     memcpy(*streamPtrPtr, (VkDeviceSize*)local_pOffsets, ((bindingCount)) * sizeof(VkDeviceSize));
22831     *streamPtrPtr += ((bindingCount)) * sizeof(VkDeviceSize);
22832     // WARNING PTR CHECK
22833     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pSizes;
22834     memcpy((*streamPtrPtr), &cgen_var_1, 8);
22835     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
22836     *streamPtrPtr += 8;
22837     if (local_pSizes) {
22838         memcpy(*streamPtrPtr, (VkDeviceSize*)local_pSizes, ((bindingCount)) * sizeof(VkDeviceSize));
22839         *streamPtrPtr += ((bindingCount)) * sizeof(VkDeviceSize);
22840     }
22841     // WARNING PTR CHECK
22842     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pStrides;
22843     memcpy((*streamPtrPtr), &cgen_var_2, 8);
22844     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
22845     *streamPtrPtr += 8;
22846     if (local_pStrides) {
22847         memcpy(*streamPtrPtr, (VkDeviceSize*)local_pStrides,
22848                ((bindingCount)) * sizeof(VkDeviceSize));
22849         *streamPtrPtr += ((bindingCount)) * sizeof(VkDeviceSize);
22850     }
22851     ++encodeCount;
22852     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22853         pool->freeAll();
22854         stream->clearPool();
22855     }
22856     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22857 }
22858 
vkCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer,VkBool32 depthTestEnable,uint32_t doLock)22859 void VkEncoder::vkCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable,
22860                                            uint32_t doLock) {
22861     (void)doLock;
22862     bool queueSubmitWithCommandsEnabled =
22863         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22864     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22865     auto stream = mImpl->stream();
22866     auto pool = mImpl->pool();
22867     VkCommandBuffer local_commandBuffer;
22868     VkBool32 local_depthTestEnable;
22869     local_commandBuffer = commandBuffer;
22870     local_depthTestEnable = depthTestEnable;
22871     size_t count = 0;
22872     size_t* countPtr = &count;
22873     {
22874         uint64_t cgen_var_0;
22875         *countPtr += 1 * 8;
22876         *countPtr += sizeof(VkBool32);
22877     }
22878     uint32_t packetSize_vkCmdSetDepthTestEnableEXT = 4 + 4 + count;
22879     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthTestEnableEXT -= 8;
22880     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthTestEnableEXT);
22881     uint8_t* packetBeginPtr = streamPtr;
22882     uint8_t** streamPtrPtr = &streamPtr;
22883     uint32_t opcode_vkCmdSetDepthTestEnableEXT = OP_vkCmdSetDepthTestEnableEXT;
22884     memcpy(streamPtr, &opcode_vkCmdSetDepthTestEnableEXT, sizeof(uint32_t));
22885     streamPtr += sizeof(uint32_t);
22886     memcpy(streamPtr, &packetSize_vkCmdSetDepthTestEnableEXT, sizeof(uint32_t));
22887     streamPtr += sizeof(uint32_t);
22888     if (!queueSubmitWithCommandsEnabled) {
22889         uint64_t cgen_var_0;
22890         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22891         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22892         *streamPtrPtr += 1 * 8;
22893     }
22894     memcpy(*streamPtrPtr, (VkBool32*)&local_depthTestEnable, sizeof(VkBool32));
22895     *streamPtrPtr += sizeof(VkBool32);
22896     ++encodeCount;
22897     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22898         pool->freeAll();
22899         stream->clearPool();
22900     }
22901     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22902 }
22903 
vkCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer,VkBool32 depthWriteEnable,uint32_t doLock)22904 void VkEncoder::vkCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer,
22905                                             VkBool32 depthWriteEnable, uint32_t doLock) {
22906     (void)doLock;
22907     bool queueSubmitWithCommandsEnabled =
22908         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22909     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22910     auto stream = mImpl->stream();
22911     auto pool = mImpl->pool();
22912     VkCommandBuffer local_commandBuffer;
22913     VkBool32 local_depthWriteEnable;
22914     local_commandBuffer = commandBuffer;
22915     local_depthWriteEnable = depthWriteEnable;
22916     size_t count = 0;
22917     size_t* countPtr = &count;
22918     {
22919         uint64_t cgen_var_0;
22920         *countPtr += 1 * 8;
22921         *countPtr += sizeof(VkBool32);
22922     }
22923     uint32_t packetSize_vkCmdSetDepthWriteEnableEXT = 4 + 4 + count;
22924     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthWriteEnableEXT -= 8;
22925     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthWriteEnableEXT);
22926     uint8_t* packetBeginPtr = streamPtr;
22927     uint8_t** streamPtrPtr = &streamPtr;
22928     uint32_t opcode_vkCmdSetDepthWriteEnableEXT = OP_vkCmdSetDepthWriteEnableEXT;
22929     memcpy(streamPtr, &opcode_vkCmdSetDepthWriteEnableEXT, sizeof(uint32_t));
22930     streamPtr += sizeof(uint32_t);
22931     memcpy(streamPtr, &packetSize_vkCmdSetDepthWriteEnableEXT, sizeof(uint32_t));
22932     streamPtr += sizeof(uint32_t);
22933     if (!queueSubmitWithCommandsEnabled) {
22934         uint64_t cgen_var_0;
22935         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22936         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22937         *streamPtrPtr += 1 * 8;
22938     }
22939     memcpy(*streamPtrPtr, (VkBool32*)&local_depthWriteEnable, sizeof(VkBool32));
22940     *streamPtrPtr += sizeof(VkBool32);
22941     ++encodeCount;
22942     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22943         pool->freeAll();
22944         stream->clearPool();
22945     }
22946     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22947 }
22948 
vkCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer,VkCompareOp depthCompareOp,uint32_t doLock)22949 void VkEncoder::vkCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp,
22950                                           uint32_t doLock) {
22951     (void)doLock;
22952     bool queueSubmitWithCommandsEnabled =
22953         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22954     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
22955     auto stream = mImpl->stream();
22956     auto pool = mImpl->pool();
22957     VkCommandBuffer local_commandBuffer;
22958     VkCompareOp local_depthCompareOp;
22959     local_commandBuffer = commandBuffer;
22960     local_depthCompareOp = depthCompareOp;
22961     size_t count = 0;
22962     size_t* countPtr = &count;
22963     {
22964         uint64_t cgen_var_0;
22965         *countPtr += 1 * 8;
22966         *countPtr += sizeof(VkCompareOp);
22967     }
22968     uint32_t packetSize_vkCmdSetDepthCompareOpEXT = 4 + 4 + count;
22969     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthCompareOpEXT -= 8;
22970     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthCompareOpEXT);
22971     uint8_t* packetBeginPtr = streamPtr;
22972     uint8_t** streamPtrPtr = &streamPtr;
22973     uint32_t opcode_vkCmdSetDepthCompareOpEXT = OP_vkCmdSetDepthCompareOpEXT;
22974     memcpy(streamPtr, &opcode_vkCmdSetDepthCompareOpEXT, sizeof(uint32_t));
22975     streamPtr += sizeof(uint32_t);
22976     memcpy(streamPtr, &packetSize_vkCmdSetDepthCompareOpEXT, sizeof(uint32_t));
22977     streamPtr += sizeof(uint32_t);
22978     if (!queueSubmitWithCommandsEnabled) {
22979         uint64_t cgen_var_0;
22980         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
22981         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
22982         *streamPtrPtr += 1 * 8;
22983     }
22984     memcpy(*streamPtrPtr, (VkCompareOp*)&local_depthCompareOp, sizeof(VkCompareOp));
22985     *streamPtrPtr += sizeof(VkCompareOp);
22986     ++encodeCount;
22987     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
22988         pool->freeAll();
22989         stream->clearPool();
22990     }
22991     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
22992 }
22993 
vkCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,VkBool32 depthBoundsTestEnable,uint32_t doLock)22994 void VkEncoder::vkCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
22995                                                  VkBool32 depthBoundsTestEnable, uint32_t doLock) {
22996     (void)doLock;
22997     bool queueSubmitWithCommandsEnabled =
22998         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
22999     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23000     auto stream = mImpl->stream();
23001     auto pool = mImpl->pool();
23002     VkCommandBuffer local_commandBuffer;
23003     VkBool32 local_depthBoundsTestEnable;
23004     local_commandBuffer = commandBuffer;
23005     local_depthBoundsTestEnable = depthBoundsTestEnable;
23006     size_t count = 0;
23007     size_t* countPtr = &count;
23008     {
23009         uint64_t cgen_var_0;
23010         *countPtr += 1 * 8;
23011         *countPtr += sizeof(VkBool32);
23012     }
23013     uint32_t packetSize_vkCmdSetDepthBoundsTestEnableEXT = 4 + 4 + count;
23014     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthBoundsTestEnableEXT -= 8;
23015     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthBoundsTestEnableEXT);
23016     uint8_t* packetBeginPtr = streamPtr;
23017     uint8_t** streamPtrPtr = &streamPtr;
23018     uint32_t opcode_vkCmdSetDepthBoundsTestEnableEXT = OP_vkCmdSetDepthBoundsTestEnableEXT;
23019     memcpy(streamPtr, &opcode_vkCmdSetDepthBoundsTestEnableEXT, sizeof(uint32_t));
23020     streamPtr += sizeof(uint32_t);
23021     memcpy(streamPtr, &packetSize_vkCmdSetDepthBoundsTestEnableEXT, sizeof(uint32_t));
23022     streamPtr += sizeof(uint32_t);
23023     if (!queueSubmitWithCommandsEnabled) {
23024         uint64_t cgen_var_0;
23025         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
23026         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23027         *streamPtrPtr += 1 * 8;
23028     }
23029     memcpy(*streamPtrPtr, (VkBool32*)&local_depthBoundsTestEnable, sizeof(VkBool32));
23030     *streamPtrPtr += sizeof(VkBool32);
23031     ++encodeCount;
23032     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23033         pool->freeAll();
23034         stream->clearPool();
23035     }
23036     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23037 }
23038 
vkCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer,VkBool32 stencilTestEnable,uint32_t doLock)23039 void VkEncoder::vkCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer,
23040                                              VkBool32 stencilTestEnable, uint32_t doLock) {
23041     (void)doLock;
23042     bool queueSubmitWithCommandsEnabled =
23043         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23044     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23045     auto stream = mImpl->stream();
23046     auto pool = mImpl->pool();
23047     VkCommandBuffer local_commandBuffer;
23048     VkBool32 local_stencilTestEnable;
23049     local_commandBuffer = commandBuffer;
23050     local_stencilTestEnable = stencilTestEnable;
23051     size_t count = 0;
23052     size_t* countPtr = &count;
23053     {
23054         uint64_t cgen_var_0;
23055         *countPtr += 1 * 8;
23056         *countPtr += sizeof(VkBool32);
23057     }
23058     uint32_t packetSize_vkCmdSetStencilTestEnableEXT = 4 + 4 + count;
23059     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetStencilTestEnableEXT -= 8;
23060     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetStencilTestEnableEXT);
23061     uint8_t* packetBeginPtr = streamPtr;
23062     uint8_t** streamPtrPtr = &streamPtr;
23063     uint32_t opcode_vkCmdSetStencilTestEnableEXT = OP_vkCmdSetStencilTestEnableEXT;
23064     memcpy(streamPtr, &opcode_vkCmdSetStencilTestEnableEXT, sizeof(uint32_t));
23065     streamPtr += sizeof(uint32_t);
23066     memcpy(streamPtr, &packetSize_vkCmdSetStencilTestEnableEXT, sizeof(uint32_t));
23067     streamPtr += sizeof(uint32_t);
23068     if (!queueSubmitWithCommandsEnabled) {
23069         uint64_t cgen_var_0;
23070         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
23071         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23072         *streamPtrPtr += 1 * 8;
23073     }
23074     memcpy(*streamPtrPtr, (VkBool32*)&local_stencilTestEnable, sizeof(VkBool32));
23075     *streamPtrPtr += sizeof(VkBool32);
23076     ++encodeCount;
23077     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23078         pool->freeAll();
23079         stream->clearPool();
23080     }
23081     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23082 }
23083 
vkCmdSetStencilOpEXT(VkCommandBuffer commandBuffer,VkStencilFaceFlags faceMask,VkStencilOp failOp,VkStencilOp passOp,VkStencilOp depthFailOp,VkCompareOp compareOp,uint32_t doLock)23084 void VkEncoder::vkCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
23085                                      VkStencilOp failOp, VkStencilOp passOp,
23086                                      VkStencilOp depthFailOp, VkCompareOp compareOp,
23087                                      uint32_t doLock) {
23088     (void)doLock;
23089     bool queueSubmitWithCommandsEnabled =
23090         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23091     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23092     auto stream = mImpl->stream();
23093     auto pool = mImpl->pool();
23094     VkCommandBuffer local_commandBuffer;
23095     VkStencilFaceFlags local_faceMask;
23096     VkStencilOp local_failOp;
23097     VkStencilOp local_passOp;
23098     VkStencilOp local_depthFailOp;
23099     VkCompareOp local_compareOp;
23100     local_commandBuffer = commandBuffer;
23101     local_faceMask = faceMask;
23102     local_failOp = failOp;
23103     local_passOp = passOp;
23104     local_depthFailOp = depthFailOp;
23105     local_compareOp = compareOp;
23106     size_t count = 0;
23107     size_t* countPtr = &count;
23108     {
23109         uint64_t cgen_var_0;
23110         *countPtr += 1 * 8;
23111         *countPtr += sizeof(VkStencilFaceFlags);
23112         *countPtr += sizeof(VkStencilOp);
23113         *countPtr += sizeof(VkStencilOp);
23114         *countPtr += sizeof(VkStencilOp);
23115         *countPtr += sizeof(VkCompareOp);
23116     }
23117     uint32_t packetSize_vkCmdSetStencilOpEXT = 4 + 4 + count;
23118     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetStencilOpEXT -= 8;
23119     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetStencilOpEXT);
23120     uint8_t* packetBeginPtr = streamPtr;
23121     uint8_t** streamPtrPtr = &streamPtr;
23122     uint32_t opcode_vkCmdSetStencilOpEXT = OP_vkCmdSetStencilOpEXT;
23123     memcpy(streamPtr, &opcode_vkCmdSetStencilOpEXT, sizeof(uint32_t));
23124     streamPtr += sizeof(uint32_t);
23125     memcpy(streamPtr, &packetSize_vkCmdSetStencilOpEXT, sizeof(uint32_t));
23126     streamPtr += sizeof(uint32_t);
23127     if (!queueSubmitWithCommandsEnabled) {
23128         uint64_t cgen_var_0;
23129         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
23130         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23131         *streamPtrPtr += 1 * 8;
23132     }
23133     memcpy(*streamPtrPtr, (VkStencilFaceFlags*)&local_faceMask, sizeof(VkStencilFaceFlags));
23134     *streamPtrPtr += sizeof(VkStencilFaceFlags);
23135     memcpy(*streamPtrPtr, (VkStencilOp*)&local_failOp, sizeof(VkStencilOp));
23136     *streamPtrPtr += sizeof(VkStencilOp);
23137     memcpy(*streamPtrPtr, (VkStencilOp*)&local_passOp, sizeof(VkStencilOp));
23138     *streamPtrPtr += sizeof(VkStencilOp);
23139     memcpy(*streamPtrPtr, (VkStencilOp*)&local_depthFailOp, sizeof(VkStencilOp));
23140     *streamPtrPtr += sizeof(VkStencilOp);
23141     memcpy(*streamPtrPtr, (VkCompareOp*)&local_compareOp, sizeof(VkCompareOp));
23142     *streamPtrPtr += sizeof(VkCompareOp);
23143     ++encodeCount;
23144     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23145         pool->freeAll();
23146         stream->clearPool();
23147     }
23148     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23149 }
23150 
23151 #endif
23152 #ifdef VK_EXT_host_image_copy
vkCopyMemoryToImageEXT(VkDevice device,const VkCopyMemoryToImageInfoEXT * pCopyMemoryToImageInfo,uint32_t doLock)23153 VkResult VkEncoder::vkCopyMemoryToImageEXT(VkDevice device,
23154                                            const VkCopyMemoryToImageInfoEXT* pCopyMemoryToImageInfo,
23155                                            uint32_t doLock) {
23156     (void)doLock;
23157     bool queueSubmitWithCommandsEnabled =
23158         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23159     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23160     auto stream = mImpl->stream();
23161     auto pool = mImpl->pool();
23162     VkDevice local_device;
23163     VkCopyMemoryToImageInfoEXT* local_pCopyMemoryToImageInfo;
23164     local_device = device;
23165     local_pCopyMemoryToImageInfo = nullptr;
23166     if (pCopyMemoryToImageInfo) {
23167         local_pCopyMemoryToImageInfo =
23168             (VkCopyMemoryToImageInfoEXT*)pool->alloc(sizeof(const VkCopyMemoryToImageInfoEXT));
23169         deepcopy_VkCopyMemoryToImageInfoEXT(
23170             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyMemoryToImageInfo,
23171             (VkCopyMemoryToImageInfoEXT*)(local_pCopyMemoryToImageInfo));
23172     }
23173     if (local_pCopyMemoryToImageInfo) {
23174         transform_tohost_VkCopyMemoryToImageInfoEXT(
23175             sResourceTracker, (VkCopyMemoryToImageInfoEXT*)(local_pCopyMemoryToImageInfo));
23176     }
23177     size_t count = 0;
23178     size_t* countPtr = &count;
23179     {
23180         uint64_t cgen_var_0;
23181         *countPtr += 1 * 8;
23182         count_VkCopyMemoryToImageInfoEXT(
23183             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
23184             (VkCopyMemoryToImageInfoEXT*)(local_pCopyMemoryToImageInfo), countPtr);
23185     }
23186     uint32_t packetSize_vkCopyMemoryToImageEXT =
23187         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
23188     uint8_t* streamPtr = stream->reserve(packetSize_vkCopyMemoryToImageEXT);
23189     uint8_t* packetBeginPtr = streamPtr;
23190     uint8_t** streamPtrPtr = &streamPtr;
23191     uint32_t opcode_vkCopyMemoryToImageEXT = OP_vkCopyMemoryToImageEXT;
23192     uint32_t seqno;
23193     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
23194     memcpy(streamPtr, &opcode_vkCopyMemoryToImageEXT, sizeof(uint32_t));
23195     streamPtr += sizeof(uint32_t);
23196     memcpy(streamPtr, &packetSize_vkCopyMemoryToImageEXT, sizeof(uint32_t));
23197     streamPtr += sizeof(uint32_t);
23198     if (queueSubmitWithCommandsEnabled) {
23199         memcpy(streamPtr, &seqno, sizeof(uint32_t));
23200         streamPtr += sizeof(uint32_t);
23201     }
23202     uint64_t cgen_var_0;
23203     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
23204     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23205     *streamPtrPtr += 1 * 8;
23206     reservedmarshal_VkCopyMemoryToImageInfoEXT(
23207         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
23208         (VkCopyMemoryToImageInfoEXT*)(local_pCopyMemoryToImageInfo), streamPtrPtr);
23209     VkResult vkCopyMemoryToImageEXT_VkResult_return = (VkResult)0;
23210     stream->read(&vkCopyMemoryToImageEXT_VkResult_return, sizeof(VkResult));
23211     ++encodeCount;
23212     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23213         pool->freeAll();
23214         stream->clearPool();
23215     }
23216     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23217     return vkCopyMemoryToImageEXT_VkResult_return;
23218 }
23219 
vkCopyImageToMemoryEXT(VkDevice device,const VkCopyImageToMemoryInfoEXT * pCopyImageToMemoryInfo,uint32_t doLock)23220 VkResult VkEncoder::vkCopyImageToMemoryEXT(VkDevice device,
23221                                            const VkCopyImageToMemoryInfoEXT* pCopyImageToMemoryInfo,
23222                                            uint32_t doLock) {
23223     (void)doLock;
23224     bool queueSubmitWithCommandsEnabled =
23225         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23226     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23227     auto stream = mImpl->stream();
23228     auto pool = mImpl->pool();
23229     VkDevice local_device;
23230     VkCopyImageToMemoryInfoEXT* local_pCopyImageToMemoryInfo;
23231     local_device = device;
23232     local_pCopyImageToMemoryInfo = nullptr;
23233     if (pCopyImageToMemoryInfo) {
23234         local_pCopyImageToMemoryInfo =
23235             (VkCopyImageToMemoryInfoEXT*)pool->alloc(sizeof(const VkCopyImageToMemoryInfoEXT));
23236         deepcopy_VkCopyImageToMemoryInfoEXT(
23237             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyImageToMemoryInfo,
23238             (VkCopyImageToMemoryInfoEXT*)(local_pCopyImageToMemoryInfo));
23239     }
23240     if (local_pCopyImageToMemoryInfo) {
23241         transform_tohost_VkCopyImageToMemoryInfoEXT(
23242             sResourceTracker, (VkCopyImageToMemoryInfoEXT*)(local_pCopyImageToMemoryInfo));
23243     }
23244     size_t count = 0;
23245     size_t* countPtr = &count;
23246     {
23247         uint64_t cgen_var_0;
23248         *countPtr += 1 * 8;
23249         count_VkCopyImageToMemoryInfoEXT(
23250             sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
23251             (VkCopyImageToMemoryInfoEXT*)(local_pCopyImageToMemoryInfo), countPtr);
23252     }
23253     uint32_t packetSize_vkCopyImageToMemoryEXT =
23254         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
23255     uint8_t* streamPtr = stream->reserve(packetSize_vkCopyImageToMemoryEXT);
23256     uint8_t* packetBeginPtr = streamPtr;
23257     uint8_t** streamPtrPtr = &streamPtr;
23258     uint32_t opcode_vkCopyImageToMemoryEXT = OP_vkCopyImageToMemoryEXT;
23259     uint32_t seqno;
23260     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
23261     memcpy(streamPtr, &opcode_vkCopyImageToMemoryEXT, sizeof(uint32_t));
23262     streamPtr += sizeof(uint32_t);
23263     memcpy(streamPtr, &packetSize_vkCopyImageToMemoryEXT, sizeof(uint32_t));
23264     streamPtr += sizeof(uint32_t);
23265     if (queueSubmitWithCommandsEnabled) {
23266         memcpy(streamPtr, &seqno, sizeof(uint32_t));
23267         streamPtr += sizeof(uint32_t);
23268     }
23269     uint64_t cgen_var_0;
23270     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
23271     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23272     *streamPtrPtr += 1 * 8;
23273     reservedmarshal_VkCopyImageToMemoryInfoEXT(
23274         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
23275         (VkCopyImageToMemoryInfoEXT*)(local_pCopyImageToMemoryInfo), streamPtrPtr);
23276     VkResult vkCopyImageToMemoryEXT_VkResult_return = (VkResult)0;
23277     stream->read(&vkCopyImageToMemoryEXT_VkResult_return, sizeof(VkResult));
23278     ++encodeCount;
23279     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23280         pool->freeAll();
23281         stream->clearPool();
23282     }
23283     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23284     return vkCopyImageToMemoryEXT_VkResult_return;
23285 }
23286 
vkCopyImageToImageEXT(VkDevice device,const VkCopyImageToImageInfoEXT * pCopyImageToImageInfo,uint32_t doLock)23287 VkResult VkEncoder::vkCopyImageToImageEXT(VkDevice device,
23288                                           const VkCopyImageToImageInfoEXT* pCopyImageToImageInfo,
23289                                           uint32_t doLock) {
23290     (void)doLock;
23291     bool queueSubmitWithCommandsEnabled =
23292         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23293     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23294     auto stream = mImpl->stream();
23295     auto pool = mImpl->pool();
23296     VkDevice local_device;
23297     VkCopyImageToImageInfoEXT* local_pCopyImageToImageInfo;
23298     local_device = device;
23299     local_pCopyImageToImageInfo = nullptr;
23300     if (pCopyImageToImageInfo) {
23301         local_pCopyImageToImageInfo =
23302             (VkCopyImageToImageInfoEXT*)pool->alloc(sizeof(const VkCopyImageToImageInfoEXT));
23303         deepcopy_VkCopyImageToImageInfoEXT(
23304             pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCopyImageToImageInfo,
23305             (VkCopyImageToImageInfoEXT*)(local_pCopyImageToImageInfo));
23306     }
23307     if (local_pCopyImageToImageInfo) {
23308         transform_tohost_VkCopyImageToImageInfoEXT(
23309             sResourceTracker, (VkCopyImageToImageInfoEXT*)(local_pCopyImageToImageInfo));
23310     }
23311     size_t count = 0;
23312     size_t* countPtr = &count;
23313     {
23314         uint64_t cgen_var_0;
23315         *countPtr += 1 * 8;
23316         count_VkCopyImageToImageInfoEXT(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
23317                                         (VkCopyImageToImageInfoEXT*)(local_pCopyImageToImageInfo),
23318                                         countPtr);
23319     }
23320     uint32_t packetSize_vkCopyImageToImageEXT =
23321         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
23322     uint8_t* streamPtr = stream->reserve(packetSize_vkCopyImageToImageEXT);
23323     uint8_t* packetBeginPtr = streamPtr;
23324     uint8_t** streamPtrPtr = &streamPtr;
23325     uint32_t opcode_vkCopyImageToImageEXT = OP_vkCopyImageToImageEXT;
23326     uint32_t seqno;
23327     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
23328     memcpy(streamPtr, &opcode_vkCopyImageToImageEXT, sizeof(uint32_t));
23329     streamPtr += sizeof(uint32_t);
23330     memcpy(streamPtr, &packetSize_vkCopyImageToImageEXT, sizeof(uint32_t));
23331     streamPtr += sizeof(uint32_t);
23332     if (queueSubmitWithCommandsEnabled) {
23333         memcpy(streamPtr, &seqno, sizeof(uint32_t));
23334         streamPtr += sizeof(uint32_t);
23335     }
23336     uint64_t cgen_var_0;
23337     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
23338     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23339     *streamPtrPtr += 1 * 8;
23340     reservedmarshal_VkCopyImageToImageInfoEXT(
23341         stream, VK_STRUCTURE_TYPE_MAX_ENUM,
23342         (VkCopyImageToImageInfoEXT*)(local_pCopyImageToImageInfo), streamPtrPtr);
23343     VkResult vkCopyImageToImageEXT_VkResult_return = (VkResult)0;
23344     stream->read(&vkCopyImageToImageEXT_VkResult_return, sizeof(VkResult));
23345     ++encodeCount;
23346     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23347         pool->freeAll();
23348         stream->clearPool();
23349     }
23350     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23351     return vkCopyImageToImageEXT_VkResult_return;
23352 }
23353 
vkTransitionImageLayoutEXT(VkDevice device,uint32_t transitionCount,const VkHostImageLayoutTransitionInfoEXT * pTransitions,uint32_t doLock)23354 VkResult VkEncoder::vkTransitionImageLayoutEXT(
23355     VkDevice device, uint32_t transitionCount,
23356     const VkHostImageLayoutTransitionInfoEXT* pTransitions, uint32_t doLock) {
23357     (void)doLock;
23358     bool queueSubmitWithCommandsEnabled =
23359         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23360     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23361     auto stream = mImpl->stream();
23362     auto pool = mImpl->pool();
23363     VkDevice local_device;
23364     uint32_t local_transitionCount;
23365     VkHostImageLayoutTransitionInfoEXT* local_pTransitions;
23366     local_device = device;
23367     local_transitionCount = transitionCount;
23368     local_pTransitions = nullptr;
23369     if (pTransitions) {
23370         local_pTransitions = (VkHostImageLayoutTransitionInfoEXT*)pool->alloc(
23371             ((transitionCount)) * sizeof(const VkHostImageLayoutTransitionInfoEXT));
23372         for (uint32_t i = 0; i < (uint32_t)((transitionCount)); ++i) {
23373             deepcopy_VkHostImageLayoutTransitionInfoEXT(
23374                 pool, VK_STRUCTURE_TYPE_MAX_ENUM, pTransitions + i,
23375                 (VkHostImageLayoutTransitionInfoEXT*)(local_pTransitions + i));
23376         }
23377     }
23378     if (local_pTransitions) {
23379         for (uint32_t i = 0; i < (uint32_t)((transitionCount)); ++i) {
23380             transform_tohost_VkHostImageLayoutTransitionInfoEXT(
23381                 sResourceTracker, (VkHostImageLayoutTransitionInfoEXT*)(local_pTransitions + i));
23382         }
23383     }
23384     size_t count = 0;
23385     size_t* countPtr = &count;
23386     {
23387         uint64_t cgen_var_0;
23388         *countPtr += 1 * 8;
23389         *countPtr += sizeof(uint32_t);
23390         for (uint32_t i = 0; i < (uint32_t)((transitionCount)); ++i) {
23391             count_VkHostImageLayoutTransitionInfoEXT(
23392                 sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
23393                 (VkHostImageLayoutTransitionInfoEXT*)(local_pTransitions + i), countPtr);
23394         }
23395     }
23396     uint32_t packetSize_vkTransitionImageLayoutEXT =
23397         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
23398     uint8_t* streamPtr = stream->reserve(packetSize_vkTransitionImageLayoutEXT);
23399     uint8_t* packetBeginPtr = streamPtr;
23400     uint8_t** streamPtrPtr = &streamPtr;
23401     uint32_t opcode_vkTransitionImageLayoutEXT = OP_vkTransitionImageLayoutEXT;
23402     uint32_t seqno;
23403     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
23404     memcpy(streamPtr, &opcode_vkTransitionImageLayoutEXT, sizeof(uint32_t));
23405     streamPtr += sizeof(uint32_t);
23406     memcpy(streamPtr, &packetSize_vkTransitionImageLayoutEXT, sizeof(uint32_t));
23407     streamPtr += sizeof(uint32_t);
23408     if (queueSubmitWithCommandsEnabled) {
23409         memcpy(streamPtr, &seqno, sizeof(uint32_t));
23410         streamPtr += sizeof(uint32_t);
23411     }
23412     uint64_t cgen_var_0;
23413     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
23414     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23415     *streamPtrPtr += 1 * 8;
23416     memcpy(*streamPtrPtr, (uint32_t*)&local_transitionCount, sizeof(uint32_t));
23417     *streamPtrPtr += sizeof(uint32_t);
23418     for (uint32_t i = 0; i < (uint32_t)((transitionCount)); ++i) {
23419         reservedmarshal_VkHostImageLayoutTransitionInfoEXT(
23420             stream, VK_STRUCTURE_TYPE_MAX_ENUM,
23421             (VkHostImageLayoutTransitionInfoEXT*)(local_pTransitions + i), streamPtrPtr);
23422     }
23423     VkResult vkTransitionImageLayoutEXT_VkResult_return = (VkResult)0;
23424     stream->read(&vkTransitionImageLayoutEXT_VkResult_return, sizeof(VkResult));
23425     ++encodeCount;
23426     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23427         pool->freeAll();
23428         stream->clearPool();
23429     }
23430     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23431     return vkTransitionImageLayoutEXT_VkResult_return;
23432 }
23433 
vkGetImageSubresourceLayout2EXT(VkDevice device,VkImage image,const VkImageSubresource2KHR * pSubresource,VkSubresourceLayout2KHR * pLayout,uint32_t doLock)23434 void VkEncoder::vkGetImageSubresourceLayout2EXT(VkDevice device, VkImage image,
23435                                                 const VkImageSubresource2KHR* pSubresource,
23436                                                 VkSubresourceLayout2KHR* pLayout, uint32_t doLock) {
23437     (void)doLock;
23438     bool queueSubmitWithCommandsEnabled =
23439         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23440     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23441     auto stream = mImpl->stream();
23442     auto pool = mImpl->pool();
23443     VkDevice local_device;
23444     VkImage local_image;
23445     VkImageSubresource2KHR* local_pSubresource;
23446     local_device = device;
23447     local_image = image;
23448     local_pSubresource = nullptr;
23449     if (pSubresource) {
23450         local_pSubresource =
23451             (VkImageSubresource2KHR*)pool->alloc(sizeof(const VkImageSubresource2KHR));
23452         deepcopy_VkImageSubresource2KHR(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubresource,
23453                                         (VkImageSubresource2KHR*)(local_pSubresource));
23454     }
23455     if (local_pSubresource) {
23456         transform_tohost_VkImageSubresource2KHR(sResourceTracker,
23457                                                 (VkImageSubresource2KHR*)(local_pSubresource));
23458     }
23459     size_t count = 0;
23460     size_t* countPtr = &count;
23461     {
23462         uint64_t cgen_var_0;
23463         *countPtr += 1 * 8;
23464         uint64_t cgen_var_1;
23465         *countPtr += 1 * 8;
23466         count_VkImageSubresource2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
23467                                      (VkImageSubresource2KHR*)(local_pSubresource), countPtr);
23468         count_VkSubresourceLayout2KHR(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
23469                                       (VkSubresourceLayout2KHR*)(pLayout), countPtr);
23470     }
23471     uint32_t packetSize_vkGetImageSubresourceLayout2EXT =
23472         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
23473     uint8_t* streamPtr = stream->reserve(packetSize_vkGetImageSubresourceLayout2EXT);
23474     uint8_t* packetBeginPtr = streamPtr;
23475     uint8_t** streamPtrPtr = &streamPtr;
23476     uint32_t opcode_vkGetImageSubresourceLayout2EXT = OP_vkGetImageSubresourceLayout2EXT;
23477     uint32_t seqno;
23478     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
23479     memcpy(streamPtr, &opcode_vkGetImageSubresourceLayout2EXT, sizeof(uint32_t));
23480     streamPtr += sizeof(uint32_t);
23481     memcpy(streamPtr, &packetSize_vkGetImageSubresourceLayout2EXT, sizeof(uint32_t));
23482     streamPtr += sizeof(uint32_t);
23483     if (queueSubmitWithCommandsEnabled) {
23484         memcpy(streamPtr, &seqno, sizeof(uint32_t));
23485         streamPtr += sizeof(uint32_t);
23486     }
23487     uint64_t cgen_var_0;
23488     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
23489     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23490     *streamPtrPtr += 1 * 8;
23491     uint64_t cgen_var_1;
23492     *&cgen_var_1 = get_host_u64_VkImage((*&local_image));
23493     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
23494     *streamPtrPtr += 1 * 8;
23495     reservedmarshal_VkImageSubresource2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
23496                                            (VkImageSubresource2KHR*)(local_pSubresource),
23497                                            streamPtrPtr);
23498     reservedmarshal_VkSubresourceLayout2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
23499                                             (VkSubresourceLayout2KHR*)(pLayout), streamPtrPtr);
23500     unmarshal_VkSubresourceLayout2KHR(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
23501                                       (VkSubresourceLayout2KHR*)(pLayout));
23502     if (pLayout) {
23503         transform_fromhost_VkSubresourceLayout2KHR(sResourceTracker,
23504                                                    (VkSubresourceLayout2KHR*)(pLayout));
23505     }
23506     ++encodeCount;
23507     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23508         pool->freeAll();
23509         stream->clearPool();
23510     }
23511     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23512 }
23513 
23514 #endif
23515 #ifdef VK_EXT_private_data
vkCreatePrivateDataSlotEXT(VkDevice device,const VkPrivateDataSlotCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkPrivateDataSlot * pPrivateDataSlot,uint32_t doLock)23516 VkResult VkEncoder::vkCreatePrivateDataSlotEXT(VkDevice device,
23517                                                const VkPrivateDataSlotCreateInfo* pCreateInfo,
23518                                                const VkAllocationCallbacks* pAllocator,
23519                                                VkPrivateDataSlot* pPrivateDataSlot,
23520                                                uint32_t doLock) {
23521     (void)doLock;
23522     bool queueSubmitWithCommandsEnabled =
23523         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23524     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23525     auto stream = mImpl->stream();
23526     auto pool = mImpl->pool();
23527     VkDevice local_device;
23528     VkPrivateDataSlotCreateInfo* local_pCreateInfo;
23529     VkAllocationCallbacks* local_pAllocator;
23530     local_device = device;
23531     local_pCreateInfo = nullptr;
23532     if (pCreateInfo) {
23533         local_pCreateInfo =
23534             (VkPrivateDataSlotCreateInfo*)pool->alloc(sizeof(const VkPrivateDataSlotCreateInfo));
23535         deepcopy_VkPrivateDataSlotCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
23536                                              (VkPrivateDataSlotCreateInfo*)(local_pCreateInfo));
23537     }
23538     local_pAllocator = nullptr;
23539     if (pAllocator) {
23540         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
23541         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
23542                                        (VkAllocationCallbacks*)(local_pAllocator));
23543     }
23544     local_pAllocator = nullptr;
23545     if (local_pCreateInfo) {
23546         transform_tohost_VkPrivateDataSlotCreateInfo(
23547             sResourceTracker, (VkPrivateDataSlotCreateInfo*)(local_pCreateInfo));
23548     }
23549     if (local_pAllocator) {
23550         transform_tohost_VkAllocationCallbacks(sResourceTracker,
23551                                                (VkAllocationCallbacks*)(local_pAllocator));
23552     }
23553     size_t count = 0;
23554     size_t* countPtr = &count;
23555     {
23556         uint64_t cgen_var_0;
23557         *countPtr += 1 * 8;
23558         count_VkPrivateDataSlotCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
23559                                           (VkPrivateDataSlotCreateInfo*)(local_pCreateInfo),
23560                                           countPtr);
23561         // WARNING PTR CHECK
23562         *countPtr += 8;
23563         if (local_pAllocator) {
23564             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
23565                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
23566         }
23567         uint64_t cgen_var_1;
23568         *countPtr += 8;
23569     }
23570     uint32_t packetSize_vkCreatePrivateDataSlotEXT =
23571         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
23572     uint8_t* streamPtr = stream->reserve(packetSize_vkCreatePrivateDataSlotEXT);
23573     uint8_t* packetBeginPtr = streamPtr;
23574     uint8_t** streamPtrPtr = &streamPtr;
23575     uint32_t opcode_vkCreatePrivateDataSlotEXT = OP_vkCreatePrivateDataSlotEXT;
23576     uint32_t seqno;
23577     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
23578     memcpy(streamPtr, &opcode_vkCreatePrivateDataSlotEXT, sizeof(uint32_t));
23579     streamPtr += sizeof(uint32_t);
23580     memcpy(streamPtr, &packetSize_vkCreatePrivateDataSlotEXT, sizeof(uint32_t));
23581     streamPtr += sizeof(uint32_t);
23582     if (queueSubmitWithCommandsEnabled) {
23583         memcpy(streamPtr, &seqno, sizeof(uint32_t));
23584         streamPtr += sizeof(uint32_t);
23585     }
23586     uint64_t cgen_var_0;
23587     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
23588     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23589     *streamPtrPtr += 1 * 8;
23590     reservedmarshal_VkPrivateDataSlotCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
23591                                                 (VkPrivateDataSlotCreateInfo*)(local_pCreateInfo),
23592                                                 streamPtrPtr);
23593     // WARNING PTR CHECK
23594     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
23595     memcpy((*streamPtrPtr), &cgen_var_1, 8);
23596     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
23597     *streamPtrPtr += 8;
23598     if (local_pAllocator) {
23599         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
23600                                               (VkAllocationCallbacks*)(local_pAllocator),
23601                                               streamPtrPtr);
23602     }
23603     /* is handle, possibly out */;
23604     uint64_t cgen_var_2;
23605     *&cgen_var_2 = (uint64_t)((*pPrivateDataSlot));
23606     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
23607     *streamPtrPtr += 8;
23608     /* is handle, possibly out */;
23609     uint64_t cgen_var_3;
23610     stream->read((uint64_t*)&cgen_var_3, 8);
23611     stream->handleMapping()->mapHandles_u64_VkPrivateDataSlot(
23612         &cgen_var_3, (VkPrivateDataSlot*)pPrivateDataSlot, 1);
23613     VkResult vkCreatePrivateDataSlotEXT_VkResult_return = (VkResult)0;
23614     stream->read(&vkCreatePrivateDataSlotEXT_VkResult_return, sizeof(VkResult));
23615     ++encodeCount;
23616     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23617         pool->freeAll();
23618         stream->clearPool();
23619     }
23620     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23621     return vkCreatePrivateDataSlotEXT_VkResult_return;
23622 }
23623 
vkDestroyPrivateDataSlotEXT(VkDevice device,VkPrivateDataSlot privateDataSlot,const VkAllocationCallbacks * pAllocator,uint32_t doLock)23624 void VkEncoder::vkDestroyPrivateDataSlotEXT(VkDevice device, VkPrivateDataSlot privateDataSlot,
23625                                             const VkAllocationCallbacks* pAllocator,
23626                                             uint32_t doLock) {
23627     (void)doLock;
23628     bool queueSubmitWithCommandsEnabled =
23629         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23630     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23631     auto stream = mImpl->stream();
23632     auto pool = mImpl->pool();
23633     VkDevice local_device;
23634     VkPrivateDataSlot local_privateDataSlot;
23635     VkAllocationCallbacks* local_pAllocator;
23636     local_device = device;
23637     local_privateDataSlot = privateDataSlot;
23638     local_pAllocator = nullptr;
23639     if (pAllocator) {
23640         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
23641         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
23642                                        (VkAllocationCallbacks*)(local_pAllocator));
23643     }
23644     local_pAllocator = nullptr;
23645     if (local_pAllocator) {
23646         transform_tohost_VkAllocationCallbacks(sResourceTracker,
23647                                                (VkAllocationCallbacks*)(local_pAllocator));
23648     }
23649     size_t count = 0;
23650     size_t* countPtr = &count;
23651     {
23652         uint64_t cgen_var_0;
23653         *countPtr += 1 * 8;
23654         uint64_t cgen_var_1;
23655         *countPtr += 1 * 8;
23656         // WARNING PTR CHECK
23657         *countPtr += 8;
23658         if (local_pAllocator) {
23659             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
23660                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
23661         }
23662     }
23663     uint32_t packetSize_vkDestroyPrivateDataSlotEXT =
23664         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
23665     uint8_t* streamPtr = stream->reserve(packetSize_vkDestroyPrivateDataSlotEXT);
23666     uint8_t* packetBeginPtr = streamPtr;
23667     uint8_t** streamPtrPtr = &streamPtr;
23668     uint32_t opcode_vkDestroyPrivateDataSlotEXT = OP_vkDestroyPrivateDataSlotEXT;
23669     uint32_t seqno;
23670     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
23671     memcpy(streamPtr, &opcode_vkDestroyPrivateDataSlotEXT, sizeof(uint32_t));
23672     streamPtr += sizeof(uint32_t);
23673     memcpy(streamPtr, &packetSize_vkDestroyPrivateDataSlotEXT, sizeof(uint32_t));
23674     streamPtr += sizeof(uint32_t);
23675     if (queueSubmitWithCommandsEnabled) {
23676         memcpy(streamPtr, &seqno, sizeof(uint32_t));
23677         streamPtr += sizeof(uint32_t);
23678     }
23679     uint64_t cgen_var_0;
23680     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
23681     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23682     *streamPtrPtr += 1 * 8;
23683     uint64_t cgen_var_1;
23684     *&cgen_var_1 = get_host_u64_VkPrivateDataSlot((*&local_privateDataSlot));
23685     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
23686     *streamPtrPtr += 1 * 8;
23687     // WARNING PTR CHECK
23688     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
23689     memcpy((*streamPtrPtr), &cgen_var_2, 8);
23690     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
23691     *streamPtrPtr += 8;
23692     if (local_pAllocator) {
23693         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
23694                                               (VkAllocationCallbacks*)(local_pAllocator),
23695                                               streamPtrPtr);
23696     }
23697     stream->flush();
23698     ++encodeCount;
23699     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23700         pool->freeAll();
23701         stream->clearPool();
23702     }
23703     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23704 }
23705 
vkSetPrivateDataEXT(VkDevice device,VkObjectType objectType,uint64_t objectHandle,VkPrivateDataSlot privateDataSlot,uint64_t data,uint32_t doLock)23706 VkResult VkEncoder::vkSetPrivateDataEXT(VkDevice device, VkObjectType objectType,
23707                                         uint64_t objectHandle, VkPrivateDataSlot privateDataSlot,
23708                                         uint64_t data, uint32_t doLock) {
23709     (void)doLock;
23710     bool queueSubmitWithCommandsEnabled =
23711         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23712     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23713     auto stream = mImpl->stream();
23714     auto pool = mImpl->pool();
23715     VkDevice local_device;
23716     VkObjectType local_objectType;
23717     uint64_t local_objectHandle;
23718     VkPrivateDataSlot local_privateDataSlot;
23719     uint64_t local_data;
23720     local_device = device;
23721     local_objectType = objectType;
23722     local_objectHandle = objectHandle;
23723     local_privateDataSlot = privateDataSlot;
23724     local_data = data;
23725     size_t count = 0;
23726     size_t* countPtr = &count;
23727     {
23728         uint64_t cgen_var_0;
23729         *countPtr += 1 * 8;
23730         *countPtr += sizeof(VkObjectType);
23731         *countPtr += sizeof(uint64_t);
23732         uint64_t cgen_var_1;
23733         *countPtr += 1 * 8;
23734         *countPtr += sizeof(uint64_t);
23735     }
23736     uint32_t packetSize_vkSetPrivateDataEXT =
23737         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
23738     uint8_t* streamPtr = stream->reserve(packetSize_vkSetPrivateDataEXT);
23739     uint8_t* packetBeginPtr = streamPtr;
23740     uint8_t** streamPtrPtr = &streamPtr;
23741     uint32_t opcode_vkSetPrivateDataEXT = OP_vkSetPrivateDataEXT;
23742     uint32_t seqno;
23743     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
23744     memcpy(streamPtr, &opcode_vkSetPrivateDataEXT, sizeof(uint32_t));
23745     streamPtr += sizeof(uint32_t);
23746     memcpy(streamPtr, &packetSize_vkSetPrivateDataEXT, sizeof(uint32_t));
23747     streamPtr += sizeof(uint32_t);
23748     if (queueSubmitWithCommandsEnabled) {
23749         memcpy(streamPtr, &seqno, sizeof(uint32_t));
23750         streamPtr += sizeof(uint32_t);
23751     }
23752     uint64_t cgen_var_0;
23753     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
23754     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23755     *streamPtrPtr += 1 * 8;
23756     memcpy(*streamPtrPtr, (VkObjectType*)&local_objectType, sizeof(VkObjectType));
23757     *streamPtrPtr += sizeof(VkObjectType);
23758     memcpy(*streamPtrPtr, (uint64_t*)&local_objectHandle, sizeof(uint64_t));
23759     *streamPtrPtr += sizeof(uint64_t);
23760     uint64_t cgen_var_1;
23761     *&cgen_var_1 = get_host_u64_VkPrivateDataSlot((*&local_privateDataSlot));
23762     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
23763     *streamPtrPtr += 1 * 8;
23764     memcpy(*streamPtrPtr, (uint64_t*)&local_data, sizeof(uint64_t));
23765     *streamPtrPtr += sizeof(uint64_t);
23766     VkResult vkSetPrivateDataEXT_VkResult_return = (VkResult)0;
23767     stream->read(&vkSetPrivateDataEXT_VkResult_return, sizeof(VkResult));
23768     ++encodeCount;
23769     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23770         pool->freeAll();
23771         stream->clearPool();
23772     }
23773     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23774     return vkSetPrivateDataEXT_VkResult_return;
23775 }
23776 
vkGetPrivateDataEXT(VkDevice device,VkObjectType objectType,uint64_t objectHandle,VkPrivateDataSlot privateDataSlot,uint64_t * pData,uint32_t doLock)23777 void VkEncoder::vkGetPrivateDataEXT(VkDevice device, VkObjectType objectType, uint64_t objectHandle,
23778                                     VkPrivateDataSlot privateDataSlot, uint64_t* pData,
23779                                     uint32_t doLock) {
23780     (void)doLock;
23781     bool queueSubmitWithCommandsEnabled =
23782         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23783     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23784     auto stream = mImpl->stream();
23785     auto pool = mImpl->pool();
23786     VkDevice local_device;
23787     VkObjectType local_objectType;
23788     uint64_t local_objectHandle;
23789     VkPrivateDataSlot local_privateDataSlot;
23790     local_device = device;
23791     local_objectType = objectType;
23792     local_objectHandle = objectHandle;
23793     local_privateDataSlot = privateDataSlot;
23794     size_t count = 0;
23795     size_t* countPtr = &count;
23796     {
23797         uint64_t cgen_var_0;
23798         *countPtr += 1 * 8;
23799         *countPtr += sizeof(VkObjectType);
23800         *countPtr += sizeof(uint64_t);
23801         uint64_t cgen_var_1;
23802         *countPtr += 1 * 8;
23803         *countPtr += sizeof(uint64_t);
23804     }
23805     uint32_t packetSize_vkGetPrivateDataEXT =
23806         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
23807     uint8_t* streamPtr = stream->reserve(packetSize_vkGetPrivateDataEXT);
23808     uint8_t* packetBeginPtr = streamPtr;
23809     uint8_t** streamPtrPtr = &streamPtr;
23810     uint32_t opcode_vkGetPrivateDataEXT = OP_vkGetPrivateDataEXT;
23811     uint32_t seqno;
23812     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
23813     memcpy(streamPtr, &opcode_vkGetPrivateDataEXT, sizeof(uint32_t));
23814     streamPtr += sizeof(uint32_t);
23815     memcpy(streamPtr, &packetSize_vkGetPrivateDataEXT, sizeof(uint32_t));
23816     streamPtr += sizeof(uint32_t);
23817     if (queueSubmitWithCommandsEnabled) {
23818         memcpy(streamPtr, &seqno, sizeof(uint32_t));
23819         streamPtr += sizeof(uint32_t);
23820     }
23821     uint64_t cgen_var_0;
23822     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
23823     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23824     *streamPtrPtr += 1 * 8;
23825     memcpy(*streamPtrPtr, (VkObjectType*)&local_objectType, sizeof(VkObjectType));
23826     *streamPtrPtr += sizeof(VkObjectType);
23827     memcpy(*streamPtrPtr, (uint64_t*)&local_objectHandle, sizeof(uint64_t));
23828     *streamPtrPtr += sizeof(uint64_t);
23829     uint64_t cgen_var_1;
23830     *&cgen_var_1 = get_host_u64_VkPrivateDataSlot((*&local_privateDataSlot));
23831     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
23832     *streamPtrPtr += 1 * 8;
23833     memcpy(*streamPtrPtr, (uint64_t*)pData, sizeof(uint64_t));
23834     *streamPtrPtr += sizeof(uint64_t);
23835     stream->read((uint64_t*)pData, sizeof(uint64_t));
23836     ++encodeCount;
23837     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23838         pool->freeAll();
23839         stream->clearPool();
23840     }
23841     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23842 }
23843 
23844 #endif
23845 #ifdef VK_EXT_extended_dynamic_state2
vkCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer,uint32_t patchControlPoints,uint32_t doLock)23846 void VkEncoder::vkCmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer,
23847                                               uint32_t patchControlPoints, uint32_t doLock) {
23848     (void)doLock;
23849     bool queueSubmitWithCommandsEnabled =
23850         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23851     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23852     auto stream = mImpl->stream();
23853     auto pool = mImpl->pool();
23854     VkCommandBuffer local_commandBuffer;
23855     uint32_t local_patchControlPoints;
23856     local_commandBuffer = commandBuffer;
23857     local_patchControlPoints = patchControlPoints;
23858     size_t count = 0;
23859     size_t* countPtr = &count;
23860     {
23861         uint64_t cgen_var_0;
23862         *countPtr += 1 * 8;
23863         *countPtr += sizeof(uint32_t);
23864     }
23865     uint32_t packetSize_vkCmdSetPatchControlPointsEXT = 4 + 4 + count;
23866     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetPatchControlPointsEXT -= 8;
23867     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetPatchControlPointsEXT);
23868     uint8_t* packetBeginPtr = streamPtr;
23869     uint8_t** streamPtrPtr = &streamPtr;
23870     uint32_t opcode_vkCmdSetPatchControlPointsEXT = OP_vkCmdSetPatchControlPointsEXT;
23871     memcpy(streamPtr, &opcode_vkCmdSetPatchControlPointsEXT, sizeof(uint32_t));
23872     streamPtr += sizeof(uint32_t);
23873     memcpy(streamPtr, &packetSize_vkCmdSetPatchControlPointsEXT, sizeof(uint32_t));
23874     streamPtr += sizeof(uint32_t);
23875     if (!queueSubmitWithCommandsEnabled) {
23876         uint64_t cgen_var_0;
23877         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
23878         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23879         *streamPtrPtr += 1 * 8;
23880     }
23881     memcpy(*streamPtrPtr, (uint32_t*)&local_patchControlPoints, sizeof(uint32_t));
23882     *streamPtrPtr += sizeof(uint32_t);
23883     ++encodeCount;
23884     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23885         pool->freeAll();
23886         stream->clearPool();
23887     }
23888     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23889 }
23890 
vkCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,VkBool32 rasterizerDiscardEnable,uint32_t doLock)23891 void VkEncoder::vkCmdSetRasterizerDiscardEnableEXT(VkCommandBuffer commandBuffer,
23892                                                    VkBool32 rasterizerDiscardEnable,
23893                                                    uint32_t doLock) {
23894     (void)doLock;
23895     bool queueSubmitWithCommandsEnabled =
23896         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23897     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23898     auto stream = mImpl->stream();
23899     auto pool = mImpl->pool();
23900     VkCommandBuffer local_commandBuffer;
23901     VkBool32 local_rasterizerDiscardEnable;
23902     local_commandBuffer = commandBuffer;
23903     local_rasterizerDiscardEnable = rasterizerDiscardEnable;
23904     size_t count = 0;
23905     size_t* countPtr = &count;
23906     {
23907         uint64_t cgen_var_0;
23908         *countPtr += 1 * 8;
23909         *countPtr += sizeof(VkBool32);
23910     }
23911     uint32_t packetSize_vkCmdSetRasterizerDiscardEnableEXT = 4 + 4 + count;
23912     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetRasterizerDiscardEnableEXT -= 8;
23913     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetRasterizerDiscardEnableEXT);
23914     uint8_t* packetBeginPtr = streamPtr;
23915     uint8_t** streamPtrPtr = &streamPtr;
23916     uint32_t opcode_vkCmdSetRasterizerDiscardEnableEXT = OP_vkCmdSetRasterizerDiscardEnableEXT;
23917     memcpy(streamPtr, &opcode_vkCmdSetRasterizerDiscardEnableEXT, sizeof(uint32_t));
23918     streamPtr += sizeof(uint32_t);
23919     memcpy(streamPtr, &packetSize_vkCmdSetRasterizerDiscardEnableEXT, sizeof(uint32_t));
23920     streamPtr += sizeof(uint32_t);
23921     if (!queueSubmitWithCommandsEnabled) {
23922         uint64_t cgen_var_0;
23923         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
23924         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23925         *streamPtrPtr += 1 * 8;
23926     }
23927     memcpy(*streamPtrPtr, (VkBool32*)&local_rasterizerDiscardEnable, sizeof(VkBool32));
23928     *streamPtrPtr += sizeof(VkBool32);
23929     ++encodeCount;
23930     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23931         pool->freeAll();
23932         stream->clearPool();
23933     }
23934     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23935 }
23936 
vkCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer,VkBool32 depthBiasEnable,uint32_t doLock)23937 void VkEncoder::vkCmdSetDepthBiasEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable,
23938                                            uint32_t doLock) {
23939     (void)doLock;
23940     bool queueSubmitWithCommandsEnabled =
23941         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23942     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23943     auto stream = mImpl->stream();
23944     auto pool = mImpl->pool();
23945     VkCommandBuffer local_commandBuffer;
23946     VkBool32 local_depthBiasEnable;
23947     local_commandBuffer = commandBuffer;
23948     local_depthBiasEnable = depthBiasEnable;
23949     size_t count = 0;
23950     size_t* countPtr = &count;
23951     {
23952         uint64_t cgen_var_0;
23953         *countPtr += 1 * 8;
23954         *countPtr += sizeof(VkBool32);
23955     }
23956     uint32_t packetSize_vkCmdSetDepthBiasEnableEXT = 4 + 4 + count;
23957     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetDepthBiasEnableEXT -= 8;
23958     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetDepthBiasEnableEXT);
23959     uint8_t* packetBeginPtr = streamPtr;
23960     uint8_t** streamPtrPtr = &streamPtr;
23961     uint32_t opcode_vkCmdSetDepthBiasEnableEXT = OP_vkCmdSetDepthBiasEnableEXT;
23962     memcpy(streamPtr, &opcode_vkCmdSetDepthBiasEnableEXT, sizeof(uint32_t));
23963     streamPtr += sizeof(uint32_t);
23964     memcpy(streamPtr, &packetSize_vkCmdSetDepthBiasEnableEXT, sizeof(uint32_t));
23965     streamPtr += sizeof(uint32_t);
23966     if (!queueSubmitWithCommandsEnabled) {
23967         uint64_t cgen_var_0;
23968         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
23969         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
23970         *streamPtrPtr += 1 * 8;
23971     }
23972     memcpy(*streamPtrPtr, (VkBool32*)&local_depthBiasEnable, sizeof(VkBool32));
23973     *streamPtrPtr += sizeof(VkBool32);
23974     ++encodeCount;
23975     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
23976         pool->freeAll();
23977         stream->clearPool();
23978     }
23979     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
23980 }
23981 
vkCmdSetLogicOpEXT(VkCommandBuffer commandBuffer,VkLogicOp logicOp,uint32_t doLock)23982 void VkEncoder::vkCmdSetLogicOpEXT(VkCommandBuffer commandBuffer, VkLogicOp logicOp,
23983                                    uint32_t doLock) {
23984     (void)doLock;
23985     bool queueSubmitWithCommandsEnabled =
23986         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
23987     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
23988     auto stream = mImpl->stream();
23989     auto pool = mImpl->pool();
23990     VkCommandBuffer local_commandBuffer;
23991     VkLogicOp local_logicOp;
23992     local_commandBuffer = commandBuffer;
23993     local_logicOp = logicOp;
23994     size_t count = 0;
23995     size_t* countPtr = &count;
23996     {
23997         uint64_t cgen_var_0;
23998         *countPtr += 1 * 8;
23999         *countPtr += sizeof(VkLogicOp);
24000     }
24001     uint32_t packetSize_vkCmdSetLogicOpEXT = 4 + 4 + count;
24002     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetLogicOpEXT -= 8;
24003     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetLogicOpEXT);
24004     uint8_t* packetBeginPtr = streamPtr;
24005     uint8_t** streamPtrPtr = &streamPtr;
24006     uint32_t opcode_vkCmdSetLogicOpEXT = OP_vkCmdSetLogicOpEXT;
24007     memcpy(streamPtr, &opcode_vkCmdSetLogicOpEXT, sizeof(uint32_t));
24008     streamPtr += sizeof(uint32_t);
24009     memcpy(streamPtr, &packetSize_vkCmdSetLogicOpEXT, sizeof(uint32_t));
24010     streamPtr += sizeof(uint32_t);
24011     if (!queueSubmitWithCommandsEnabled) {
24012         uint64_t cgen_var_0;
24013         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
24014         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24015         *streamPtrPtr += 1 * 8;
24016     }
24017     memcpy(*streamPtrPtr, (VkLogicOp*)&local_logicOp, sizeof(VkLogicOp));
24018     *streamPtrPtr += sizeof(VkLogicOp);
24019     ++encodeCount;
24020     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24021         pool->freeAll();
24022         stream->clearPool();
24023     }
24024     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
24025 }
24026 
vkCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,VkBool32 primitiveRestartEnable,uint32_t doLock)24027 void VkEncoder::vkCmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer,
24028                                                   VkBool32 primitiveRestartEnable,
24029                                                   uint32_t doLock) {
24030     (void)doLock;
24031     bool queueSubmitWithCommandsEnabled =
24032         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
24033     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
24034     auto stream = mImpl->stream();
24035     auto pool = mImpl->pool();
24036     VkCommandBuffer local_commandBuffer;
24037     VkBool32 local_primitiveRestartEnable;
24038     local_commandBuffer = commandBuffer;
24039     local_primitiveRestartEnable = primitiveRestartEnable;
24040     size_t count = 0;
24041     size_t* countPtr = &count;
24042     {
24043         uint64_t cgen_var_0;
24044         *countPtr += 1 * 8;
24045         *countPtr += sizeof(VkBool32);
24046     }
24047     uint32_t packetSize_vkCmdSetPrimitiveRestartEnableEXT = 4 + 4 + count;
24048     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetPrimitiveRestartEnableEXT -= 8;
24049     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetPrimitiveRestartEnableEXT);
24050     uint8_t* packetBeginPtr = streamPtr;
24051     uint8_t** streamPtrPtr = &streamPtr;
24052     uint32_t opcode_vkCmdSetPrimitiveRestartEnableEXT = OP_vkCmdSetPrimitiveRestartEnableEXT;
24053     memcpy(streamPtr, &opcode_vkCmdSetPrimitiveRestartEnableEXT, sizeof(uint32_t));
24054     streamPtr += sizeof(uint32_t);
24055     memcpy(streamPtr, &packetSize_vkCmdSetPrimitiveRestartEnableEXT, sizeof(uint32_t));
24056     streamPtr += sizeof(uint32_t);
24057     if (!queueSubmitWithCommandsEnabled) {
24058         uint64_t cgen_var_0;
24059         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
24060         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24061         *streamPtrPtr += 1 * 8;
24062     }
24063     memcpy(*streamPtrPtr, (VkBool32*)&local_primitiveRestartEnable, sizeof(VkBool32));
24064     *streamPtrPtr += sizeof(VkBool32);
24065     ++encodeCount;
24066     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24067         pool->freeAll();
24068         stream->clearPool();
24069     }
24070     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
24071 }
24072 
24073 #endif
24074 #ifdef VK_EXT_color_write_enable
vkCmdSetColorWriteEnableEXT(VkCommandBuffer commandBuffer,uint32_t attachmentCount,const VkBool32 * pColorWriteEnables,uint32_t doLock)24075 void VkEncoder::vkCmdSetColorWriteEnableEXT(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
24076                                             const VkBool32* pColorWriteEnables, uint32_t doLock) {
24077     (void)doLock;
24078     bool queueSubmitWithCommandsEnabled =
24079         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
24080     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
24081     auto stream = mImpl->stream();
24082     auto pool = mImpl->pool();
24083     VkCommandBuffer local_commandBuffer;
24084     uint32_t local_attachmentCount;
24085     VkBool32* local_pColorWriteEnables;
24086     local_commandBuffer = commandBuffer;
24087     local_attachmentCount = attachmentCount;
24088     // Avoiding deepcopy for pColorWriteEnables
24089     local_pColorWriteEnables = (VkBool32*)pColorWriteEnables;
24090     size_t count = 0;
24091     size_t* countPtr = &count;
24092     {
24093         uint64_t cgen_var_0;
24094         *countPtr += 1 * 8;
24095         *countPtr += sizeof(uint32_t);
24096         *countPtr += ((attachmentCount)) * sizeof(VkBool32);
24097     }
24098     uint32_t packetSize_vkCmdSetColorWriteEnableEXT = 4 + 4 + count;
24099     if (queueSubmitWithCommandsEnabled) packetSize_vkCmdSetColorWriteEnableEXT -= 8;
24100     uint8_t* streamPtr = stream->reserve(packetSize_vkCmdSetColorWriteEnableEXT);
24101     uint8_t* packetBeginPtr = streamPtr;
24102     uint8_t** streamPtrPtr = &streamPtr;
24103     uint32_t opcode_vkCmdSetColorWriteEnableEXT = OP_vkCmdSetColorWriteEnableEXT;
24104     memcpy(streamPtr, &opcode_vkCmdSetColorWriteEnableEXT, sizeof(uint32_t));
24105     streamPtr += sizeof(uint32_t);
24106     memcpy(streamPtr, &packetSize_vkCmdSetColorWriteEnableEXT, sizeof(uint32_t));
24107     streamPtr += sizeof(uint32_t);
24108     if (!queueSubmitWithCommandsEnabled) {
24109         uint64_t cgen_var_0;
24110         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
24111         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24112         *streamPtrPtr += 1 * 8;
24113     }
24114     memcpy(*streamPtrPtr, (uint32_t*)&local_attachmentCount, sizeof(uint32_t));
24115     *streamPtrPtr += sizeof(uint32_t);
24116     memcpy(*streamPtrPtr, (VkBool32*)local_pColorWriteEnables,
24117            ((attachmentCount)) * sizeof(VkBool32));
24118     *streamPtrPtr += ((attachmentCount)) * sizeof(VkBool32);
24119     ++encodeCount;
24120     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24121         pool->freeAll();
24122         stream->clearPool();
24123     }
24124     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
24125 }
24126 
24127 #endif
24128 #ifdef VK_GOOGLE_gfxstream
vkMapMemoryIntoAddressSpaceGOOGLE(VkDevice device,VkDeviceMemory memory,uint64_t * pAddress,uint32_t doLock)24129 VkResult VkEncoder::vkMapMemoryIntoAddressSpaceGOOGLE(VkDevice device, VkDeviceMemory memory,
24130                                                       uint64_t* pAddress, uint32_t doLock) {
24131     (void)doLock;
24132     bool queueSubmitWithCommandsEnabled =
24133         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
24134     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
24135     sResourceTracker->on_vkMapMemoryIntoAddressSpaceGOOGLE_pre(this, VK_SUCCESS, device, memory,
24136                                                                pAddress);
24137     auto stream = mImpl->stream();
24138     auto pool = mImpl->pool();
24139     VkDevice local_device;
24140     VkDeviceMemory local_memory;
24141     local_device = device;
24142     local_memory = memory;
24143     sResourceTracker->deviceMemoryTransform_tohost(
24144         (VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
24145         (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
24146     size_t count = 0;
24147     size_t* countPtr = &count;
24148     {
24149         uint64_t cgen_var_0;
24150         *countPtr += 1 * 8;
24151         uint64_t cgen_var_1;
24152         *countPtr += 1 * 8;
24153         // WARNING PTR CHECK
24154         *countPtr += 8;
24155         if (pAddress) {
24156             *countPtr += sizeof(uint64_t);
24157         }
24158     }
24159     uint32_t packetSize_vkMapMemoryIntoAddressSpaceGOOGLE =
24160         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
24161     uint8_t* streamPtr = stream->reserve(packetSize_vkMapMemoryIntoAddressSpaceGOOGLE);
24162     uint8_t* packetBeginPtr = streamPtr;
24163     uint8_t** streamPtrPtr = &streamPtr;
24164     uint32_t opcode_vkMapMemoryIntoAddressSpaceGOOGLE = OP_vkMapMemoryIntoAddressSpaceGOOGLE;
24165     uint32_t seqno;
24166     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
24167     memcpy(streamPtr, &opcode_vkMapMemoryIntoAddressSpaceGOOGLE, sizeof(uint32_t));
24168     streamPtr += sizeof(uint32_t);
24169     memcpy(streamPtr, &packetSize_vkMapMemoryIntoAddressSpaceGOOGLE, sizeof(uint32_t));
24170     streamPtr += sizeof(uint32_t);
24171     if (queueSubmitWithCommandsEnabled) {
24172         memcpy(streamPtr, &seqno, sizeof(uint32_t));
24173         streamPtr += sizeof(uint32_t);
24174     }
24175     uint64_t cgen_var_0;
24176     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
24177     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24178     *streamPtrPtr += 1 * 8;
24179     uint64_t cgen_var_1;
24180     *&cgen_var_1 = get_host_u64_VkDeviceMemory((*&local_memory));
24181     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
24182     *streamPtrPtr += 1 * 8;
24183     // WARNING PTR CHECK
24184     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pAddress;
24185     memcpy((*streamPtrPtr), &cgen_var_2, 8);
24186     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24187     *streamPtrPtr += 8;
24188     if (pAddress) {
24189         memcpy(*streamPtrPtr, (uint64_t*)pAddress, sizeof(uint64_t));
24190         *streamPtrPtr += sizeof(uint64_t);
24191     }
24192     // WARNING PTR CHECK
24193     uint64_t* check_pAddress;
24194     check_pAddress = (uint64_t*)(uintptr_t)stream->getBe64();
24195     if (pAddress) {
24196         if (!(check_pAddress)) {
24197             fprintf(stderr, "fatal: pAddress inconsistent between guest and host\n");
24198         }
24199         stream->read((uint64_t*)pAddress, sizeof(uint64_t));
24200     }
24201     VkResult vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return = (VkResult)0;
24202     stream->read(&vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return, sizeof(VkResult));
24203     sResourceTracker->on_vkMapMemoryIntoAddressSpaceGOOGLE(
24204         this, vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return, device, memory, pAddress);
24205     ++encodeCount;
24206     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24207         pool->freeAll();
24208         stream->clearPool();
24209     }
24210     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
24211     return vkMapMemoryIntoAddressSpaceGOOGLE_VkResult_return;
24212 }
24213 
vkUpdateDescriptorSetWithTemplateSizedGOOGLE(VkDevice device,VkDescriptorSet descriptorSet,VkDescriptorUpdateTemplate descriptorUpdateTemplate,uint32_t imageInfoCount,uint32_t bufferInfoCount,uint32_t bufferViewCount,const uint32_t * pImageInfoEntryIndices,const uint32_t * pBufferInfoEntryIndices,const uint32_t * pBufferViewEntryIndices,const VkDescriptorImageInfo * pImageInfos,const VkDescriptorBufferInfo * pBufferInfos,const VkBufferView * pBufferViews,uint32_t doLock)24214 void VkEncoder::vkUpdateDescriptorSetWithTemplateSizedGOOGLE(
24215     VkDevice device, VkDescriptorSet descriptorSet,
24216     VkDescriptorUpdateTemplate descriptorUpdateTemplate, uint32_t imageInfoCount,
24217     uint32_t bufferInfoCount, uint32_t bufferViewCount, const uint32_t* pImageInfoEntryIndices,
24218     const uint32_t* pBufferInfoEntryIndices, const uint32_t* pBufferViewEntryIndices,
24219     const VkDescriptorImageInfo* pImageInfos, const VkDescriptorBufferInfo* pBufferInfos,
24220     const VkBufferView* pBufferViews, uint32_t doLock) {
24221     (void)doLock;
24222     bool queueSubmitWithCommandsEnabled =
24223         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
24224     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
24225     auto stream = mImpl->stream();
24226     auto pool = mImpl->pool();
24227     VkDevice local_device;
24228     VkDescriptorSet local_descriptorSet;
24229     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
24230     uint32_t local_imageInfoCount;
24231     uint32_t local_bufferInfoCount;
24232     uint32_t local_bufferViewCount;
24233     uint32_t* local_pImageInfoEntryIndices;
24234     uint32_t* local_pBufferInfoEntryIndices;
24235     uint32_t* local_pBufferViewEntryIndices;
24236     VkDescriptorImageInfo* local_pImageInfos;
24237     VkDescriptorBufferInfo* local_pBufferInfos;
24238     VkBufferView* local_pBufferViews;
24239     local_device = device;
24240     local_descriptorSet = descriptorSet;
24241     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
24242     local_imageInfoCount = imageInfoCount;
24243     local_bufferInfoCount = bufferInfoCount;
24244     local_bufferViewCount = bufferViewCount;
24245     // Avoiding deepcopy for pImageInfoEntryIndices
24246     local_pImageInfoEntryIndices = (uint32_t*)pImageInfoEntryIndices;
24247     // Avoiding deepcopy for pBufferInfoEntryIndices
24248     local_pBufferInfoEntryIndices = (uint32_t*)pBufferInfoEntryIndices;
24249     // Avoiding deepcopy for pBufferViewEntryIndices
24250     local_pBufferViewEntryIndices = (uint32_t*)pBufferViewEntryIndices;
24251     local_pImageInfos = nullptr;
24252     if (pImageInfos) {
24253         local_pImageInfos = (VkDescriptorImageInfo*)pool->alloc(
24254             ((imageInfoCount)) * sizeof(const VkDescriptorImageInfo));
24255         for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i) {
24256             deepcopy_VkDescriptorImageInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImageInfos + i,
24257                                            (VkDescriptorImageInfo*)(local_pImageInfos + i));
24258         }
24259     }
24260     local_pBufferInfos = nullptr;
24261     if (pBufferInfos) {
24262         local_pBufferInfos = (VkDescriptorBufferInfo*)pool->alloc(
24263             ((bufferInfoCount)) * sizeof(const VkDescriptorBufferInfo));
24264         for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i) {
24265             deepcopy_VkDescriptorBufferInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBufferInfos + i,
24266                                             (VkDescriptorBufferInfo*)(local_pBufferInfos + i));
24267         }
24268     }
24269     // Avoiding deepcopy for pBufferViews
24270     local_pBufferViews = (VkBufferView*)pBufferViews;
24271     if (local_pImageInfos) {
24272         for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i) {
24273             transform_tohost_VkDescriptorImageInfo(sResourceTracker,
24274                                                    (VkDescriptorImageInfo*)(local_pImageInfos + i));
24275         }
24276     }
24277     if (local_pBufferInfos) {
24278         for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i) {
24279             transform_tohost_VkDescriptorBufferInfo(
24280                 sResourceTracker, (VkDescriptorBufferInfo*)(local_pBufferInfos + i));
24281         }
24282     }
24283     size_t count = 0;
24284     size_t* countPtr = &count;
24285     {
24286         uint64_t cgen_var_0;
24287         *countPtr += 1 * 8;
24288         uint64_t cgen_var_1;
24289         *countPtr += 1 * 8;
24290         uint64_t cgen_var_2;
24291         *countPtr += 1 * 8;
24292         *countPtr += sizeof(uint32_t);
24293         *countPtr += sizeof(uint32_t);
24294         *countPtr += sizeof(uint32_t);
24295         // WARNING PTR CHECK
24296         *countPtr += 8;
24297         if (local_pImageInfoEntryIndices) {
24298             *countPtr += ((imageInfoCount)) * sizeof(uint32_t);
24299         }
24300         // WARNING PTR CHECK
24301         *countPtr += 8;
24302         if (local_pBufferInfoEntryIndices) {
24303             *countPtr += ((bufferInfoCount)) * sizeof(uint32_t);
24304         }
24305         // WARNING PTR CHECK
24306         *countPtr += 8;
24307         if (local_pBufferViewEntryIndices) {
24308             *countPtr += ((bufferViewCount)) * sizeof(uint32_t);
24309         }
24310         // WARNING PTR CHECK
24311         *countPtr += 8;
24312         if (local_pImageInfos) {
24313             for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i) {
24314                 count_VkDescriptorImageInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
24315                                             (VkDescriptorImageInfo*)(local_pImageInfos + i),
24316                                             countPtr);
24317             }
24318         }
24319         // WARNING PTR CHECK
24320         *countPtr += 8;
24321         if (local_pBufferInfos) {
24322             for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i) {
24323                 count_VkDescriptorBufferInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
24324                                              (VkDescriptorBufferInfo*)(local_pBufferInfos + i),
24325                                              countPtr);
24326             }
24327         }
24328         // WARNING PTR CHECK
24329         *countPtr += 8;
24330         if (local_pBufferViews) {
24331             if (((bufferViewCount))) {
24332                 *countPtr += ((bufferViewCount)) * 8;
24333             }
24334         }
24335     }
24336     uint32_t packetSize_vkUpdateDescriptorSetWithTemplateSizedGOOGLE =
24337         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
24338     uint8_t* streamPtr = stream->reserve(packetSize_vkUpdateDescriptorSetWithTemplateSizedGOOGLE);
24339     uint8_t* packetBeginPtr = streamPtr;
24340     uint8_t** streamPtrPtr = &streamPtr;
24341     uint32_t opcode_vkUpdateDescriptorSetWithTemplateSizedGOOGLE =
24342         OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE;
24343     uint32_t seqno;
24344     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
24345     memcpy(streamPtr, &opcode_vkUpdateDescriptorSetWithTemplateSizedGOOGLE, sizeof(uint32_t));
24346     streamPtr += sizeof(uint32_t);
24347     memcpy(streamPtr, &packetSize_vkUpdateDescriptorSetWithTemplateSizedGOOGLE, sizeof(uint32_t));
24348     streamPtr += sizeof(uint32_t);
24349     if (queueSubmitWithCommandsEnabled) {
24350         memcpy(streamPtr, &seqno, sizeof(uint32_t));
24351         streamPtr += sizeof(uint32_t);
24352     }
24353     uint64_t cgen_var_0;
24354     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
24355     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24356     *streamPtrPtr += 1 * 8;
24357     uint64_t cgen_var_1;
24358     *&cgen_var_1 = get_host_u64_VkDescriptorSet((*&local_descriptorSet));
24359     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
24360     *streamPtrPtr += 1 * 8;
24361     uint64_t cgen_var_2;
24362     *&cgen_var_2 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
24363     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
24364     *streamPtrPtr += 1 * 8;
24365     memcpy(*streamPtrPtr, (uint32_t*)&local_imageInfoCount, sizeof(uint32_t));
24366     *streamPtrPtr += sizeof(uint32_t);
24367     memcpy(*streamPtrPtr, (uint32_t*)&local_bufferInfoCount, sizeof(uint32_t));
24368     *streamPtrPtr += sizeof(uint32_t);
24369     memcpy(*streamPtrPtr, (uint32_t*)&local_bufferViewCount, sizeof(uint32_t));
24370     *streamPtrPtr += sizeof(uint32_t);
24371     // WARNING PTR CHECK
24372     uint64_t cgen_var_3 = (uint64_t)(uintptr_t)local_pImageInfoEntryIndices;
24373     memcpy((*streamPtrPtr), &cgen_var_3, 8);
24374     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24375     *streamPtrPtr += 8;
24376     if (local_pImageInfoEntryIndices) {
24377         memcpy(*streamPtrPtr, (uint32_t*)local_pImageInfoEntryIndices,
24378                ((imageInfoCount)) * sizeof(uint32_t));
24379         *streamPtrPtr += ((imageInfoCount)) * sizeof(uint32_t);
24380     }
24381     // WARNING PTR CHECK
24382     uint64_t cgen_var_4 = (uint64_t)(uintptr_t)local_pBufferInfoEntryIndices;
24383     memcpy((*streamPtrPtr), &cgen_var_4, 8);
24384     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24385     *streamPtrPtr += 8;
24386     if (local_pBufferInfoEntryIndices) {
24387         memcpy(*streamPtrPtr, (uint32_t*)local_pBufferInfoEntryIndices,
24388                ((bufferInfoCount)) * sizeof(uint32_t));
24389         *streamPtrPtr += ((bufferInfoCount)) * sizeof(uint32_t);
24390     }
24391     // WARNING PTR CHECK
24392     uint64_t cgen_var_5 = (uint64_t)(uintptr_t)local_pBufferViewEntryIndices;
24393     memcpy((*streamPtrPtr), &cgen_var_5, 8);
24394     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24395     *streamPtrPtr += 8;
24396     if (local_pBufferViewEntryIndices) {
24397         memcpy(*streamPtrPtr, (uint32_t*)local_pBufferViewEntryIndices,
24398                ((bufferViewCount)) * sizeof(uint32_t));
24399         *streamPtrPtr += ((bufferViewCount)) * sizeof(uint32_t);
24400     }
24401     // WARNING PTR CHECK
24402     uint64_t cgen_var_6 = (uint64_t)(uintptr_t)local_pImageInfos;
24403     memcpy((*streamPtrPtr), &cgen_var_6, 8);
24404     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24405     *streamPtrPtr += 8;
24406     if (local_pImageInfos) {
24407         for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i) {
24408             reservedmarshal_VkDescriptorImageInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
24409                                                   (VkDescriptorImageInfo*)(local_pImageInfos + i),
24410                                                   streamPtrPtr);
24411         }
24412     }
24413     // WARNING PTR CHECK
24414     uint64_t cgen_var_7 = (uint64_t)(uintptr_t)local_pBufferInfos;
24415     memcpy((*streamPtrPtr), &cgen_var_7, 8);
24416     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24417     *streamPtrPtr += 8;
24418     if (local_pBufferInfos) {
24419         for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i) {
24420             reservedmarshal_VkDescriptorBufferInfo(
24421                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
24422                 (VkDescriptorBufferInfo*)(local_pBufferInfos + i), streamPtrPtr);
24423         }
24424     }
24425     // WARNING PTR CHECK
24426     uint64_t cgen_var_8 = (uint64_t)(uintptr_t)local_pBufferViews;
24427     memcpy((*streamPtrPtr), &cgen_var_8, 8);
24428     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24429     *streamPtrPtr += 8;
24430     if (local_pBufferViews) {
24431         if (((bufferViewCount))) {
24432             uint8_t* cgen_var_8_0_ptr = (uint8_t*)(*streamPtrPtr);
24433             for (uint32_t k = 0; k < ((bufferViewCount)); ++k) {
24434                 uint64_t tmpval = get_host_u64_VkBufferView(local_pBufferViews[k]);
24435                 memcpy(cgen_var_8_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
24436             }
24437             *streamPtrPtr += 8 * ((bufferViewCount));
24438         }
24439     }
24440     stream->flush();
24441     ++encodeCount;
24442     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24443         pool->freeAll();
24444         stream->clearPool();
24445     }
24446     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
24447 }
24448 
vkBeginCommandBufferAsyncGOOGLE(VkCommandBuffer commandBuffer,const VkCommandBufferBeginInfo * pBeginInfo,uint32_t doLock)24449 void VkEncoder::vkBeginCommandBufferAsyncGOOGLE(VkCommandBuffer commandBuffer,
24450                                                 const VkCommandBufferBeginInfo* pBeginInfo,
24451                                                 uint32_t doLock) {
24452     (void)doLock;
24453     bool queueSubmitWithCommandsEnabled =
24454         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
24455     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
24456     auto stream = mImpl->stream();
24457     auto pool = mImpl->pool();
24458     VkCommandBuffer local_commandBuffer;
24459     VkCommandBufferBeginInfo* local_pBeginInfo;
24460     local_commandBuffer = commandBuffer;
24461     local_pBeginInfo = nullptr;
24462     if (pBeginInfo) {
24463         local_pBeginInfo =
24464             (VkCommandBufferBeginInfo*)pool->alloc(sizeof(const VkCommandBufferBeginInfo));
24465         deepcopy_VkCommandBufferBeginInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBeginInfo,
24466                                           (VkCommandBufferBeginInfo*)(local_pBeginInfo));
24467     }
24468     if (local_pBeginInfo) {
24469         transform_tohost_VkCommandBufferBeginInfo(sResourceTracker,
24470                                                   (VkCommandBufferBeginInfo*)(local_pBeginInfo));
24471     }
24472     size_t count = 0;
24473     size_t* countPtr = &count;
24474     {
24475         uint64_t cgen_var_0;
24476         *countPtr += 1 * 8;
24477         count_VkCommandBufferBeginInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
24478                                        (VkCommandBufferBeginInfo*)(local_pBeginInfo), countPtr);
24479     }
24480     uint32_t packetSize_vkBeginCommandBufferAsyncGOOGLE = 4 + 4 + count;
24481     if (queueSubmitWithCommandsEnabled) packetSize_vkBeginCommandBufferAsyncGOOGLE -= 8;
24482     uint8_t* streamPtr = stream->reserve(packetSize_vkBeginCommandBufferAsyncGOOGLE);
24483     uint8_t* packetBeginPtr = streamPtr;
24484     uint8_t** streamPtrPtr = &streamPtr;
24485     uint32_t opcode_vkBeginCommandBufferAsyncGOOGLE = OP_vkBeginCommandBufferAsyncGOOGLE;
24486     memcpy(streamPtr, &opcode_vkBeginCommandBufferAsyncGOOGLE, sizeof(uint32_t));
24487     streamPtr += sizeof(uint32_t);
24488     memcpy(streamPtr, &packetSize_vkBeginCommandBufferAsyncGOOGLE, sizeof(uint32_t));
24489     streamPtr += sizeof(uint32_t);
24490     if (!queueSubmitWithCommandsEnabled) {
24491         uint64_t cgen_var_0;
24492         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
24493         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24494         *streamPtrPtr += 1 * 8;
24495     }
24496     reservedmarshal_VkCommandBufferBeginInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
24497                                              (VkCommandBufferBeginInfo*)(local_pBeginInfo),
24498                                              streamPtrPtr);
24499     ++encodeCount;
24500     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24501         pool->freeAll();
24502         stream->clearPool();
24503     }
24504     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
24505 }
24506 
vkEndCommandBufferAsyncGOOGLE(VkCommandBuffer commandBuffer,uint32_t doLock)24507 void VkEncoder::vkEndCommandBufferAsyncGOOGLE(VkCommandBuffer commandBuffer, uint32_t doLock) {
24508     (void)doLock;
24509     bool queueSubmitWithCommandsEnabled =
24510         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
24511     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
24512     auto stream = mImpl->stream();
24513     auto pool = mImpl->pool();
24514     VkCommandBuffer local_commandBuffer;
24515     local_commandBuffer = commandBuffer;
24516     size_t count = 0;
24517     size_t* countPtr = &count;
24518     {
24519         uint64_t cgen_var_0;
24520         *countPtr += 1 * 8;
24521     }
24522     uint32_t packetSize_vkEndCommandBufferAsyncGOOGLE = 4 + 4 + count;
24523     if (queueSubmitWithCommandsEnabled) packetSize_vkEndCommandBufferAsyncGOOGLE -= 8;
24524     uint8_t* streamPtr = stream->reserve(packetSize_vkEndCommandBufferAsyncGOOGLE);
24525     uint8_t* packetBeginPtr = streamPtr;
24526     uint8_t** streamPtrPtr = &streamPtr;
24527     uint32_t opcode_vkEndCommandBufferAsyncGOOGLE = OP_vkEndCommandBufferAsyncGOOGLE;
24528     memcpy(streamPtr, &opcode_vkEndCommandBufferAsyncGOOGLE, sizeof(uint32_t));
24529     streamPtr += sizeof(uint32_t);
24530     memcpy(streamPtr, &packetSize_vkEndCommandBufferAsyncGOOGLE, sizeof(uint32_t));
24531     streamPtr += sizeof(uint32_t);
24532     if (!queueSubmitWithCommandsEnabled) {
24533         uint64_t cgen_var_0;
24534         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
24535         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24536         *streamPtrPtr += 1 * 8;
24537     }
24538     stream->flush();
24539     ++encodeCount;
24540     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24541         pool->freeAll();
24542         stream->clearPool();
24543     }
24544     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
24545 }
24546 
vkResetCommandBufferAsyncGOOGLE(VkCommandBuffer commandBuffer,VkCommandBufferResetFlags flags,uint32_t doLock)24547 void VkEncoder::vkResetCommandBufferAsyncGOOGLE(VkCommandBuffer commandBuffer,
24548                                                 VkCommandBufferResetFlags flags, uint32_t doLock) {
24549     (void)doLock;
24550     bool queueSubmitWithCommandsEnabled =
24551         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
24552     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
24553     auto stream = mImpl->stream();
24554     auto pool = mImpl->pool();
24555     VkCommandBuffer local_commandBuffer;
24556     VkCommandBufferResetFlags local_flags;
24557     local_commandBuffer = commandBuffer;
24558     local_flags = flags;
24559     size_t count = 0;
24560     size_t* countPtr = &count;
24561     {
24562         uint64_t cgen_var_0;
24563         *countPtr += 1 * 8;
24564         *countPtr += sizeof(VkCommandBufferResetFlags);
24565     }
24566     uint32_t packetSize_vkResetCommandBufferAsyncGOOGLE = 4 + 4 + count;
24567     if (queueSubmitWithCommandsEnabled) packetSize_vkResetCommandBufferAsyncGOOGLE -= 8;
24568     uint8_t* streamPtr = stream->reserve(packetSize_vkResetCommandBufferAsyncGOOGLE);
24569     uint8_t* packetBeginPtr = streamPtr;
24570     uint8_t** streamPtrPtr = &streamPtr;
24571     uint32_t opcode_vkResetCommandBufferAsyncGOOGLE = OP_vkResetCommandBufferAsyncGOOGLE;
24572     memcpy(streamPtr, &opcode_vkResetCommandBufferAsyncGOOGLE, sizeof(uint32_t));
24573     streamPtr += sizeof(uint32_t);
24574     memcpy(streamPtr, &packetSize_vkResetCommandBufferAsyncGOOGLE, sizeof(uint32_t));
24575     streamPtr += sizeof(uint32_t);
24576     if (!queueSubmitWithCommandsEnabled) {
24577         uint64_t cgen_var_0;
24578         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
24579         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24580         *streamPtrPtr += 1 * 8;
24581     }
24582     memcpy(*streamPtrPtr, (VkCommandBufferResetFlags*)&local_flags,
24583            sizeof(VkCommandBufferResetFlags));
24584     *streamPtrPtr += sizeof(VkCommandBufferResetFlags);
24585     ++encodeCount;
24586     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24587         pool->freeAll();
24588         stream->clearPool();
24589     }
24590     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
24591 }
24592 
vkCommandBufferHostSyncGOOGLE(VkCommandBuffer commandBuffer,uint32_t needHostSync,uint32_t sequenceNumber,uint32_t doLock)24593 void VkEncoder::vkCommandBufferHostSyncGOOGLE(VkCommandBuffer commandBuffer, uint32_t needHostSync,
24594                                               uint32_t sequenceNumber, uint32_t doLock) {
24595     (void)doLock;
24596     bool queueSubmitWithCommandsEnabled =
24597         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
24598     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
24599     auto stream = mImpl->stream();
24600     auto pool = mImpl->pool();
24601     VkCommandBuffer local_commandBuffer;
24602     uint32_t local_needHostSync;
24603     uint32_t local_sequenceNumber;
24604     local_commandBuffer = commandBuffer;
24605     local_needHostSync = needHostSync;
24606     local_sequenceNumber = sequenceNumber;
24607     size_t count = 0;
24608     size_t* countPtr = &count;
24609     {
24610         uint64_t cgen_var_0;
24611         *countPtr += 1 * 8;
24612         *countPtr += sizeof(uint32_t);
24613         *countPtr += sizeof(uint32_t);
24614     }
24615     uint32_t packetSize_vkCommandBufferHostSyncGOOGLE = 4 + 4 + count;
24616     if (queueSubmitWithCommandsEnabled) packetSize_vkCommandBufferHostSyncGOOGLE -= 8;
24617     uint8_t* streamPtr = stream->reserve(packetSize_vkCommandBufferHostSyncGOOGLE);
24618     uint8_t* packetBeginPtr = streamPtr;
24619     uint8_t** streamPtrPtr = &streamPtr;
24620     uint32_t opcode_vkCommandBufferHostSyncGOOGLE = OP_vkCommandBufferHostSyncGOOGLE;
24621     memcpy(streamPtr, &opcode_vkCommandBufferHostSyncGOOGLE, sizeof(uint32_t));
24622     streamPtr += sizeof(uint32_t);
24623     memcpy(streamPtr, &packetSize_vkCommandBufferHostSyncGOOGLE, sizeof(uint32_t));
24624     streamPtr += sizeof(uint32_t);
24625     if (!queueSubmitWithCommandsEnabled) {
24626         uint64_t cgen_var_0;
24627         *&cgen_var_0 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
24628         memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24629         *streamPtrPtr += 1 * 8;
24630     }
24631     memcpy(*streamPtrPtr, (uint32_t*)&local_needHostSync, sizeof(uint32_t));
24632     *streamPtrPtr += sizeof(uint32_t);
24633     memcpy(*streamPtrPtr, (uint32_t*)&local_sequenceNumber, sizeof(uint32_t));
24634     *streamPtrPtr += sizeof(uint32_t);
24635     ++encodeCount;
24636     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24637         pool->freeAll();
24638         stream->clearPool();
24639     }
24640     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
24641 }
24642 
vkCreateImageWithRequirementsGOOGLE(VkDevice device,const VkImageCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkImage * pImage,VkMemoryRequirements * pMemoryRequirements,uint32_t doLock)24643 VkResult VkEncoder::vkCreateImageWithRequirementsGOOGLE(
24644     VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
24645     VkImage* pImage, VkMemoryRequirements* pMemoryRequirements, uint32_t doLock) {
24646     (void)doLock;
24647     bool queueSubmitWithCommandsEnabled =
24648         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
24649     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
24650     auto stream = mImpl->stream();
24651     auto pool = mImpl->pool();
24652     VkDevice local_device;
24653     VkImageCreateInfo* local_pCreateInfo;
24654     VkAllocationCallbacks* local_pAllocator;
24655     local_device = device;
24656     local_pCreateInfo = nullptr;
24657     if (pCreateInfo) {
24658         local_pCreateInfo = (VkImageCreateInfo*)pool->alloc(sizeof(const VkImageCreateInfo));
24659         deepcopy_VkImageCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
24660                                    (VkImageCreateInfo*)(local_pCreateInfo));
24661     }
24662     local_pAllocator = nullptr;
24663     if (pAllocator) {
24664         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
24665         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
24666                                        (VkAllocationCallbacks*)(local_pAllocator));
24667     }
24668     sResourceTracker->unwrap_vkCreateImage_pCreateInfo(pCreateInfo, local_pCreateInfo);
24669     local_pAllocator = nullptr;
24670     if (local_pCreateInfo) {
24671         sResourceTracker->transformImpl_VkImageCreateInfo_tohost(local_pCreateInfo, 1);
24672         transform_tohost_VkImageCreateInfo(sResourceTracker,
24673                                            (VkImageCreateInfo*)(local_pCreateInfo));
24674     }
24675     if (local_pAllocator) {
24676         transform_tohost_VkAllocationCallbacks(sResourceTracker,
24677                                                (VkAllocationCallbacks*)(local_pAllocator));
24678     }
24679     size_t count = 0;
24680     size_t* countPtr = &count;
24681     {
24682         uint64_t cgen_var_0;
24683         *countPtr += 1 * 8;
24684         count_VkImageCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
24685                                 (VkImageCreateInfo*)(local_pCreateInfo), countPtr);
24686         // WARNING PTR CHECK
24687         *countPtr += 8;
24688         if (local_pAllocator) {
24689             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
24690                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
24691         }
24692         uint64_t cgen_var_1;
24693         *countPtr += 8;
24694         count_VkMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
24695                                    (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
24696     }
24697     uint32_t packetSize_vkCreateImageWithRequirementsGOOGLE =
24698         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
24699     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateImageWithRequirementsGOOGLE);
24700     uint8_t* packetBeginPtr = streamPtr;
24701     uint8_t** streamPtrPtr = &streamPtr;
24702     uint32_t opcode_vkCreateImageWithRequirementsGOOGLE = OP_vkCreateImageWithRequirementsGOOGLE;
24703     uint32_t seqno;
24704     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
24705     memcpy(streamPtr, &opcode_vkCreateImageWithRequirementsGOOGLE, sizeof(uint32_t));
24706     streamPtr += sizeof(uint32_t);
24707     memcpy(streamPtr, &packetSize_vkCreateImageWithRequirementsGOOGLE, sizeof(uint32_t));
24708     streamPtr += sizeof(uint32_t);
24709     if (queueSubmitWithCommandsEnabled) {
24710         memcpy(streamPtr, &seqno, sizeof(uint32_t));
24711         streamPtr += sizeof(uint32_t);
24712     }
24713     uint64_t cgen_var_0;
24714     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
24715     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24716     *streamPtrPtr += 1 * 8;
24717     reservedmarshal_VkImageCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
24718                                       (VkImageCreateInfo*)(local_pCreateInfo), streamPtrPtr);
24719     // WARNING PTR CHECK
24720     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
24721     memcpy((*streamPtrPtr), &cgen_var_1, 8);
24722     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24723     *streamPtrPtr += 8;
24724     if (local_pAllocator) {
24725         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
24726                                               (VkAllocationCallbacks*)(local_pAllocator),
24727                                               streamPtrPtr);
24728     }
24729     /* is handle, possibly out */;
24730     uint64_t cgen_var_2;
24731     *&cgen_var_2 = (uint64_t)((*pImage));
24732     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
24733     *streamPtrPtr += 8;
24734     /* is handle, possibly out */;
24735     reservedmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
24736                                          (VkMemoryRequirements*)(pMemoryRequirements),
24737                                          streamPtrPtr);
24738     stream->setHandleMapping(sResourceTracker->createMapping());
24739     uint64_t cgen_var_3;
24740     stream->read((uint64_t*)&cgen_var_3, 8);
24741     stream->handleMapping()->mapHandles_u64_VkImage(&cgen_var_3, (VkImage*)pImage, 1);
24742     stream->unsetHandleMapping();
24743     unmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
24744                                    (VkMemoryRequirements*)(pMemoryRequirements));
24745     if (pMemoryRequirements) {
24746         transform_fromhost_VkMemoryRequirements(sResourceTracker,
24747                                                 (VkMemoryRequirements*)(pMemoryRequirements));
24748     }
24749     VkResult vkCreateImageWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
24750     stream->read(&vkCreateImageWithRequirementsGOOGLE_VkResult_return, sizeof(VkResult));
24751     ++encodeCount;
24752     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24753         pool->freeAll();
24754         stream->clearPool();
24755     }
24756     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
24757     return vkCreateImageWithRequirementsGOOGLE_VkResult_return;
24758 }
24759 
vkCreateBufferWithRequirementsGOOGLE(VkDevice device,const VkBufferCreateInfo * pCreateInfo,const VkAllocationCallbacks * pAllocator,VkBuffer * pBuffer,VkMemoryRequirements * pMemoryRequirements,uint32_t doLock)24760 VkResult VkEncoder::vkCreateBufferWithRequirementsGOOGLE(
24761     VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
24762     VkBuffer* pBuffer, VkMemoryRequirements* pMemoryRequirements, uint32_t doLock) {
24763     (void)doLock;
24764     bool queueSubmitWithCommandsEnabled =
24765         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
24766     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
24767     auto stream = mImpl->stream();
24768     auto pool = mImpl->pool();
24769     VkDevice local_device;
24770     VkBufferCreateInfo* local_pCreateInfo;
24771     VkAllocationCallbacks* local_pAllocator;
24772     local_device = device;
24773     local_pCreateInfo = nullptr;
24774     if (pCreateInfo) {
24775         local_pCreateInfo = (VkBufferCreateInfo*)pool->alloc(sizeof(const VkBufferCreateInfo));
24776         deepcopy_VkBufferCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
24777                                     (VkBufferCreateInfo*)(local_pCreateInfo));
24778     }
24779     local_pAllocator = nullptr;
24780     if (pAllocator) {
24781         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
24782         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
24783                                        (VkAllocationCallbacks*)(local_pAllocator));
24784     }
24785     local_pAllocator = nullptr;
24786     if (local_pCreateInfo) {
24787         transform_tohost_VkBufferCreateInfo(sResourceTracker,
24788                                             (VkBufferCreateInfo*)(local_pCreateInfo));
24789     }
24790     if (local_pAllocator) {
24791         transform_tohost_VkAllocationCallbacks(sResourceTracker,
24792                                                (VkAllocationCallbacks*)(local_pAllocator));
24793     }
24794     size_t count = 0;
24795     size_t* countPtr = &count;
24796     {
24797         uint64_t cgen_var_0;
24798         *countPtr += 1 * 8;
24799         count_VkBufferCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
24800                                  (VkBufferCreateInfo*)(local_pCreateInfo), countPtr);
24801         // WARNING PTR CHECK
24802         *countPtr += 8;
24803         if (local_pAllocator) {
24804             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
24805                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
24806         }
24807         uint64_t cgen_var_1;
24808         *countPtr += 8;
24809         count_VkMemoryRequirements(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
24810                                    (VkMemoryRequirements*)(pMemoryRequirements), countPtr);
24811     }
24812     uint32_t packetSize_vkCreateBufferWithRequirementsGOOGLE =
24813         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
24814     uint8_t* streamPtr = stream->reserve(packetSize_vkCreateBufferWithRequirementsGOOGLE);
24815     uint8_t* packetBeginPtr = streamPtr;
24816     uint8_t** streamPtrPtr = &streamPtr;
24817     uint32_t opcode_vkCreateBufferWithRequirementsGOOGLE = OP_vkCreateBufferWithRequirementsGOOGLE;
24818     uint32_t seqno;
24819     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
24820     memcpy(streamPtr, &opcode_vkCreateBufferWithRequirementsGOOGLE, sizeof(uint32_t));
24821     streamPtr += sizeof(uint32_t);
24822     memcpy(streamPtr, &packetSize_vkCreateBufferWithRequirementsGOOGLE, sizeof(uint32_t));
24823     streamPtr += sizeof(uint32_t);
24824     if (queueSubmitWithCommandsEnabled) {
24825         memcpy(streamPtr, &seqno, sizeof(uint32_t));
24826         streamPtr += sizeof(uint32_t);
24827     }
24828     uint64_t cgen_var_0;
24829     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
24830     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24831     *streamPtrPtr += 1 * 8;
24832     reservedmarshal_VkBufferCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
24833                                        (VkBufferCreateInfo*)(local_pCreateInfo), streamPtrPtr);
24834     // WARNING PTR CHECK
24835     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pAllocator;
24836     memcpy((*streamPtrPtr), &cgen_var_1, 8);
24837     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24838     *streamPtrPtr += 8;
24839     if (local_pAllocator) {
24840         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
24841                                               (VkAllocationCallbacks*)(local_pAllocator),
24842                                               streamPtrPtr);
24843     }
24844     /* is handle, possibly out */;
24845     uint64_t cgen_var_2;
24846     *&cgen_var_2 = (uint64_t)((*pBuffer));
24847     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 8);
24848     *streamPtrPtr += 8;
24849     /* is handle, possibly out */;
24850     reservedmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
24851                                          (VkMemoryRequirements*)(pMemoryRequirements),
24852                                          streamPtrPtr);
24853     stream->setHandleMapping(sResourceTracker->createMapping());
24854     uint64_t cgen_var_3;
24855     stream->read((uint64_t*)&cgen_var_3, 8);
24856     stream->handleMapping()->mapHandles_u64_VkBuffer(&cgen_var_3, (VkBuffer*)pBuffer, 1);
24857     stream->unsetHandleMapping();
24858     unmarshal_VkMemoryRequirements(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
24859                                    (VkMemoryRequirements*)(pMemoryRequirements));
24860     if (pMemoryRequirements) {
24861         transform_fromhost_VkMemoryRequirements(sResourceTracker,
24862                                                 (VkMemoryRequirements*)(pMemoryRequirements));
24863     }
24864     VkResult vkCreateBufferWithRequirementsGOOGLE_VkResult_return = (VkResult)0;
24865     stream->read(&vkCreateBufferWithRequirementsGOOGLE_VkResult_return, sizeof(VkResult));
24866     ++encodeCount;
24867     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24868         pool->freeAll();
24869         stream->clearPool();
24870     }
24871     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
24872     return vkCreateBufferWithRequirementsGOOGLE_VkResult_return;
24873 }
24874 
vkGetMemoryHostAddressInfoGOOGLE(VkDevice device,VkDeviceMemory memory,uint64_t * pAddress,uint64_t * pSize,uint64_t * pHostmemId,uint32_t doLock)24875 VkResult VkEncoder::vkGetMemoryHostAddressInfoGOOGLE(VkDevice device, VkDeviceMemory memory,
24876                                                      uint64_t* pAddress, uint64_t* pSize,
24877                                                      uint64_t* pHostmemId, uint32_t doLock) {
24878     (void)doLock;
24879     bool queueSubmitWithCommandsEnabled =
24880         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
24881     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
24882     auto stream = mImpl->stream();
24883     auto pool = mImpl->pool();
24884     VkDevice local_device;
24885     VkDeviceMemory local_memory;
24886     local_device = device;
24887     local_memory = memory;
24888     sResourceTracker->deviceMemoryTransform_tohost(
24889         (VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
24890         (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
24891     size_t count = 0;
24892     size_t* countPtr = &count;
24893     {
24894         uint64_t cgen_var_0;
24895         *countPtr += 1 * 8;
24896         uint64_t cgen_var_1;
24897         *countPtr += 1 * 8;
24898         // WARNING PTR CHECK
24899         *countPtr += 8;
24900         if (pAddress) {
24901             *countPtr += sizeof(uint64_t);
24902         }
24903         // WARNING PTR CHECK
24904         *countPtr += 8;
24905         if (pSize) {
24906             *countPtr += sizeof(uint64_t);
24907         }
24908         // WARNING PTR CHECK
24909         *countPtr += 8;
24910         if (pHostmemId) {
24911             *countPtr += sizeof(uint64_t);
24912         }
24913     }
24914     uint32_t packetSize_vkGetMemoryHostAddressInfoGOOGLE =
24915         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
24916     uint8_t* streamPtr = stream->reserve(packetSize_vkGetMemoryHostAddressInfoGOOGLE);
24917     uint8_t* packetBeginPtr = streamPtr;
24918     uint8_t** streamPtrPtr = &streamPtr;
24919     uint32_t opcode_vkGetMemoryHostAddressInfoGOOGLE = OP_vkGetMemoryHostAddressInfoGOOGLE;
24920     uint32_t seqno;
24921     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
24922     memcpy(streamPtr, &opcode_vkGetMemoryHostAddressInfoGOOGLE, sizeof(uint32_t));
24923     streamPtr += sizeof(uint32_t);
24924     memcpy(streamPtr, &packetSize_vkGetMemoryHostAddressInfoGOOGLE, sizeof(uint32_t));
24925     streamPtr += sizeof(uint32_t);
24926     if (queueSubmitWithCommandsEnabled) {
24927         memcpy(streamPtr, &seqno, sizeof(uint32_t));
24928         streamPtr += sizeof(uint32_t);
24929     }
24930     uint64_t cgen_var_0;
24931     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
24932     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
24933     *streamPtrPtr += 1 * 8;
24934     uint64_t cgen_var_1;
24935     *&cgen_var_1 = get_host_u64_VkDeviceMemory((*&local_memory));
24936     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
24937     *streamPtrPtr += 1 * 8;
24938     // WARNING PTR CHECK
24939     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pAddress;
24940     memcpy((*streamPtrPtr), &cgen_var_2, 8);
24941     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24942     *streamPtrPtr += 8;
24943     if (pAddress) {
24944         memcpy(*streamPtrPtr, (uint64_t*)pAddress, sizeof(uint64_t));
24945         *streamPtrPtr += sizeof(uint64_t);
24946     }
24947     // WARNING PTR CHECK
24948     uint64_t cgen_var_3 = (uint64_t)(uintptr_t)pSize;
24949     memcpy((*streamPtrPtr), &cgen_var_3, 8);
24950     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24951     *streamPtrPtr += 8;
24952     if (pSize) {
24953         memcpy(*streamPtrPtr, (uint64_t*)pSize, sizeof(uint64_t));
24954         *streamPtrPtr += sizeof(uint64_t);
24955     }
24956     // WARNING PTR CHECK
24957     uint64_t cgen_var_4 = (uint64_t)(uintptr_t)pHostmemId;
24958     memcpy((*streamPtrPtr), &cgen_var_4, 8);
24959     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
24960     *streamPtrPtr += 8;
24961     if (pHostmemId) {
24962         memcpy(*streamPtrPtr, (uint64_t*)pHostmemId, sizeof(uint64_t));
24963         *streamPtrPtr += sizeof(uint64_t);
24964     }
24965     // WARNING PTR CHECK
24966     uint64_t* check_pAddress;
24967     check_pAddress = (uint64_t*)(uintptr_t)stream->getBe64();
24968     if (pAddress) {
24969         if (!(check_pAddress)) {
24970             fprintf(stderr, "fatal: pAddress inconsistent between guest and host\n");
24971         }
24972         stream->read((uint64_t*)pAddress, sizeof(uint64_t));
24973     }
24974     // WARNING PTR CHECK
24975     uint64_t* check_pSize;
24976     check_pSize = (uint64_t*)(uintptr_t)stream->getBe64();
24977     if (pSize) {
24978         if (!(check_pSize)) {
24979             fprintf(stderr, "fatal: pSize inconsistent between guest and host\n");
24980         }
24981         stream->read((uint64_t*)pSize, sizeof(uint64_t));
24982     }
24983     // WARNING PTR CHECK
24984     uint64_t* check_pHostmemId;
24985     check_pHostmemId = (uint64_t*)(uintptr_t)stream->getBe64();
24986     if (pHostmemId) {
24987         if (!(check_pHostmemId)) {
24988             fprintf(stderr, "fatal: pHostmemId inconsistent between guest and host\n");
24989         }
24990         stream->read((uint64_t*)pHostmemId, sizeof(uint64_t));
24991     }
24992     VkResult vkGetMemoryHostAddressInfoGOOGLE_VkResult_return = (VkResult)0;
24993     stream->read(&vkGetMemoryHostAddressInfoGOOGLE_VkResult_return, sizeof(VkResult));
24994     ++encodeCount;
24995     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
24996         pool->freeAll();
24997         stream->clearPool();
24998     }
24999     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25000     return vkGetMemoryHostAddressInfoGOOGLE_VkResult_return;
25001 }
25002 
vkFreeMemorySyncGOOGLE(VkDevice device,VkDeviceMemory memory,const VkAllocationCallbacks * pAllocator,uint32_t doLock)25003 VkResult VkEncoder::vkFreeMemorySyncGOOGLE(VkDevice device, VkDeviceMemory memory,
25004                                            const VkAllocationCallbacks* pAllocator,
25005                                            uint32_t doLock) {
25006     (void)doLock;
25007     bool queueSubmitWithCommandsEnabled =
25008         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25009     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25010     auto stream = mImpl->stream();
25011     auto pool = mImpl->pool();
25012     VkDevice local_device;
25013     VkDeviceMemory local_memory;
25014     VkAllocationCallbacks* local_pAllocator;
25015     local_device = device;
25016     local_memory = memory;
25017     local_pAllocator = nullptr;
25018     if (pAllocator) {
25019         local_pAllocator = (VkAllocationCallbacks*)pool->alloc(sizeof(const VkAllocationCallbacks));
25020         deepcopy_VkAllocationCallbacks(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pAllocator,
25021                                        (VkAllocationCallbacks*)(local_pAllocator));
25022     }
25023     local_pAllocator = nullptr;
25024     sResourceTracker->deviceMemoryTransform_tohost(
25025         (VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
25026         (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
25027     size_t count = 0;
25028     size_t* countPtr = &count;
25029     {
25030         uint64_t cgen_var_0;
25031         *countPtr += 1 * 8;
25032         uint64_t cgen_var_1;
25033         *countPtr += 1 * 8;
25034         // WARNING PTR CHECK
25035         *countPtr += 8;
25036         if (local_pAllocator) {
25037             count_VkAllocationCallbacks(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
25038                                         (VkAllocationCallbacks*)(local_pAllocator), countPtr);
25039         }
25040     }
25041     uint32_t packetSize_vkFreeMemorySyncGOOGLE =
25042         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25043     uint8_t* streamPtr = stream->reserve(packetSize_vkFreeMemorySyncGOOGLE);
25044     uint8_t* packetBeginPtr = streamPtr;
25045     uint8_t** streamPtrPtr = &streamPtr;
25046     uint32_t opcode_vkFreeMemorySyncGOOGLE = OP_vkFreeMemorySyncGOOGLE;
25047     uint32_t seqno;
25048     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25049     memcpy(streamPtr, &opcode_vkFreeMemorySyncGOOGLE, sizeof(uint32_t));
25050     streamPtr += sizeof(uint32_t);
25051     memcpy(streamPtr, &packetSize_vkFreeMemorySyncGOOGLE, sizeof(uint32_t));
25052     streamPtr += sizeof(uint32_t);
25053     if (queueSubmitWithCommandsEnabled) {
25054         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25055         streamPtr += sizeof(uint32_t);
25056     }
25057     uint64_t cgen_var_0;
25058     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
25059     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25060     *streamPtrPtr += 1 * 8;
25061     uint64_t cgen_var_1;
25062     *&cgen_var_1 = get_host_u64_VkDeviceMemory((*&local_memory));
25063     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
25064     *streamPtrPtr += 1 * 8;
25065     // WARNING PTR CHECK
25066     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)local_pAllocator;
25067     memcpy((*streamPtrPtr), &cgen_var_2, 8);
25068     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
25069     *streamPtrPtr += 8;
25070     if (local_pAllocator) {
25071         reservedmarshal_VkAllocationCallbacks(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
25072                                               (VkAllocationCallbacks*)(local_pAllocator),
25073                                               streamPtrPtr);
25074     }
25075     VkResult vkFreeMemorySyncGOOGLE_VkResult_return = (VkResult)0;
25076     stream->read(&vkFreeMemorySyncGOOGLE_VkResult_return, sizeof(VkResult));
25077     sResourceTracker->destroyMapping()->mapHandles_VkDeviceMemory((VkDeviceMemory*)&memory);
25078     ++encodeCount;
25079     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25080         pool->freeAll();
25081         stream->clearPool();
25082     }
25083     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25084     return vkFreeMemorySyncGOOGLE_VkResult_return;
25085 }
25086 
vkQueueHostSyncGOOGLE(VkQueue queue,uint32_t needHostSync,uint32_t sequenceNumber,uint32_t doLock)25087 void VkEncoder::vkQueueHostSyncGOOGLE(VkQueue queue, uint32_t needHostSync, uint32_t sequenceNumber,
25088                                       uint32_t doLock) {
25089     (void)doLock;
25090     bool queueSubmitWithCommandsEnabled =
25091         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25092     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25093     auto stream = mImpl->stream();
25094     auto pool = mImpl->pool();
25095     VkQueue local_queue;
25096     uint32_t local_needHostSync;
25097     uint32_t local_sequenceNumber;
25098     local_queue = queue;
25099     local_needHostSync = needHostSync;
25100     local_sequenceNumber = sequenceNumber;
25101     size_t count = 0;
25102     size_t* countPtr = &count;
25103     {
25104         uint64_t cgen_var_0;
25105         *countPtr += 1 * 8;
25106         *countPtr += sizeof(uint32_t);
25107         *countPtr += sizeof(uint32_t);
25108     }
25109     uint32_t packetSize_vkQueueHostSyncGOOGLE =
25110         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25111     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueHostSyncGOOGLE);
25112     uint8_t* packetBeginPtr = streamPtr;
25113     uint8_t** streamPtrPtr = &streamPtr;
25114     uint32_t opcode_vkQueueHostSyncGOOGLE = OP_vkQueueHostSyncGOOGLE;
25115     uint32_t seqno;
25116     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25117     memcpy(streamPtr, &opcode_vkQueueHostSyncGOOGLE, sizeof(uint32_t));
25118     streamPtr += sizeof(uint32_t);
25119     memcpy(streamPtr, &packetSize_vkQueueHostSyncGOOGLE, sizeof(uint32_t));
25120     streamPtr += sizeof(uint32_t);
25121     if (queueSubmitWithCommandsEnabled) {
25122         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25123         streamPtr += sizeof(uint32_t);
25124     }
25125     uint64_t cgen_var_0;
25126     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
25127     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25128     *streamPtrPtr += 1 * 8;
25129     memcpy(*streamPtrPtr, (uint32_t*)&local_needHostSync, sizeof(uint32_t));
25130     *streamPtrPtr += sizeof(uint32_t);
25131     memcpy(*streamPtrPtr, (uint32_t*)&local_sequenceNumber, sizeof(uint32_t));
25132     *streamPtrPtr += sizeof(uint32_t);
25133     stream->flush();
25134     ++encodeCount;
25135     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25136         pool->freeAll();
25137         stream->clearPool();
25138     }
25139     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25140 }
25141 
vkQueueSubmitAsyncGOOGLE(VkQueue queue,uint32_t submitCount,const VkSubmitInfo * pSubmits,VkFence fence,uint32_t doLock)25142 void VkEncoder::vkQueueSubmitAsyncGOOGLE(VkQueue queue, uint32_t submitCount,
25143                                          const VkSubmitInfo* pSubmits, VkFence fence,
25144                                          uint32_t doLock) {
25145     (void)doLock;
25146     bool queueSubmitWithCommandsEnabled =
25147         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25148     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25149     auto stream = mImpl->stream();
25150     auto pool = mImpl->pool();
25151     VkQueue local_queue;
25152     uint32_t local_submitCount;
25153     VkSubmitInfo* local_pSubmits;
25154     VkFence local_fence;
25155     local_queue = queue;
25156     local_submitCount = submitCount;
25157     local_pSubmits = nullptr;
25158     if (pSubmits) {
25159         local_pSubmits = (VkSubmitInfo*)pool->alloc(((submitCount)) * sizeof(const VkSubmitInfo));
25160         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
25161             deepcopy_VkSubmitInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubmits + i,
25162                                   (VkSubmitInfo*)(local_pSubmits + i));
25163         }
25164     }
25165     local_fence = fence;
25166     if (local_pSubmits) {
25167         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
25168             transform_tohost_VkSubmitInfo(sResourceTracker, (VkSubmitInfo*)(local_pSubmits + i));
25169         }
25170     }
25171     size_t count = 0;
25172     size_t* countPtr = &count;
25173     {
25174         uint64_t cgen_var_0;
25175         *countPtr += 1 * 8;
25176         *countPtr += sizeof(uint32_t);
25177         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
25178             count_VkSubmitInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
25179                                (VkSubmitInfo*)(local_pSubmits + i), countPtr);
25180         }
25181         uint64_t cgen_var_1;
25182         *countPtr += 1 * 8;
25183     }
25184     uint32_t packetSize_vkQueueSubmitAsyncGOOGLE =
25185         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25186     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSubmitAsyncGOOGLE);
25187     uint8_t* packetBeginPtr = streamPtr;
25188     uint8_t** streamPtrPtr = &streamPtr;
25189     uint32_t opcode_vkQueueSubmitAsyncGOOGLE = OP_vkQueueSubmitAsyncGOOGLE;
25190     uint32_t seqno;
25191     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25192     memcpy(streamPtr, &opcode_vkQueueSubmitAsyncGOOGLE, sizeof(uint32_t));
25193     streamPtr += sizeof(uint32_t);
25194     memcpy(streamPtr, &packetSize_vkQueueSubmitAsyncGOOGLE, sizeof(uint32_t));
25195     streamPtr += sizeof(uint32_t);
25196     if (queueSubmitWithCommandsEnabled) {
25197         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25198         streamPtr += sizeof(uint32_t);
25199     }
25200     uint64_t cgen_var_0;
25201     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
25202     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25203     *streamPtrPtr += 1 * 8;
25204     memcpy(*streamPtrPtr, (uint32_t*)&local_submitCount, sizeof(uint32_t));
25205     *streamPtrPtr += sizeof(uint32_t);
25206     for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
25207         reservedmarshal_VkSubmitInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
25208                                      (VkSubmitInfo*)(local_pSubmits + i), streamPtrPtr);
25209     }
25210     uint64_t cgen_var_1;
25211     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
25212     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
25213     *streamPtrPtr += 1 * 8;
25214     stream->flush();
25215     ++encodeCount;
25216     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25217         pool->freeAll();
25218         stream->clearPool();
25219     }
25220     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25221 }
25222 
vkQueueWaitIdleAsyncGOOGLE(VkQueue queue,uint32_t doLock)25223 void VkEncoder::vkQueueWaitIdleAsyncGOOGLE(VkQueue queue, uint32_t doLock) {
25224     (void)doLock;
25225     bool queueSubmitWithCommandsEnabled =
25226         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25227     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25228     auto stream = mImpl->stream();
25229     auto pool = mImpl->pool();
25230     VkQueue local_queue;
25231     local_queue = queue;
25232     size_t count = 0;
25233     size_t* countPtr = &count;
25234     {
25235         uint64_t cgen_var_0;
25236         *countPtr += 1 * 8;
25237     }
25238     uint32_t packetSize_vkQueueWaitIdleAsyncGOOGLE =
25239         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25240     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueWaitIdleAsyncGOOGLE);
25241     uint8_t* packetBeginPtr = streamPtr;
25242     uint8_t** streamPtrPtr = &streamPtr;
25243     uint32_t opcode_vkQueueWaitIdleAsyncGOOGLE = OP_vkQueueWaitIdleAsyncGOOGLE;
25244     uint32_t seqno;
25245     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25246     memcpy(streamPtr, &opcode_vkQueueWaitIdleAsyncGOOGLE, sizeof(uint32_t));
25247     streamPtr += sizeof(uint32_t);
25248     memcpy(streamPtr, &packetSize_vkQueueWaitIdleAsyncGOOGLE, sizeof(uint32_t));
25249     streamPtr += sizeof(uint32_t);
25250     if (queueSubmitWithCommandsEnabled) {
25251         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25252         streamPtr += sizeof(uint32_t);
25253     }
25254     uint64_t cgen_var_0;
25255     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
25256     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25257     *streamPtrPtr += 1 * 8;
25258     stream->flush();
25259     ++encodeCount;
25260     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25261         pool->freeAll();
25262         stream->clearPool();
25263     }
25264     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25265 }
25266 
vkQueueBindSparseAsyncGOOGLE(VkQueue queue,uint32_t bindInfoCount,const VkBindSparseInfo * pBindInfo,VkFence fence,uint32_t doLock)25267 void VkEncoder::vkQueueBindSparseAsyncGOOGLE(VkQueue queue, uint32_t bindInfoCount,
25268                                              const VkBindSparseInfo* pBindInfo, VkFence fence,
25269                                              uint32_t doLock) {
25270     (void)doLock;
25271     bool queueSubmitWithCommandsEnabled =
25272         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25273     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25274     auto stream = mImpl->stream();
25275     auto pool = mImpl->pool();
25276     VkQueue local_queue;
25277     uint32_t local_bindInfoCount;
25278     VkBindSparseInfo* local_pBindInfo;
25279     VkFence local_fence;
25280     local_queue = queue;
25281     local_bindInfoCount = bindInfoCount;
25282     local_pBindInfo = nullptr;
25283     if (pBindInfo) {
25284         local_pBindInfo =
25285             (VkBindSparseInfo*)pool->alloc(((bindInfoCount)) * sizeof(const VkBindSparseInfo));
25286         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
25287             deepcopy_VkBindSparseInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBindInfo + i,
25288                                       (VkBindSparseInfo*)(local_pBindInfo + i));
25289         }
25290     }
25291     local_fence = fence;
25292     if (local_pBindInfo) {
25293         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
25294             transform_tohost_VkBindSparseInfo(sResourceTracker,
25295                                               (VkBindSparseInfo*)(local_pBindInfo + i));
25296         }
25297     }
25298     size_t count = 0;
25299     size_t* countPtr = &count;
25300     {
25301         uint64_t cgen_var_0;
25302         *countPtr += 1 * 8;
25303         *countPtr += sizeof(uint32_t);
25304         for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
25305             count_VkBindSparseInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
25306                                    (VkBindSparseInfo*)(local_pBindInfo + i), countPtr);
25307         }
25308         uint64_t cgen_var_1;
25309         *countPtr += 1 * 8;
25310     }
25311     uint32_t packetSize_vkQueueBindSparseAsyncGOOGLE =
25312         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25313     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueBindSparseAsyncGOOGLE);
25314     uint8_t* packetBeginPtr = streamPtr;
25315     uint8_t** streamPtrPtr = &streamPtr;
25316     uint32_t opcode_vkQueueBindSparseAsyncGOOGLE = OP_vkQueueBindSparseAsyncGOOGLE;
25317     uint32_t seqno;
25318     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25319     memcpy(streamPtr, &opcode_vkQueueBindSparseAsyncGOOGLE, sizeof(uint32_t));
25320     streamPtr += sizeof(uint32_t);
25321     memcpy(streamPtr, &packetSize_vkQueueBindSparseAsyncGOOGLE, sizeof(uint32_t));
25322     streamPtr += sizeof(uint32_t);
25323     if (queueSubmitWithCommandsEnabled) {
25324         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25325         streamPtr += sizeof(uint32_t);
25326     }
25327     uint64_t cgen_var_0;
25328     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
25329     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25330     *streamPtrPtr += 1 * 8;
25331     memcpy(*streamPtrPtr, (uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
25332     *streamPtrPtr += sizeof(uint32_t);
25333     for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i) {
25334         reservedmarshal_VkBindSparseInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
25335                                          (VkBindSparseInfo*)(local_pBindInfo + i), streamPtrPtr);
25336     }
25337     uint64_t cgen_var_1;
25338     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
25339     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
25340     *streamPtrPtr += 1 * 8;
25341     stream->flush();
25342     ++encodeCount;
25343     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25344         pool->freeAll();
25345         stream->clearPool();
25346     }
25347     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25348 }
25349 
vkGetLinearImageLayoutGOOGLE(VkDevice device,VkFormat format,VkDeviceSize * pOffset,VkDeviceSize * pRowPitchAlignment,uint32_t doLock)25350 void VkEncoder::vkGetLinearImageLayoutGOOGLE(VkDevice device, VkFormat format,
25351                                              VkDeviceSize* pOffset,
25352                                              VkDeviceSize* pRowPitchAlignment, uint32_t doLock) {
25353     (void)doLock;
25354     bool queueSubmitWithCommandsEnabled =
25355         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25356     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25357     auto stream = mImpl->stream();
25358     auto pool = mImpl->pool();
25359     VkDevice local_device;
25360     VkFormat local_format;
25361     local_device = device;
25362     local_format = format;
25363     size_t count = 0;
25364     size_t* countPtr = &count;
25365     {
25366         uint64_t cgen_var_0;
25367         *countPtr += 1 * 8;
25368         *countPtr += sizeof(VkFormat);
25369         *countPtr += sizeof(VkDeviceSize);
25370         *countPtr += sizeof(VkDeviceSize);
25371     }
25372     uint32_t packetSize_vkGetLinearImageLayoutGOOGLE =
25373         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25374     uint8_t* streamPtr = stream->reserve(packetSize_vkGetLinearImageLayoutGOOGLE);
25375     uint8_t* packetBeginPtr = streamPtr;
25376     uint8_t** streamPtrPtr = &streamPtr;
25377     uint32_t opcode_vkGetLinearImageLayoutGOOGLE = OP_vkGetLinearImageLayoutGOOGLE;
25378     uint32_t seqno;
25379     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25380     memcpy(streamPtr, &opcode_vkGetLinearImageLayoutGOOGLE, sizeof(uint32_t));
25381     streamPtr += sizeof(uint32_t);
25382     memcpy(streamPtr, &packetSize_vkGetLinearImageLayoutGOOGLE, sizeof(uint32_t));
25383     streamPtr += sizeof(uint32_t);
25384     if (queueSubmitWithCommandsEnabled) {
25385         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25386         streamPtr += sizeof(uint32_t);
25387     }
25388     uint64_t cgen_var_0;
25389     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
25390     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25391     *streamPtrPtr += 1 * 8;
25392     memcpy(*streamPtrPtr, (VkFormat*)&local_format, sizeof(VkFormat));
25393     *streamPtrPtr += sizeof(VkFormat);
25394     memcpy(*streamPtrPtr, (VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
25395     *streamPtrPtr += sizeof(VkDeviceSize);
25396     memcpy(*streamPtrPtr, (VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
25397     *streamPtrPtr += sizeof(VkDeviceSize);
25398     stream->read((VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
25399     stream->read((VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
25400     ++encodeCount;
25401     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25402         pool->freeAll();
25403         stream->clearPool();
25404     }
25405     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25406 }
25407 
vkGetLinearImageLayout2GOOGLE(VkDevice device,const VkImageCreateInfo * pCreateInfo,VkDeviceSize * pOffset,VkDeviceSize * pRowPitchAlignment,uint32_t doLock)25408 void VkEncoder::vkGetLinearImageLayout2GOOGLE(VkDevice device, const VkImageCreateInfo* pCreateInfo,
25409                                               VkDeviceSize* pOffset,
25410                                               VkDeviceSize* pRowPitchAlignment, uint32_t doLock) {
25411     (void)doLock;
25412     bool queueSubmitWithCommandsEnabled =
25413         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25414     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25415     auto stream = mImpl->stream();
25416     auto pool = mImpl->pool();
25417     VkDevice local_device;
25418     VkImageCreateInfo* local_pCreateInfo;
25419     local_device = device;
25420     local_pCreateInfo = nullptr;
25421     if (pCreateInfo) {
25422         local_pCreateInfo = (VkImageCreateInfo*)pool->alloc(sizeof(const VkImageCreateInfo));
25423         deepcopy_VkImageCreateInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pCreateInfo,
25424                                    (VkImageCreateInfo*)(local_pCreateInfo));
25425     }
25426     if (local_pCreateInfo) {
25427         sResourceTracker->transformImpl_VkImageCreateInfo_tohost(local_pCreateInfo, 1);
25428         transform_tohost_VkImageCreateInfo(sResourceTracker,
25429                                            (VkImageCreateInfo*)(local_pCreateInfo));
25430     }
25431     size_t count = 0;
25432     size_t* countPtr = &count;
25433     {
25434         uint64_t cgen_var_0;
25435         *countPtr += 1 * 8;
25436         count_VkImageCreateInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
25437                                 (VkImageCreateInfo*)(local_pCreateInfo), countPtr);
25438         *countPtr += sizeof(VkDeviceSize);
25439         *countPtr += sizeof(VkDeviceSize);
25440     }
25441     uint32_t packetSize_vkGetLinearImageLayout2GOOGLE =
25442         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25443     uint8_t* streamPtr = stream->reserve(packetSize_vkGetLinearImageLayout2GOOGLE);
25444     uint8_t* packetBeginPtr = streamPtr;
25445     uint8_t** streamPtrPtr = &streamPtr;
25446     uint32_t opcode_vkGetLinearImageLayout2GOOGLE = OP_vkGetLinearImageLayout2GOOGLE;
25447     uint32_t seqno;
25448     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25449     memcpy(streamPtr, &opcode_vkGetLinearImageLayout2GOOGLE, sizeof(uint32_t));
25450     streamPtr += sizeof(uint32_t);
25451     memcpy(streamPtr, &packetSize_vkGetLinearImageLayout2GOOGLE, sizeof(uint32_t));
25452     streamPtr += sizeof(uint32_t);
25453     if (queueSubmitWithCommandsEnabled) {
25454         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25455         streamPtr += sizeof(uint32_t);
25456     }
25457     uint64_t cgen_var_0;
25458     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
25459     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25460     *streamPtrPtr += 1 * 8;
25461     reservedmarshal_VkImageCreateInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
25462                                       (VkImageCreateInfo*)(local_pCreateInfo), streamPtrPtr);
25463     memcpy(*streamPtrPtr, (VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
25464     *streamPtrPtr += sizeof(VkDeviceSize);
25465     memcpy(*streamPtrPtr, (VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
25466     *streamPtrPtr += sizeof(VkDeviceSize);
25467     stream->read((VkDeviceSize*)pOffset, sizeof(VkDeviceSize));
25468     stream->read((VkDeviceSize*)pRowPitchAlignment, sizeof(VkDeviceSize));
25469     ++encodeCount;
25470     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25471         pool->freeAll();
25472         stream->clearPool();
25473     }
25474     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25475 }
25476 
vkQueueFlushCommandsGOOGLE(VkQueue queue,VkCommandBuffer commandBuffer,VkDeviceSize dataSize,const void * pData,uint32_t doLock)25477 void VkEncoder::vkQueueFlushCommandsGOOGLE(VkQueue queue, VkCommandBuffer commandBuffer,
25478                                            VkDeviceSize dataSize, const void* pData,
25479                                            uint32_t doLock) {
25480 #include "vkQueueFlushCommandsGOOGLE_encode_impl.cpp.inl"
25481 }
25482 
vkQueueCommitDescriptorSetUpdatesGOOGLE(VkQueue queue,uint32_t descriptorPoolCount,const VkDescriptorPool * pDescriptorPools,uint32_t descriptorSetCount,const VkDescriptorSetLayout * pSetLayouts,const uint64_t * pDescriptorSetPoolIds,const uint32_t * pDescriptorSetWhichPool,const uint32_t * pDescriptorSetPendingAllocation,const uint32_t * pDescriptorWriteStartingIndices,uint32_t pendingDescriptorWriteCount,const VkWriteDescriptorSet * pPendingDescriptorWrites,uint32_t doLock)25483 void VkEncoder::vkQueueCommitDescriptorSetUpdatesGOOGLE(
25484     VkQueue queue, uint32_t descriptorPoolCount, const VkDescriptorPool* pDescriptorPools,
25485     uint32_t descriptorSetCount, const VkDescriptorSetLayout* pSetLayouts,
25486     const uint64_t* pDescriptorSetPoolIds, const uint32_t* pDescriptorSetWhichPool,
25487     const uint32_t* pDescriptorSetPendingAllocation,
25488     const uint32_t* pDescriptorWriteStartingIndices, uint32_t pendingDescriptorWriteCount,
25489     const VkWriteDescriptorSet* pPendingDescriptorWrites, uint32_t doLock) {
25490     (void)doLock;
25491     bool queueSubmitWithCommandsEnabled =
25492         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25493     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25494     auto stream = mImpl->stream();
25495     auto pool = mImpl->pool();
25496     VkQueue local_queue;
25497     uint32_t local_descriptorPoolCount;
25498     VkDescriptorPool* local_pDescriptorPools;
25499     uint32_t local_descriptorSetCount;
25500     VkDescriptorSetLayout* local_pSetLayouts;
25501     uint64_t* local_pDescriptorSetPoolIds;
25502     uint32_t* local_pDescriptorSetWhichPool;
25503     uint32_t* local_pDescriptorSetPendingAllocation;
25504     uint32_t* local_pDescriptorWriteStartingIndices;
25505     uint32_t local_pendingDescriptorWriteCount;
25506     VkWriteDescriptorSet* local_pPendingDescriptorWrites;
25507     local_queue = queue;
25508     local_descriptorPoolCount = descriptorPoolCount;
25509     // Avoiding deepcopy for pDescriptorPools
25510     local_pDescriptorPools = (VkDescriptorPool*)pDescriptorPools;
25511     local_descriptorSetCount = descriptorSetCount;
25512     // Avoiding deepcopy for pSetLayouts
25513     local_pSetLayouts = (VkDescriptorSetLayout*)pSetLayouts;
25514     // Avoiding deepcopy for pDescriptorSetPoolIds
25515     local_pDescriptorSetPoolIds = (uint64_t*)pDescriptorSetPoolIds;
25516     // Avoiding deepcopy for pDescriptorSetWhichPool
25517     local_pDescriptorSetWhichPool = (uint32_t*)pDescriptorSetWhichPool;
25518     // Avoiding deepcopy for pDescriptorSetPendingAllocation
25519     local_pDescriptorSetPendingAllocation = (uint32_t*)pDescriptorSetPendingAllocation;
25520     // Avoiding deepcopy for pDescriptorWriteStartingIndices
25521     local_pDescriptorWriteStartingIndices = (uint32_t*)pDescriptorWriteStartingIndices;
25522     local_pendingDescriptorWriteCount = pendingDescriptorWriteCount;
25523     local_pPendingDescriptorWrites = nullptr;
25524     if (pPendingDescriptorWrites) {
25525         local_pPendingDescriptorWrites = (VkWriteDescriptorSet*)pool->alloc(
25526             ((pendingDescriptorWriteCount)) * sizeof(const VkWriteDescriptorSet));
25527         for (uint32_t i = 0; i < (uint32_t)((pendingDescriptorWriteCount)); ++i) {
25528             deepcopy_VkWriteDescriptorSet(
25529                 pool, VK_STRUCTURE_TYPE_MAX_ENUM, pPendingDescriptorWrites + i,
25530                 (VkWriteDescriptorSet*)(local_pPendingDescriptorWrites + i));
25531         }
25532     }
25533     if (local_pPendingDescriptorWrites) {
25534         for (uint32_t i = 0; i < (uint32_t)((pendingDescriptorWriteCount)); ++i) {
25535             transform_tohost_VkWriteDescriptorSet(
25536                 sResourceTracker, (VkWriteDescriptorSet*)(local_pPendingDescriptorWrites + i));
25537         }
25538     }
25539     size_t count = 0;
25540     size_t* countPtr = &count;
25541     {
25542         uint64_t cgen_var_0;
25543         *countPtr += 1 * 8;
25544         *countPtr += sizeof(uint32_t);
25545         if (((descriptorPoolCount))) {
25546             *countPtr += ((descriptorPoolCount)) * 8;
25547         }
25548         *countPtr += sizeof(uint32_t);
25549         if (((descriptorSetCount))) {
25550             *countPtr += ((descriptorSetCount)) * 8;
25551         }
25552         *countPtr += ((descriptorSetCount)) * sizeof(uint64_t);
25553         *countPtr += ((descriptorSetCount)) * sizeof(uint32_t);
25554         *countPtr += ((descriptorSetCount)) * sizeof(uint32_t);
25555         *countPtr += ((descriptorSetCount)) * sizeof(uint32_t);
25556         *countPtr += sizeof(uint32_t);
25557         for (uint32_t i = 0; i < (uint32_t)((pendingDescriptorWriteCount)); ++i) {
25558             count_VkWriteDescriptorSet(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
25559                                        (VkWriteDescriptorSet*)(local_pPendingDescriptorWrites + i),
25560                                        countPtr);
25561         }
25562     }
25563     uint32_t packetSize_vkQueueCommitDescriptorSetUpdatesGOOGLE =
25564         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25565     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueCommitDescriptorSetUpdatesGOOGLE);
25566     uint8_t* packetBeginPtr = streamPtr;
25567     uint8_t** streamPtrPtr = &streamPtr;
25568     uint32_t opcode_vkQueueCommitDescriptorSetUpdatesGOOGLE =
25569         OP_vkQueueCommitDescriptorSetUpdatesGOOGLE;
25570     uint32_t seqno;
25571     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25572     memcpy(streamPtr, &opcode_vkQueueCommitDescriptorSetUpdatesGOOGLE, sizeof(uint32_t));
25573     streamPtr += sizeof(uint32_t);
25574     memcpy(streamPtr, &packetSize_vkQueueCommitDescriptorSetUpdatesGOOGLE, sizeof(uint32_t));
25575     streamPtr += sizeof(uint32_t);
25576     if (queueSubmitWithCommandsEnabled) {
25577         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25578         streamPtr += sizeof(uint32_t);
25579     }
25580     uint64_t cgen_var_0;
25581     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
25582     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25583     *streamPtrPtr += 1 * 8;
25584     memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorPoolCount, sizeof(uint32_t));
25585     *streamPtrPtr += sizeof(uint32_t);
25586     if (((descriptorPoolCount))) {
25587         uint8_t* cgen_var_1_ptr = (uint8_t*)(*streamPtrPtr);
25588         for (uint32_t k = 0; k < ((descriptorPoolCount)); ++k) {
25589             uint64_t tmpval = get_host_u64_VkDescriptorPool(local_pDescriptorPools[k]);
25590             memcpy(cgen_var_1_ptr + k * 8, &tmpval, sizeof(uint64_t));
25591         }
25592         *streamPtrPtr += 8 * ((descriptorPoolCount));
25593     }
25594     memcpy(*streamPtrPtr, (uint32_t*)&local_descriptorSetCount, sizeof(uint32_t));
25595     *streamPtrPtr += sizeof(uint32_t);
25596     if (((descriptorSetCount))) {
25597         uint8_t* cgen_var_2_ptr = (uint8_t*)(*streamPtrPtr);
25598         for (uint32_t k = 0; k < ((descriptorSetCount)); ++k) {
25599             uint64_t tmpval = get_host_u64_VkDescriptorSetLayout(local_pSetLayouts[k]);
25600             memcpy(cgen_var_2_ptr + k * 8, &tmpval, sizeof(uint64_t));
25601         }
25602         *streamPtrPtr += 8 * ((descriptorSetCount));
25603     }
25604     memcpy(*streamPtrPtr, (uint64_t*)local_pDescriptorSetPoolIds,
25605            ((descriptorSetCount)) * sizeof(uint64_t));
25606     *streamPtrPtr += ((descriptorSetCount)) * sizeof(uint64_t);
25607     memcpy(*streamPtrPtr, (uint32_t*)local_pDescriptorSetWhichPool,
25608            ((descriptorSetCount)) * sizeof(uint32_t));
25609     *streamPtrPtr += ((descriptorSetCount)) * sizeof(uint32_t);
25610     memcpy(*streamPtrPtr, (uint32_t*)local_pDescriptorSetPendingAllocation,
25611            ((descriptorSetCount)) * sizeof(uint32_t));
25612     *streamPtrPtr += ((descriptorSetCount)) * sizeof(uint32_t);
25613     memcpy(*streamPtrPtr, (uint32_t*)local_pDescriptorWriteStartingIndices,
25614            ((descriptorSetCount)) * sizeof(uint32_t));
25615     *streamPtrPtr += ((descriptorSetCount)) * sizeof(uint32_t);
25616     memcpy(*streamPtrPtr, (uint32_t*)&local_pendingDescriptorWriteCount, sizeof(uint32_t));
25617     *streamPtrPtr += sizeof(uint32_t);
25618     for (uint32_t i = 0; i < (uint32_t)((pendingDescriptorWriteCount)); ++i) {
25619         reservedmarshal_VkWriteDescriptorSet(
25620             stream, VK_STRUCTURE_TYPE_MAX_ENUM,
25621             (VkWriteDescriptorSet*)(local_pPendingDescriptorWrites + i), streamPtrPtr);
25622     }
25623     stream->flush();
25624     ++encodeCount;
25625     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25626         pool->freeAll();
25627         stream->clearPool();
25628     }
25629     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25630 }
25631 
vkCollectDescriptorPoolIdsGOOGLE(VkDevice device,VkDescriptorPool descriptorPool,uint32_t * pPoolIdCount,uint64_t * pPoolIds,uint32_t doLock)25632 void VkEncoder::vkCollectDescriptorPoolIdsGOOGLE(VkDevice device, VkDescriptorPool descriptorPool,
25633                                                  uint32_t* pPoolIdCount, uint64_t* pPoolIds,
25634                                                  uint32_t doLock) {
25635     (void)doLock;
25636     bool queueSubmitWithCommandsEnabled =
25637         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25638     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25639     auto stream = mImpl->stream();
25640     auto pool = mImpl->pool();
25641     VkDevice local_device;
25642     VkDescriptorPool local_descriptorPool;
25643     local_device = device;
25644     local_descriptorPool = descriptorPool;
25645     size_t count = 0;
25646     size_t* countPtr = &count;
25647     {
25648         uint64_t cgen_var_0;
25649         *countPtr += 1 * 8;
25650         uint64_t cgen_var_1;
25651         *countPtr += 1 * 8;
25652         *countPtr += sizeof(uint32_t);
25653         // WARNING PTR CHECK
25654         *countPtr += 8;
25655         if (pPoolIds) {
25656             if (pPoolIdCount) {
25657                 *countPtr += (*(pPoolIdCount)) * sizeof(uint64_t);
25658             }
25659         }
25660     }
25661     uint32_t packetSize_vkCollectDescriptorPoolIdsGOOGLE =
25662         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25663     uint8_t* streamPtr = stream->reserve(packetSize_vkCollectDescriptorPoolIdsGOOGLE);
25664     uint8_t* packetBeginPtr = streamPtr;
25665     uint8_t** streamPtrPtr = &streamPtr;
25666     uint32_t opcode_vkCollectDescriptorPoolIdsGOOGLE = OP_vkCollectDescriptorPoolIdsGOOGLE;
25667     uint32_t seqno;
25668     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25669     memcpy(streamPtr, &opcode_vkCollectDescriptorPoolIdsGOOGLE, sizeof(uint32_t));
25670     streamPtr += sizeof(uint32_t);
25671     memcpy(streamPtr, &packetSize_vkCollectDescriptorPoolIdsGOOGLE, sizeof(uint32_t));
25672     streamPtr += sizeof(uint32_t);
25673     if (queueSubmitWithCommandsEnabled) {
25674         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25675         streamPtr += sizeof(uint32_t);
25676     }
25677     uint64_t cgen_var_0;
25678     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
25679     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25680     *streamPtrPtr += 1 * 8;
25681     uint64_t cgen_var_1;
25682     *&cgen_var_1 = get_host_u64_VkDescriptorPool((*&local_descriptorPool));
25683     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
25684     *streamPtrPtr += 1 * 8;
25685     memcpy(*streamPtrPtr, (uint32_t*)pPoolIdCount, sizeof(uint32_t));
25686     *streamPtrPtr += sizeof(uint32_t);
25687     // WARNING PTR CHECK
25688     uint64_t cgen_var_2 = (uint64_t)(uintptr_t)pPoolIds;
25689     memcpy((*streamPtrPtr), &cgen_var_2, 8);
25690     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
25691     *streamPtrPtr += 8;
25692     if (pPoolIds) {
25693         memcpy(*streamPtrPtr, (uint64_t*)pPoolIds, (*(pPoolIdCount)) * sizeof(uint64_t));
25694         *streamPtrPtr += (*(pPoolIdCount)) * sizeof(uint64_t);
25695     }
25696     stream->read((uint32_t*)pPoolIdCount, sizeof(uint32_t));
25697     // WARNING PTR CHECK
25698     uint64_t* check_pPoolIds;
25699     check_pPoolIds = (uint64_t*)(uintptr_t)stream->getBe64();
25700     if (pPoolIds) {
25701         if (!(check_pPoolIds)) {
25702             fprintf(stderr, "fatal: pPoolIds inconsistent between guest and host\n");
25703         }
25704         stream->read((uint64_t*)pPoolIds, (*(pPoolIdCount)) * sizeof(uint64_t));
25705     }
25706     ++encodeCount;
25707     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25708         pool->freeAll();
25709         stream->clearPool();
25710     }
25711     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25712 }
25713 
vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(VkQueue queue,uint32_t waitSemaphoreCount,const VkSemaphore * pWaitSemaphores,VkImage image,uint32_t doLock)25714 void VkEncoder::vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(VkQueue queue,
25715                                                             uint32_t waitSemaphoreCount,
25716                                                             const VkSemaphore* pWaitSemaphores,
25717                                                             VkImage image, uint32_t doLock) {
25718     (void)doLock;
25719     bool queueSubmitWithCommandsEnabled =
25720         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25721     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25722     auto stream = mImpl->stream();
25723     auto pool = mImpl->pool();
25724     VkQueue local_queue;
25725     uint32_t local_waitSemaphoreCount;
25726     VkSemaphore* local_pWaitSemaphores;
25727     VkImage local_image;
25728     local_queue = queue;
25729     local_waitSemaphoreCount = waitSemaphoreCount;
25730     // Avoiding deepcopy for pWaitSemaphores
25731     local_pWaitSemaphores = (VkSemaphore*)pWaitSemaphores;
25732     local_image = image;
25733     size_t count = 0;
25734     size_t* countPtr = &count;
25735     {
25736         uint64_t cgen_var_0;
25737         *countPtr += 1 * 8;
25738         *countPtr += sizeof(uint32_t);
25739         // WARNING PTR CHECK
25740         *countPtr += 8;
25741         if (local_pWaitSemaphores) {
25742             if (((waitSemaphoreCount))) {
25743                 *countPtr += ((waitSemaphoreCount)) * 8;
25744             }
25745         }
25746         uint64_t cgen_var_1;
25747         *countPtr += 1 * 8;
25748     }
25749     uint32_t packetSize_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE =
25750         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25751     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE);
25752     uint8_t* packetBeginPtr = streamPtr;
25753     uint8_t** streamPtrPtr = &streamPtr;
25754     uint32_t opcode_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE =
25755         OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE;
25756     uint32_t seqno;
25757     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25758     memcpy(streamPtr, &opcode_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE, sizeof(uint32_t));
25759     streamPtr += sizeof(uint32_t);
25760     memcpy(streamPtr, &packetSize_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE, sizeof(uint32_t));
25761     streamPtr += sizeof(uint32_t);
25762     if (queueSubmitWithCommandsEnabled) {
25763         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25764         streamPtr += sizeof(uint32_t);
25765     }
25766     uint64_t cgen_var_0;
25767     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
25768     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25769     *streamPtrPtr += 1 * 8;
25770     memcpy(*streamPtrPtr, (uint32_t*)&local_waitSemaphoreCount, sizeof(uint32_t));
25771     *streamPtrPtr += sizeof(uint32_t);
25772     // WARNING PTR CHECK
25773     uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pWaitSemaphores;
25774     memcpy((*streamPtrPtr), &cgen_var_1, 8);
25775     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
25776     *streamPtrPtr += 8;
25777     if (local_pWaitSemaphores) {
25778         if (((waitSemaphoreCount))) {
25779             uint8_t* cgen_var_1_0_ptr = (uint8_t*)(*streamPtrPtr);
25780             for (uint32_t k = 0; k < ((waitSemaphoreCount)); ++k) {
25781                 uint64_t tmpval = get_host_u64_VkSemaphore(local_pWaitSemaphores[k]);
25782                 memcpy(cgen_var_1_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
25783             }
25784             *streamPtrPtr += 8 * ((waitSemaphoreCount));
25785         }
25786     }
25787     uint64_t cgen_var_2;
25788     *&cgen_var_2 = get_host_u64_VkImage((*&local_image));
25789     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
25790     *streamPtrPtr += 1 * 8;
25791     stream->flush();
25792     ++encodeCount;
25793     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25794         pool->freeAll();
25795         stream->clearPool();
25796     }
25797     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25798 }
25799 
vkQueueFlushCommandsFromAuxMemoryGOOGLE(VkQueue queue,VkCommandBuffer commandBuffer,VkDeviceMemory deviceMemory,VkDeviceSize dataOffset,VkDeviceSize dataSize,uint32_t doLock)25800 void VkEncoder::vkQueueFlushCommandsFromAuxMemoryGOOGLE(VkQueue queue,
25801                                                         VkCommandBuffer commandBuffer,
25802                                                         VkDeviceMemory deviceMemory,
25803                                                         VkDeviceSize dataOffset,
25804                                                         VkDeviceSize dataSize, uint32_t doLock) {
25805     (void)doLock;
25806     bool queueSubmitWithCommandsEnabled =
25807         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25808     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25809     auto stream = mImpl->stream();
25810     auto pool = mImpl->pool();
25811     VkQueue local_queue;
25812     VkCommandBuffer local_commandBuffer;
25813     VkDeviceMemory local_deviceMemory;
25814     VkDeviceSize local_dataOffset;
25815     VkDeviceSize local_dataSize;
25816     local_queue = queue;
25817     local_commandBuffer = commandBuffer;
25818     local_deviceMemory = deviceMemory;
25819     local_dataOffset = dataOffset;
25820     local_dataSize = dataSize;
25821     size_t count = 0;
25822     size_t* countPtr = &count;
25823     {
25824         uint64_t cgen_var_0;
25825         *countPtr += 1 * 8;
25826         uint64_t cgen_var_1;
25827         *countPtr += 1 * 8;
25828         uint64_t cgen_var_2;
25829         *countPtr += 1 * 8;
25830         *countPtr += sizeof(VkDeviceSize);
25831         *countPtr += sizeof(VkDeviceSize);
25832     }
25833     uint32_t packetSize_vkQueueFlushCommandsFromAuxMemoryGOOGLE =
25834         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25835     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueFlushCommandsFromAuxMemoryGOOGLE);
25836     uint8_t* packetBeginPtr = streamPtr;
25837     uint8_t** streamPtrPtr = &streamPtr;
25838     uint32_t opcode_vkQueueFlushCommandsFromAuxMemoryGOOGLE =
25839         OP_vkQueueFlushCommandsFromAuxMemoryGOOGLE;
25840     uint32_t seqno;
25841     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25842     memcpy(streamPtr, &opcode_vkQueueFlushCommandsFromAuxMemoryGOOGLE, sizeof(uint32_t));
25843     streamPtr += sizeof(uint32_t);
25844     memcpy(streamPtr, &packetSize_vkQueueFlushCommandsFromAuxMemoryGOOGLE, sizeof(uint32_t));
25845     streamPtr += sizeof(uint32_t);
25846     if (queueSubmitWithCommandsEnabled) {
25847         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25848         streamPtr += sizeof(uint32_t);
25849     }
25850     uint64_t cgen_var_0;
25851     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
25852     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25853     *streamPtrPtr += 1 * 8;
25854     uint64_t cgen_var_1;
25855     *&cgen_var_1 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
25856     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
25857     *streamPtrPtr += 1 * 8;
25858     uint64_t cgen_var_2;
25859     *&cgen_var_2 = get_host_u64_VkDeviceMemory((*&local_deviceMemory));
25860     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
25861     *streamPtrPtr += 1 * 8;
25862     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dataOffset, sizeof(VkDeviceSize));
25863     *streamPtrPtr += sizeof(VkDeviceSize);
25864     memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dataSize, sizeof(VkDeviceSize));
25865     *streamPtrPtr += sizeof(VkDeviceSize);
25866     stream->flush();
25867     ++encodeCount;
25868     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25869         pool->freeAll();
25870         stream->clearPool();
25871     }
25872     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25873 }
25874 
vkGetBlobGOOGLE(VkDevice device,VkDeviceMemory memory,uint32_t doLock)25875 VkResult VkEncoder::vkGetBlobGOOGLE(VkDevice device, VkDeviceMemory memory, uint32_t doLock) {
25876     (void)doLock;
25877     bool queueSubmitWithCommandsEnabled =
25878         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25879     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25880     auto stream = mImpl->stream();
25881     auto pool = mImpl->pool();
25882     VkDevice local_device;
25883     VkDeviceMemory local_memory;
25884     local_device = device;
25885     local_memory = memory;
25886     sResourceTracker->deviceMemoryTransform_tohost(
25887         (VkDeviceMemory*)&local_memory, 1, (VkDeviceSize*)nullptr, 0, (VkDeviceSize*)nullptr, 0,
25888         (uint32_t*)nullptr, 0, (uint32_t*)nullptr, 0);
25889     size_t count = 0;
25890     size_t* countPtr = &count;
25891     {
25892         uint64_t cgen_var_0;
25893         *countPtr += 1 * 8;
25894         uint64_t cgen_var_1;
25895         *countPtr += 1 * 8;
25896     }
25897     uint32_t packetSize_vkGetBlobGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
25898     uint8_t* streamPtr = stream->reserve(packetSize_vkGetBlobGOOGLE);
25899     uint8_t* packetBeginPtr = streamPtr;
25900     uint8_t** streamPtrPtr = &streamPtr;
25901     uint32_t opcode_vkGetBlobGOOGLE = OP_vkGetBlobGOOGLE;
25902     uint32_t seqno;
25903     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
25904     memcpy(streamPtr, &opcode_vkGetBlobGOOGLE, sizeof(uint32_t));
25905     streamPtr += sizeof(uint32_t);
25906     memcpy(streamPtr, &packetSize_vkGetBlobGOOGLE, sizeof(uint32_t));
25907     streamPtr += sizeof(uint32_t);
25908     if (queueSubmitWithCommandsEnabled) {
25909         memcpy(streamPtr, &seqno, sizeof(uint32_t));
25910         streamPtr += sizeof(uint32_t);
25911     }
25912     uint64_t cgen_var_0;
25913     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
25914     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
25915     *streamPtrPtr += 1 * 8;
25916     uint64_t cgen_var_1;
25917     *&cgen_var_1 = get_host_u64_VkDeviceMemory((*&local_memory));
25918     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
25919     *streamPtrPtr += 1 * 8;
25920     VkResult vkGetBlobGOOGLE_VkResult_return = (VkResult)0;
25921     stream->read(&vkGetBlobGOOGLE_VkResult_return, sizeof(VkResult));
25922     ++encodeCount;
25923     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
25924         pool->freeAll();
25925         stream->clearPool();
25926     }
25927     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
25928     return vkGetBlobGOOGLE_VkResult_return;
25929 }
25930 
vkUpdateDescriptorSetWithTemplateSized2GOOGLE(VkDevice device,VkDescriptorSet descriptorSet,VkDescriptorUpdateTemplate descriptorUpdateTemplate,uint32_t imageInfoCount,uint32_t bufferInfoCount,uint32_t bufferViewCount,uint32_t inlineUniformBlockCount,const uint32_t * pImageInfoEntryIndices,const uint32_t * pBufferInfoEntryIndices,const uint32_t * pBufferViewEntryIndices,const VkDescriptorImageInfo * pImageInfos,const VkDescriptorBufferInfo * pBufferInfos,const VkBufferView * pBufferViews,const uint8_t * pInlineUniformBlockData,uint32_t doLock)25931 void VkEncoder::vkUpdateDescriptorSetWithTemplateSized2GOOGLE(
25932     VkDevice device, VkDescriptorSet descriptorSet,
25933     VkDescriptorUpdateTemplate descriptorUpdateTemplate, uint32_t imageInfoCount,
25934     uint32_t bufferInfoCount, uint32_t bufferViewCount, uint32_t inlineUniformBlockCount,
25935     const uint32_t* pImageInfoEntryIndices, const uint32_t* pBufferInfoEntryIndices,
25936     const uint32_t* pBufferViewEntryIndices, const VkDescriptorImageInfo* pImageInfos,
25937     const VkDescriptorBufferInfo* pBufferInfos, const VkBufferView* pBufferViews,
25938     const uint8_t* pInlineUniformBlockData, uint32_t doLock) {
25939     (void)doLock;
25940     bool queueSubmitWithCommandsEnabled =
25941         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
25942     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
25943     auto stream = mImpl->stream();
25944     auto pool = mImpl->pool();
25945     VkDevice local_device;
25946     VkDescriptorSet local_descriptorSet;
25947     VkDescriptorUpdateTemplate local_descriptorUpdateTemplate;
25948     uint32_t local_imageInfoCount;
25949     uint32_t local_bufferInfoCount;
25950     uint32_t local_bufferViewCount;
25951     uint32_t local_inlineUniformBlockCount;
25952     uint32_t* local_pImageInfoEntryIndices;
25953     uint32_t* local_pBufferInfoEntryIndices;
25954     uint32_t* local_pBufferViewEntryIndices;
25955     VkDescriptorImageInfo* local_pImageInfos;
25956     VkDescriptorBufferInfo* local_pBufferInfos;
25957     VkBufferView* local_pBufferViews;
25958     uint8_t* local_pInlineUniformBlockData;
25959     local_device = device;
25960     local_descriptorSet = descriptorSet;
25961     local_descriptorUpdateTemplate = descriptorUpdateTemplate;
25962     local_imageInfoCount = imageInfoCount;
25963     local_bufferInfoCount = bufferInfoCount;
25964     local_bufferViewCount = bufferViewCount;
25965     local_inlineUniformBlockCount = inlineUniformBlockCount;
25966     // Avoiding deepcopy for pImageInfoEntryIndices
25967     local_pImageInfoEntryIndices = (uint32_t*)pImageInfoEntryIndices;
25968     // Avoiding deepcopy for pBufferInfoEntryIndices
25969     local_pBufferInfoEntryIndices = (uint32_t*)pBufferInfoEntryIndices;
25970     // Avoiding deepcopy for pBufferViewEntryIndices
25971     local_pBufferViewEntryIndices = (uint32_t*)pBufferViewEntryIndices;
25972     local_pImageInfos = nullptr;
25973     if (pImageInfos) {
25974         local_pImageInfos = (VkDescriptorImageInfo*)pool->alloc(
25975             ((imageInfoCount)) * sizeof(const VkDescriptorImageInfo));
25976         for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i) {
25977             deepcopy_VkDescriptorImageInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pImageInfos + i,
25978                                            (VkDescriptorImageInfo*)(local_pImageInfos + i));
25979         }
25980     }
25981     local_pBufferInfos = nullptr;
25982     if (pBufferInfos) {
25983         local_pBufferInfos = (VkDescriptorBufferInfo*)pool->alloc(
25984             ((bufferInfoCount)) * sizeof(const VkDescriptorBufferInfo));
25985         for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i) {
25986             deepcopy_VkDescriptorBufferInfo(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pBufferInfos + i,
25987                                             (VkDescriptorBufferInfo*)(local_pBufferInfos + i));
25988         }
25989     }
25990     // Avoiding deepcopy for pBufferViews
25991     local_pBufferViews = (VkBufferView*)pBufferViews;
25992     // Avoiding deepcopy for pInlineUniformBlockData
25993     local_pInlineUniformBlockData = (uint8_t*)pInlineUniformBlockData;
25994     if (local_pImageInfos) {
25995         for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i) {
25996             transform_tohost_VkDescriptorImageInfo(sResourceTracker,
25997                                                    (VkDescriptorImageInfo*)(local_pImageInfos + i));
25998         }
25999     }
26000     if (local_pBufferInfos) {
26001         for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i) {
26002             transform_tohost_VkDescriptorBufferInfo(
26003                 sResourceTracker, (VkDescriptorBufferInfo*)(local_pBufferInfos + i));
26004         }
26005     }
26006     size_t count = 0;
26007     size_t* countPtr = &count;
26008     {
26009         uint64_t cgen_var_0;
26010         *countPtr += 1 * 8;
26011         uint64_t cgen_var_1;
26012         *countPtr += 1 * 8;
26013         uint64_t cgen_var_2;
26014         *countPtr += 1 * 8;
26015         *countPtr += sizeof(uint32_t);
26016         *countPtr += sizeof(uint32_t);
26017         *countPtr += sizeof(uint32_t);
26018         *countPtr += sizeof(uint32_t);
26019         // WARNING PTR CHECK
26020         *countPtr += 8;
26021         if (local_pImageInfoEntryIndices) {
26022             *countPtr += ((imageInfoCount)) * sizeof(uint32_t);
26023         }
26024         // WARNING PTR CHECK
26025         *countPtr += 8;
26026         if (local_pBufferInfoEntryIndices) {
26027             *countPtr += ((bufferInfoCount)) * sizeof(uint32_t);
26028         }
26029         // WARNING PTR CHECK
26030         *countPtr += 8;
26031         if (local_pBufferViewEntryIndices) {
26032             *countPtr += ((bufferViewCount)) * sizeof(uint32_t);
26033         }
26034         // WARNING PTR CHECK
26035         *countPtr += 8;
26036         if (local_pImageInfos) {
26037             for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i) {
26038                 count_VkDescriptorImageInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
26039                                             (VkDescriptorImageInfo*)(local_pImageInfos + i),
26040                                             countPtr);
26041             }
26042         }
26043         // WARNING PTR CHECK
26044         *countPtr += 8;
26045         if (local_pBufferInfos) {
26046             for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i) {
26047                 count_VkDescriptorBufferInfo(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
26048                                              (VkDescriptorBufferInfo*)(local_pBufferInfos + i),
26049                                              countPtr);
26050             }
26051         }
26052         // WARNING PTR CHECK
26053         *countPtr += 8;
26054         if (local_pBufferViews) {
26055             if (((bufferViewCount))) {
26056                 *countPtr += ((bufferViewCount)) * 8;
26057             }
26058         }
26059         // WARNING PTR CHECK
26060         *countPtr += 8;
26061         if (local_pInlineUniformBlockData) {
26062             *countPtr += ((inlineUniformBlockCount)) * sizeof(uint8_t);
26063         }
26064     }
26065     uint32_t packetSize_vkUpdateDescriptorSetWithTemplateSized2GOOGLE =
26066         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
26067     uint8_t* streamPtr = stream->reserve(packetSize_vkUpdateDescriptorSetWithTemplateSized2GOOGLE);
26068     uint8_t* packetBeginPtr = streamPtr;
26069     uint8_t** streamPtrPtr = &streamPtr;
26070     uint32_t opcode_vkUpdateDescriptorSetWithTemplateSized2GOOGLE =
26071         OP_vkUpdateDescriptorSetWithTemplateSized2GOOGLE;
26072     uint32_t seqno;
26073     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
26074     memcpy(streamPtr, &opcode_vkUpdateDescriptorSetWithTemplateSized2GOOGLE, sizeof(uint32_t));
26075     streamPtr += sizeof(uint32_t);
26076     memcpy(streamPtr, &packetSize_vkUpdateDescriptorSetWithTemplateSized2GOOGLE, sizeof(uint32_t));
26077     streamPtr += sizeof(uint32_t);
26078     if (queueSubmitWithCommandsEnabled) {
26079         memcpy(streamPtr, &seqno, sizeof(uint32_t));
26080         streamPtr += sizeof(uint32_t);
26081     }
26082     uint64_t cgen_var_0;
26083     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
26084     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
26085     *streamPtrPtr += 1 * 8;
26086     uint64_t cgen_var_1;
26087     *&cgen_var_1 = get_host_u64_VkDescriptorSet((*&local_descriptorSet));
26088     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
26089     *streamPtrPtr += 1 * 8;
26090     uint64_t cgen_var_2;
26091     *&cgen_var_2 = get_host_u64_VkDescriptorUpdateTemplate((*&local_descriptorUpdateTemplate));
26092     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
26093     *streamPtrPtr += 1 * 8;
26094     memcpy(*streamPtrPtr, (uint32_t*)&local_imageInfoCount, sizeof(uint32_t));
26095     *streamPtrPtr += sizeof(uint32_t);
26096     memcpy(*streamPtrPtr, (uint32_t*)&local_bufferInfoCount, sizeof(uint32_t));
26097     *streamPtrPtr += sizeof(uint32_t);
26098     memcpy(*streamPtrPtr, (uint32_t*)&local_bufferViewCount, sizeof(uint32_t));
26099     *streamPtrPtr += sizeof(uint32_t);
26100     memcpy(*streamPtrPtr, (uint32_t*)&local_inlineUniformBlockCount, sizeof(uint32_t));
26101     *streamPtrPtr += sizeof(uint32_t);
26102     // WARNING PTR CHECK
26103     uint64_t cgen_var_3 = (uint64_t)(uintptr_t)local_pImageInfoEntryIndices;
26104     memcpy((*streamPtrPtr), &cgen_var_3, 8);
26105     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
26106     *streamPtrPtr += 8;
26107     if (local_pImageInfoEntryIndices) {
26108         memcpy(*streamPtrPtr, (uint32_t*)local_pImageInfoEntryIndices,
26109                ((imageInfoCount)) * sizeof(uint32_t));
26110         *streamPtrPtr += ((imageInfoCount)) * sizeof(uint32_t);
26111     }
26112     // WARNING PTR CHECK
26113     uint64_t cgen_var_4 = (uint64_t)(uintptr_t)local_pBufferInfoEntryIndices;
26114     memcpy((*streamPtrPtr), &cgen_var_4, 8);
26115     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
26116     *streamPtrPtr += 8;
26117     if (local_pBufferInfoEntryIndices) {
26118         memcpy(*streamPtrPtr, (uint32_t*)local_pBufferInfoEntryIndices,
26119                ((bufferInfoCount)) * sizeof(uint32_t));
26120         *streamPtrPtr += ((bufferInfoCount)) * sizeof(uint32_t);
26121     }
26122     // WARNING PTR CHECK
26123     uint64_t cgen_var_5 = (uint64_t)(uintptr_t)local_pBufferViewEntryIndices;
26124     memcpy((*streamPtrPtr), &cgen_var_5, 8);
26125     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
26126     *streamPtrPtr += 8;
26127     if (local_pBufferViewEntryIndices) {
26128         memcpy(*streamPtrPtr, (uint32_t*)local_pBufferViewEntryIndices,
26129                ((bufferViewCount)) * sizeof(uint32_t));
26130         *streamPtrPtr += ((bufferViewCount)) * sizeof(uint32_t);
26131     }
26132     // WARNING PTR CHECK
26133     uint64_t cgen_var_6 = (uint64_t)(uintptr_t)local_pImageInfos;
26134     memcpy((*streamPtrPtr), &cgen_var_6, 8);
26135     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
26136     *streamPtrPtr += 8;
26137     if (local_pImageInfos) {
26138         for (uint32_t i = 0; i < (uint32_t)((imageInfoCount)); ++i) {
26139             reservedmarshal_VkDescriptorImageInfo(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
26140                                                   (VkDescriptorImageInfo*)(local_pImageInfos + i),
26141                                                   streamPtrPtr);
26142         }
26143     }
26144     // WARNING PTR CHECK
26145     uint64_t cgen_var_7 = (uint64_t)(uintptr_t)local_pBufferInfos;
26146     memcpy((*streamPtrPtr), &cgen_var_7, 8);
26147     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
26148     *streamPtrPtr += 8;
26149     if (local_pBufferInfos) {
26150         for (uint32_t i = 0; i < (uint32_t)((bufferInfoCount)); ++i) {
26151             reservedmarshal_VkDescriptorBufferInfo(
26152                 stream, VK_STRUCTURE_TYPE_MAX_ENUM,
26153                 (VkDescriptorBufferInfo*)(local_pBufferInfos + i), streamPtrPtr);
26154         }
26155     }
26156     // WARNING PTR CHECK
26157     uint64_t cgen_var_8 = (uint64_t)(uintptr_t)local_pBufferViews;
26158     memcpy((*streamPtrPtr), &cgen_var_8, 8);
26159     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
26160     *streamPtrPtr += 8;
26161     if (local_pBufferViews) {
26162         if (((bufferViewCount))) {
26163             uint8_t* cgen_var_8_0_ptr = (uint8_t*)(*streamPtrPtr);
26164             for (uint32_t k = 0; k < ((bufferViewCount)); ++k) {
26165                 uint64_t tmpval = get_host_u64_VkBufferView(local_pBufferViews[k]);
26166                 memcpy(cgen_var_8_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
26167             }
26168             *streamPtrPtr += 8 * ((bufferViewCount));
26169         }
26170     }
26171     // WARNING PTR CHECK
26172     uint64_t cgen_var_9 = (uint64_t)(uintptr_t)local_pInlineUniformBlockData;
26173     memcpy((*streamPtrPtr), &cgen_var_9, 8);
26174     gfxstream::aemu::Stream::toBe64((uint8_t*)(*streamPtrPtr));
26175     *streamPtrPtr += 8;
26176     if (local_pInlineUniformBlockData) {
26177         memcpy(*streamPtrPtr, (uint8_t*)local_pInlineUniformBlockData,
26178                ((inlineUniformBlockCount)) * sizeof(uint8_t));
26179         *streamPtrPtr += ((inlineUniformBlockCount)) * sizeof(uint8_t);
26180     }
26181     stream->flush();
26182     ++encodeCount;
26183     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
26184         pool->freeAll();
26185         stream->clearPool();
26186     }
26187     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
26188 }
26189 
vkQueueSubmitAsync2GOOGLE(VkQueue queue,uint32_t submitCount,const VkSubmitInfo2 * pSubmits,VkFence fence,uint32_t doLock)26190 void VkEncoder::vkQueueSubmitAsync2GOOGLE(VkQueue queue, uint32_t submitCount,
26191                                           const VkSubmitInfo2* pSubmits, VkFence fence,
26192                                           uint32_t doLock) {
26193     (void)doLock;
26194     bool queueSubmitWithCommandsEnabled =
26195         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
26196     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
26197     auto stream = mImpl->stream();
26198     auto pool = mImpl->pool();
26199     VkQueue local_queue;
26200     uint32_t local_submitCount;
26201     VkSubmitInfo2* local_pSubmits;
26202     VkFence local_fence;
26203     local_queue = queue;
26204     local_submitCount = submitCount;
26205     local_pSubmits = nullptr;
26206     if (pSubmits) {
26207         local_pSubmits = (VkSubmitInfo2*)pool->alloc(((submitCount)) * sizeof(const VkSubmitInfo2));
26208         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
26209             deepcopy_VkSubmitInfo2(pool, VK_STRUCTURE_TYPE_MAX_ENUM, pSubmits + i,
26210                                    (VkSubmitInfo2*)(local_pSubmits + i));
26211         }
26212     }
26213     local_fence = fence;
26214     if (local_pSubmits) {
26215         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
26216             transform_tohost_VkSubmitInfo2(sResourceTracker, (VkSubmitInfo2*)(local_pSubmits + i));
26217         }
26218     }
26219     size_t count = 0;
26220     size_t* countPtr = &count;
26221     {
26222         uint64_t cgen_var_0;
26223         *countPtr += 1 * 8;
26224         *countPtr += sizeof(uint32_t);
26225         for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
26226             count_VkSubmitInfo2(sFeatureBits, VK_STRUCTURE_TYPE_MAX_ENUM,
26227                                 (VkSubmitInfo2*)(local_pSubmits + i), countPtr);
26228         }
26229         uint64_t cgen_var_1;
26230         *countPtr += 1 * 8;
26231     }
26232     uint32_t packetSize_vkQueueSubmitAsync2GOOGLE =
26233         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
26234     uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSubmitAsync2GOOGLE);
26235     uint8_t* packetBeginPtr = streamPtr;
26236     uint8_t** streamPtrPtr = &streamPtr;
26237     uint32_t opcode_vkQueueSubmitAsync2GOOGLE = OP_vkQueueSubmitAsync2GOOGLE;
26238     uint32_t seqno;
26239     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
26240     memcpy(streamPtr, &opcode_vkQueueSubmitAsync2GOOGLE, sizeof(uint32_t));
26241     streamPtr += sizeof(uint32_t);
26242     memcpy(streamPtr, &packetSize_vkQueueSubmitAsync2GOOGLE, sizeof(uint32_t));
26243     streamPtr += sizeof(uint32_t);
26244     if (queueSubmitWithCommandsEnabled) {
26245         memcpy(streamPtr, &seqno, sizeof(uint32_t));
26246         streamPtr += sizeof(uint32_t);
26247     }
26248     uint64_t cgen_var_0;
26249     *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
26250     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
26251     *streamPtrPtr += 1 * 8;
26252     memcpy(*streamPtrPtr, (uint32_t*)&local_submitCount, sizeof(uint32_t));
26253     *streamPtrPtr += sizeof(uint32_t);
26254     for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i) {
26255         reservedmarshal_VkSubmitInfo2(stream, VK_STRUCTURE_TYPE_MAX_ENUM,
26256                                       (VkSubmitInfo2*)(local_pSubmits + i), streamPtrPtr);
26257     }
26258     uint64_t cgen_var_1;
26259     *&cgen_var_1 = get_host_u64_VkFence((*&local_fence));
26260     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
26261     *streamPtrPtr += 1 * 8;
26262     stream->flush();
26263     ++encodeCount;
26264     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
26265         pool->freeAll();
26266         stream->clearPool();
26267     }
26268     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
26269 }
26270 
vkGetSemaphoreGOOGLE(VkDevice device,VkSemaphore semaphore,uint64_t syncId,uint32_t doLock)26271 VkResult VkEncoder::vkGetSemaphoreGOOGLE(VkDevice device, VkSemaphore semaphore, uint64_t syncId,
26272                                          uint32_t doLock) {
26273     (void)doLock;
26274     bool queueSubmitWithCommandsEnabled =
26275         sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
26276     if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
26277     auto stream = mImpl->stream();
26278     auto pool = mImpl->pool();
26279     VkDevice local_device;
26280     VkSemaphore local_semaphore;
26281     uint64_t local_syncId;
26282     local_device = device;
26283     local_semaphore = semaphore;
26284     local_syncId = syncId;
26285     size_t count = 0;
26286     size_t* countPtr = &count;
26287     {
26288         uint64_t cgen_var_0;
26289         *countPtr += 1 * 8;
26290         uint64_t cgen_var_1;
26291         *countPtr += 1 * 8;
26292         *countPtr += sizeof(uint64_t);
26293     }
26294     uint32_t packetSize_vkGetSemaphoreGOOGLE =
26295         4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
26296     uint8_t* streamPtr = stream->reserve(packetSize_vkGetSemaphoreGOOGLE);
26297     uint8_t* packetBeginPtr = streamPtr;
26298     uint8_t** streamPtrPtr = &streamPtr;
26299     uint32_t opcode_vkGetSemaphoreGOOGLE = OP_vkGetSemaphoreGOOGLE;
26300     uint32_t seqno;
26301     if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
26302     memcpy(streamPtr, &opcode_vkGetSemaphoreGOOGLE, sizeof(uint32_t));
26303     streamPtr += sizeof(uint32_t);
26304     memcpy(streamPtr, &packetSize_vkGetSemaphoreGOOGLE, sizeof(uint32_t));
26305     streamPtr += sizeof(uint32_t);
26306     if (queueSubmitWithCommandsEnabled) {
26307         memcpy(streamPtr, &seqno, sizeof(uint32_t));
26308         streamPtr += sizeof(uint32_t);
26309     }
26310     uint64_t cgen_var_0;
26311     *&cgen_var_0 = get_host_u64_VkDevice((*&local_device));
26312     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
26313     *streamPtrPtr += 1 * 8;
26314     uint64_t cgen_var_1;
26315     *&cgen_var_1 = get_host_u64_VkSemaphore((*&local_semaphore));
26316     memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1, 1 * 8);
26317     *streamPtrPtr += 1 * 8;
26318     memcpy(*streamPtrPtr, (uint64_t*)&local_syncId, sizeof(uint64_t));
26319     *streamPtrPtr += sizeof(uint64_t);
26320     VkResult vkGetSemaphoreGOOGLE_VkResult_return = (VkResult)0;
26321     stream->read(&vkGetSemaphoreGOOGLE_VkResult_return, sizeof(VkResult));
26322     ++encodeCount;
26323     if (0 == encodeCount % POOL_CLEAR_INTERVAL) {
26324         pool->freeAll();
26325         stream->clearPool();
26326     }
26327     if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
26328     return vkGetSemaphoreGOOGLE_VkResult_return;
26329 }
26330 
26331 #endif
26332 }  // namespace vk
26333 }  // namespace gfxstream
26334