X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Ffreedreno%2Ffreedreno_program.c;h=deadb3d73a4fbacc2bf3574a868a5d0a05c32d42;hb=1b3aefad46bda59ff02c0d81c53fd3fbf249d8f4;hp=db6b258e21c0be31a025925309f7c30887cdb1af;hpb=676c77a923d596cfeb393a780a3d6cb82898e71f;p=mesa.git diff --git a/src/gallium/drivers/freedreno/freedreno_program.c b/src/gallium/drivers/freedreno/freedreno_program.c index db6b258e21c..deadb3d73a4 100644 --- a/src/gallium/drivers/freedreno/freedreno_program.c +++ b/src/gallium/drivers/freedreno/freedreno_program.c @@ -1,5 +1,3 @@ -/* -*- mode: C; c-file-style: "k&r"; tab-width 4; indent-tabs-mode: t; -*- */ - /* * Copyright (C) 2014 Rob Clark * @@ -33,22 +31,51 @@ #include "freedreno_context.h" static void -fd_fp_state_bind(struct pipe_context *pctx, void *hwcso) +fd_vs_state_bind(struct pipe_context *pctx, void *hwcso) { struct fd_context *ctx = fd_context(pctx); - ctx->prog.fp = hwcso; - ctx->dirty |= FD_SHADER_DIRTY_FP; + ctx->prog.vs = hwcso; + ctx->dirty_shader[PIPE_SHADER_VERTEX] |= FD_DIRTY_SHADER_PROG; + ctx->dirty |= FD_DIRTY_PROG; } static void -fd_vp_state_bind(struct pipe_context *pctx, void *hwcso) +fd_tcs_state_bind(struct pipe_context *pctx, void *hwcso) { struct fd_context *ctx = fd_context(pctx); - ctx->prog.vp = hwcso; - ctx->dirty |= FD_SHADER_DIRTY_VP; + ctx->prog.hs = hwcso; + ctx->dirty_shader[PIPE_SHADER_TESS_CTRL] |= FD_DIRTY_SHADER_PROG; + ctx->dirty |= FD_DIRTY_PROG; } -static const char *solid_fp = +static void +fd_tes_state_bind(struct pipe_context *pctx, void *hwcso) +{ + struct fd_context *ctx = fd_context(pctx); + ctx->prog.ds = hwcso; + ctx->dirty_shader[PIPE_SHADER_TESS_EVAL] |= FD_DIRTY_SHADER_PROG; + ctx->dirty |= FD_DIRTY_PROG; +} + +static void +fd_gs_state_bind(struct pipe_context *pctx, void *hwcso) +{ + struct fd_context *ctx = fd_context(pctx); + ctx->prog.gs = hwcso; + ctx->dirty_shader[PIPE_SHADER_GEOMETRY] |= FD_DIRTY_SHADER_PROG; + ctx->dirty |= FD_DIRTY_PROG; +} + +static void +fd_fs_state_bind(struct pipe_context *pctx, void *hwcso) +{ + struct fd_context *ctx = fd_context(pctx); + ctx->prog.fs = hwcso; + ctx->dirty_shader[PIPE_SHADER_FRAGMENT] |= FD_DIRTY_SHADER_PROG; + ctx->dirty |= FD_DIRTY_PROG; +} + +static const char *solid_fs = "FRAG \n" "PROPERTY FS_COLOR0_WRITES_ALL_CBUFS 1 \n" "DCL CONST[0] \n" @@ -56,18 +83,18 @@ static const char *solid_fp = " 0: MOV OUT[0], CONST[0] \n" " 1: END \n"; -static const char *solid_vp = +static const char *solid_vs = "VERT \n" "DCL IN[0] \n" "DCL OUT[0], POSITION \n" " 0: MOV OUT[0], IN[0] \n" " 1: END \n"; -static const char *blit_vp = +static const char *blit_vs = "VERT \n" "DCL IN[0] \n" "DCL IN[1] \n" - "DCL OUT[0], TEXCOORD[0] \n" + "DCL OUT[0], GENERIC[0] \n" "DCL OUT[1], POSITION \n" " 0: MOV OUT[0], IN[0] \n" " 0: MOV OUT[1], IN[1] \n" @@ -126,27 +153,29 @@ 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; + pctx->bind_vs_state = fd_vs_state_bind; + pctx->bind_tcs_state = fd_tcs_state_bind; + pctx->bind_tes_state = fd_tes_state_bind; + pctx->bind_gs_state = fd_gs_state_bind; + pctx->bind_fs_state = fd_fs_state_bind; + + ctx->solid_prog.fs = assemble_tgsi(pctx, solid_fs, true); + ctx->solid_prog.vs = assemble_tgsi(pctx, solid_vs, false); + ctx->blit_prog[0].vs = assemble_tgsi(pctx, blit_vs, false); + ctx->blit_prog[0].fs = fd_prog_blit(pctx, 1, false); - // XXX for now, let a2xx keep it's own hand-rolled shaders - // for solid and blit progs: if (ctx->screen->gpu_id < 300) return; - ctx->solid_prog.fp = assemble_tgsi(pctx, solid_fp, true); - ctx->solid_prog.vp = assemble_tgsi(pctx, solid_vp, false); - ctx->blit_prog[0].vp = assemble_tgsi(pctx, blit_vp, false); - ctx->blit_prog[0].fp = fd_prog_blit(pctx, 1, false); 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, false); + ctx->blit_prog[i].vs = ctx->blit_prog[0].vs; + ctx->blit_prog[i].fs = fd_prog_blit(pctx, i + 1, false); } - ctx->blit_z.vp = ctx->blit_prog[0].vp; - ctx->blit_z.fp = fd_prog_blit(pctx, 0, true); - ctx->blit_zs.vp = ctx->blit_prog[0].vp; - ctx->blit_zs.fp = fd_prog_blit(pctx, 1, true); + ctx->blit_z.vs = ctx->blit_prog[0].vs; + ctx->blit_z.fs = fd_prog_blit(pctx, 0, true); + ctx->blit_zs.vs = ctx->blit_prog[0].vs; + ctx->blit_zs.fs = fd_prog_blit(pctx, 1, true); } void fd_prog_fini(struct pipe_context *pctx) @@ -154,11 +183,11 @@ 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[0].vp); + pctx->delete_vs_state(pctx, ctx->solid_prog.vs); + pctx->delete_fs_state(pctx, ctx->solid_prog.fs); + pctx->delete_vs_state(pctx, ctx->blit_prog[0].vs); for (i = 0; i < ctx->screen->max_rts; i++) - pctx->delete_fs_state(pctx, ctx->blit_prog[i].fp); - pctx->delete_fs_state(pctx, ctx->blit_z.fp); - pctx->delete_fs_state(pctx, ctx->blit_zs.fp); + pctx->delete_fs_state(pctx, ctx->blit_prog[i].fs); + pctx->delete_fs_state(pctx, ctx->blit_z.fs); + pctx->delete_fs_state(pctx, ctx->blit_zs.fs); }