Mesa (master): lavapipe: add VK_EXT_conditional_rendering support.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jan 27 01:28:57 UTC 2021


Module: Mesa
Branch: master
Commit: 34e3e164936d1d3cef267da7780e87f062fedf39
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=34e3e164936d1d3cef267da7780e87f062fedf39

Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Dec  4 16:41:17 2020 +1000

lavapipe: add VK_EXT_conditional_rendering support.

This passes all the CTS tests.

Reviewed-by: Roland Scheidegger <sroland at vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8182>

---

 src/gallium/frontends/lavapipe/lvp_cmd_buffer.c  | 26 ++++++++++++++++++++++++
 src/gallium/frontends/lavapipe/lvp_device.c      |  8 +++++++-
 src/gallium/frontends/lavapipe/lvp_execute.c     | 21 +++++++++++++++++++
 src/gallium/frontends/lavapipe/lvp_extensions.py |  2 +-
 src/gallium/frontends/lavapipe/lvp_private.h     |  9 ++++++++
 5 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c b/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c
index 3871990bae1..e28c4b5309b 100644
--- a/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c
+++ b/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c
@@ -1797,6 +1797,32 @@ void lvp_CmdDispatchBase(
    cmd->u.dispatch.base_x = base_x;
    cmd->u.dispatch.base_y = base_y;
    cmd->u.dispatch.base_z = base_z;
+   cmd_buf_queue(cmd_buffer, cmd);
+}
+
+void lvp_CmdBeginConditionalRenderingEXT(
+   VkCommandBuffer commandBuffer,
+   const VkConditionalRenderingBeginInfoEXT *pConditionalRenderingBegin)
+{
+   LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
+   struct lvp_cmd_buffer_entry *cmd;
+   cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_BEGIN_CONDITIONAL_RENDERING);
+   if (!cmd)
+      return;
 
+   cmd->u.begin_conditional_rendering.buffer = lvp_buffer_from_handle(pConditionalRenderingBegin->buffer);
+   cmd->u.begin_conditional_rendering.offset = pConditionalRenderingBegin->offset;
+   cmd->u.begin_conditional_rendering.inverted = pConditionalRenderingBegin->flags & VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT;
+   cmd_buf_queue(cmd_buffer, cmd);
+}
+
+void lvp_CmdEndConditionalRenderingEXT(
+   VkCommandBuffer commandBuffer)
+{
+   LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
+   struct lvp_cmd_buffer_entry *cmd;
+   cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_END_CONDITIONAL_RENDERING);
+   if (!cmd)
+      return;
    cmd_buf_queue(cmd_buffer, cmd);
 }
diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c
index 3d05e424278..8869222c26e 100644
--- a/src/gallium/frontends/lavapipe/lvp_device.c
+++ b/src/gallium/frontends/lavapipe/lvp_device.c
@@ -371,7 +371,6 @@ void lvp_GetPhysicalDeviceFeatures2(
          features->privateData = true;
          break;
       }
-
       case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
          VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *features =
             (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *)ext;
@@ -398,6 +397,13 @@ void lvp_GetPhysicalDeviceFeatures2(
          features->geometryStreams = true;
          break;
       }
+      case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+         VkPhysicalDeviceConditionalRenderingFeaturesEXT *features =
+            (VkPhysicalDeviceConditionalRenderingFeaturesEXT*)ext;
+         features->conditionalRendering = true;
+         features->inheritedConditionalRendering = false;
+         break;
+      }
       default:
          break;
       }
diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c
index 5f6ac808d01..f3bdcd8a3bd 100644
--- a/src/gallium/frontends/lavapipe/lvp_execute.c
+++ b/src/gallium/frontends/lavapipe/lvp_execute.c
@@ -2540,6 +2540,21 @@ static void handle_draw_indirect_byte_count(struct lvp_cmd_buffer_entry *cmd,
    state->pctx->draw_vbo(state->pctx, &state->info, &state->indirect_info, &state->draw, 1);
 }
 
