// Manual inline for
// void VkEncoder::vkQueueFlushCommandsGOOGLE( VkQueue queue, VkCommandBuffer commandBuffer, VkDeviceSize dataSize, const void* pData, uint32_t doLock);

// We won't use the lock if this command is used (VulkanQueueSubmitWithCommands is enabled)
(void)doLock;

auto stream = mImpl->stream();
auto pool = mImpl->pool();
VkQueue local_queue;
VkCommandBuffer local_commandBuffer;
VkDeviceSize local_dataSize;
void* local_pData;
local_queue = queue;
local_commandBuffer = commandBuffer;
local_dataSize = dataSize;
// Avoiding deepcopy for pData
local_pData = (void*)pData;
size_t count = 0;
size_t* countPtr = &count;
{
    uint64_t cgen_var_1405;
    *countPtr += 1 * 8;
    uint64_t cgen_var_1406;
    *countPtr += 1 * 8;
    *countPtr += sizeof(VkDeviceSize);
    *countPtr += ((dataSize)) * sizeof(uint8_t);
}
bool queueSubmitWithCommandsEnabled = sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
uint32_t packetSize_vkQueueFlushCommandsGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
uint8_t* streamPtr = stream->reserve(packetSize_vkQueueFlushCommandsGOOGLE - local_dataSize);
uint8_t** streamPtrPtr = &streamPtr;
uint32_t opcode_vkQueueFlushCommandsGOOGLE = OP_vkQueueFlushCommandsGOOGLE;
uint32_t seqno = ResourceTracker::nextSeqno();
memcpy(streamPtr, &opcode_vkQueueFlushCommandsGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
memcpy(streamPtr, &packetSize_vkQueueFlushCommandsGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
memcpy(streamPtr, &seqno, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
uint64_t cgen_var_1407;
*&cgen_var_1407 = get_host_u64_VkQueue((*&local_queue));
memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1407, 1 * 8);
*streamPtrPtr += 1 * 8;
uint64_t cgen_var_1408;
*&cgen_var_1408 = get_host_u64_VkCommandBuffer((*&local_commandBuffer));
memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1408, 1 * 8);
*streamPtrPtr += 1 * 8;
memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dataSize, sizeof(VkDeviceSize));
*streamPtrPtr += sizeof(VkDeviceSize);

AEMU_SCOPED_TRACE("vkQueueFlush large xfer");
stream->flush();
stream->writeLarge(local_pData, dataSize);

++encodeCount;;
if (0 == encodeCount % POOL_CLEAR_INTERVAL)
{
    pool->freeAll();
    stream->clearPool();
}
