Re: [Mesa-dev] [PATCH 4/4] radeonsi: add instance divisor support v3

2013-04-02 Thread Michel Dänzer
On Mit, 2013-03-27 at 16:35 +0100, Christian König wrote: 
> From: Christian König 
> 
> v2: reduce key size, don't copy key around to much.
> v3: remove key size reduction
> 
> Signed-off-by: Christian König 

Reviewed-by: Michel Dänzer  

-- 
Earthling Michel Dänzer   |   http://www.amd.com
Libre software enthusiast |  Debian, X and DRI developer
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 4/4] radeonsi: add instance divisor support v3

2013-03-27 Thread Christian König
From: Christian König 

v2: reduce key size, don't copy key around to much.
v3: remove key size reduction

Signed-off-by: Christian König 
---
 src/gallium/drivers/radeonsi/radeonsi_shader.c |   67 +++-
 src/gallium/drivers/radeonsi/radeonsi_shader.h |   24 +
 src/gallium/drivers/radeonsi/si_state.c|   44 +---
 src/gallium/drivers/radeonsi/si_state_draw.c   |   18 +--
 4 files changed, 94 insertions(+), 59 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c 
b/src/gallium/drivers/radeonsi/radeonsi_shader.c
index 0512528..5fdf46e 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
@@ -54,11 +54,9 @@
 struct si_shader_context
 {
struct radeon_llvm_context radeon_bld;
-   struct r600_context *rctx;
struct tgsi_parse_context parse;
struct tgsi_token * tokens;
struct si_pipe_shader *shader;
-   struct si_shader_key key;
unsigned type; /* TGSI_PROCESSOR_* specifies the type of shader. */
LLVMValueRef const_md;
LLVMValueRef const_resource;
@@ -112,22 +110,41 @@ static LLVMValueRef build_indexed_load(
return result;
 }
 
+static LLVMValueRef get_instance_index(
+   struct radeon_llvm_context * radeon_bld,
+   unsigned divisor)
+{
+   struct gallivm_state * gallivm = radeon_bld->soa.bld_base.base.gallivm;
+
+   LLVMValueRef result = LLVMGetParam(radeon_bld->main_fn, 
SI_PARAM_INSTANCE_ID);
+   result = LLVMBuildAdd(gallivm->builder, result, LLVMGetParam(
+   radeon_bld->main_fn, SI_PARAM_START_INSTANCE), "");
+
+   if (divisor > 1)
+   result = LLVMBuildUDiv(gallivm->builder, result,
+   lp_build_const_int32(gallivm, divisor), "");
+
+   return result;
+}
+
 static void declare_input_vs(
struct si_shader_context * si_shader_ctx,
unsigned input_index,
const struct tgsi_full_declaration *decl)
 {
+   struct lp_build_context * base = 
&si_shader_ctx->radeon_bld.soa.bld_base.base;
+   unsigned divisor = 
si_shader_ctx->shader->key.vs.instance_divisors[input_index];
+
+   unsigned chan;
+
LLVMValueRef t_list_ptr;
LLVMValueRef t_offset;
LLVMValueRef t_list;
LLVMValueRef attribute_offset;
-   LLVMValueRef buffer_index_reg;
+   LLVMValueRef buffer_index;
LLVMValueRef args[3];
LLVMTypeRef vec4_type;
LLVMValueRef input;
-   struct lp_build_context * base = 
&si_shader_ctx->radeon_bld.soa.bld_base.base;
-   //struct pipe_vertex_element *velem = 
&rctx->vertex_elements->elements[input_index];
-   unsigned chan;
 
/* Load the T list */
t_list_ptr = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, 
SI_PARAM_VERTEX_BUFFER);
@@ -139,14 +156,20 @@ static void declare_input_vs(
/* Build the attribute offset */
attribute_offset = lp_build_const_int32(base->gallivm, 0);
 
-   /* Load the buffer index, which is always stored in VGPR0
-* for Vertex Shaders */
-   buffer_index_reg = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, 
SI_PARAM_VERTEX_ID);
+   if (divisor) {
+   /* Build index from instance ID, start instance and divisor */
+   si_shader_ctx->shader->shader.uses_instanceid = true;
+   buffer_index = get_instance_index(&si_shader_ctx->radeon_bld, 
divisor);
+   } else {
+   /* Load the buffer index, which is always stored in VGPR0
+* for Vertex Shaders */
+   buffer_index = LLVMGetParam(si_shader_ctx->radeon_bld.main_fn, 
SI_PARAM_VERTEX_ID);
+   }
 
vec4_type = LLVMVectorType(base->elem_type, 4);
args[0] = t_list;
args[1] = attribute_offset;
-   args[2] = buffer_index_reg;
+   args[2] = buffer_index;
input = build_intrinsic(base->gallivm->builder,
"llvm.SI.vs.load.input", vec4_type, args, 3,
LLVMReadNoneAttribute | LLVMNoUnwindAttribute);
@@ -239,7 +262,7 @@ static void declare_input_fs(
/* XXX: Handle all possible interpolation modes */
switch (decl->Interp.Interpolate) {
case TGSI_INTERPOLATE_COLOR:
-   if (si_shader_ctx->key.flatshade) {
+   if (si_shader_ctx->shader->key.ps.flatshade) {
interp_param = 0;
} else {
if (decl->Interp.Centroid)
@@ -272,7 +295,7 @@ static void declare_input_fs(
 
/* XXX: Could there be more than TGSI_NUM_CHANNELS (4) ? */
if (decl->Semantic.Name == TGSI_SEMANTIC_COLOR &&
-   si_shader_ctx->key.color_two_side) {
+   si_shader_ctx->shader->key.ps.color_two_side) {
LLVMValueRef args[4];
LLVMValueRef face, is_face_positive;
LLVMValueRef back_attr_number =
@@ -351,15 +374,12 @@ static void declare_system_valu