[Mesa-dev] [PATCH 3/4] radeonsi: add start instance support
From: Christian König This works different than on R600, we need to add the start instance manually. Signed-off-by: Christian König Reviewed-by: Michel Dänzer Tested-by: Michel Dänzer --- src/gallium/drivers/radeonsi/radeonsi_shader.c | 13 - src/gallium/drivers/radeonsi/radeonsi_shader.h | 12 +++- src/gallium/drivers/radeonsi/si_state_draw.c |6 ++ 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c index 62f478e..0512528 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c @@ -351,11 +351,15 @@ static void declare_system_value( unsigned index, const struct tgsi_full_declaration *decl) { + struct gallivm_state * gallivm = radeon_bld->soa.bld_base.base.gallivm; + LLVMValueRef value = 0; switch (decl->Semantic.Name) { case TGSI_SEMANTIC_INSTANCEID: value = LLVMGetParam(radeon_bld->main_fn, SI_PARAM_INSTANCE_ID); + value = LLVMBuildAdd(gallivm->builder, value, + LLVMGetParam(radeon_bld->main_fn, SI_PARAM_START_INSTANCE), ""); break; case TGSI_SEMANTIC_VERTEXID: @@ -963,11 +967,12 @@ static void create_function(struct si_shader_context *si_shader_ctx) if (si_shader_ctx->type == TGSI_PROCESSOR_VERTEX) { params[SI_PARAM_VERTEX_BUFFER] = params[SI_PARAM_SAMPLER]; + params[SI_PARAM_START_INSTANCE] = i32; params[SI_PARAM_VERTEX_ID] = i32; params[SI_PARAM_DUMMY_0] = i32; params[SI_PARAM_DUMMY_1] = i32; params[SI_PARAM_INSTANCE_ID] = i32; - radeon_llvm_create_func(&si_shader_ctx->radeon_bld, params, 8); + radeon_llvm_create_func(&si_shader_ctx->radeon_bld, params, 9); } else { params[SI_PARAM_PRIM_MASK] = i32; @@ -995,6 +1000,12 @@ static void create_function(struct si_shader_context *si_shader_ctx) LLVMValueRef P = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, i); LLVMAddAttribute(P, LLVMInRegAttribute); } + + if (si_shader_ctx->type == TGSI_PROCESSOR_VERTEX) { + LLVMValueRef P = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, + SI_PARAM_START_INSTANCE); + LLVMAddAttribute(P, LLVMInRegAttribute); + } } static void preload_constants(struct si_shader_context *si_shader_ctx) diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.h b/src/gallium/drivers/radeonsi/radeonsi_shader.h index 8f5efd0..9dae742 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.h +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.h @@ -33,8 +33,9 @@ #define SI_SGPR_SAMPLER2 #define SI_SGPR_RESOURCE 4 #define SI_SGPR_VERTEX_BUFFER 6 +#define SI_SGPR_START_INSTANCE 8 -#define SI_VS_NUM_USER_SGPR8 +#define SI_VS_NUM_USER_SGPR9 #define SI_PS_NUM_USER_SGPR6 /* LLVM function parameter indices */ @@ -44,10 +45,11 @@ /* VS only parameters */ #define SI_PARAM_VERTEX_BUFFER 3 -#define SI_PARAM_VERTEX_ID 4 -#define SI_PARAM_DUMMY_0 5 -#define SI_PARAM_DUMMY_1 6 -#define SI_PARAM_INSTANCE_ID 7 +#define SI_PARAM_START_INSTANCE4 +#define SI_PARAM_VERTEX_ID 5 +#define SI_PARAM_DUMMY_0 6 +#define SI_PARAM_DUMMY_1 7 +#define SI_PARAM_INSTANCE_ID 8 /* PS only parameters */ #define SI_PARAM_PRIM_MASK 3 diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index 91bcdf8..383d2a0 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -279,10 +279,8 @@ static bool si_update_draw_info_state(struct r600_context *rctx, info->indexed ? info->index_bias : info->start); si_pm4_set_reg(pm4, R_02840C_VGT_MULTI_PRIM_IB_RESET_INDX, info->restart_index); si_pm4_set_reg(pm4, R_028A94_VGT_MULTI_PRIM_IB_RESET_EN, info->primitive_restart); -#if 0 - si_pm4_set_reg(pm4, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0); - si_pm4_set_reg(pm4, R_03CFF4_SQ_VTX_START_INST_LOC, info->start_instance); -#endif + si_pm4_set_reg(pm4, R_00B130_SPI_SHADER_USER_DATA_VS_0 + SI_SGPR_START_INSTANCE * 4, + info->start_instance); if (prim == V_008958_DI_PT_LINELIST) ls_mask = 1; -- 1.7.9.5 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [PATCH 3/4] radeonsi: add start instance support
From: Christian König This works different than on R600, we need to add the start instance manually. Signed-off-by: Christian König --- src/gallium/drivers/radeonsi/radeonsi_shader.c | 13 - src/gallium/drivers/radeonsi/radeonsi_shader.h | 12 +++- src/gallium/drivers/radeonsi/si_state_draw.c |6 ++ 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c index 62f478e..0512528 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.c +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c @@ -351,11 +351,15 @@ static void declare_system_value( unsigned index, const struct tgsi_full_declaration *decl) { + struct gallivm_state * gallivm = radeon_bld->soa.bld_base.base.gallivm; + LLVMValueRef value = 0; switch (decl->Semantic.Name) { case TGSI_SEMANTIC_INSTANCEID: value = LLVMGetParam(radeon_bld->main_fn, SI_PARAM_INSTANCE_ID); + value = LLVMBuildAdd(gallivm->builder, value, + LLVMGetParam(radeon_bld->main_fn, SI_PARAM_START_INSTANCE), ""); break; case TGSI_SEMANTIC_VERTEXID: @@ -963,11 +967,12 @@ static void create_function(struct si_shader_context *si_shader_ctx) if (si_shader_ctx->type == TGSI_PROCESSOR_VERTEX) { params[SI_PARAM_VERTEX_BUFFER] = params[SI_PARAM_SAMPLER]; + params[SI_PARAM_START_INSTANCE] = i32; params[SI_PARAM_VERTEX_ID] = i32; params[SI_PARAM_DUMMY_0] = i32; params[SI_PARAM_DUMMY_1] = i32; params[SI_PARAM_INSTANCE_ID] = i32; - radeon_llvm_create_func(&si_shader_ctx->radeon_bld, params, 8); + radeon_llvm_create_func(&si_shader_ctx->radeon_bld, params, 9); } else { params[SI_PARAM_PRIM_MASK] = i32; @@ -995,6 +1000,12 @@ static void create_function(struct si_shader_context *si_shader_ctx) LLVMValueRef P = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, i); LLVMAddAttribute(P, LLVMInRegAttribute); } + + if (si_shader_ctx->type == TGSI_PROCESSOR_VERTEX) { + LLVMValueRef P = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, + SI_PARAM_START_INSTANCE); + LLVMAddAttribute(P, LLVMInRegAttribute); + } } static void preload_constants(struct si_shader_context *si_shader_ctx) diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.h b/src/gallium/drivers/radeonsi/radeonsi_shader.h index 8f5efd0..9dae742 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_shader.h +++ b/src/gallium/drivers/radeonsi/radeonsi_shader.h @@ -33,8 +33,9 @@ #define SI_SGPR_SAMPLER2 #define SI_SGPR_RESOURCE 4 #define SI_SGPR_VERTEX_BUFFER 6 +#define SI_SGPR_START_INSTANCE 8 -#define SI_VS_NUM_USER_SGPR8 +#define SI_VS_NUM_USER_SGPR9 #define SI_PS_NUM_USER_SGPR6 /* LLVM function parameter indices */ @@ -44,10 +45,11 @@ /* VS only parameters */ #define SI_PARAM_VERTEX_BUFFER 3 -#define SI_PARAM_VERTEX_ID 4 -#define SI_PARAM_DUMMY_0 5 -#define SI_PARAM_DUMMY_1 6 -#define SI_PARAM_INSTANCE_ID 7 +#define SI_PARAM_START_INSTANCE4 +#define SI_PARAM_VERTEX_ID 5 +#define SI_PARAM_DUMMY_0 6 +#define SI_PARAM_DUMMY_1 7 +#define SI_PARAM_INSTANCE_ID 8 /* PS only parameters */ #define SI_PARAM_PRIM_MASK 3 diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c index 91bcdf8..383d2a0 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.c +++ b/src/gallium/drivers/radeonsi/si_state_draw.c @@ -279,10 +279,8 @@ static bool si_update_draw_info_state(struct r600_context *rctx, info->indexed ? info->index_bias : info->start); si_pm4_set_reg(pm4, R_02840C_VGT_MULTI_PRIM_IB_RESET_INDX, info->restart_index); si_pm4_set_reg(pm4, R_028A94_VGT_MULTI_PRIM_IB_RESET_EN, info->primitive_restart); -#if 0 - si_pm4_set_reg(pm4, R_03CFF0_SQ_VTX_BASE_VTX_LOC, 0); - si_pm4_set_reg(pm4, R_03CFF4_SQ_VTX_START_INST_LOC, info->start_instance); -#endif + si_pm4_set_reg(pm4, R_00B130_SPI_SHADER_USER_DATA_VS_0 + SI_SGPR_START_INSTANCE * 4, + info->start_instance); if (prim == V_008958_DI_PT_LINELIST) ls_mask = 1; -- 1.7.9.5 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev