[Mesa-dev] [PATCH 3/4] radeonsi: add start instance support

2013-03-27 Thread Christian König
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

2013-03-26 Thread Christian König
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