r600g: vertex id support.
authorDave Airlie <airlied@redhat.com>
Sat, 14 Jan 2012 17:04:50 +0000 (17:04 +0000)
committerDave Airlie <airlied@redhat.com>
Sun, 15 Jan 2012 08:17:38 +0000 (08:17 +0000)
This requires GLSL 1.30 enabled, which requires integer types enabled,
so don't bother doing an INT to FLT conversion on it.

We should probably remove the instance id flt->int conversion when
turning on native integers.

this passes the three piglit tests with GLSL 1.30 forced on.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/r600_shader.c

index 071622d28bdf9181b0298525930b260d0984d08c..bc3652b477cb702c97f66b4982d262525e04b036 100644 (file)
@@ -453,8 +453,8 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx)
                        if ((r = r600_bytecode_add_alu(ctx->bc, &alu)))
                                return r;
                        break;
-               }
-
+               } else if (d->Semantic.Name == TGSI_SEMANTIC_VERTEXID)
+                       break;
        default:
                R600_ERR("unsupported file %d declaration\n", d->Declaration.File);
                return -EINVAL;
@@ -541,12 +541,19 @@ static void tgsi_src(struct r600_shader_ctx *ctx,
                r600_src->sel = V_SQ_ALU_SRC_LITERAL;
                memcpy(r600_src->value, ctx->literals + index * 4, sizeof(r600_src->value));
        } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) {
-               /* assume we wan't TGSI_SEMANTIC_INSTANCEID here */
-               r600_src->swizzle[0] = 3;
-               r600_src->swizzle[1] = 3;
-               r600_src->swizzle[2] = 3;
-               r600_src->swizzle[3] = 3;
-               r600_src->sel = 0;
+               if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_INSTANCEID) {
+                       r600_src->swizzle[0] = 3;
+                       r600_src->swizzle[1] = 3;
+                       r600_src->swizzle[2] = 3;
+                       r600_src->swizzle[3] = 3;
+                       r600_src->sel = 0;
+               } else if (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == TGSI_SEMANTIC_VERTEXID) {
+                       r600_src->swizzle[0] = 0;
+                       r600_src->swizzle[1] = 0;
+                       r600_src->swizzle[2] = 0;
+                       r600_src->swizzle[3] = 0;
+                       r600_src->sel = 0;
+               }
        } else {
                if (tgsi_src->Register.Indirect)
                        r600_src->rel = V_SQ_REL_RELATIVE;