Commit 06002016 by Yiwei Zhang

Add baseline VK_EXT_device_memory_report support

This initial implementation will only emit device memory report callbacks upon vkAllocateMemory and vkFreeMemory. This extension will be enabled on API 31 and above. VkDeviceMemoryExternalAndroid.hpp is not needed in CMakeLists.txt since Android uses build blueprint. Bug: b/158094132 Test: dEQP-VK.memory.device_memory_report.create_and_destroy_object.* Test: dEQP-VK.memory.device_memory_report.vk_device_memory.* Test: dEQP-VK.memory.device_memory_report.external_memory.* Change-Id: I519b8c7efed15924e2ac8dbb8ab806d44f4fc1ed Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/50108Tested-by: 's avatarYiwei Zhang <zzyiwei@google.com> Presubmit-Ready: Yiwei Zhang <zzyiwei@google.com> Reviewed-by: 's avatarJason Macnak <natsu@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Kokoro-Result: kokoro <noreply+kokoro@google.com>
parent 259ce709
...@@ -634,6 +634,7 @@ cc_defaults { ...@@ -634,6 +634,7 @@ cc_defaults {
"-DLOG_TAG=\"swiftshader\"", "-DLOG_TAG=\"swiftshader\"",
"-DSWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER", "-DSWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER",
"-DSWIFTSHADER_ENABLE_ASTC", // TODO(b/150130101) "-DSWIFTSHADER_ENABLE_ASTC", // TODO(b/150130101)
//"-DSWIFTSHADER_DEVICE_MEMORY_REPORT",
], ],
srcs: [ srcs: [
......
...@@ -46,7 +46,6 @@ set(VULKAN_SRC_FILES ...@@ -46,7 +46,6 @@ set(VULKAN_SRC_FILES
VkDevice.hpp VkDevice.hpp
VkDeviceMemory.cpp VkDeviceMemory.cpp
VkDeviceMemory.hpp VkDeviceMemory.hpp
VkDeviceMemoryExternalAndroid.hpp
VkDeviceMemoryExternalLinux.hpp VkDeviceMemoryExternalLinux.hpp
VkEvent.hpp VkEvent.hpp
VkFence.hpp VkFence.hpp
......
...@@ -146,6 +146,22 @@ Device::Device(const VkDeviceCreateInfo *pCreateInfo, void *mem, PhysicalDevice ...@@ -146,6 +146,22 @@ Device::Device(const VkDeviceCreateInfo *pCreateInfo, void *mem, PhysicalDevice
debugger.server = vk::dbg::Server::create(debugger.context, atoi(port)); debugger.server = vk::dbg::Server::create(debugger.context, atoi(port));
} }
#endif // ENABLE_VK_DEBUGGER #endif // ENABLE_VK_DEBUGGER
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
const VkBaseInStructure *extensionCreateInfo = reinterpret_cast<const VkBaseInStructure *>(pCreateInfo->pNext);
while(extensionCreateInfo)
{
if(extensionCreateInfo->sType == VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT)
{
auto deviceMemoryReportCreateInfo = reinterpret_cast<const VkDeviceDeviceMemoryReportCreateInfoEXT *>(pCreateInfo->pNext);
if(deviceMemoryReportCreateInfo->pfnUserCallback != nullptr)
{
deviceMemoryReportCallbacks.emplace_back(deviceMemoryReportCreateInfo->pfnUserCallback, deviceMemoryReportCreateInfo->pUserData);
}
}
extensionCreateInfo = extensionCreateInfo->pNext;
}
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
} }
void Device::destroy(const VkAllocationCallbacks *pAllocator) void Device::destroy(const VkAllocationCallbacks *pAllocator)
...@@ -375,4 +391,27 @@ void Device::contentsChanged(ImageView *imageView) ...@@ -375,4 +391,27 @@ void Device::contentsChanged(ImageView *imageView)
} }
} }
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
void Device::emitDeviceMemoryReport(VkDeviceMemoryReportEventTypeEXT type, uint64_t memoryObjectId, VkDeviceSize size, VkObjectType objectType, uint64_t objectHandle, uint32_t heapIndex)
{
if(deviceMemoryReportCallbacks.empty()) return;
const VkDeviceMemoryReportCallbackDataEXT callbackData = {
VK_STRUCTURE_TYPE_DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT, // sType
nullptr, // pNext
0, // flags
type, // type
memoryObjectId, // memoryObjectId
size, // size
objectType, // objectType
objectHandle, // objectHandle
heapIndex, // heapIndex
};
for(const auto &callback : deviceMemoryReportCallbacks)
{
callback.first(&callbackData, callback.second);
}
}
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
} // namespace vk } // namespace vk
...@@ -169,6 +169,10 @@ public: ...@@ -169,6 +169,10 @@ public:
VkResult setDebugUtilsObjectName(const VkDebugUtilsObjectNameInfoEXT *pNameInfo); VkResult setDebugUtilsObjectName(const VkDebugUtilsObjectNameInfoEXT *pNameInfo);
VkResult setDebugUtilsObjectTag(const VkDebugUtilsObjectTagInfoEXT *pTagInfo); VkResult setDebugUtilsObjectTag(const VkDebugUtilsObjectTagInfoEXT *pTagInfo);
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
void emitDeviceMemoryReport(VkDeviceMemoryReportEventTypeEXT type, uint64_t memoryObjectId, VkDeviceSize size, VkObjectType objectType, uint64_t objectHandle, uint32_t heapIndex = 0);
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
private: private:
PhysicalDevice *const physicalDevice = nullptr; PhysicalDevice *const physicalDevice = nullptr;
Queue *const queues = nullptr; Queue *const queues = nullptr;
...@@ -193,6 +197,10 @@ private: ...@@ -193,6 +197,10 @@ private:
std::shared_ptr<vk::dbg::Server> server; std::shared_ptr<vk::dbg::Server> server;
} debugger; } debugger;
#endif // ENABLE_VK_DEBUGGER #endif // ENABLE_VK_DEBUGGER
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
std::vector<std::pair<PFN_vkDeviceMemoryReportCallbackEXT, void *>> deviceMemoryReportCallbacks;
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
}; };
using DispatchableDevice = DispatchableObject<Device, VkDevice>; using DispatchableDevice = DispatchableObject<Device, VkDevice>;
......
...@@ -73,7 +73,7 @@ public: ...@@ -73,7 +73,7 @@ public:
VkResult allocate(size_t size, void **pBuffer) override VkResult allocate(size_t size, void **pBuffer) override
{ {
void *buffer = vk::allocate(size, REQUIRED_MEMORY_ALIGNMENT, DEVICE_MEMORY); buffer = vk::allocate(size, REQUIRED_MEMORY_ALIGNMENT, DEVICE_MEMORY);
if(!buffer) if(!buffer)
{ {
return VK_ERROR_OUT_OF_DEVICE_MEMORY; return VK_ERROR_OUT_OF_DEVICE_MEMORY;
...@@ -83,15 +83,26 @@ public: ...@@ -83,15 +83,26 @@ public:
return VK_SUCCESS; return VK_SUCCESS;
} }
void deallocate(void *buffer, size_t size) override void deallocate(void * /* buffer */, size_t size) override
{ {
vk::deallocate(buffer, DEVICE_MEMORY); vk::deallocate(buffer, DEVICE_MEMORY);
buffer = nullptr;
} }
VkExternalMemoryHandleTypeFlagBits getFlagBit() const override VkExternalMemoryHandleTypeFlagBits getFlagBit() const override
{ {
return typeFlagBit; return typeFlagBit;
} }
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
uint64_t getMemoryObjectId() const override
{
return (uint64_t)buffer;
}
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
private:
void *buffer = nullptr;
}; };
} // namespace vk } // namespace vk
...@@ -235,6 +246,9 @@ DeviceMemory::DeviceMemory(const VkMemoryAllocateInfo *pAllocateInfo, void *mem, ...@@ -235,6 +246,9 @@ DeviceMemory::DeviceMemory(const VkMemoryAllocateInfo *pAllocateInfo, void *mem,
void DeviceMemory::destroy(const VkAllocationCallbacks *pAllocator) void DeviceMemory::destroy(const VkAllocationCallbacks *pAllocator)
{ {
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
device->emitDeviceMemoryReport(external->isImport() ? VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_UNIMPORT_EXT : VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_FREE_EXT, external->getMemoryObjectId(), 0 /* size */, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t)(void *)VkDeviceMemory(*this));
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
if(buffer) if(buffer)
{ {
external->deallocate(buffer, size); external->deallocate(buffer, size);
...@@ -255,6 +269,9 @@ VkResult DeviceMemory::allocate() ...@@ -255,6 +269,9 @@ VkResult DeviceMemory::allocate()
{ {
if(size > MAX_MEMORY_ALLOCATION_SIZE) if(size > MAX_MEMORY_ALLOCATION_SIZE)
{ {
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
device->emitDeviceMemoryReport(VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT, 0 /* memoryObjectId */, size, VK_OBJECT_TYPE_DEVICE_MEMORY, 0 /* objectHandle */);
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
return VK_ERROR_OUT_OF_DEVICE_MEMORY; return VK_ERROR_OUT_OF_DEVICE_MEMORY;
} }
...@@ -263,6 +280,16 @@ VkResult DeviceMemory::allocate() ...@@ -263,6 +280,16 @@ VkResult DeviceMemory::allocate()
{ {
result = external->allocate(size, &buffer); result = external->allocate(size, &buffer);
} }
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
if(result == VK_SUCCESS)
{
device->emitDeviceMemoryReport(external->isImport() ? VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_IMPORT_EXT : VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATE_EXT, external->getMemoryObjectId(), size, VK_OBJECT_TYPE_DEVICE_MEMORY, (uint64_t)(void *)VkDeviceMemory(*this));
}
else
{
device->emitDeviceMemoryReport(VK_DEVICE_MEMORY_REPORT_EVENT_TYPE_ALLOCATION_FAILED_EXT, 0 /* memoryObjectId */, size, VK_OBJECT_TYPE_DEVICE_MEMORY, 0 /* objectHandle */);
}
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
return result; return result;
} }
......
...@@ -12,19 +12,14 @@ ...@@ -12,19 +12,14 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER #include "VkDeviceMemoryExternalAndroid.hpp"
# include "VkDeviceMemoryExternalAndroid.hpp" #include "VkDestroy.hpp"
#include "VkFormat.hpp"
# include "System/Debug.hpp" #include "VkObject.hpp"
# include "VkDestroy.hpp" #include "VkPhysicalDevice.hpp"
# include "VkFormat.hpp" #include "VkStringify.hpp"
# include "VkObject.hpp" #include "System/Debug.hpp"
# include "VkPhysicalDevice.hpp"
# include "VkStringify.hpp"
# include <android/hardware_buffer.h>
# include <vndk/hardware_buffer.h>
namespace { namespace {
...@@ -323,7 +318,7 @@ void AHardwareBufferExternalMemory::deallocate(void *buffer, size_t size) ...@@ -323,7 +318,7 @@ void AHardwareBufferExternalMemory::deallocate(void *buffer, size_t size)
} }
} }
VkResult AHardwareBufferExternalMemory::importAndroidHardwareBuffer(struct AHardwareBuffer *buffer, void **pBuffer) VkResult AHardwareBufferExternalMemory::importAndroidHardwareBuffer(AHardwareBuffer *buffer, void **pBuffer)
{ {
ahb = buffer; ahb = buffer;
...@@ -410,7 +405,7 @@ VkResult AHardwareBufferExternalMemory::unlockAndroidHardwareBuffer() ...@@ -410,7 +405,7 @@ VkResult AHardwareBufferExternalMemory::unlockAndroidHardwareBuffer()
return VK_SUCCESS; return VK_SUCCESS;
} }
VkResult AHardwareBufferExternalMemory::exportAndroidHardwareBuffer(struct AHardwareBuffer **pAhb) const VkResult AHardwareBufferExternalMemory::exportAndroidHardwareBuffer(AHardwareBuffer **pAhb) const
{ {
// Each call to vkGetMemoryAndroidHardwareBufferANDROID *must* return an Android hardware buffer with a new reference // Each call to vkGetMemoryAndroidHardwareBufferANDROID *must* return an Android hardware buffer with a new reference
// acquired in addition to the reference held by the VkDeviceMemory. To avoid leaking resources, the application *must* // acquired in addition to the reference held by the VkDeviceMemory. To avoid leaking resources, the application *must*
...@@ -436,7 +431,7 @@ VkResult AHardwareBufferExternalMemory::GetAndroidHardwareBufferFormatProperties ...@@ -436,7 +431,7 @@ VkResult AHardwareBufferExternalMemory::GetAndroidHardwareBufferFormatProperties
return VK_SUCCESS; return VK_SUCCESS;
} }
VkResult AHardwareBufferExternalMemory::GetAndroidHardwareBufferProperties(VkDevice &device, const struct AHardwareBuffer *buffer, VkAndroidHardwareBufferPropertiesANDROID *pProperties) VkResult AHardwareBufferExternalMemory::GetAndroidHardwareBufferProperties(VkDevice &device, const AHardwareBuffer *buffer, VkAndroidHardwareBufferPropertiesANDROID *pProperties)
{ {
VkResult result = VK_SUCCESS; VkResult result = VK_SUCCESS;
...@@ -496,4 +491,12 @@ int AHardwareBufferExternalMemory::externalImageRowPitchBytes() const ...@@ -496,4 +491,12 @@ int AHardwareBufferExternalMemory::externalImageRowPitchBytes() const
return GetBytesFromAHBFormat(ahbDesc.format) * ahbDesc.stride; return GetBytesFromAHBFormat(ahbDesc.format) * ahbDesc.stride;
} }
#endif // SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER #ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
uint64_t AHardwareBufferExternalMemory::getMemoryObjectId() const
{
uint64_t id = 0;
int ret = AHardwareBuffer_getId(ahb, &id);
ASSERT(ret == 0);
return id;
}
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
...@@ -15,15 +15,13 @@ ...@@ -15,15 +15,13 @@
#ifndef VK_DEVICE_MEMORY_EXTERNAL_ANDROID_HPP_ #ifndef VK_DEVICE_MEMORY_EXTERNAL_ANDROID_HPP_
#define VK_DEVICE_MEMORY_EXTERNAL_ANDROID_HPP_ #define VK_DEVICE_MEMORY_EXTERNAL_ANDROID_HPP_
#if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER #include "VkBuffer.hpp"
#include "VkDevice.hpp"
#include "VkDeviceMemory.hpp"
#include "VkDeviceMemoryExternalBase.hpp"
#include "VkImage.hpp"
# include "VkBuffer.hpp" #include <vndk/hardware_buffer.h>
# include "VkDevice.hpp"
# include "VkDeviceMemory.hpp"
# include "VkDeviceMemoryExternalBase.hpp"
# include "VkImage.hpp"
# include <android/hardware_buffer.h>
class AHardwareBufferExternalMemory : public vk::DeviceMemory::ExternalBase class AHardwareBufferExternalMemory : public vk::DeviceMemory::ExternalBase
{ {
...@@ -35,7 +33,7 @@ public: ...@@ -35,7 +33,7 @@ public:
{ {
bool importAhb = false; bool importAhb = false;
bool exportAhb = false; bool exportAhb = false;
struct AHardwareBuffer *ahb = nullptr; AHardwareBuffer *ahb = nullptr;
vk::Image *imageHandle = nullptr; vk::Image *imageHandle = nullptr;
vk::Buffer *bufferHandle = nullptr; vk::Buffer *bufferHandle = nullptr;
...@@ -61,28 +59,35 @@ public: ...@@ -61,28 +59,35 @@ public:
VkExternalMemoryHandleTypeFlagBits getFlagBit() const override { return typeFlagBit; } VkExternalMemoryHandleTypeFlagBits getFlagBit() const override { return typeFlagBit; }
VkResult exportAndroidHardwareBuffer(struct AHardwareBuffer **pAhb) const override; VkResult exportAndroidHardwareBuffer(AHardwareBuffer **pAhb) const override;
void setDevicePtr(vk::Device *pDevice) override { device = pDevice; } void setDevicePtr(vk::Device *pDevice) override { device = pDevice; }
bool isAndroidHardwareBuffer() override { return true; } bool isAndroidHardwareBuffer() override { return true; }
static VkResult GetAndroidHardwareBufferFormatProperties(const AHardwareBuffer_Desc &ahbDesc, VkAndroidHardwareBufferFormatPropertiesANDROID *pFormat); static VkResult GetAndroidHardwareBufferFormatProperties(const AHardwareBuffer_Desc &ahbDesc, VkAndroidHardwareBufferFormatPropertiesANDROID *pFormat);
static VkResult GetAndroidHardwareBufferProperties(VkDevice &device, const struct AHardwareBuffer *buffer, VkAndroidHardwareBufferPropertiesANDROID *pProperties); static VkResult GetAndroidHardwareBufferProperties(VkDevice &device, const AHardwareBuffer *buffer, VkAndroidHardwareBufferPropertiesANDROID *pProperties);
bool hasExternalImageProperties() const override final { return true; } bool hasExternalImageProperties() const override final { return true; }
int externalImageRowPitchBytes() const override final; int externalImageRowPitchBytes() const override final;
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
bool isImport() const override
{
return allocateInfo.importAhb;
}
uint64_t getMemoryObjectId() const override;
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
private: private:
VkResult importAndroidHardwareBuffer(struct AHardwareBuffer *buffer, void **pBuffer); VkResult importAndroidHardwareBuffer(AHardwareBuffer *buffer, void **pBuffer);
VkResult allocateAndroidHardwareBuffer(void **pBuffer); VkResult allocateAndroidHardwareBuffer(void **pBuffer);
VkResult lockAndroidHardwareBuffer(void **pBuffer); VkResult lockAndroidHardwareBuffer(void **pBuffer);
VkResult unlockAndroidHardwareBuffer(); VkResult unlockAndroidHardwareBuffer();
struct AHardwareBuffer *ahb = nullptr; AHardwareBuffer *ahb = nullptr;
AHardwareBuffer_Desc ahbDesc = {}; AHardwareBuffer_Desc ahbDesc = {};
vk::Device *device = nullptr; vk::Device *device = nullptr;
AllocateInfo allocateInfo; AllocateInfo allocateInfo;
}; };
#endif // SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
#endif // VK_DEVICE_MEMORY_EXTERNAL_ANDROID_HPP_ #endif // VK_DEVICE_MEMORY_EXTERNAL_ANDROID_HPP_
...@@ -62,6 +62,18 @@ public: ...@@ -62,6 +62,18 @@ public:
virtual bool hasExternalImageProperties() const { return false; } virtual bool hasExternalImageProperties() const { return false; }
virtual int externalImageRowPitchBytes() const { return 0; } virtual int externalImageRowPitchBytes() const { return 0; }
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
virtual bool isImport() const
{
return false;
}
virtual uint64_t getMemoryObjectId() const
{
return 0;
}
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
protected: protected:
ExternalBase() = default; ExternalBase() = default;
}; };
......
...@@ -217,6 +217,14 @@ static void getPhysicalDeviceShaderSubgroupExtendedTypesFeatures(T *features) ...@@ -217,6 +217,14 @@ static void getPhysicalDeviceShaderSubgroupExtendedTypesFeatures(T *features)
features->shaderSubgroupExtendedTypes = VK_TRUE; features->shaderSubgroupExtendedTypes = VK_TRUE;
} }
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
template<typename T>
static void getPhysicalDeviceDeviceMemoryReportFeaturesEXT(T *features)
{
features->deviceMemoryReport = VK_TRUE;
}
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
template<typename T> template<typename T>
static void getPhysicalDeviceVulkan12Features(T *features) static void getPhysicalDeviceVulkan12Features(T *features)
{ {
...@@ -320,6 +328,11 @@ void PhysicalDevice::getFeatures2(VkPhysicalDeviceFeatures2 *features) const ...@@ -320,6 +328,11 @@ void PhysicalDevice::getFeatures2(VkPhysicalDeviceFeatures2 *features) const
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR: case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR:
getPhysicalDeviceShaderSubgroupExtendedTypesFeatures(reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures *>(curExtension)); getPhysicalDeviceShaderSubgroupExtendedTypesFeatures(reinterpret_cast<VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures *>(curExtension));
break; break;
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
getPhysicalDeviceDeviceMemoryReportFeaturesEXT(reinterpret_cast<VkPhysicalDeviceDeviceMemoryReportFeaturesEXT *>(curExtension));
break;
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
default: default:
LOG_TRAP("curExtension->pNext->sType = %s", vk::Stringify(curExtension->sType).c_str()); LOG_TRAP("curExtension->pNext->sType = %s", vk::Stringify(curExtension->sType).c_str());
break; break;
......
...@@ -389,6 +389,9 @@ static const VkExtensionProperties deviceExtensionProperties[] = { ...@@ -389,6 +389,9 @@ static const VkExtensionProperties deviceExtensionProperties[] = {
{ VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, VK_EXT_PROVOKING_VERTEX_SPEC_VERSION }, { VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, VK_EXT_PROVOKING_VERTEX_SPEC_VERSION },
{ VK_GOOGLE_SAMPLER_FILTERING_PRECISION_EXTENSION_NAME, VK_GOOGLE_SAMPLER_FILTERING_PRECISION_SPEC_VERSION }, { VK_GOOGLE_SAMPLER_FILTERING_PRECISION_EXTENSION_NAME, VK_GOOGLE_SAMPLER_FILTERING_PRECISION_SPEC_VERSION },
{ VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME, VK_EXT_DEPTH_RANGE_UNRESTRICTED_SPEC_VERSION }, { VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME, VK_EXT_DEPTH_RANGE_UNRESTRICTED_SPEC_VERSION },
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
{ VK_EXT_DEVICE_MEMORY_REPORT_EXTENSION_NAME, VK_EXT_DEVICE_MEMORY_REPORT_SPEC_VERSION },
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
// Vulkan 1.2 promoted extensions // Vulkan 1.2 promoted extensions
{ VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, VK_KHR_IMAGE_FORMAT_LIST_SPEC_VERSION }, { VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME, VK_KHR_IMAGE_FORMAT_LIST_SPEC_VERSION },
{ VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION }, { VK_KHR_IMAGELESS_FRAMEBUFFER_EXTENSION_NAME, VK_KHR_IMAGELESS_FRAMEBUFFER_SPEC_VERSION },
...@@ -765,6 +768,14 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice, c ...@@ -765,6 +768,14 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice, c
(void)imagelessFramebufferFeatures->imagelessFramebuffer; (void)imagelessFramebufferFeatures->imagelessFramebuffer;
} }
break; break;
#ifdef SWIFTSHADER_DEVICE_MEMORY_REPORT
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT:
{
const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT *deviceMemoryReportFeatures = reinterpret_cast<const VkPhysicalDeviceDeviceMemoryReportFeaturesEXT *>(extensionCreateInfo);
(void)deviceMemoryReportFeatures->deviceMemoryReport;
}
break;
#endif // SWIFTSHADER_DEVICE_MEMORY_REPORT
default: default:
// "the [driver] must skip over, without processing (other than reading the sType and pNext members) any structures in the chain with sType values not defined by [supported extenions]" // "the [driver] must skip over, without processing (other than reading the sType and pNext members) any structures in the chain with sType values not defined by [supported extenions]"
LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str()); LOG_TRAP("pCreateInfo->pNext sType = %s", vk::Stringify(extensionCreateInfo->sType).c_str());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment