Introduce GFXSTREAM_ABORT instead of normal abort. This CL moves most of our abort() callsites to use the new GFXSTREAM_ABORT macro, which will allow us to track metrics about when and where we abort. Generated code is not yet changed, and test and third-party code is not affected. Bug: 204125485 Test: Compile, run emulator. Change-Id: I909d79a35121f24a60e3b4db2745af5ceeee369c
diff --git a/stream-servers/vulkan/VkAndroidNativeBuffer.cpp b/stream-servers/vulkan/VkAndroidNativeBuffer.cpp index 9f92bcf..4a8f363 100644 --- a/stream-servers/vulkan/VkAndroidNativeBuffer.cpp +++ b/stream-servers/vulkan/VkAndroidNativeBuffer.cpp
@@ -15,6 +15,7 @@ #include "cereal/common/goldfish_vk_private_defs.h" #include "cereal/common/goldfish_vk_extension_structs.h" +#include "host-common/GfxstreamFatalError.h" #include "stream-servers/FrameBuffer.h" #include "GrallocDefs.h" #include "VkCommonOperations.h"
diff --git a/stream-servers/vulkan/VkCommonOperations.cpp b/stream-servers/vulkan/VkCommonOperations.cpp index fc95906..330324f 100644 --- a/stream-servers/vulkan/VkCommonOperations.cpp +++ b/stream-servers/vulkan/VkCommonOperations.cpp
@@ -34,6 +34,7 @@ #include "base/System.h" #include "base/Tracing.h" #include "common/goldfish_vk_dispatch.h" +#include "host-common/GfxstreamFatalError.h" #include "host-common/vm_operations.h" #ifdef _WIN32 @@ -792,7 +793,6 @@ sVkEmulation->physdev = physdevs[maxScoringIndex]; sVkEmulation->deviceInfo = deviceInfos[maxScoringIndex]; - // Postcondition: sVkEmulation has valid device support info // Ask about image format support here. @@ -1876,7 +1876,6 @@ bool readRes = FrameBuffer::getFB()-> readColorBufferContents( colorBufferHandle, &cbNumBytes, nullptr); - if (!readRes) { fprintf(stderr, "%s: Failed to read color buffer 0x%x\n", __func__, colorBufferHandle); @@ -2008,7 +2007,7 @@ }); } } - + vk->vkCmdCopyBufferToImage( sVkEmulation->commandBuffer, sVkEmulation->staging.buffer, @@ -2469,8 +2468,8 @@ if (res == VK_NOT_READY) { continue; } - VK_COMMON_ERROR("Invalid fence state: %d", static_cast<int>(res)); - ::std::abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) + << "Invalid fence state: " << static_cast<int>(res); } VkCommandBuffer commandBuffer; VkCommandBufferAllocateInfo allocateInfo = { @@ -2504,9 +2503,7 @@ void acquireColorBuffersForHostComposing(const std::vector<uint32_t>& layerColorBuffers, uint32_t renderTargetColorBuffer) { if (!sVkEmulation || !sVkEmulation->live) { - VK_COMMON_ERROR("Host Vulkan device lost."); - ::std::abort(); - return; + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << "Host Vulkan device lost"; } std::vector<std::tuple<uint32_t, VkImageLayout>> colorBuffersAndLayouts; @@ -2647,9 +2644,7 @@ static VkFence doReleaseColorBufferForGuestRendering( const std::vector<uint32_t>& colorBufferHandles) { if (!sVkEmulation || !sVkEmulation->live) { - VK_COMMON_ERROR("Host Vulkan device lost."); - ::std::abort(); - return VK_NULL_HANDLE; + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << "Host Vulkan device lost"; } AutoLock lock(sVkEmulationLock); @@ -2772,9 +2767,7 @@ void releaseColorBufferFromHostComposingSync(const std::vector<uint32_t>& colorBufferHandles) { VkFence fence = doReleaseColorBufferForGuestRendering(colorBufferHandles); if (!sVkEmulation || !sVkEmulation->live) { - VK_COMMON_ERROR("Host Vulkan device lost."); - ::std::abort(); - return; + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << "Host Vulkan device lost"; } AutoLock lock(sVkEmulationLock);
diff --git a/stream-servers/vulkan/VkDecoderGlobalState.cpp b/stream-servers/vulkan/VkDecoderGlobalState.cpp index d480316..24139fc 100644 --- a/stream-servers/vulkan/VkDecoderGlobalState.cpp +++ b/stream-servers/vulkan/VkDecoderGlobalState.cpp
@@ -44,6 +44,7 @@ #include "common/goldfish_vk_deepcopy.h" #include "common/goldfish_vk_dispatch.h" #include "host-common/address_space_device_control_ops.h" +#include "host-common/GfxstreamFatalError.h" #include "host-common/vm_operations.h" #include "host-common/feature_control.h" #include "vk_util.h" @@ -456,8 +457,8 @@ if (m_emu->instanceSupportsMoltenVK) { if (!m_vk->vkSetMTLTextureMVK) { - fprintf(stderr, "Cannot find vkSetMTLTextureMVK\n"); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << + "Cannot find vkSetMTLTextureMVK"; } } @@ -3032,11 +3033,8 @@ vk_find_struct<VkExportMemoryAllocateInfo>(pAllocateInfo); if (exportAllocInfoPtr) { - fprintf(stderr, - "%s: Fatal: Export allocs are to be handled " - "on the guest side / VkCommonOperations.\n", - __func__); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << + "Export allocs are to be handled on the guest side / VkCommonOperations."; } const VkMemoryDedicatedAllocateInfo* dedicatedAllocInfoPtr = @@ -4370,7 +4368,7 @@ currSi.pWaitSemaphores = pBindInfo[i].pWaitSemaphores; waitDstStageMasks.resize(pBindInfo[i].waitSemaphoreCount, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT); currSi.pWaitDstStageMask = waitDstStageMasks.data(); - + currSi.signalSemaphoreCount = 0; currSi.pSignalSemaphores = nullptr; @@ -4515,8 +4513,8 @@ auto poolInfo = android::base::find(mDescriptorPoolInfo, pool); if (!poolInfo) { - fprintf(stderr, "%s: FATAL: descriptor pool %p not found\n", __func__, pool); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) + << "descriptor pool " << pool << " not found "; } DispatchableHandleInfo<uint64_t>* setHandleInfo = sBoxedHandleManager.get(poolId); @@ -4555,9 +4553,10 @@ *didAlloc = true; return allocedSet; } else { - fprintf(stderr, "%s: FATAL: descriptor pool %p wanted to get set with id 0x%llx but it wasn't allocated\n", __func__, - pool, (unsigned long long)poolId); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) + << "descriptor pool " << pool << " wanted to get set with id 0x" << + std::hex << poolId; + return nullptr; } } } @@ -4587,9 +4586,8 @@ if (queueInfo) { device = queueInfo->device; } else { - fprintf(stderr, "%s: FATAL: queue %p (boxed: %p) with no device registered\n", __func__, - queue, boxed_queue); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) + << "queue " << queue << "(boxed: " << boxed_queue << ") with no device registered"; } std::vector<VkDescriptorSet> setsToUpdate(descriptorSetCount, nullptr); @@ -6259,8 +6257,8 @@ } else if (isDescriptorTypeBufferView(type)) { numBufferViews += count; } else { - fprintf(stderr, "%s: fatal: unknown descriptor type 0x%x\n", __func__, type); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) + << "unknown descriptor type 0x" << std::hex << type; } } @@ -6303,8 +6301,8 @@ entryForHost.stride = sizeof(VkBufferView); ++bufferViewCount; } else { - fprintf(stderr, "%s: fatal: unknown descriptor type 0x%x\n", __func__, type); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) + << "unknown descriptor type 0x" << std::hex << type; } res.linearizedTemplateEntries.push_back(entryForHost);
diff --git a/stream-servers/vulkan/VulkanStream.cpp b/stream-servers/vulkan/VulkanStream.cpp index 9529c10..7c326d4 100644 --- a/stream-servers/vulkan/VulkanStream.cpp +++ b/stream-servers/vulkan/VulkanStream.cpp
@@ -18,6 +18,7 @@ #include "base/BumpPool.h" #include "host-common/feature_control.h" +#include "host-common/GfxstreamFatalError.h" #include <vector> @@ -56,12 +57,12 @@ *ptrAddr = nullptr; return; } - + *ptrAddr = mPool.alloc(bytes); if (!*ptrAddr) { - fprintf(stderr, "%s: FATAL: alloc failed. Wanted size: %zu\n", __func__, bytes); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << + "alloc failed. Wanted size: " << bytes; } } @@ -99,10 +100,8 @@ android::base::Stream::fromBe32((uint8_t*)&len); if (len == UINT32_MAX) { - fprintf(stderr, - "%s: FATAL: VulkanStream can't allocate %u bytes\n", - __func__, UINT32_MAX); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << + "VulkanStream can't allocate UINT32_MAX bytes"; } alloc((void**)forOutput, len + 1); @@ -137,8 +136,8 @@ ssize_t VulkanStream::read(void *buffer, size_t size) { commitWrite(); if (!mStream->readFully(buffer, size)) { - E("FATAL: Could not read back %zu bytes", size); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) + << "Could not read back " << size << " bytes"; } return size; } @@ -162,16 +161,16 @@ void VulkanStream::commitWrite() { if (!valid()) { - E("FATAL: Tried to commit write to vulkan pipe with invalid pipe!"); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << + "Tried to commit write to vulkan pipe with invalid pipe!"; } - + int written = mStream->writeFully(mWriteBuffer.data(), mWritePos); - + if (written) { - E("FATAL: Did not write exactly %zu bytes!", mWritePos); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) + << "Did not write exactly " << mWritePos << " bytes!"; } mWritePos = 0; } @@ -226,10 +225,8 @@ } ssize_t VulkanMemReadingStream::write(const void* buffer, size_t size) { - fprintf(stderr, - "%s: FATAL: VulkanMemReadingStream does not support writing\n", - __func__); - abort(); + GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER)) << + "VulkanMemReadingStream does not support writing"; } uint8_t* VulkanMemReadingStream::beginTrace() {
diff --git a/stream-servers/vulkan/vk_util.h b/stream-servers/vulkan/vk_util.h index 92c0469..053f2e4 100644 --- a/stream-servers/vulkan/vk_util.h +++ b/stream-servers/vulkan/vk_util.h
@@ -35,6 +35,8 @@ #include "base/Lock.h" #include "common/vk_struct_id.h" +#include "VkCommonOperations.h" +#include "host-common/GfxstreamFatalError.h" struct vk_struct_common { VkStructureType sType; @@ -267,9 +269,7 @@ do { \ VkResult err = x; \ if (err != VK_SUCCESS) { \ - ::fprintf(stderr, "%s(%u) %s: %s failed, error code = %d\n", \ - __FILE__, __LINE__, __FUNCTION__, #x, err); \ - ::abort(); \ + GFXSTREAM_ABORT(FatalError(err)); \ } \ } while (0)