lavapipe: add support for VK_KHR_indirect_draw_count
Just hooks up the new cmds to the gallium draw API Reviewed-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7888>
This commit is contained in:
parent
f65b1d22f2
commit
6a265420dd
|
@ -1417,3 +1417,59 @@ void lvp_CmdPipelineBarrier(
|
|||
/* TODO finish off this */
|
||||
cmd_buf_queue(cmd_buffer, cmd);
|
||||
}
|
||||
|
||||
void lvp_CmdDrawIndirectCount(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBuffer buffer,
|
||||
VkDeviceSize offset,
|
||||
VkBuffer countBuffer,
|
||||
VkDeviceSize countBufferOffset,
|
||||
uint32_t maxDrawCount,
|
||||
uint32_t stride)
|
||||
{
|
||||
LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
LVP_FROM_HANDLE(lvp_buffer, buf, buffer);
|
||||
LVP_FROM_HANDLE(lvp_buffer, count_buf, countBuffer);
|
||||
struct lvp_cmd_buffer_entry *cmd;
|
||||
|
||||
cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DRAW_INDIRECT_COUNT);
|
||||
if (!cmd)
|
||||
return;
|
||||
|
||||
cmd->u.draw_indirect_count.offset = offset;
|
||||
cmd->u.draw_indirect_count.buffer = buf;
|
||||
cmd->u.draw_indirect_count.count_buffer_offset = countBufferOffset;
|
||||
cmd->u.draw_indirect_count.count_buffer = count_buf;
|
||||
cmd->u.draw_indirect_count.max_draw_count = maxDrawCount;
|
||||
cmd->u.draw_indirect_count.stride = stride;
|
||||
|
||||
cmd_buf_queue(cmd_buffer, cmd);
|
||||
}
|
||||
|
||||
void lvp_CmdDrawIndexedIndirectCount(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBuffer buffer,
|
||||
VkDeviceSize offset,
|
||||
VkBuffer countBuffer,
|
||||
VkDeviceSize countBufferOffset,
|
||||
uint32_t maxDrawCount,
|
||||
uint32_t stride)
|
||||
{
|
||||
LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
LVP_FROM_HANDLE(lvp_buffer, buf, buffer);
|
||||
LVP_FROM_HANDLE(lvp_buffer, count_buf, countBuffer);
|
||||
struct lvp_cmd_buffer_entry *cmd;
|
||||
|
||||
cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DRAW_INDEXED_INDIRECT_COUNT);
|
||||
if (!cmd)
|
||||
return;
|
||||
|
||||
cmd->u.draw_indirect_count.offset = offset;
|
||||
cmd->u.draw_indirect_count.buffer = buf;
|
||||
cmd->u.draw_indirect_count.count_buffer_offset = countBufferOffset;
|
||||
cmd->u.draw_indirect_count.count_buffer = count_buf;
|
||||
cmd->u.draw_indirect_count.max_draw_count = maxDrawCount;
|
||||
cmd->u.draw_indirect_count.stride = stride;
|
||||
|
||||
cmd_buf_queue(cmd_buffer, cmd);
|
||||
}
|
||||
|
|
|
@ -2283,6 +2283,25 @@ static void handle_resolve_image(struct lvp_cmd_buffer_entry *cmd,
|
|||
}
|
||||
}
|
||||
|
||||
static void handle_draw_indirect_count(struct lvp_cmd_buffer_entry *cmd,
|
||||
struct rendering_state *state, bool indexed)
|
||||
{
|
||||
if (indexed) {
|
||||
state->info.index_bounds_valid = false;
|
||||
state->info.index_size = state->index_size;
|
||||
state->info.index.resource = state->index_buffer;
|
||||
state->info.max_index = ~0;
|
||||
} else
|
||||
state->info.index_size = 0;
|
||||
state->indirect_info.offset = cmd->u.draw_indirect_count.offset;
|
||||
state->indirect_info.stride = cmd->u.draw_indirect_count.stride;
|
||||
state->indirect_info.draw_count = cmd->u.draw_indirect_count.max_draw_count;
|
||||
state->indirect_info.buffer = cmd->u.draw_indirect_count.buffer->bo;
|
||||
state->indirect_info.indirect_draw_count_offset = cmd->u.draw_indirect_count.count_buffer_offset;
|
||||
state->indirect_info.indirect_draw_count = cmd->u.draw_indirect_count.count_buffer->bo;
|
||||
state->pctx->draw_vbo(state->pctx, &state->info, &state->indirect_info, &state->draw, 1);
|
||||
}
|
||||
|
||||
static void lvp_execute_cmd_buffer(struct lvp_cmd_buffer *cmd_buffer,
|
||||
struct rendering_state *state)
|
||||
{
|
||||
|
@ -2426,6 +2445,14 @@ static void lvp_execute_cmd_buffer(struct lvp_cmd_buffer *cmd_buffer,
|
|||
case LVP_CMD_EXECUTE_COMMANDS:
|
||||
handle_execute_commands(cmd, state);
|
||||
break;
|
||||
case LVP_CMD_DRAW_INDIRECT_COUNT:
|
||||
emit_state(state);
|
||||
handle_draw_indirect_count(cmd, state, false);
|
||||
break;
|
||||
case LVP_CMD_DRAW_INDEXED_INDIRECT_COUNT:
|
||||
emit_state(state);
|
||||
handle_draw_indirect_count(cmd, state, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@ EXTENSIONS = [
|
|||
Extension('VK_KHR_descriptor_update_template', 1, False),
|
||||
Extension('VK_KHR_device_group', 1, False),
|
||||
Extension('VK_KHR_device_group_creation', 1, False),
|
||||
Extension('VK_KHR_draw_indirect_count', 1, False),
|
||||
Extension('VK_KHR_draw_indirect_count', 1, True),
|
||||
Extension('VK_KHR_driver_properties', 1, True),
|
||||
Extension('VK_KHR_external_fence', 1, False),
|
||||
Extension('VK_KHR_external_fence_capabilities', 1, True),
|
||||
|
|
|
@ -640,6 +640,8 @@ enum lvp_cmds {
|
|||
LVP_CMD_NEXT_SUBPASS,
|
||||
LVP_CMD_END_RENDER_PASS,
|
||||
LVP_CMD_EXECUTE_COMMANDS,
|
||||
LVP_CMD_DRAW_INDIRECT_COUNT,
|
||||
LVP_CMD_DRAW_INDEXED_INDIRECT_COUNT,
|
||||
};
|
||||
|
||||
struct lvp_cmd_bind_pipeline {
|
||||
|
@ -904,6 +906,15 @@ struct lvp_cmd_execute_commands {
|
|||
struct lvp_cmd_buffer *cmd_buffers[0];
|
||||
};
|
||||
|
||||
struct lvp_cmd_draw_indirect_count {
|
||||
VkDeviceSize offset;
|
||||
struct lvp_buffer *buffer;
|
||||
VkDeviceSize count_buffer_offset;
|
||||
struct lvp_buffer *count_buffer;
|
||||
uint32_t max_draw_count;
|
||||
uint32_t stride;
|
||||
};
|
||||
|
||||
struct lvp_cmd_buffer_entry {
|
||||
struct list_head cmd_link;
|
||||
uint32_t cmd_type;
|
||||
|
@ -944,6 +955,7 @@ struct lvp_cmd_buffer_entry {
|
|||
struct lvp_cmd_begin_render_pass begin_render_pass;
|
||||
struct lvp_cmd_next_subpass next_subpass;
|
||||
struct lvp_cmd_execute_commands execute_commands;
|
||||
struct lvp_cmd_draw_indirect_count draw_indirect_count;
|
||||
} u;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue