Home | History | Annotate | Download | only in softpipe

Lines Matching refs:setup

55    float dx;		/**< X(v1) - X(v0), used only during setup */
56 float dy; /**< Y(v1) - Y(v0), used only during setup */
72 * Triangle setup info.
125 * Clip setup->quad against the scissor/surface bounds.
128 quad_clip(struct setup_context *setup, struct quad_header *quad)
130 const struct pipe_scissor_state *cliprect = &setup->softpipe->cliprect;
159 clip_emit_quad(struct setup_context *setup, struct quad_header *quad)
161 quad_clip( setup, quad );
164 struct softpipe_context *sp = setup->softpipe;
167 setup->numFragsEmitted += util_bitcount(quad->inout.mask);
198 flush_spans(struct setup_context *setup)
201 const int xleft0 = setup->span.left[0];
202 const int xleft1 = setup->span.left[1];
203 const int xright0 = setup->span.right[0];
204 const int xright1 = setup->span.right[1];
205 struct quad_stage *pipe = setup->softpipe->quad.first;
235 setup->quad[q].input.x0 = lx;
236 setup->quad[q].input.y0 = setup->span.y;
237 setup->quad[q].input.facing = setup->facing;
238 setup->quad[q].inout.mask = quadmask;
239 setup->quad_ptrs[q] = &setup->quad[q];
242 setup->numFragsEmitted += util_bitcount(quadmask);
250 pipe->run( pipe, setup->quad_ptrs, q );
255 setup->span.y = 0;
256 setup->span.right[0] = 0;
257 setup->span.right[1] = 0;
258 setup->span.left[0] = 1000000; /* greater than right[0] */
259 setup->span.left[1] = 1000000; /* greater than right[1] */
265 print_vertex(const struct setup_context *setup,
270 for (i = 0; i < setup->nr_vertex_attrs; i++) {
287 setup_sort_vertices(struct setup_context *setup,
293 if (setup->softpipe->rasterizer->flatshade_first)
294 setup->vprovoke = v0;
296 setup->vprovoke = v2;
306 setup->vmin = v0;
307 setup->vmid = v1;
308 setup->vmax = v2;
312 setup->vmin = v2;
313 setup->vmid = v0;
314 setup->vmax = v1;
318 setup->vmin = v0;
319 setup->vmid = v2;
320 setup->vmax = v1;
326 setup->vmin = v1;
327 setup->vmid = v0;
328 setup->vmax = v2;
332 setup->vmin = v2;
333 setup->vmid = v1;
334 setup->vmax = v0;
338 setup->vmin = v1;
339 setup->vmid = v2;
340 setup->vmax = v0;
345 setup->ebot.dx = setup->vmid[0][0] - setup->vmin[0][0];
346 setup->ebot.dy = setup->vmid[0][1] - setup->vmin[0][1];
347 setup->emaj.dx = setup->vmax[0][0] - setup->vmin[0][0];
348 setup->emaj.dy = setup->vmax[0][1] - setup->vmin[0][1];
349 setup->etop.dx = setup->vmax[0][0] - setup->vmid[0][0];
350 setup->etop.dy = setup->vmax[0][1] - setup->vmid[0][1];
363 const float area = (setup->emaj.dx * setup->ebot.dy -
364 setup->ebot.dx * setup->emaj.dy);
366 setup->oneoverarea = 1.0f / area;
370 __FUNCTION__, setup->oneoverarea, area, det );
372 if (util_is_inf_or_nan(setup->oneoverarea))
381 setup->facing =
383 (setup->softpipe->rasterizer->front_ccw));
386 unsigned face = setup->facing == 0 ? PIPE_FACE_FRONT : PIPE_FACE_BACK;
388 if (face & setup->cull_face)
397 if (setup->softpipe->rasterizer->gl_rasterization_rules) {
398 setup->pixel_offset = 0.5f;
400 setup->pixel_offset = 0.0f;
456 * The result will be put into setup->coef[slot].a0[i].
461 const_coeff(struct setup_context *setup,
472 coef->a0[i] = setup->vprovoke[vertSlot][i];
482 tri_linear_coeff(struct setup_context *setup,
489 float a = setup->ebot.dy * majda - botda * setup->emaj.dy;
490 float b = setup->emaj.dx * botda - majda * setup->ebot.dx;
491 float dadx = a * setup->oneoverarea;
492 float dady = b * setup->oneoverarea;
512 (dadx * (setup->vmin[0][0] - setup->pixel_offset) +
513 dady * (setup->vmin[0][1] - setup->pixel_offset)));
518 setup->coef[slot].a0[i],
519 setup->coef[slot].dadx[i],
520 setup->coef[slot].dady[i]);
535 tri_persp_coeff(struct setup_context *setup,
542 float mina = v[0] * setup->vmin[0][3];
543 float mida = v[1] * setup->vmid[0][3];
544 float maxa = v[2] * setup->vmax[0][3];
547 float a = setup->ebot.dy * majda - botda * setup->emaj.dy;
548 float b = setup->emaj.dx * botda - majda * setup->ebot.dx;
549 float dadx = a * setup->oneoverarea;
550 float dady = b * setup->oneoverarea;
554 setup->vmin[vertSlot][i],
555 setup->vmid[vertSlot][i],
556 setup->vmax[vertSlot][i]
564 (dadx * (setup->vmin[0][0] - setup->pixel_offset) +
565 dady * (setup->vmin[0][1] - setup->pixel_offset)));
570 * Special coefficient setup for gl_FragCoord.
576 setup_fragcoord_coeff(struct setup_context *setup, uint slot)
578 const struct tgsi_shader_info *fsInfo = &setup->softpipe->fs_variant->info;
581 setup->coef[slot].a0[0] = fsInfo->pixel_center_integer ? 0.0 : 0.5;
582 setup->coef[slot].dadx[0] = 1.0;
583 setup->coef[slot].dady[0] = 0.0;
585 setup->coef[slot].a0[1] =
586 (fsInfo->origin_lower_left ? setup->softpipe->framebuffer.height-1 : 0)
588 setup->coef[slot].dadx[1] = 0.0;
589 setup->coef[slot].dady[1] = fsInfo->origin_lower_left ? -1.0 : 1.0;
591 setup->coef[slot].a0[2] = setup->posCoef.a0[2];
592 setup->coef[slot].dadx[2] = setup->posCoef.dadx[2];
593 setup->coef[slot].dady[2] = setup->posCoef.dady[2];
595 setup->coef[slot].a0[3] = setup->posCoef.a0[3];
596 setup->coef[slot].dadx[3] = setup->posCoef.dadx[3];
597 setup->coef[slot].dady[3] = setup->posCoef.dady[3];
603 * Compute the setup->coef[] array dadx, dady, a0 values.
604 * Must be called after setup->vmin,vmid,vmax,vprovoke are initialized.
607 setup_tri_coefficients(struct setup_context *setup)
609 struct softpipe_context *softpipe = setup->softpipe;
610 const struct tgsi_shader_info *fsInfo = &setup->softpipe->fs_variant->info;
617 v[0] = setup->vmin[0][2];
618 v[1] = setup->vmid[0][2];
619 v[2] = setup->vmax[0][2];
620 tri_linear_coeff(setup, &setup->posCoef, 2, v);
622 v[0] = setup->vmin[0][3];
623 v[1] = setup->vmid[0][3];
624 v[2] = setup->vmax[0][3];
625 tri_linear_coeff(setup, &setup->posCoef, 3, v);
627 /* setup interpolation for all the remaining attributes:
636 const_coeff(setup, &setup->coef[fragSlot], vertSlot, j);
640 tri_apply_cylindrical_wrap(setup->vmin[vertSlot][j],
641 setup->vmid[vertSlot][j],
642 setup->vmax[vertSlot][j],
645 tri_linear_coeff(setup, &setup->coef[fragSlot], j, v);
650 tri_apply_cylindrical_wrap(setup->vmin[vertSlot][j],
651 setup->vmid[vertSlot][j],
652 setup->vmax[vertSlot][j],
655 tri_persp_coeff(setup, &setup->coef[fragSlot], j, v);
659 setup_fragcoord_coeff(setup, fragSlot);
667 setup->coef[fragSlot].a0[0] = setup->facing * -2.0f + 1.0f;
668 setup->coef[fragSlot].dadx[0] = 0.0;
669 setup->coef[fragSlot].dady[0] = 0.0;
676 setup_tri_edges(struct setup_context *setup)
678 float vmin_x = setup->vmin[0][0] + setup->pixel_offset;
679 float vmid_x = setup->vmid[0][0] + setup->pixel_offset;
681 float vmin_y = setup->vmin[0][1] - setup->pixel_offset;
682 float vmid_y = setup->vmid[0][1] - setup->pixel_offset;
683 float vmax_y = setup->vmax[0][1] - setup->pixel_offset;
685 setup->emaj.sy = ceilf(vmin_y);
686 setup->emaj.lines = (int) ceilf(vmax_y - setup->emaj.sy);
687 setup->emaj.dxdy = setup->emaj.dy ? setup->emaj.dx / setup->emaj.dy : .0f;
688 setup->emaj.sx = vmin_x + (setup->emaj.sy - vmin_y) * setup->emaj.dxdy;
690 setup->etop.sy = ceilf(vmid_y);
691 setup->etop.lines = (int) ceilf(vmax_y - setup->etop.sy);
692 setup->etop.dxdy = setup->etop.dy ? setup->etop.dx / setup->etop.dy : .0f;
693 setup->etop.sx = vmid_x + (setup->etop.sy - vmid_y) * setup->etop.dxdy;
695 setup->ebot.sy = ceilf(vmin_y);
696 setup->ebot.lines = (int) ceilf(vmid_y - setup->ebot.sy);
697 setup->ebot.dxdy = setup->ebot.dy ? setup->ebot.dx / setup->ebot.dy : .0f;
698 setup->ebot.sx = vmin_x + (setup->ebot.sy - vmin_y) * setup->ebot.dxdy;
707 subtriangle(struct setup_context *setup,
712 const struct pipe_scissor_state *cliprect = &setup->softpipe->cliprect;
758 if (block(_y) != setup->span.y) {
759 flush_spans(setup);
760 setup->span.y = block(_y);
763 setup->span.left[_y&1] = left;
764 setup->span.right[_y&1] = right;
800 * Do setup for triangle rasterization, then render the triangle.
803 sp_setup_tri(struct setup_context *setup,
811 debug_printf("Setup triangle:\n");
812 print_vertex(setup, v0);
813 print_vertex(setup, v1);
814 print_vertex(setup, v2);
817 if (setup->softpipe->no_rast || setup->softpipe->rasterizer->rasterizer_discard)
826 setup->numFragsEmitted = 0;
827 setup->numFragsWritten = 0;
830 if (!setup_sort_vertices( setup, det, v0, v1, v2 ))
833 setup_tri_coefficients( setup );
834 setup_tri_edges( setup );
836 assert(setup->softpipe->reduced_prim == PIPE_PRIM_TRIANGLES);
838 setup->span.y = 0;
839 setup->span.right[0] = 0;
840 setup->span.right[1] = 0;
841 /* setup->span.z_mode = tri_z_mode( setup->ctx ); */
843 /* init_constant_attribs( setup ); */
845 if (setup->oneoverarea < 0.0) {
848 subtriangle( setup, &setup->emaj, &setup->ebot, setup->ebot.lines );
849 subtriangle( setup, &setup->emaj, &setup->etop, setup->etop.lines );
854 subtriangle( setup, &setup->ebot, &setup->emaj, setup->ebot.lines );
855 subtriangle( setup, &setup->etop, &setup->emaj, setup->etop.lines );
858 flush_spans( setup );
862 setup->numFragsEmitted,
863 setup->numFragsWritten);
900 line_linear_coeff(const struct setup_context *setup,
906 const float dadx = da * setup->emaj.dx * setup->oneoverarea;
907 const float dady = da * setup->emaj.dy * setup->oneoverarea;
911 (dadx * (setup->vmin[0][0] - setup->pixel_offset) +
912 dady * (setup->vmin[0][1] - setup->pixel_offset)));
922 line_persp_coeff(const struct setup_context *setup,
927 const float a0 = v[0] * setup->vmin[0][3];
928 const float a1 = v[1] * setup->vmax[0][3];
930 const float dadx = da * setup->emaj.dx * setup->oneoverarea;
931 const float dady = da * setup->emaj.dy * setup->oneoverarea;
935 (dadx * (setup->vmin[0][0] - setup->pixel_offset) +
936 dady * (setup->vmin[0][1] - setup->pixel_offset)));
941 * Compute the setup->coef[] array dadx, dady, a0 values.
942 * Must be called after setup->vmin,vmax are initialized.
945 setup_line_coefficients(struct setup_context *setup,
949 struct softpipe_context *softpipe = setup->softpipe;
950 const struct tgsi_shader_info *fsInfo = &setup->softpipe->fs_variant->info;
956 /* use setup->vmin, vmax to point to vertices */
958 setup->vprovoke = v0;
960 setup->vprovoke = v1;
961 setup->vmin = v0;
962 setup->vmax = v1;
964 setup->emaj.dx = setup->vmax[0][0] - setup->vmin[0][0];
965 setup->emaj.dy = setup->vmax[0][1] - setup->vmin[0][1];
968 area = setup->emaj.dx * setup->emaj.dx + setup->emaj.dy * setup->emaj.dy;
971 setup->oneoverarea = 1.0f / area;
975 v[0] = setup->vmin[0][2];
976 v[1] = setup->vmax[0][2];
977 line_linear_coeff(setup, &setup->posCoef, 2, v);
979 v[0] = setup->vmin[0][3];
980 v[1] = setup->vmax[0][3];
981 line_linear_coeff(setup, &setup->posCoef, 3, v);
983 /* setup interpolation for all the remaining attributes:
992 const_coeff(setup, &setup->coef[fragSlot], vertSlot, j);
996 line_apply_cylindrical_wrap(setup->vmin[vertSlot][j],
997 setup->vmax[vertSlot][j],
1000 line_linear_coeff(setup, &setup->coef[fragSlot], j, v);
1005 line_apply_cylindrical_wrap(setup->vmin[vertSlot][j],
1006 setup->vmax[vertSlot][j],
1009 line_persp_coeff(setup, &setup->coef[fragSlot], j, v);
1013 setup_fragcoord_coeff(setup, fragSlot);
1021 setup->coef[fragSlot].a0[0] = setup->facing * -2.0f + 1.0f;
1022 setup->coef[fragSlot].dadx[0] = 0.0;
1023 setup->coef[fragSlot].dady[0] = 0.0;
1034 plot(struct setup_context *setup, int x, int y)
1042 if (quadX != setup->quad[0].input.x0 ||
1043 quadY != setup->quad[0].input.y0)
1047 if (setup->quad[0].input.x0 != -1)
1048 clip_emit_quad( setup, &setup->quad[0] );
1050 setup->quad[0].input.x0 = quadX;
1051 setup->quad[0].input.y0 = quadY;
1052 setup->quad[0].inout.mask = 0x0;
1055 setup->quad[0].inout.mask |= mask;
1060 * Do setup for line rasterization, then render the line.
1065 sp_setup_line(struct setup_context *setup,
1078 debug_printf("Setup line:\n");
1079 print_vertex(setup, v0);
1080 print_vertex(setup, v1);
1083 if (setup->softpipe->no_rast || setup->softpipe->rasterizer->rasterizer_discard)
1089 if (!setup_line_coefficients(setup, v0, v1))
1115 assert(setup->softpipe->reduced_prim == PIPE_PRIM_LINES);
1117 setup->quad[0].input.x0 = setup->quad[0].input.y0 = -1;
1118 setup->quad[0].inout.mask = 0x0;
1123 setup->quad[0].input.coverage[0] =
1124 setup->quad[0].input.coverage[1] =
1125 setup->quad[0].input.coverage[2] =
1126 setup->quad[0].input.coverage[3] = 1.0;
1136 plot(setup, x0, y0);
1156 plot(setup, x0, y0);
1170 if (setup->quad[0].inout.mask) {
1171 clip_emit_quad( setup, &setup->quad[0] );
1177 point_persp_coeff(const struct setup_context *setup,
1190 * Do setup for point rasterization, then render the point.
1195 sp_setup_point(struct setup_context *setup,
1198 struct softpipe_context *softpipe = setup->softpipe;
1199 const struct tgsi_shader_info *fsInfo = &setup->softpipe->fs_variant->info;
1200 const int sizeAttr = setup->softpipe->psize_slot;
1203 : setup->softpipe->rasterizer->point_size;
1205 const boolean round = (boolean) setup->softpipe->rasterizer->point_smooth;
1212 debug_printf("Setup point:\n");
1213 print_vertex(setup, v0);
1216 if (setup->softpipe->no_rast || setup->softpipe->rasterizer->rasterizer_discard)
1219 assert(setup->softpipe->reduced_prim == PIPE_PRIM_POINTS);
1222 * However, for point sprites, we'll need to setup texcoords appropriately.
1237 setup->vprovoke = v0;
1239 /* setup Z, W */
1240 const_coeff(setup, &setup->posCoef, 0, 2);
1241 const_coeff(setup, &setup->posCoef, 0, 3);
1252 const_coeff(setup, &setup->coef[fragSlot], vertSlot, j);
1256 point_persp_coeff(setup, setup->vprovoke,
1257 &setup->coef[fragSlot], vertSlot, j);
1260 setup_fragcoord_coeff(setup, fragSlot);
1268 setup->coef[fragSlot].a0[0] = setup->facing * -2.0f + 1.0f;
1269 setup->coef[fragSlot].dadx[0] = 0.0;
1270 setup->coef[fragSlot].dady[0] = 0.0;
1279 setup->quad[0].input.x0 = (int) x - ix;
1280 setup->quad[0].input.y0 = (int) y - iy;
1281 setup->quad[0].inout.mask = (1 << ix) << (2 * iy);
1282 clip_emit_quad( setup, &setup->quad[0] );
1302 setup->quad[0].inout.mask = 0x0;
1309 setup->quad[0].input.coverage[QUAD_TOP_LEFT] = MIN2(cover, 1.0f);
1310 setup->quad[0].inout.mask |= MASK_TOP_LEFT;
1318 setup->quad[0].input.coverage[QUAD_TOP_RIGHT] = MIN2(cover, 1.0f);
1319 setup->quad[0].inout.mask |= MASK_TOP_RIGHT;
1327 setup->quad[0].input.coverage[QUAD_BOTTOM_LEFT] = MIN2(cover, 1.0f);
1328 setup->quad[0].inout.mask |= MASK_BOTTOM_LEFT;
1336 setup->quad[0].input.coverage[QUAD_BOTTOM_RIGHT] = MIN2(cover, 1.0f);
1337 setup->quad[0].inout.mask |= MASK_BOTTOM_RIGHT;
1340 if (setup->quad[0].inout.mask) {
1341 setup->quad[0].input.x0 = ix;
1342 setup->quad[0].input.y0 = iy;
1343 clip_emit_quad( setup, &setup->quad[0] );
1387 setup->quad[0].inout.mask = mask;
1388 setup->quad[0].input.x0 = ix;
1389 setup->quad[0].input.y0 = iy;
1390 clip_emit_quad( setup, &setup->quad[0] );
1402 sp_setup_prepare(struct setup_context *setup)
1404 struct softpipe_context *sp = setup->softpipe;
1411 setup->nr_vertex_attrs = draw_num_shader_outputs(sp->draw);
1419 setup->cull_face = sp->rasterizer->cull_face;
1423 setup->cull_face = PIPE_FACE_NONE;
1429 sp_setup_destroy_context(struct setup_context *setup)
1431 FREE( setup );
1436 * Create a new primitive setup/render stage.
1441 struct setup_context *setup = CALLOC_STRUCT(setup_context);
1444 setup->softpipe = softpipe;
1447 setup->quad[i].coef = setup->coef;
1448 setup->quad[i].posCoef = &setup->posCoef;
1451 setup->span.left[0] = 1000000; /* greater than right[0] */
1452 setup->span.left[1] = 1000000; /* greater than right[1] */
1454 return setup;