[Mesa-dev] [PATCH 06/11] freedreno: a2xx: add fragcoord

Jonathan Marek jonathan at marek.ca
Mon Oct 8 04:06:06 UTC 2018


emulated fragcoord. a2xx has *some* hw support but it is not practical

Signed-off-by: Jonathan Marek <jonathan at marek.ca>
---
 .../drivers/freedreno/a2xx/fd2_compiler.c        | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_compiler.c b/src/gallium/drivers/freedreno/a2xx/fd2_compiler.c
index 1ce3bc4f82..ab5d16f1a7 100644
--- a/src/gallium/drivers/freedreno/a2xx/fd2_compiler.c
+++ b/src/gallium/drivers/freedreno/a2xx/fd2_compiler.c
@@ -186,6 +186,7 @@ compile_init(struct fd2_compile_context *ctx, struct fd_program_stateobj *prog,
 					switch (name) {
 					case TGSI_SEMANTIC_COLOR:
 					case TGSI_SEMANTIC_GENERIC:
+					case TGSI_SEMANTIC_POSITION:
 						ctx->num_param++;
 						break;
 					default:
@@ -325,6 +326,8 @@ add_dst_reg(struct fd2_compile_context *ctx, struct ir2_instruction *alu,
 					num = ctx->prog->num_exports;
 			}
 		} else {
+			/* write to gl_FragCoord.z not possible */
+			assert(ctx->output_export_idx[dst->Index] != TGSI_SEMANTIC_POSITION);
 			num = dst->Index;
 		}
 		break;
@@ -1103,6 +1106,7 @@ compile_extra_exports(struct fd2_compile_context *ctx)
 {
 	struct ir2_shader *shader = ctx->so->ir;
 	struct ir2_instruction *instr;
+	int fragcoord = ctx->prog->export_linkage[TGSI_SEMANTIC_POSITION];
 	int position = ctx->num_regs[TGSI_FILE_INPUT] + 1;
 	unsigned i;
 	/* XXX hacky way to get new temporaries */
@@ -1122,6 +1126,18 @@ compile_extra_exports(struct fd2_compile_context *ctx)
 	ir2_reg_create(instr, tmp, "wwww", 0);
 	ir2_dst_create(instr, tmp + 1, "xyzw", 0);
 
+	if (fragcoord != 0xff) {
+		instr = ir2_instr_create_alu_v(shader, MULADDv);
+		ir2_reg_create(instr, 66, "xyzw", IR2_REG_CONST);
+		ir2_reg_create(instr, tmp + 1, "xyzw", 0);
+		ir2_reg_create(instr, 65, "xyzw", IR2_REG_CONST);
+		ir2_dst_create(instr, fragcoord, "xyz_", IR2_REG_EXPORT);
+
+		instr = ir2_instr_create_alu_s(shader, MAXs);
+		ir2_reg_create(instr, tmp, "wwww", 0);
+		ir2_dst_create(instr, fragcoord, "___w", IR2_REG_EXPORT);
+	}
+
 	/* these two instructions could be avoided with constant folding
 	 * but it would be hard to implement..
 	 */
-- 
2.17.1



More information about the mesa-dev mailing list