radv: move vgt_gs_mode value to pipeline.
No need to recalculate this everytime. Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -599,27 +599,6 @@ radv_emit_vertex_shader(struct radv_cmd_buffer *cmd_buffer,
|
|||||||
radeon_set_context_reg(cmd_buffer->cs, R_028A84_VGT_PRIMITIVEID_EN, 0);
|
radeon_set_context_reg(cmd_buffer->cs, R_028A84_VGT_PRIMITIVEID_EN, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t si_vgt_gs_mode(struct radv_shader_variant *gs)
|
|
||||||
{
|
|
||||||
unsigned gs_max_vert_out = gs->info.gs.vertices_out;
|
|
||||||
unsigned cut_mode;
|
|
||||||
|
|
||||||
if (gs_max_vert_out <= 128) {
|
|
||||||
cut_mode = V_028A40_GS_CUT_128;
|
|
||||||
} else if (gs_max_vert_out <= 256) {
|
|
||||||
cut_mode = V_028A40_GS_CUT_256;
|
|
||||||
} else if (gs_max_vert_out <= 512) {
|
|
||||||
cut_mode = V_028A40_GS_CUT_512;
|
|
||||||
} else {
|
|
||||||
assert(gs_max_vert_out <= 1024);
|
|
||||||
cut_mode = V_028A40_GS_CUT_1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
return S_028A40_MODE(V_028A40_GS_SCENARIO_G) |
|
|
||||||
S_028A40_CUT_MODE(cut_mode)|
|
|
||||||
S_028A40_ES_WRITE_OPTIMIZE(1) |
|
|
||||||
S_028A40_GS_WRITE_OPTIMIZE(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
radv_emit_geometry_shader(struct radv_cmd_buffer *cmd_buffer,
|
radv_emit_geometry_shader(struct radv_cmd_buffer *cmd_buffer,
|
||||||
@@ -629,13 +608,11 @@ radv_emit_geometry_shader(struct radv_cmd_buffer *cmd_buffer,
|
|||||||
struct radv_shader_variant *gs;
|
struct radv_shader_variant *gs;
|
||||||
uint64_t va;
|
uint64_t va;
|
||||||
|
|
||||||
gs = pipeline->shaders[MESA_SHADER_GEOMETRY];
|
radeon_set_context_reg(cmd_buffer->cs, R_028A40_VGT_GS_MODE, pipeline->graphics.vgt_gs_mode);
|
||||||
if (!gs) {
|
|
||||||
radeon_set_context_reg(cmd_buffer->cs, R_028A40_VGT_GS_MODE, 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
radeon_set_context_reg(cmd_buffer->cs, R_028A40_VGT_GS_MODE, si_vgt_gs_mode(gs));
|
gs = pipeline->shaders[MESA_SHADER_GEOMETRY];
|
||||||
|
if (!gs)
|
||||||
|
return;
|
||||||
|
|
||||||
uint32_t gsvs_itemsize = gs->info.gs.max_gsvs_emit_size >> 2;
|
uint32_t gsvs_itemsize = gs->info.gs.max_gsvs_emit_size >> 2;
|
||||||
|
|
||||||
|
@@ -1505,6 +1505,28 @@ static const struct radv_prim_vertex_count prim_size_table[] = {
|
|||||||
[V_008958_DI_PT_2D_TRI_STRIP] = {0, 0},
|
[V_008958_DI_PT_2D_TRI_STRIP] = {0, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static uint32_t si_vgt_gs_mode(struct radv_shader_variant *gs)
|
||||||
|
{
|
||||||
|
unsigned gs_max_vert_out = gs->info.gs.vertices_out;
|
||||||
|
unsigned cut_mode;
|
||||||
|
|
||||||
|
if (gs_max_vert_out <= 128) {
|
||||||
|
cut_mode = V_028A40_GS_CUT_128;
|
||||||
|
} else if (gs_max_vert_out <= 256) {
|
||||||
|
cut_mode = V_028A40_GS_CUT_256;
|
||||||
|
} else if (gs_max_vert_out <= 512) {
|
||||||
|
cut_mode = V_028A40_GS_CUT_512;
|
||||||
|
} else {
|
||||||
|
assert(gs_max_vert_out <= 1024);
|
||||||
|
cut_mode = V_028A40_GS_CUT_1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_028A40_MODE(V_028A40_GS_SCENARIO_G) |
|
||||||
|
S_028A40_CUT_MODE(cut_mode)|
|
||||||
|
S_028A40_ES_WRITE_OPTIMIZE(1) |
|
||||||
|
S_028A40_GS_WRITE_OPTIMIZE(1);
|
||||||
|
}
|
||||||
|
|
||||||
VkResult
|
VkResult
|
||||||
radv_pipeline_init(struct radv_pipeline *pipeline,
|
radv_pipeline_init(struct radv_pipeline *pipeline,
|
||||||
struct radv_device *device,
|
struct radv_device *device,
|
||||||
@@ -1559,7 +1581,10 @@ radv_pipeline_init(struct radv_pipeline *pipeline,
|
|||||||
|
|
||||||
pipeline->active_stages |= mesa_to_vk_shader_stage(MESA_SHADER_GEOMETRY);
|
pipeline->active_stages |= mesa_to_vk_shader_stage(MESA_SHADER_GEOMETRY);
|
||||||
calculate_gs_ring_sizes(pipeline);
|
calculate_gs_ring_sizes(pipeline);
|
||||||
}
|
|
||||||
|
pipeline->graphics.vgt_gs_mode = si_vgt_gs_mode(pipeline->shaders[MESA_SHADER_GEOMETRY]);
|
||||||
|
} else
|
||||||
|
pipeline->graphics.vgt_gs_mode = 0;
|
||||||
|
|
||||||
if (!modules[MESA_SHADER_FRAGMENT]) {
|
if (!modules[MESA_SHADER_FRAGMENT]) {
|
||||||
nir_builder fs_b;
|
nir_builder fs_b;
|
||||||
|
@@ -957,6 +957,7 @@ struct radv_pipeline {
|
|||||||
struct radv_multisample_state ms;
|
struct radv_multisample_state ms;
|
||||||
unsigned prim;
|
unsigned prim;
|
||||||
unsigned gs_out;
|
unsigned gs_out;
|
||||||
|
uint32_t vgt_gs_mode;
|
||||||
bool prim_restart_enable;
|
bool prim_restart_enable;
|
||||||
unsigned esgs_ring_size;
|
unsigned esgs_ring_size;
|
||||||
unsigned gsvs_ring_size;
|
unsigned gsvs_ring_size;
|
||||||
|
Reference in New Issue
Block a user