/** * Make fragment shader for glDraw/CopyPixels. This shader is made * by combining the pixel transfer shader with the user-defined shader. * \param fpIn the current/incoming fragment program * \param fpOut returns the combined fragment program */ void st_make_drawpix_fragment_program(struct st_context *st, struct gl_fragment_program *fpIn, struct gl_fragment_program **fpOut) { struct gl_program *newProg; if (is_passthrough_program(fpIn)) { newProg = (struct gl_program *) _mesa_clone_fragment_program(st->ctx, &st->pixel_xfer.program->Base); } else { #if 0 /* debug */ printf("Base program:\n"); _mesa_print_program(&fpIn->Base); printf("DrawPix program:\n"); _mesa_print_program(&st->pixel_xfer.program->Base.Base); #endif newProg = _mesa_combine_programs(st->ctx, &st->pixel_xfer.program->Base.Base, &fpIn->Base); } #if 0 /* debug */ printf("Combined DrawPixels program:\n"); _mesa_print_program(newProg); printf("InputsRead: 0x%x\n", newProg->InputsRead); printf("OutputsWritten: 0x%x\n", newProg->OutputsWritten); _mesa_print_parameter_list(newProg->Parameters); #endif *fpOut = (struct gl_fragment_program *) newProg; }
/** * Combine basic bitmap fragment program with the user-defined program. * \param st current context * \param fpIn the incoming fragment program * \param fpOut the new fragment program which does fragment culling * \param bitmap_sampler sampler number for the bitmap texture */ void st_make_bitmap_fragment_program(struct st_context *st, struct gl_fragment_program *fpIn, struct gl_fragment_program **fpOut, GLuint *bitmap_sampler) { struct st_fragment_program *bitmap_prog; struct st_fragment_program *stfpIn = (struct st_fragment_program *) fpIn; struct gl_program *newProg; uint sampler; /* * Generate new program which is the user-defined program prefixed * with the bitmap sampler/kill instructions. */ sampler = find_free_bit(fpIn->Base.SamplersUsed); if (stfpIn->glsl_to_tgsi) newProg = make_bitmap_fragment_program_glsl(st, stfpIn, sampler); else { bitmap_prog = make_bitmap_fragment_program(st->ctx, sampler); newProg = _mesa_combine_programs(st->ctx, &bitmap_prog->Base.Base, &fpIn->Base); /* done with this after combining */ st_reference_fragprog(st, &bitmap_prog, NULL); } #if 0 { printf("Combined bitmap program:\n"); _mesa_print_program(newProg); printf("InputsRead: 0x%x\n", newProg->InputsRead); printf("OutputsWritten: 0x%x\n", newProg->OutputsWritten); _mesa_print_parameter_list(newProg->Parameters); } #endif /* return results */ *fpOut = (struct gl_fragment_program *) newProg; *bitmap_sampler = sampler; }
/** * Make fragment shader for glDraw/CopyPixels. This shader is made * by combining the pixel transfer shader with the user-defined shader. */ static struct st_fragment_program * combined_drawpix_fragment_program(GLcontext *ctx) { struct st_context *st = ctx->st; struct st_fragment_program *stfp; if (st->pixel_xfer.program->serialNo == st->pixel_xfer.xfer_prog_sn && st->fp->serialNo == st->pixel_xfer.user_prog_sn) { /* the pixel tranfer program has not changed and the user-defined * program has not changed, so re-use the combined program. */ stfp = st->pixel_xfer.combined_prog; } else { /* Concatenate the pixel transfer program with the current user- * defined program. */ if (is_passthrough_program(&st->fp->Base)) { stfp = (struct st_fragment_program *) _mesa_clone_program(ctx, &st->pixel_xfer.program->Base.Base); } else { #if 0 printf("Base program:\n"); _mesa_print_program(&st->fp->Base.Base); printf("DrawPix program:\n"); _mesa_print_program(&st->pixel_xfer.program->Base.Base); #endif stfp = (struct st_fragment_program *) _mesa_combine_programs(ctx, &st->pixel_xfer.program->Base.Base, &st->fp->Base.Base); } #if 0 { struct gl_program *p = &stfp->Base.Base; printf("Combined DrawPixels program:\n"); _mesa_print_program(p); printf("InputsRead: 0x%x\n", p->InputsRead); printf("OutputsWritten: 0x%x\n", p->OutputsWritten); _mesa_print_parameter_list(p->Parameters); } #endif /* translate to TGSI tokens */ st_translate_fragment_program(st, stfp, NULL); /* save new program, update serial numbers */ st->pixel_xfer.xfer_prog_sn = st->pixel_xfer.program->serialNo; st->pixel_xfer.user_prog_sn = st->fp->serialNo; st->pixel_xfer.combined_prog_sn = stfp->serialNo; /* can't reference new program directly, already have a reference on it */ st_reference_fragprog(st, &st->pixel_xfer.combined_prog, NULL); st->pixel_xfer.combined_prog = stfp; } /* Ideally we'd have updated the pipe constants during the normal * st/atom mechanism. But we can't since this is specific to glDrawPixels. */ st_upload_constants(st, stfp->Base.Base.Parameters, PIPE_SHADER_FRAGMENT); return stfp; }