+static void handle_begin_conditional_rendering(struct lvp_cmd_buffer_entry *cmd,
+                                               struct rendering_state *state)
+{
+   struct lvp_cmd_begin_conditional_rendering *bcr = &cmd->u.begin_conditional_rendering;
+   state->pctx->render_condition_mem(state->pctx,
+                                     bcr->buffer->bo,
+                                     bcr->buffer->offset + bcr->offset,
+                                     bcr->inverted);
+}
+
+static void handle_end_conditional_rendering(struct rendering_state *state)
+{
+   state->pctx->render_condition_mem(state->pctx, NULL, 0, false);
+}
+
 static void lvp_execute_cmd_buffer(struct lvp_cmd_buffer *cmd_buffer,
                                    struct rendering_state *state)
 {
@@ -2706,6 +2721,12 @@ static void lvp_execute_cmd_buffer(struct lvp_cmd_buffer *cmd_buffer,
       case LVP_CMD_DRAW_INDIRECT_BYTE_COUNT:
          emit_state(state);
          handle_draw_indirect_byte_count(cmd, state);
+	 break;
+      case LVP_CMD_BEGIN_CONDITIONAL_RENDERING:
+         handle_begin_conditional_rendering(cmd, state);
+         break;
+      case LVP_CMD_END_CONDITIONAL_RENDERING:
+         handle_end_conditional_rendering(state);
          break;
       }
    }
diff --git a/src/gallium/frontends/lavapipe/lvp_extensions.py b/src/gallium/frontends/lavapipe/lvp_extensions.py
index 408d2572211..4e988dc2e67 100644
--- a/src/gallium/frontends/lavapipe/lvp_extensions.py
+++ b/src/gallium/frontends/lavapipe/lvp_extensions.py
@@ -110,7 +110,7 @@ EXTENSIONS = [
     Extension('VK_EXT_acquire_xlib_display',              1, 'VK_USE_PLATFORM_XLIB_XRANDR_EXT'),
     Extension('VK_EXT_buffer_device_address',             1, False),
     Extension('VK_EXT_calibrated_timestamps',             1, False),
-    Extension('VK_EXT_conditional_rendering',             1, False),
+    Extension('VK_EXT_conditional_rendering',             1, True),
     Extension('VK_EXT_conservative_rasterization',        1, False),
     Extension('VK_EXT_display_surface_counter',           1, 'VK_USE_PLATFORM_DISPLAY_KHR'),
     Extension('VK_EXT_display_control',                   1, 'VK_USE_PLATFORM_DISPLAY_KHR'),
diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h
index 472ff9c5fc6..ff83f93c283 100644
--- a/src/gallium/frontends/lavapipe/lvp_private.h
+++ b/src/gallium/frontends/lavapipe/lvp_private.h
@@ -664,6 +664,8 @@ enum lvp_cmds {
    LVP_CMD_BEGIN_TRANSFORM_FEEDBACK,
    LVP_CMD_END_TRANSFORM_FEEDBACK,
    LVP_CMD_DRAW_INDIRECT_BYTE_COUNT,
+   LVP_CMD_BEGIN_CONDITIONAL_RENDERING,
+   LVP_CMD_END_CONDITIONAL_RENDERING,
 };
 
 struct lvp_cmd_bind_pipeline {
@@ -987,6 +989,12 @@ struct lvp_cmd_draw_indirect_byte_count {
    uint32_t vertex_stride;
 };
 
+struct lvp_cmd_begin_conditional_rendering {
+   struct lvp_buffer *buffer;
+   VkDeviceSize offset;
+   bool inverted;
+};
+
 struct lvp_cmd_buffer_entry {
    struct list_head cmd_link;
    uint32_t cmd_type;
@@ -1033,6 +1041,7 @@ struct lvp_cmd_buffer_entry {
       struct lvp_cmd_begin_transform_feedback begin_transform_feedback;
       struct lvp_cmd_end_transform_feedback end_transform_feedback;
       struct lvp_cmd_draw_indirect_byte_count draw_indirect_byte_count;
+      struct lvp_cmd_begin_conditional_rendering begin_conditional_rendering;
    } u;
 };
 



More information about the mesa-commit mailing list