draw: make sure viewport gets updated in draw llvm shader
authorKeith Whitwell <keithw@vmware.com>
Wed, 20 Oct 2010 05:11:49 +0000 (22:11 -0700)
committerKeith Whitwell <keithw@vmware.com>
Wed, 20 Oct 2010 05:11:49 +0000 (22:11 -0700)
The viewport state was being baked in at compile time (oops...)

src/gallium/auxiliary/draw/draw_llvm.c
src/gallium/auxiliary/draw/draw_llvm.h
src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c

index 338127dafec62d2ddc4111c81f8ac17b4545e099..beb955fbf49622cbbc9c1ed04305e22fae01d61d 100644 (file)
@@ -131,13 +131,14 @@ init_globals(struct draw_llvm *llvm)
 
    /* struct draw_jit_context */
    {
-      LLVMTypeRef elem_types[4];
+      LLVMTypeRef elem_types[5];
       LLVMTypeRef context_type;
 
       elem_types[0] = LLVMPointerType(LLVMFloatType(), 0); /* vs_constants */
       elem_types[1] = LLVMPointerType(LLVMFloatType(), 0); /* gs_constants */
       elem_types[2] = LLVMPointerType(LLVMArrayType(LLVMArrayType(LLVMFloatType(), 4), 12), 0); /* planes */
-      elem_types[3] = LLVMArrayType(texture_type,
+      elem_types[3] = LLVMPointerType(LLVMFloatType(), 0); /* viewport */
+      elem_types[4] = LLVMArrayType(texture_type,
                                     PIPE_MAX_VERTEX_SAMPLERS); /* textures */
 
       context_type = LLVMStructType(elem_types, Elements(elem_types), 0);
@@ -784,21 +785,38 @@ store_clip(LLVMBuilderRef builder,
 
 }
 
+/* Equivalent of _mm_set1_ps(a)
+ */
+static LLVMValueRef vec4f_from_scalar(LLVMBuilderRef bld,
+                                     LLVMValueRef a,
+                                     const char *name)
+{
+   LLVMValueRef res = LLVMGetUndef(LLVMVectorType(LLVMFloatType(), 4));
+   int i;
+
+   for(i = 0; i < 4; ++i) {
+      LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, 0);
+      res = LLVMBuildInsertElement(bld, res, a, index, i == 3 ? name : "");
+   }
+
+   return res;
+}
+
 /*
  * Transforms the outputs for viewport mapping
  */
 static void
 generate_viewport(struct draw_llvm *llvm,
                   LLVMBuilderRef builder,
-                  LLVMValueRef (*outputs)[NUM_CHANNELS])
+                  LLVMValueRef (*outputs)[NUM_CHANNELS],
+                  LLVMValueRef context_ptr)
 {
    int i;
-   const float *scaleA = llvm->draw->viewport.scale;
-   const float *transA = llvm->draw->viewport.translate;
    struct lp_type f32_type = lp_type_float_vec(32);
    LLVMValueRef out3 = LLVMBuildLoad(builder, outputs[0][3], ""); /*w0 w1 w2 w3*/   
    LLVMValueRef const1 = lp_build_const_vec(f32_type, 1.0);       /*1.0 1.0 1.0 1.0*/ 
-   
+   LLVMValueRef vp_ptr = draw_jit_context_viewport(builder, context_ptr);
+
    /* for 1/w convention*/
    out3 = LLVMBuildFDiv(builder, const1, out3, "");
    LLVMBuildStore(builder, out3, outputs[0][3]);
@@ -806,9 +824,21 @@ generate_viewport(struct draw_llvm *llvm,
    /* Viewport Mapping */
    for (i=0; i<3; i++){
       LLVMValueRef out = LLVMBuildLoad(builder, outputs[0][i], ""); /*x0 x1 x2 x3*/
-      LLVMValueRef scale = lp_build_const_vec(f32_type, scaleA[i]); /*sx sx sx sx*/     
-      LLVMValueRef trans = lp_build_const_vec(f32_type, transA[i]); /*tx tx tx tx*/
+      LLVMValueRef scale;
+      LLVMValueRef trans;
+      LLVMValueRef scale_i;
+      LLVMValueRef trans_i;
+      LLVMValueRef index;
       
+      index = LLVMConstInt(LLVMInt32Type(), i, 0);
+      scale_i = LLVMBuildGEP(builder, vp_ptr, &index, 1, "");
+
+      index = LLVMConstInt(LLVMInt32Type(), i+4, 0);
+      trans_i = LLVMBuildGEP(builder, vp_ptr, &index, 1, "");
+
+      scale = vec4f_from_scalar(builder, LLVMBuildLoad(builder, scale_i, ""), "scale");
+      trans = vec4f_from_scalar(builder, LLVMBuildLoad(builder, trans_i, ""), "trans");
+
       /* divide by w */
       out = LLVMBuildMul(builder, out, out3, "");
       /* mult by scale */
@@ -822,22 +852,6 @@ generate_viewport(struct draw_llvm *llvm,
    
 }
 
-/* Equivalent of _mm_set1_ps(a)
- */
-static LLVMValueRef vec4f_from_scalar(LLVMBuilderRef bld,
-                                     LLVMValueRef a,
-                                     const char *name)
-{
-   LLVMValueRef res = LLVMGetUndef(LLVMVectorType(LLVMFloatType(), 4));
-   int i;
-
-   for(i = 0; i < 4; ++i) {
-      LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, 0);
-      res = LLVMBuildInsertElement(bld, res, a, index, i == 3 ? name : "");
-   }
-
-   return res;
-}
 
 /*
  * Returns clipmask as 4xi32 bitmask for the 4 vertices
@@ -1143,7 +1157,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant)
       
       /* do viewport mapping */
       if (!bypass_viewport){
-         generate_viewport(llvm, builder, outputs);
+         generate_viewport(llvm, builder, outputs, context_ptr);
       }
 
       /* store clipmask in vertex header and positions in data */
@@ -1354,7 +1368,7 @@ draw_llvm_generate_elts(struct draw_llvm *llvm, struct draw_llvm_variant *varian
       
       /* do viewport mapping */
       if (!bypass_viewport){
-         generate_viewport(llvm, builder, outputs);
+         generate_viewport(llvm, builder, outputs, context_ptr);
       }
 
       /* store clipmask in vertex header, 
index aa984ed3a2fb2ccd945c7fdac954756b4972fccd..c3c30c07c644d34396aab016bfe624b2d594245d 100644 (file)
@@ -97,6 +97,7 @@ struct draw_jit_context
    const float *vs_constants;
    const float *gs_constants;
    float (*planes) [12][4];
+   float *viewport;
 
    struct draw_jit_texture textures[PIPE_MAX_VERTEX_SAMPLERS];
 };
@@ -111,7 +112,10 @@ struct draw_jit_context
 #define draw_jit_context_planes(_builder, _ptr) \
    lp_build_struct_get(_builder, _ptr, 2, "planes")
 
-#define DRAW_JIT_CTX_TEXTURES 3
+#define draw_jit_context_viewport(_builder, _ptr) \
+   lp_build_struct_get(_builder, _ptr, 3, "viewport")
+
+#define DRAW_JIT_CTX_TEXTURES 4
 
 #define draw_jit_context_textures(_builder, _ptr) \
    lp_build_struct_get_ptr(_builder, _ptr, DRAW_JIT_CTX_TEXTURES, "textures")
index e5b2532b50af9468511a4755fda3e2754c7caf66..a53a768d02990e4d4d4b6ac787f39ae2478dd913 100644 (file)
@@ -177,6 +177,8 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle,
       draw->pt.user.gs_constants[0];
    fpme->llvm->jit_context.planes =
       (float (*) [12][4]) draw->pt.user.planes[0];
+   fpme->llvm->jit_context.viewport =
+      (float *)draw->viewport.scale;
     
 }