draw/llvm: skip clipping and viewport transform if there's no position output
authorRoland Scheidegger <sroland@vmware.com>
Fri, 1 Mar 2013 13:50:40 +0000 (14:50 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Sat, 2 Mar 2013 01:54:31 +0000 (02:54 +0100)
With glsl 1.40 writing position is not required (useful for transform
feedback, though in fact it's still possible to rasterize such geometry
even if the results aren't too well defined).
Prevents crashes in that case. Fixes piglit glsl-1.40-tf-no-position.
Not quite sure this is 100% correct as it also skips clipdistance
clipping which could still work (but not sure if the result would
really be needed?)

Reviewed-by: Jose Fonseca <jfonseca@vmware.com
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/auxiliary/draw/draw_llvm.c

index 8e466879c93d481fc4f478369a457b7eec3b9286..763158b5c93e9e925ee4dfef86d144c3bc33d6c6 100644 (file)
@@ -1349,36 +1349,41 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant,
                   sampler,
                   variant->key.clamp_vertex_color);
 
-      /* store original positions in clip before further manipulation */
-      store_clip(gallivm, vs_type, io, outputs, 0, cv);
-      store_clip(gallivm, vs_type, io, outputs, 1, pos);
-
-      /* do cliptest */
-      if (enable_cliptest) {
-         LLVMValueRef temp = LLVMBuildLoad(builder, clipmask_bool_ptr, "");
-         /* allocate clipmask, assign it integer type */
-         clipmask = generate_clipmask(llvm,
-                                      gallivm,
-                                      vs_type,
-                                      outputs,
-                                      variant->key.clip_xy,
-                                      variant->key.clip_z, 
-                                      variant->key.clip_user,
-                                      variant->key.clip_halfz,
-                                      variant->key.ucp_enable,
-                                      context_ptr, &have_clipdist);
-         temp = LLVMBuildOr(builder, clipmask, temp, "");
-         /* store temporary clipping boolean value */
-         LLVMBuildStore(builder, temp, clipmask_bool_ptr);
+      if (pos != -1) {
+         /* store original positions in clip before further manipulation */
+         store_clip(gallivm, vs_type, io, outputs, 0, cv);
+         store_clip(gallivm, vs_type, io, outputs, 1, pos);
+
+         /* do cliptest */
+         if (enable_cliptest) {
+            LLVMValueRef temp = LLVMBuildLoad(builder, clipmask_bool_ptr, "");
+            /* allocate clipmask, assign it integer type */
+            clipmask = generate_clipmask(llvm,
+                                         gallivm,
+                                         vs_type,
+                                         outputs,
+                                         variant->key.clip_xy,
+                                         variant->key.clip_z,
+                                         variant->key.clip_user,
+                                         variant->key.clip_halfz,
+                                         variant->key.ucp_enable,
+                                         context_ptr, &have_clipdist);
+            temp = LLVMBuildOr(builder, clipmask, temp, "");
+            /* store temporary clipping boolean value */
+            LLVMBuildStore(builder, temp, clipmask_bool_ptr);
+         }
+         else {
+            clipmask = lp_build_const_int_vec(gallivm, lp_int_type(vs_type), 0);
+         }
+
+         /* do viewport mapping */
+         if (!bypass_viewport) {
+            generate_viewport(variant, builder, vs_type, outputs, context_ptr);
+         }
       }
       else {
          clipmask = lp_build_const_int_vec(gallivm, lp_int_type(vs_type), 0);
       }
-      
-      /* do viewport mapping */
-      if (!bypass_viewport) {
-         generate_viewport(variant, builder, vs_type, outputs, context_ptr);
-      }
 
       /* store clipmask in vertex header, 
        * original positions in clip