diff options
Diffstat (limited to 'src/gallium/drivers/freedreno/freedreno_program.c')
-rw-r--r-- | src/gallium/drivers/freedreno/freedreno_program.c | 46 |
1 files changed, 33 insertions, 13 deletions
diff --git a/src/gallium/drivers/freedreno/freedreno_program.c b/src/gallium/drivers/freedreno/freedreno_program.c index 167ed02f85d..52a165b64af 100644 --- a/src/gallium/drivers/freedreno/freedreno_program.c +++ b/src/gallium/drivers/freedreno/freedreno_program.c @@ -27,6 +27,7 @@ */ #include "tgsi/tgsi_text.h" +#include "tgsi/tgsi_ureg.h" #include "freedreno_program.h" #include "freedreno_context.h" @@ -64,15 +65,6 @@ static const char *solid_vp = " 0: MOV OUT[0], IN[0] \n" " 1: END \n"; -static const char *blit_fp = - "FRAG \n" - "PROPERTY FS_COLOR0_WRITES_ALL_CBUFS 1 \n" - "DCL IN[0], TEXCOORD[0], PERSPECTIVE \n" - "DCL OUT[0], COLOR \n" - "DCL SAMP[0] \n" - " 0: TEX OUT[0], IN[0], SAMP[0], 2D \n" - " 1: END \n"; - static const char *blit_vp = "VERT \n" "DCL IN[0] \n" @@ -99,9 +91,31 @@ static void * assemble_tgsi(struct pipe_context *pctx, return pctx->create_vs_state(pctx, &cso); } +static void * +fd_prog_blit(struct pipe_context *pctx, int rts) +{ + int i; + struct ureg_src tc; + struct ureg_program *ureg = ureg_create(TGSI_PROCESSOR_FRAGMENT); + if (!ureg) + return NULL; + + tc = ureg_DECL_fs_input( + ureg, TGSI_SEMANTIC_GENERIC, 0, TGSI_INTERPOLATE_PERSPECTIVE); + for (i = 0; i < rts; i++) + ureg_TEX(ureg, ureg_DECL_output(ureg, TGSI_SEMANTIC_COLOR, i), + TGSI_TEXTURE_2D, tc, ureg_DECL_sampler(ureg, i)); + + ureg_END(ureg); + + return ureg_create_shader_and_destroy(ureg, pctx); +} + + void fd_prog_init(struct pipe_context *pctx) { struct fd_context *ctx = fd_context(pctx); + int i; pctx->bind_fs_state = fd_fp_state_bind; pctx->bind_vs_state = fd_vp_state_bind; @@ -113,16 +127,22 @@ void fd_prog_init(struct pipe_context *pctx) ctx->solid_prog.fp = assemble_tgsi(pctx, solid_fp, true); ctx->solid_prog.vp = assemble_tgsi(pctx, solid_vp, false); - ctx->blit_prog.fp = assemble_tgsi(pctx, blit_fp, true); - ctx->blit_prog.vp = assemble_tgsi(pctx, blit_vp, false); + ctx->blit_prog[0].vp = assemble_tgsi(pctx, blit_vp, false); + ctx->blit_prog[0].fp = fd_prog_blit(pctx, 1); + for (i = 1; i < ctx->screen->max_rts; i++) { + ctx->blit_prog[i].vp = ctx->blit_prog[0].vp; + ctx->blit_prog[i].fp = fd_prog_blit(pctx, i + 1); + } } void fd_prog_fini(struct pipe_context *pctx) { struct fd_context *ctx = fd_context(pctx); + int i; pctx->delete_vs_state(pctx, ctx->solid_prog.vp); pctx->delete_fs_state(pctx, ctx->solid_prog.fp); - pctx->delete_vs_state(pctx, ctx->blit_prog.vp); - pctx->delete_fs_state(pctx, ctx->blit_prog.fp); + pctx->delete_vs_state(pctx, ctx->blit_prog[0].vp); + for (i = 0; i < ctx->screen->max_rts; i++) + pctx->delete_fs_state(pctx, ctx->blit_prog[i].fp); } |