/** cast wrapper */
-static INLINE struct llvm_middle_end *
+static inline struct llvm_middle_end *
llvm_middle_end(struct draw_pt_middle_end *middle)
{
return (struct llvm_middle_end *) middle;
draw->clip_user,
point_clip ? draw->guard_band_points_xy :
draw->guard_band_xy,
- draw->identity_viewport,
+ draw->bypass_viewport,
draw->rasterizer->clip_halfz,
(draw->vs.edgeflag_output ? TRUE : FALSE) );
draw_pt_so_emit_prepare( fpme->so_emit, gs == NULL );
if (!(opt & PT_PIPELINE)) {
- draw_pt_emit_prepare( fpme->emit,
- out_prim,
+ draw_pt_emit_prepare( fpme->emit, out_prim,
max_vertices );
*max_vertices = MAX2( *max_vertices, 4096 );
static void
llvm_middle_end_bind_parameters(struct draw_pt_middle_end *middle)
{
+ static const float fake_const_buf[4];
struct llvm_middle_end *fpme = llvm_middle_end(middle);
struct draw_context *draw = fpme->draw;
+ struct draw_llvm *llvm = fpme->llvm;
unsigned i;
- for (i = 0; i < Elements(fpme->llvm->jit_context.vs_constants); ++i) {
+ for (i = 0; i < ARRAY_SIZE(llvm->jit_context.vs_constants); ++i) {
int num_consts =
draw->pt.user.vs_constants_size[i] / (sizeof(float) * 4);
- fpme->llvm->jit_context.vs_constants[i] = draw->pt.user.vs_constants[i];
- fpme->llvm->jit_context.num_vs_constants[i] = num_consts;
+ llvm->jit_context.vs_constants[i] = draw->pt.user.vs_constants[i];
+ llvm->jit_context.num_vs_constants[i] = num_consts;
+ if (num_consts == 0) {
+ llvm->jit_context.vs_constants[i] = fake_const_buf;
+ }
}
- for (i = 0; i < Elements(fpme->llvm->gs_jit_context.constants); ++i) {
+ for (i = 0; i < ARRAY_SIZE(llvm->gs_jit_context.constants); ++i) {
int num_consts =
draw->pt.user.gs_constants_size[i] / (sizeof(float) * 4);
- fpme->llvm->gs_jit_context.constants[i] = draw->pt.user.gs_constants[i];
- fpme->llvm->gs_jit_context.num_constants[i] = num_consts;
+ llvm->gs_jit_context.constants[i] = draw->pt.user.gs_constants[i];
+ llvm->gs_jit_context.num_constants[i] = num_consts;
+ if (num_consts == 0) {
+ llvm->gs_jit_context.constants[i] = fake_const_buf;
+ }
}
- fpme->llvm->jit_context.planes =
+ llvm->jit_context.planes =
(float (*)[DRAW_TOTAL_CLIP_PLANES][4]) draw->pt.user.planes[0];
- fpme->llvm->gs_jit_context.planes =
+ llvm->gs_jit_context.planes =
(float (*)[DRAW_TOTAL_CLIP_PLANES][4]) draw->pt.user.planes[0];
- fpme->llvm->jit_context.viewports = draw->viewports;
- fpme->llvm->gs_jit_context.viewports = draw->viewports;
+ llvm->jit_context.viewports = draw->viewports;
+ llvm->gs_jit_context.viewports = draw->viewports;
}
* will try to access non-existent position output.
*/
if (draw_current_shader_position_output(draw) != -1) {
- if ((opt & PT_SHADE) && gshader) {
+ if ((opt & PT_SHADE) && (gshader ||
+ draw->vs.vertex_shader->info.writes_viewport_index)) {
clipped = draw_pt_post_vs_run( fpme->post_vs, vert_info, prim_info );
}
+ /* "clipped" also includes non-one edgeflag */
if (clipped) {
opt |= PT_PIPELINE;
}
}
+static inline unsigned
+prim_type(unsigned prim, unsigned flags)
+{
+ if (flags & DRAW_LINE_LOOP_AS_STRIP)
+ return PIPE_PRIM_LINE_STRIP;
+ else
+ return prim;
+}
+
+
static void
llvm_middle_end_run(struct draw_pt_middle_end *middle,
const unsigned *fetch_elts,
prim_info.start = 0;
prim_info.count = draw_count;
prim_info.elts = draw_elts;
- prim_info.prim = fpme->input_prim;
+ prim_info.prim = prim_type(fpme->input_prim, prim_flags);
prim_info.flags = prim_flags;
prim_info.primitive_count = 1;
prim_info.primitive_lengths = &draw_count;
prim_info.start = 0;
prim_info.count = count;
prim_info.elts = NULL;
- prim_info.prim = fpme->input_prim;
+ prim_info.prim = prim_type(fpme->input_prim, prim_flags);
prim_info.flags = prim_flags;
prim_info.primitive_count = 1;
prim_info.primitive_lengths = &count;
prim_info.start = 0;
prim_info.count = draw_count;
prim_info.elts = draw_elts;
- prim_info.prim = fpme->input_prim;
+ prim_info.prim = prim_type(fpme->input_prim, prim_flags);
prim_info.flags = prim_flags;
prim_info.primitive_count = 1;
prim_info.primitive_lengths = &draw_count;