From e6c237cfd6f53ff569f68255d5d6da15148cd0f5 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 10 Oct 2011 17:43:59 -0600 Subject: [PATCH] draw/llvm: fix hard-coded number of total clip planes MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Instead of 12 use DRAW_TOTAL_CLIP_PLANES. The max number of user-defined clip planes was increased to 8 so the total number of planes is 14. This doesn't fix any specific bug, but clearly the old code was wrong. Reviewed-by: José Fonseca --- src/gallium/auxiliary/draw/draw_context.c | 2 +- src/gallium/auxiliary/draw/draw_llvm.c | 19 ++++++++++++------- src/gallium/auxiliary/draw/draw_llvm.h | 2 +- src/gallium/auxiliary/draw/draw_private.h | 12 ++++++++---- .../draw/draw_pt_fetch_shade_pipeline_llvm.c | 2 +- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_context.c b/src/gallium/auxiliary/draw/draw_context.c index 6a85b79a02c..e1b9a15e528 100644 --- a/src/gallium/auxiliary/draw/draw_context.c +++ b/src/gallium/auxiliary/draw/draw_context.c @@ -369,7 +369,7 @@ draw_set_mapped_constant_buffer(struct draw_context *draw, case PIPE_SHADER_VERTEX: draw->pt.user.vs_constants[slot] = buffer; draw->pt.user.vs_constants_size[slot] = size; - draw->pt.user.planes = (float (*) [12][4]) &(draw->plane[0]); + draw->pt.user.planes = (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) &(draw->plane[0]); draw_vs_set_constants(draw, slot, buffer, size); break; case PIPE_SHADER_GEOMETRY: diff --git a/src/gallium/auxiliary/draw/draw_llvm.c b/src/gallium/auxiliary/draw/draw_llvm.c index d427d2c9ced..01659fe76a1 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.c +++ b/src/gallium/auxiliary/draw/draw_llvm.c @@ -191,7 +191,8 @@ create_jit_context_type(struct gallivm_state *gallivm, elem_types[0] = LLVMPointerType(float_type, 0); /* vs_constants */ elem_types[1] = LLVMPointerType(float_type, 0); /* gs_constants */ - elem_types[2] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type, 4), 12), 0); /* planes */ + elem_types[2] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type, 4), + DRAW_TOTAL_CLIP_PLANES), 0); elem_types[3] = LLVMPointerType(float_type, 0); /* viewport */ elem_types[4] = LLVMArrayType(texture_type, PIPE_MAX_VERTEX_SAMPLERS); /* textures */ @@ -708,17 +709,21 @@ store_aos(struct gallivm_state *gallivm, LLVMValueRef id_ptr = draw_jit_header_id(gallivm, io_ptr); LLVMValueRef data_ptr = draw_jit_header_data(gallivm, io_ptr); LLVMValueRef indices[3]; - LLVMValueRef val, shift; + LLVMValueRef val; + int vertex_id_pad_edgeflag; indices[0] = lp_build_const_int32(gallivm, 0); indices[1] = index; indices[2] = lp_build_const_int32(gallivm, 0); - /* initialize vertex id:16 = 0xffff, pad:3 = 0, edgeflag:1 = 1 */ - val = lp_build_const_int32(gallivm, 0xffff1); - shift = lp_build_const_int32(gallivm, 12); - val = LLVMBuildShl(builder, val, shift, ""); - /* add clipmask:12 */ + /* If this assertion fails, it means we need to update the bit twidding + * code here. See struct vertex_header in draw_private.h. + */ + assert(DRAW_TOTAL_CLIP_PLANES==14); + /* initialize vertex id:16 = 0xffff, pad:1 = 0, edgeflag:1 = 1 */ + vertex_id_pad_edgeflag = (0xffff << 16) | (1 << DRAW_TOTAL_CLIP_PLANES); + val = lp_build_const_int32(gallivm, vertex_id_pad_edgeflag); + /* OR with the clipmask */ val = LLVMBuildOr(builder, val, clipmask, ""); /* store vertex header */ diff --git a/src/gallium/auxiliary/draw/draw_llvm.h b/src/gallium/auxiliary/draw/draw_llvm.h index 375b7b8b571..bc361357de5 100644 --- a/src/gallium/auxiliary/draw/draw_llvm.h +++ b/src/gallium/auxiliary/draw/draw_llvm.h @@ -98,7 +98,7 @@ struct draw_jit_context { const float *vs_constants; const float *gs_constants; - float (*planes) [12][4]; + float (*planes) [DRAW_TOTAL_CLIP_PLANES][4]; float *viewport; struct draw_jit_texture textures[PIPE_MAX_VERTEX_SAMPLERS]; diff --git a/src/gallium/auxiliary/draw/draw_private.h b/src/gallium/auxiliary/draw/draw_private.h index ef772660f71..b84d2b77179 100644 --- a/src/gallium/auxiliary/draw/draw_private.h +++ b/src/gallium/auxiliary/draw/draw_private.h @@ -52,6 +52,10 @@ struct draw_llvm; #endif +/** Sum of frustum planes and user-defined planes */ +#define DRAW_TOTAL_CLIP_PLANES (6 + PIPE_MAX_CLIP_PLANES) + + struct pipe_context; struct draw_vertex_shader; struct draw_context; @@ -66,9 +70,9 @@ struct tgsi_sampler; * Carry some useful information around with the vertices in the prim pipe. */ struct vertex_header { - unsigned clipmask:12; + unsigned clipmask:DRAW_TOTAL_CLIP_PLANES; unsigned edgeflag:1; - unsigned pad:3; + unsigned pad:1; unsigned vertex_id:16; float clip[4]; @@ -179,7 +183,7 @@ struct draw_context unsigned gs_constants_size[PIPE_MAX_CONSTANT_BUFFERS]; /* pointer to planes */ - float (*planes)[12][4]; + float (*planes)[DRAW_TOTAL_CLIP_PLANES][4]; } user; boolean test_fse; /* enable FSE even though its not correct (eg for softpipe) */ @@ -277,7 +281,7 @@ struct draw_context /* Clip derived state: */ - float plane[12][4]; + float plane[DRAW_TOTAL_CLIP_PLANES][4]; unsigned nr_planes; boolean depth_clamp; diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c index 2a3fb89884c..7698f5ff2af 100644 --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c @@ -184,7 +184,7 @@ llvm_middle_end_prepare( struct draw_pt_middle_end *middle, fpme->llvm->jit_context.gs_constants = draw->pt.user.gs_constants[0]; fpme->llvm->jit_context.planes = - (float (*) [12][4]) draw->pt.user.planes[0]; + (float (*) [DRAW_TOTAL_CLIP_PLANES][4]) draw->pt.user.planes[0]; fpme->llvm->jit_context.viewport = (float *)draw->viewport.scale; -- 2.30.2