lavapipe: add VK_EXT_conditional_rendering support.

This passes all the CTS tests.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8182>
This commit is contained in:
Dave Airlie 2020-12-04 16:41:17 +10:00
parent 9cc3328842
commit 34e3e16493
5 changed files with 65 additions and 3 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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'),

View File

@ -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;
};