Module: Mesa
Branch: main
Commit: be201008ca5f6735b44af649ff746d748d123684
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=be201008ca5f6735b44af649ff746d748d123684

Author: Lionel Landwerlin <[email protected]>
Date:   Thu Dec 10 16:01:31 2020 +0200

anv: Emit protection + session ID on protected command buffers

v2: Add the missing PIPE_CONTROL enable/disable bits

v3: Use new I915_PROTECTED_CONTENT_DEFAULT_SESSION

Signed-off-by: Lionel Landwerlin <[email protected]>
Reviewed-by: José Roberto de Souza <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8064>

---

 src/intel/vulkan/anv_private.h     |  2 ++
 src/intel/vulkan/genX_cmd_buffer.c | 29 +++++++++++++++++++++++++++++
 src/intel/vulkan/i915/anv_device.c |  2 ++
 3 files changed, 33 insertions(+)

diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index b3ae01e117e..c3ad9de96e6 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -1648,6 +1648,8 @@ struct anv_device {
 
     bool                                        robust_buffer_access;
 
+    uint32_t                                    protected_session_id;
+
     /** Shadow ray query BO
      *
      * The ray_query_bo only holds the current ray being traced. When using
diff --git a/src/intel/vulkan/genX_cmd_buffer.c 
b/src/intel/vulkan/genX_cmd_buffer.c
index 45f60ad6ec5..3b7794c5710 100644
--- a/src/intel/vulkan/genX_cmd_buffer.c
+++ b/src/intel/vulkan/genX_cmd_buffer.c
@@ -3332,6 +3332,23 @@ genX(BeginCommandBuffer)(
        anv_cmd_buffer_is_blitter_queue(cmd_buffer))
       return VK_SUCCESS;
 
+#if GFX_VER >= 12
+   if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY &&
+       cmd_buffer->vk.pool->flags & VK_COMMAND_POOL_CREATE_PROTECTED_BIT) {
+      anv_batch_emit(&cmd_buffer->batch, GENX(MI_SET_APPID), appid) {
+         /* Default value for single session. */
+         appid.ProtectedMemoryApplicationID = 
cmd_buffer->device->protected_session_id;
+         appid.ProtectedMemoryApplicationIDType = DISPLAY_APP;
+      }
+      anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
+         pc.CommandStreamerStallEnable = true;
+         pc.DCFlushEnable = true;
+         pc.RenderTargetCacheFlushEnable = true;
+         pc.ProtectedMemoryEnable = true;
+      }
+   }
+#endif
+
    genX(cmd_buffer_emit_state_base_address)(cmd_buffer);
 
    /* We sometimes store vertex data in the dynamic state buffer for blorp
@@ -3540,6 +3557,18 @@ end_command_buffer(struct anv_cmd_buffer *cmd_buffer)
 
    emit_isp_disable(cmd_buffer);
 
+#if GFX_VER >= 12
+   if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY &&
+       cmd_buffer->vk.pool->flags & VK_COMMAND_POOL_CREATE_PROTECTED_BIT) {
+      anv_batch_emit(&cmd_buffer->batch, GENX(PIPE_CONTROL), pc) {
+         pc.CommandStreamerStallEnable = true;
+         pc.DCFlushEnable = true;
+         pc.RenderTargetCacheFlushEnable = true;
+         pc.ProtectedMemoryDisable = true;
+      }
+   }
+#endif
+
    trace_intel_end_cmd_buffer(&cmd_buffer->trace, cmd_buffer->vk.level);
 
    anv_cmd_buffer_end_batch_buffer(cmd_buffer);
diff --git a/src/intel/vulkan/i915/anv_device.c 
b/src/intel/vulkan/i915/anv_device.c
index 9524eaef55d..f2909e09eff 100644
--- a/src/intel/vulkan/i915/anv_device.c
+++ b/src/intel/vulkan/i915/anv_device.c
@@ -264,6 +264,8 @@ anv_i915_device_setup_context(struct anv_device *device,
                               const VkDeviceCreateInfo *pCreateInfo,
                               const uint32_t num_queues)
 {
+   device->protected_session_id = I915_PROTECTED_CONTENT_DEFAULT_SESSION;
+
    if (device->physical->has_vm_control)
       return anv_i915_device_setup_vm(device);
 

Reply via email to