diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp index 5adcdf29eb..464e1cc051 100644 --- a/src/libANGLE/renderer/vulkan/ContextVk.cpp +++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp @@ -2764,6 +2764,33 @@ angle::Result ContextVk::handleDirtyGraphicsIndexBuffer(DirtyBits::Iterator *dir vk::BufferHelper *elementArrayBuffer = mCurrentIndexBuffer; ASSERT(elementArrayBuffer != nullptr); + // ---- POC instrumentation: detect stale offset on converted index buffer ---- + { + const VkDeviceSize bufSize = elementArrayBuffer->getSize(); + const VkDeviceSize offset = mCurrentIndexBufferOffset; + const VkDeviceSize suballocOff = elementArrayBuffer->getOffset(); + if (offset > bufSize) + { + const VkDeviceSize underflow = bufSize - offset; // wraps on VkDeviceSize/uint64 + fprintf( + stderr, + "[ANGLE-POC] *** BUG *** handleDirtyGraphicsIndexBuffer: " + "mCurrentIndexBufferOffset=%llu > mCurrentIndexBuffer->getSize()=%llu " + "(suballoc offset=%llu, supportsMaintenance5=%d, supportsIndexTypeUint8=%d)\n" + "[ANGLE-POC] -> maintenance5 path: vkCmdBindIndexBuffer2KHR size = " + "roundDownPow2(size-offset,..) = roundDownPow2(%llu,..) ~= 2^64 " + "(VUID-vkCmdBindIndexBuffer2-size-08767)\n" + "[ANGLE-POC] -> non-maintenance5 path: vkCmdBindIndexBuffer offset = %llu " + "into pool VkBuffer (VUID-vkCmdBindIndexBuffer-offset-08782 / OOB index read)\n", + (unsigned long long)offset, (unsigned long long)bufSize, + (unsigned long long)suballocOff, + (int)getFeatures().supportsMaintenance5.enabled, + (int)getFeatures().supportsIndexTypeUint8.enabled, + (unsigned long long)underflow, (unsigned long long)(suballocOff + offset)); + } + } + // ---- end POC instrumentation ---- + if (getFeatures().supportsMaintenance5.enabled) { // The bound size is from the start offset to the end of the element buffer, and should be