diff options
Diffstat (limited to 'src/gallium/auxiliary/draw')
-rw-r--r-- | src/gallium/auxiliary/draw/draw_cliptest_tmp.h | 16 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_context.c | 21 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_llvm.c | 20 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_llvm.h | 4 | ||||
-rw-r--r-- | src/gallium/auxiliary/draw/draw_private.h | 2 |
5 files changed, 31 insertions, 32 deletions
diff --git a/src/gallium/auxiliary/draw/draw_cliptest_tmp.h b/src/gallium/auxiliary/draw/draw_cliptest_tmp.h index 1ca152911eb..9e6827cc452 100644 --- a/src/gallium/auxiliary/draw/draw_cliptest_tmp.h +++ b/src/gallium/auxiliary/draw/draw_cliptest_tmp.h @@ -36,7 +36,7 @@ static boolean TAG(do_cliptest)( struct pt_post_vs *pvs, /* const */ float (*plane)[4] = pvs->draw->plane; const unsigned pos = draw_current_shader_position_output(pvs->draw); const unsigned ef = pvs->draw->vs.edgeflag_output; - const unsigned nr = pvs->draw->nr_planes; + const unsigned ucp_enable = pvs->draw->rasterizer->clip_plane_enable; const unsigned flags = (FLAGS); unsigned need_pipeline = 0; unsigned j; @@ -81,10 +81,16 @@ static boolean TAG(do_cliptest)( struct pt_post_vs *pvs, } if (flags & DO_CLIP_USER) { - unsigned i; - for (i = 6; i < nr; i++) { - if (dot4(position, plane[i]) < 0) - mask |= (1<<i); + unsigned ucp_mask = ucp_enable; + + while (ucp_mask) { + unsigned plane_idx = ffs(ucp_mask)-1; + ucp_mask &= ~(1 << plane_idx); + plane_idx += 6; + + if (dot4(position, plane[plane_idx]) < 0) { + mask |= 1 << plane_idx; + } } } diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index f6db95d756e..f91e408cbf0 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -151,11 +151,10 @@ boolean draw_init(struct draw_context *draw) ASSIGN_4V( draw->plane[3], 0, 1, 0, 1 ); ASSIGN_4V( draw->plane[4], 0, 0, 1, 1 ); /* yes these are correct */ ASSIGN_4V( draw->plane[5], 0, 0, -1, 1 ); /* mesa's a bit wonky */ - draw->nr_planes = 6; draw->clip_xy = TRUE; draw->clip_z = TRUE; - + draw->pt.user.planes = (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) &(draw->plane[0]); draw->reduced_prim = ~0; /* != any of PIPE_PRIM_x */ @@ -247,8 +246,9 @@ static void update_clip_flags( struct draw_context *draw ) draw->guard_band_xy = (!draw->driver.bypass_clip_xy && draw->driver.guard_band_xy); draw->clip_z = (!draw->driver.bypass_clip_z && - !draw->depth_clamp); - draw->clip_user = (draw->nr_planes > 6); + draw->rasterizer && draw->rasterizer->depth_clip); + draw->clip_user = draw->rasterizer && + draw->rasterizer->clip_plane_enable != 0; } /** @@ -264,8 +264,8 @@ void draw_set_rasterizer_state( struct draw_context *draw, draw->rasterizer = raster; draw->rast_handle = rast_handle; - - } + update_clip_flags(draw); + } } /* With a little more work, llvmpipe will be able to turn this off and @@ -311,14 +311,7 @@ void draw_set_clip_state( struct draw_context *draw, { draw_do_flush( draw, DRAW_FLUSH_STATE_CHANGE ); - assert(clip->nr <= PIPE_MAX_CLIP_PLANES); - memcpy(&draw->plane[6], clip->ucp, clip->nr * sizeof(clip->ucp[0])); - draw->nr_planes = 6 + clip->nr; - draw->depth_clamp = clip->depth_clamp; - - draw->pt.user.planes = (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) &(draw->plane[0]); - - update_clip_flags(draw); + memcpy(&draw->plane[6], clip->ucp, sizeof(clip->ucp)); } diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index 296c8fdef41..cf97e82a63c 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -1021,7 +1021,7 @@ generate_clipmask(struct gallivm_state *gallivm, boolean clip_z, boolean clip_user, boolean clip_halfz, - unsigned nr, + unsigned ucp_enable, LLVMValueRef context_ptr) { LLVMBuilderRef builder = gallivm->builder; @@ -1030,7 +1030,6 @@ generate_clipmask(struct gallivm_state *gallivm, LLVMValueRef zero, shift; LLVMValueRef pos_x, pos_y, pos_z, pos_w; LLVMValueRef plane1, planes, plane_ptr, sum; - unsigned i; struct lp_type f32_type = lp_type_float_vec(32); mask = lp_build_const_int_vec(gallivm, lp_type_int_vec(32), 0); @@ -1098,12 +1097,15 @@ generate_clipmask(struct gallivm_state *gallivm, if (clip_user) { LLVMValueRef planes_ptr = draw_jit_context_planes(gallivm, context_ptr); LLVMValueRef indices[3]; - temp = lp_build_const_int_vec(gallivm, lp_type_int_vec(32), 32); /* userclip planes */ - for (i = 6; i < nr; i++) { + while (ucp_enable) { + unsigned plane_idx = ffs(ucp_enable)-1; + ucp_enable &= ~(1 << plane_idx); + plane_idx += 6; + indices[0] = lp_build_const_int32(gallivm, 0); - indices[1] = lp_build_const_int32(gallivm, i); + indices[1] = lp_build_const_int32(gallivm, plane_idx); indices[2] = lp_build_const_int32(gallivm, 0); plane_ptr = LLVMBuildGEP(builder, planes_ptr, indices, 3, ""); @@ -1133,8 +1135,8 @@ generate_clipmask(struct gallivm_state *gallivm, sum = LLVMBuildFAdd(builder, sum, test, ""); test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, sum); - temp = LLVMBuildShl(builder, temp, shift, ""); - test = LLVMBuildAnd(builder, test, temp, ""); + temp = lp_build_const_int_vec(gallivm, lp_type_int_vec(32), 1 << plane_idx); + test = LLVMBuildAnd(builder, test, temp, ""); mask = LLVMBuildOr(builder, mask, test, ""); } } @@ -1365,7 +1367,7 @@ draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant, variant->key.clip_z, variant->key.clip_user, variant->key.clip_halfz, - variant->key.nr_planes, + variant->key.ucp_enable, context_ptr); /* return clipping boolean value for function */ clipmask_bool(gallivm, clipmask, ret_ptr); @@ -1447,7 +1449,7 @@ draw_llvm_make_variant_key(struct draw_llvm *llvm, char *store) key->bypass_viewport = llvm->draw->identity_viewport; key->clip_halfz = !llvm->draw->rasterizer->gl_rasterization_rules; key->need_edgeflags = (llvm->draw->vs.edgeflag_output ? TRUE : FALSE); - key->nr_planes = llvm->draw->nr_planes; + key->ucp_enable = llvm->draw->rasterizer->clip_plane_enable; key->pad = 0; /* All variants of this shader will have the same value for diff --git a/src/gallium/auxiliary/draw/draw_llvm.h b/src/gallium/auxiliary/draw/draw_llvm.h index bc361357de5..edd1a08e3db 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.h +++ b/src/gallium/auxiliary/draw/draw_llvm.h @@ -171,8 +171,8 @@ struct draw_llvm_variant_key unsigned clip_halfz:1; unsigned bypass_viewport:1; unsigned need_edgeflags:1; - unsigned nr_planes:4; - unsigned pad:5; + unsigned ucp_enable:PIPE_MAX_CLIP_PLANES; + unsigned pad:9-PIPE_MAX_CLIP_PLANES; /* Variable number of vertex elements: */ diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h index 89653e11161..c0ef18e3ed2 100644 --- a/src/gallium/auxiliary/draw/draw_private.h +++ b/src/gallium/auxiliary/draw/draw_private.h @@ -278,8 +278,6 @@ struct draw_context /* Clip derived state: */ float plane[DRAW_TOTAL_CLIP_PLANES][4]; - unsigned nr_planes; - boolean depth_clamp; /* If a prim stage introduces new vertex attributes, they'll be stored here */ |