Comment #12 on issue 3965 by j.vi...@
samsung.com: Implement EGL_EXT_protected_content
https://bugs.chromium.org/p/angleproject/issues/detail?id=3965#c12Design Notes:
Vulkan Protected Memory - Section 10.2.3 Protected Memory
vkGetPhysicalDeviceMemoryProperties
VkMemoryPropertyFlagBits - VK_MEMORY_PROPERTY_PROTECTED_BIT - only device access
// Extension to determine support for protected memory
vkCreateDevice: VkDeviceCreateInfo -
pNext - from VkPhysicalDeviceFeatures2
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES
struct VkPhysicalDeviceProtectedMemoryFeatures
member VkBool32 protectedMemory;
Add@ RendererVk::initialize
Add@ RendererVk::initFeatures
Add@ RendererVk::queryDeviceExtensionFeatures
// Extension to determine driver behavior on protection violation
pNext of VkPhysicalDeviceProperties2
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES
VkPhysicalDeviceProtectedMemoryProperties
.protectedNoFault = true == driver no crash at protection violation
Add@ RendererVk::initialize
// Extension to determine if protected swapchains are supported
extension: VK_KHR_surface_protected_capabilities
pNext from struct VkSurfaceCapabilities2KHR
struct VkSurfaceProtectedCapabilitiesKHR - VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR
VkBool32 supportsProtected;
If supportsProtected is VK_TRUE, then creation of swapchains with the
VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR flag set must be supported for surface.
Add@ RendererVk::initialize
Add@ WindowSurfaceVk::initializeImpl
// How to create proteced swapchain
vkCreateSwapchainKHR(...)
struct VkSwapchainCreateInfoKHR - VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR
member VkSwapchainCreateFlagsKHR flags; - VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR
Add@ WindowSurfaceVk::createSwapChain
// Flag for protected Submit
vkQueueSubmit(...) - submit protected commands
VkSubmitInfo - VK_STRUCTURE_TYPE_SUBMIT_INFO
pNext: VkProtectedSubmitInfo - VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO
VkBool32 .protectedSubmit = true; - then all pCommandBuffers array must be protected
Add@ ContextVk::getTimestamp - is queue or commandBatch protected?
Add@ CommandProcess.cpp - InitializeSubmitInfo()
Add@ CommandQueue::submitFrame() - from context?
Add@ CommandQueue::queueSubmitOneOff() - from context
Add@ CommandQueue::queueSubmit() - already set in SubmitInfo?
// Query protected Queues
vkGetPhysicalDeviceQueueFamilyProperties(...)
VkQueueFamilyProperties.queueFlags;
VkQueueFlagBits
VK_QUEUE_PROTECTED_BIT - is set, then the queues in this queue family support the VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT bit (protected-capable queue)
From: // Provided by VK_KHR_get_physical_device_properties2
void vkGetPhysicalDeviceQueueFamilyProperties2KHR
Add@ RendererVk::initialize = need to be sure we use the protected Queue for protected work. Need to be able to select which to use
// Create protected queue
VkDeviceQueueCreateInfo
VkDeviceQueueCreateFlags flags; - VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT
vkGetDeviceQueue
Add@ RendererVk::initializeDevice - Probably need 2 Queues, one protected the other not. Complicated by the priority scheme.
Need to select which of the queues to use protected/non-protected and priority
// Create Protected command pool
vkCreateCommandPool(...) - command buffers from pool are protected
VkCommandPoolCreateInfo - VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO
VkCommandPoolCreateFlags flags; - VK_COMMAND_POOL_CREATE_PROTECTED_BIT
Add@ CommandProcessor::releaseToCommandBatch() ?
Add@ PersistentCommandPool::init() - per Context, there is a TODO here
Add@ RendererVk::getCommandBufferOneOff() - per context?, add commandBuffer?
NoAdd@? vk_wrapper.h - CreateInfo provided to init() call
// Command buffer
vkCmdExecuteCommands
const VkCommandBuffer* pCommandBuffers - must be protected, if "other" resources protected
@ CommandBuffer::executeCommands
@ vk_helpers.cpp - seems contained in PrimaryCommand.
VkMemoryType
VkMemoryPropertyFlags propertyFlags;
VkMemoryPropertyFlagBits - VK_MEMORY_PROPERTY_PROTECTED_BIT
@ VkMemoryPropertyFlags GetPreferredMemoryType - translated from GL types. Need to make sure protected is accounted for.
@ This is embedded in all the VkCreate structures.
vkAllocateMemory(...)
VkMemoryAllocateInfo - VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO
.memoryTypeIndex - VK_MEMORY_PROPERTY_PROTECTED_BIT
@ DeviceMemory::allocate() - all calls to this provide structure with bit
Add@ FindAndAllocateCompatibleMemory() - needs to include protected memory bit
//Android
struct AHardwareBuffer;
.usage = AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT == VK_IMAGE_CREATE_PROTECTED_BIT
Add@ GetANativeWindowBufferProperties()
Add@ NativeBufferImageSiblingAndroid::initialize
Add@ NativeBufferImageSiblingAndroid::isProtected()
Add@ HardwareBufferImageSiblingVkAndroid::initImpl()
// Create protected buffer
vkCreateBuffer(...)
struct VkBufferCreateInfo - VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO
member VkBufferCreateFlags flags; - VK_BUFFER_CREATE_PROTECTED_BIT
Add@ BufferVk::setExternalBufferData() - set per context
Add@ ContextVk::initialize() - set per context
Add@ OverlayVk::createFont(), OverlayVk::cullWidgets(), OverlayVk::onPresent(), OverlayVk::onPresent() - per contectVk
Add@ TransformFeedbackVk::begin()
Add@ UtilsVk::stencilBlitResolveNoShaderExport(), UtilsVk::copyImageBits()
Add@ DynamicBuffer::allocateNewBuffer(), BufferHelper::init(), BufferHelper::initExternal()
Add@ StagingBuffer::init() - per use - read or write - so a layer up or more
// Create protected Image
vkCreateImage(...)
struct VkImageCreateInfo - VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
member VkImageCreateFlags flags; - VK_IMAGE_CREATE_PROTECTED_BIT
Add@ ImageHelper::initExternal() - pass in flag per use read/write?
Add@ ImageHelper::init2DStaging()
Add@ HardwareBufferImageSiblingVkAndroid::initImpl() may need to get/set protected
// Create protected ImageView
vkCreateImageView(...)
struct VkImageViewCreateInfo - VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
member VkImageViewCreateFlags flags; - VK_IMAGE_CREATE_PROTECTED_BIT
Add@ ImageHelper::initLayerImageViewImpl() pass protected in per use
vkBindBufferMemory(...) & vkBindBufferMemory2
VK_BUFFER_CREATE_PROTECTED_BIT must match VK_MEMORY_PROPERTY_PROTECTED_BIT
struct VkBindBufferMemoryInfo - VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO
@ this isn't used in ANGLE
vkBindImageMemory(...) and vkBindImageMemory2
VK_IMAGE_CREATE_PROTECTED_BIT must match up with VK_MEMORY_PROPERTY_PROTECTED_BIT
struct VkBindImageMemoryInfo - VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO
@ this isn't used in ANGLE
// Commands with protected bits
vkCmdBeginQuery(...)
vkCmdBeginQueryIndexedEXT(...)
vkCmdEndQuery(...)
vkCmdEndQueryIndexedEXT(...)
! commandBuffer must not be a protected command buffer
vkCmdClearColorImage(...)
vkCmdClearDepthStencilImage(...)
vkCmdCopyImage(...), vkCmdCopyImage2KHR(...)
! image and command buffer must match on protected/unprotected
vkCmdClearAttachments(...)
! attachments and command buffer must match protected/unprotected
vkCmdFillBuffer(...)
vkCmdUpdateBuffer(...)
vkCmdCopyBuffer(...) , vkCmdCopyBuffer2KHR(...)
! commandbuffer and buffer must match protected/unprotectec
vkCmdCopyBufferToImage(...), vkCmdCopyBufferToImage2KHR(...)
vkCmdCopyImageToBuffer(...), vkCmdCopyImageToBuffer2KHR(...)
vkCmdBlitImage(...), vkCmdBlitImage2KHR(...)
vkCmdResolveImage(...), vkCmdResolveImage2KHR(...)
! commandbuffer, srcImage, dstImage must match protected/unprotected
vkCmdDraw(...)
vkCmdDrawIndexed(...)
vkCmdDrawIndirect(...)
vkCmdDrawIndirectCount(...)
vkCmdDrawIndexedIndirect(...)
vkCmdDrawIndexedIndirectCount(...)
vkCmdDrawIndirectByteCountEXT(...)
vkCmdDispatch(...)
vkCmdDispatchIndirect(...)
vkCmdDispatchBase(...)
vkCmdTraceRaysKHR((...)
vkCmdTraceRaysIndirectKHR(..)
! commandBuffer and pipeline resources must match