anv: extract out draw call generation
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Ivan Briano <ivan.briano@intel.com> Tested-by: Felix DeGrood <felix.j.degrood@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25361>
This commit is contained in:

committed by
Marge Bot

parent
8ab3c03a32
commit
d5aec0ca4b
@@ -27,56 +27,62 @@
|
||||
|
||||
#include "common_generated_draws.glsl"
|
||||
|
||||
void main()
|
||||
void write_draw(uint item_idx, uint cmd_idx, uint draw_id)
|
||||
{
|
||||
bool is_indexed = (flags & ANV_GENERATED_FLAG_INDEXED) != 0;
|
||||
bool is_predicated = (flags & ANV_GENERATED_FLAG_PREDICATED) != 0;
|
||||
uint indirect_data_offset = item_idx * indirect_data_stride / 4;
|
||||
|
||||
if (is_indexed) {
|
||||
/* Loading a VkDrawIndexedIndirectCommand */
|
||||
uint index_count = indirect_data[indirect_data_offset + 0];
|
||||
uint instance_count = indirect_data[indirect_data_offset + 1] * instance_multiplier;
|
||||
uint first_index = indirect_data[indirect_data_offset + 2];
|
||||
uint vertex_offset = indirect_data[indirect_data_offset + 3];
|
||||
uint first_instance = indirect_data[indirect_data_offset + 4];
|
||||
|
||||
write_3DPRIMITIVE_EXTENDED(cmd_idx,
|
||||
is_predicated,
|
||||
is_indexed,
|
||||
index_count,
|
||||
first_index,
|
||||
instance_count,
|
||||
first_instance,
|
||||
vertex_offset,
|
||||
vertex_offset,
|
||||
first_instance,
|
||||
draw_id);
|
||||
} else {
|
||||
/* Loading a VkDrawIndirectCommand structure */
|
||||
uint vertex_count = indirect_data[indirect_data_offset + 0];
|
||||
uint instance_count = indirect_data[indirect_data_offset + 1] * instance_multiplier;
|
||||
uint first_vertex = indirect_data[indirect_data_offset + 2];
|
||||
uint first_instance = indirect_data[indirect_data_offset + 3];
|
||||
|
||||
write_3DPRIMITIVE_EXTENDED(cmd_idx,
|
||||
is_predicated,
|
||||
is_indexed,
|
||||
vertex_count,
|
||||
first_vertex,
|
||||
instance_count,
|
||||
first_instance,
|
||||
0 /* base_vertex_location */,
|
||||
first_vertex,
|
||||
first_instance,
|
||||
draw_id);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
uint _3dprim_dw_size = (flags >> 16) & 0xff;
|
||||
uint item_idx = uint(gl_FragCoord.y) * 8192 + uint(gl_FragCoord.x);
|
||||
uint indirect_data_offset = item_idx * indirect_data_stride / 4;
|
||||
uint cmd_idx = item_idx * _3dprim_dw_size;
|
||||
uint draw_id = draw_base + item_idx;
|
||||
|
||||
if (draw_id < draw_count) {
|
||||
if (is_indexed) {
|
||||
/* Loading a VkDrawIndexedIndirectCommand */
|
||||
uint index_count = indirect_data[indirect_data_offset + 0];
|
||||
uint instance_count = indirect_data[indirect_data_offset + 1] * instance_multiplier;
|
||||
uint first_index = indirect_data[indirect_data_offset + 2];
|
||||
uint vertex_offset = indirect_data[indirect_data_offset + 3];
|
||||
uint first_instance = indirect_data[indirect_data_offset + 4];
|
||||
|
||||
write_3DPRIMITIVE_EXTENDED(cmd_idx,
|
||||
is_predicated,
|
||||
is_indexed,
|
||||
index_count,
|
||||
first_index,
|
||||
instance_count,
|
||||
first_instance,
|
||||
vertex_offset,
|
||||
vertex_offset,
|
||||
first_instance,
|
||||
draw_id);
|
||||
} else {
|
||||
/* Loading a VkDrawIndirectCommand structure */
|
||||
uint vertex_count = indirect_data[indirect_data_offset + 0];
|
||||
uint instance_count = indirect_data[indirect_data_offset + 1] * instance_multiplier;
|
||||
uint first_vertex = indirect_data[indirect_data_offset + 2];
|
||||
uint first_instance = indirect_data[indirect_data_offset + 3];
|
||||
|
||||
write_3DPRIMITIVE_EXTENDED(cmd_idx,
|
||||
is_predicated,
|
||||
is_indexed,
|
||||
vertex_count,
|
||||
first_vertex,
|
||||
instance_count,
|
||||
first_instance,
|
||||
0 /* base_vertex_location */,
|
||||
first_vertex,
|
||||
first_instance,
|
||||
draw_id);
|
||||
}
|
||||
}
|
||||
if (draw_id < draw_count)
|
||||
write_draw(item_idx, cmd_idx, draw_id);
|
||||
|
||||
end_generated_draws(cmd_idx, draw_id, draw_count);
|
||||
}
|
||||
|
@@ -27,115 +27,120 @@
|
||||
|
||||
#include "common_generated_draws.glsl"
|
||||
|
||||
void main()
|
||||
void write_draw(uint item_idx, uint cmd_idx, uint draw_id)
|
||||
{
|
||||
bool is_indexed = (flags & ANV_GENERATED_FLAG_INDEXED) != 0;
|
||||
bool is_predicated = (flags & ANV_GENERATED_FLAG_PREDICATED) != 0;
|
||||
bool uses_base = (flags & ANV_GENERATED_FLAG_BASE) != 0;
|
||||
bool uses_drawid = (flags & ANV_GENERATED_FLAG_DRAWID) != 0;
|
||||
uint mocs = (flags >> 8) & 0xff;
|
||||
uint indirect_data_offset = item_idx * indirect_data_stride / 4;
|
||||
|
||||
if (is_indexed) {
|
||||
/* Loading a VkDrawIndexedIndirectCommand */
|
||||
uint index_count = indirect_data[indirect_data_offset + 0];
|
||||
uint instance_count = indirect_data[indirect_data_offset + 1] * instance_multiplier;
|
||||
uint first_index = indirect_data[indirect_data_offset + 2];
|
||||
uint vertex_offset = indirect_data[indirect_data_offset + 3];
|
||||
uint first_instance = indirect_data[indirect_data_offset + 4];
|
||||
|
||||
if (uses_base || uses_drawid) {
|
||||
uint state_vertex_len =
|
||||
1 + (uses_base ? 4 : 0) + (uses_drawid ? 4 : 0);
|
||||
commands[cmd_idx] =
|
||||
(3 << 29 | /* Command Type */
|
||||
3 << 27 | /* Command SubType */
|
||||
0 << 24 | /* 3D Command Opcode */
|
||||
8 << 16 | /* 3D Command Sub Opcode */
|
||||
(state_vertex_len - 2) << 0); /* DWord Length */
|
||||
cmd_idx += 1;
|
||||
if (uses_base) {
|
||||
uint64_t indirect_draw_data_addr =
|
||||
indirect_data_addr + item_idx * indirect_data_stride + 12;
|
||||
write_VERTEX_BUFFER_STATE(cmd_idx,
|
||||
mocs,
|
||||
31,
|
||||
indirect_draw_data_addr,
|
||||
8);
|
||||
cmd_idx += 4;
|
||||
}
|
||||
if (uses_drawid) {
|
||||
uint64_t draw_idx_addr = draw_id_addr + 4 * item_idx;
|
||||
draw_ids[item_idx] = draw_id;
|
||||
write_VERTEX_BUFFER_STATE(cmd_idx,
|
||||
mocs,
|
||||
32,
|
||||
draw_idx_addr,
|
||||
4);
|
||||
cmd_idx += 4;
|
||||
}
|
||||
}
|
||||
write_3DPRIMITIVE(cmd_idx,
|
||||
is_predicated,
|
||||
is_indexed,
|
||||
index_count,
|
||||
first_index,
|
||||
instance_count,
|
||||
first_instance,
|
||||
vertex_offset);
|
||||
} else {
|
||||
/* Loading a VkDrawIndirectCommand structure */
|
||||
uint vertex_count = indirect_data[indirect_data_offset + 0];
|
||||
uint instance_count = indirect_data[indirect_data_offset + 1] * instance_multiplier;
|
||||
uint first_vertex = indirect_data[indirect_data_offset + 2];
|
||||
uint first_instance = indirect_data[indirect_data_offset + 3];
|
||||
|
||||
if (uses_base || uses_drawid) {
|
||||
uint state_vertex_len =
|
||||
1 + (uses_base ? 4 : 0) + (uses_drawid ? 4 : 0);
|
||||
commands[cmd_idx] =
|
||||
(3 << 29 | /* Command Type */
|
||||
3 << 27 | /* Command SubType */
|
||||
0 << 24 | /* 3D Command Opcode */
|
||||
8 << 16 | /* 3D Command Sub Opcode */
|
||||
(state_vertex_len - 2) << 0); /* DWord Length */
|
||||
cmd_idx += 1;
|
||||
if (uses_base) {
|
||||
uint64_t indirect_draw_data_addr =
|
||||
indirect_data_addr + item_idx * indirect_data_stride + 8;
|
||||
write_VERTEX_BUFFER_STATE(cmd_idx,
|
||||
mocs,
|
||||
31,
|
||||
indirect_draw_data_addr,
|
||||
8);
|
||||
cmd_idx += 4;
|
||||
}
|
||||
if (uses_drawid) {
|
||||
uint64_t draw_idx_addr = draw_id_addr + 4 * item_idx;
|
||||
draw_ids[item_idx] = draw_id;
|
||||
write_VERTEX_BUFFER_STATE(cmd_idx,
|
||||
mocs,
|
||||
32,
|
||||
draw_idx_addr,
|
||||
4);
|
||||
cmd_idx += 4;
|
||||
}
|
||||
}
|
||||
write_3DPRIMITIVE(cmd_idx,
|
||||
is_predicated,
|
||||
is_indexed,
|
||||
vertex_count,
|
||||
first_vertex,
|
||||
instance_count,
|
||||
first_instance,
|
||||
0 /* base_vertex_location */);
|
||||
}
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
uint _3dprim_dw_size = (flags >> 16) & 0xff;
|
||||
uint item_idx = uint(gl_FragCoord.y) * 8192 + uint(gl_FragCoord.x);
|
||||
uint indirect_data_offset = item_idx * indirect_data_stride / 4;
|
||||
uint cmd_idx = item_idx * _3dprim_dw_size;
|
||||
uint draw_id = draw_base + item_idx;
|
||||
|
||||
if (draw_id < draw_count) {
|
||||
if (is_indexed) {
|
||||
/* Loading a VkDrawIndexedIndirectCommand */
|
||||
uint index_count = indirect_data[indirect_data_offset + 0];
|
||||
uint instance_count = indirect_data[indirect_data_offset + 1] * instance_multiplier;
|
||||
uint first_index = indirect_data[indirect_data_offset + 2];
|
||||
uint vertex_offset = indirect_data[indirect_data_offset + 3];
|
||||
uint first_instance = indirect_data[indirect_data_offset + 4];
|
||||
|
||||
if (uses_base || uses_drawid) {
|
||||
uint state_vertex_len =
|
||||
1 + (uses_base ? 4 : 0) + (uses_drawid ? 4 : 0);
|
||||
commands[cmd_idx] =
|
||||
(3 << 29 | /* Command Type */
|
||||
3 << 27 | /* Command SubType */
|
||||
0 << 24 | /* 3D Command Opcode */
|
||||
8 << 16 | /* 3D Command Sub Opcode */
|
||||
(state_vertex_len - 2) << 0); /* DWord Length */
|
||||
cmd_idx += 1;
|
||||
if (uses_base) {
|
||||
uint64_t indirect_draw_data_addr =
|
||||
indirect_data_addr + item_idx * indirect_data_stride + 12;
|
||||
write_VERTEX_BUFFER_STATE(cmd_idx,
|
||||
mocs,
|
||||
31,
|
||||
indirect_draw_data_addr,
|
||||
8);
|
||||
cmd_idx += 4;
|
||||
}
|
||||
if (uses_drawid) {
|
||||
uint64_t draw_idx_addr = draw_id_addr + 4 * item_idx;
|
||||
draw_ids[item_idx] = draw_id;
|
||||
write_VERTEX_BUFFER_STATE(cmd_idx,
|
||||
mocs,
|
||||
32,
|
||||
draw_idx_addr,
|
||||
4);
|
||||
cmd_idx += 4;
|
||||
}
|
||||
}
|
||||
write_3DPRIMITIVE(cmd_idx,
|
||||
is_predicated,
|
||||
is_indexed,
|
||||
index_count,
|
||||
first_index,
|
||||
instance_count,
|
||||
first_instance,
|
||||
vertex_offset);
|
||||
} else {
|
||||
/* Loading a VkDrawIndirectCommand structure */
|
||||
uint vertex_count = indirect_data[indirect_data_offset + 0];
|
||||
uint instance_count = indirect_data[indirect_data_offset + 1] * instance_multiplier;
|
||||
uint first_vertex = indirect_data[indirect_data_offset + 2];
|
||||
uint first_instance = indirect_data[indirect_data_offset + 3];
|
||||
|
||||
if (uses_base || uses_drawid) {
|
||||
uint state_vertex_len =
|
||||
1 + (uses_base ? 4 : 0) + (uses_drawid ? 4 : 0);
|
||||
commands[cmd_idx] =
|
||||
(3 << 29 | /* Command Type */
|
||||
3 << 27 | /* Command SubType */
|
||||
0 << 24 | /* 3D Command Opcode */
|
||||
8 << 16 | /* 3D Command Sub Opcode */
|
||||
(state_vertex_len - 2) << 0); /* DWord Length */
|
||||
cmd_idx += 1;
|
||||
if (uses_base) {
|
||||
uint64_t indirect_draw_data_addr =
|
||||
indirect_data_addr + item_idx * indirect_data_stride + 8;
|
||||
write_VERTEX_BUFFER_STATE(cmd_idx,
|
||||
mocs,
|
||||
31,
|
||||
indirect_draw_data_addr,
|
||||
8);
|
||||
cmd_idx += 4;
|
||||
}
|
||||
if (uses_drawid) {
|
||||
uint64_t draw_idx_addr = draw_id_addr + 4 * item_idx;
|
||||
draw_ids[item_idx] = draw_id;
|
||||
write_VERTEX_BUFFER_STATE(cmd_idx,
|
||||
mocs,
|
||||
32,
|
||||
draw_idx_addr,
|
||||
4);
|
||||
cmd_idx += 4;
|
||||
}
|
||||
}
|
||||
write_3DPRIMITIVE(cmd_idx,
|
||||
is_predicated,
|
||||
is_indexed,
|
||||
vertex_count,
|
||||
first_vertex,
|
||||
instance_count,
|
||||
first_instance,
|
||||
0 /* base_vertex_location */);
|
||||
}
|
||||
}
|
||||
if (draw_id < draw_count)
|
||||
write_draw(item_idx, cmd_idx, draw_id);
|
||||
|
||||
end_generated_draws(cmd_idx, draw_id, draw_count);
|
||||
}
|
||||
|
Reference in New Issue
Block a user