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:
parent
9cc3328842
commit
34e3e16493
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue