From 34e3e164936d1d3cef267da7780e87f062fedf39 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Fri, 4 Dec 2020 16:41:17 +1000 Subject: [PATCH] lavapipe: add VK_EXT_conditional_rendering support. This passes all the CTS tests. Reviewed-by: Roland Scheidegger Part-of: --- .../frontends/lavapipe/lvp_cmd_buffer.c | 28 ++++++++++++++++++- src/gallium/frontends/lavapipe/lvp_device.c | 8 +++++- src/gallium/frontends/lavapipe/lvp_execute.c | 21 ++++++++++++++ .../frontends/lavapipe/lvp_extensions.py | 2 +- src/gallium/frontends/lavapipe/lvp_private.h | 9 ++++++ 5 files changed, 65 insertions(+), 3 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; };