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

Signed-off-by: Jonathan Marek <jonat...@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

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to