/** * Compute the setup->coef[] array dadx, dady, a0 values. * Must be called after setup->vmin,vmid,vmax,vprovoke are initialized. */ static void setup_tri_coefficients( struct setup_context *setup ) { struct softpipe_context *softpipe = setup->softpipe; const struct sp_fragment_shader *spfs = softpipe->fs; const struct vertex_info *vinfo = softpipe_get_vertex_info(softpipe); uint fragSlot; /* z and w are done by linear interpolation: */ tri_linear_coeff(setup, &setup->posCoef, 0, 2); tri_linear_coeff(setup, &setup->posCoef, 0, 3); /* setup interpolation for all the remaining attributes: */ for (fragSlot = 0; fragSlot < spfs->info.num_inputs; fragSlot++) { const uint vertSlot = vinfo->attrib[fragSlot].src_index; uint j; switch (vinfo->attrib[fragSlot].interp_mode) { case INTERP_CONSTANT: for (j = 0; j < NUM_CHANNELS; j++) const_coeff(setup, &setup->coef[fragSlot], vertSlot, j); break; case INTERP_LINEAR: for (j = 0; j < NUM_CHANNELS; j++) tri_linear_coeff(setup, &setup->coef[fragSlot], vertSlot, j); break; case INTERP_PERSPECTIVE: for (j = 0; j < NUM_CHANNELS; j++) tri_persp_coeff(setup, &setup->coef[fragSlot], vertSlot, j); break; case INTERP_POS: setup_fragcoord_coeff(setup, fragSlot); break; default: assert(0); } if (spfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FOG) { /* FOG.y = front/back facing XXX fix this */ setup->coef[fragSlot].a0[1] = 1.0f - setup->quad.input.facing; setup->coef[fragSlot].dadx[1] = 0.0; setup->coef[fragSlot].dady[1] = 0.0; } } }
/** * Compute the setup->coef[] array dadx, dady, a0 values. * Must be called after setup->vmin,vmid,vmax,vprovoke are initialized. */ static void setup_tri_coefficients( struct setup_context *setup ) { struct llvmpipe_context *llvmpipe = setup->llvmpipe; const struct lp_fragment_shader *lpfs = llvmpipe->fs; const struct vertex_info *vinfo = llvmpipe_get_vertex_info(llvmpipe); uint fragSlot; /* z and w are done by linear interpolation: */ tri_pos_coeff(setup, 0, 2); tri_pos_coeff(setup, 0, 3); /* setup interpolation for all the remaining attributes: */ for (fragSlot = 0; fragSlot < lpfs->info.num_inputs; fragSlot++) { const uint vertSlot = vinfo->attrib[fragSlot].src_index; switch (vinfo->attrib[fragSlot].interp_mode) { case INTERP_CONSTANT: const_coeff(setup, fragSlot, vertSlot); break; case INTERP_LINEAR: tri_linear_coeff(setup, fragSlot, vertSlot); break; case INTERP_PERSPECTIVE: tri_persp_coeff(setup, fragSlot, vertSlot); break; case INTERP_POS: setup_fragcoord_coeff(setup, fragSlot); break; default: assert(0); } if (lpfs->info.input_semantic_name[fragSlot] == TGSI_SEMANTIC_FACE) { setup->coef.a0[1 + fragSlot][0] = 1.0f - setup->facing; setup->coef.dadx[1 + fragSlot][0] = 0.0; setup->coef.dady[1 + fragSlot][0] = 0.0; } } }
/** * Compute the setup->coef[] array dadx, dady, a0 values. * Must be called after setup->vmin,vmid,vmax,vprovoke are initialized. */ static void setup_tri_coefficients(struct setup_context *setup) { struct softpipe_context *softpipe = setup->softpipe; const struct tgsi_shader_info *fsInfo = &setup->softpipe->fs_variant->info; const struct sp_setup_info *sinfo = &softpipe->setup_info; uint fragSlot; float v[3]; assert(sinfo->valid); /* z and w are done by linear interpolation: */ v[0] = setup->vmin[0][2]; v[1] = setup->vmid[0][2]; v[2] = setup->vmax[0][2]; tri_linear_coeff(setup, &setup->posCoef, 2, v); v[0] = setup->vmin[0][3]; v[1] = setup->vmid[0][3]; v[2] = setup->vmax[0][3]; tri_linear_coeff(setup, &setup->posCoef, 3, v); /* setup interpolation for all the remaining attributes: */ for (fragSlot = 0; fragSlot < fsInfo->num_inputs; fragSlot++) { const uint vertSlot = sinfo->attrib[fragSlot].src_index; uint j; switch (sinfo->attrib[fragSlot].interp) { case SP_INTERP_CONSTANT: for (j = 0; j < TGSI_NUM_CHANNELS; j++) { const_coeff(setup, &setup->coef[fragSlot], vertSlot, j); } break; case SP_INTERP_LINEAR: for (j = 0; j < TGSI_NUM_CHANNELS; j++) { tri_apply_cylindrical_wrap(setup->vmin[vertSlot][j], setup->vmid[vertSlot][j], setup->vmax[vertSlot][j], fsInfo->input_cylindrical_wrap[fragSlot] & (1 << j), v); tri_linear_coeff(setup, &setup->coef[fragSlot], j, v); } break; case SP_INTERP_PERSPECTIVE: for (j = 0; j < TGSI_NUM_CHANNELS; j++) { tri_apply_cylindrical_wrap(setup->vmin[vertSlot][j], setup->vmid[vertSlot][j], setup->vmax[vertSlot][j], fsInfo->input_cylindrical_wrap[fragSlot] & (1 << j), v); tri_persp_coeff(setup, &setup->coef[fragSlot], j, v); } break; case SP_INTERP_POS: setup_fragcoord_coeff(setup, fragSlot); break; default: assert(0); } if (fsInfo->input_semantic_name[fragSlot] == TGSI_SEMANTIC_FACE) { /* convert 0 to 1.0 and 1 to -1.0 */ setup->coef[fragSlot].a0[0] = setup->facing * -2.0f + 1.0f; setup->coef[fragSlot].dadx[0] = 0.0; setup->coef[fragSlot].dady[0] = 0.0; } if (0) { for (j = 0; j < TGSI_NUM_CHANNELS; j++) { debug_printf("attr[%d].%c: a0:%f dx:%f dy:%f\n", fragSlot, "xyzw"[j], setup->coef[fragSlot].a0[j], setup->coef[fragSlot].dadx[j], setup->coef[fragSlot].dady[j]); } } } }