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