svga: implement CEIL opcode translation
authorBrian Paul <brianp@vmware.com>
Wed, 9 May 2012 16:31:07 +0000 (10:31 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 9 May 2012 16:53:15 +0000 (10:53 -0600)
Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/drivers/svga/svga_tgsi_insn.c

index 5e6d1fbc9048b22ec1b0f4c94a711d02691b30d5..a68912608bc6d63e18764ef29b80c0b5b40dffdb 100644 (file)
@@ -871,6 +871,31 @@ static boolean emit_floor(struct svga_shader_emitter *emit,
 }
 
 
+/* Translate the following TGSI CEIL instruction.
+ *    CEIL  DST, SRC
+ * To the following SVGA3D instruction sequence.
+ *    FRC  TMP, -SRC
+ *    ADD  DST, SRC, TMP
+ */
+static boolean emit_ceil(struct svga_shader_emitter *emit,
+                         const struct tgsi_full_instruction *insn)
+{
+   SVGA3dShaderDestToken dst = translate_dst_register(emit, insn, 0);
+   const struct src_register src0 = translate_src_register(emit, &insn->Src[0]);
+   SVGA3dShaderDestToken temp = get_temp(emit);
+
+   /* FRC  TMP, -SRC */
+   if (!submit_op1(emit, inst_token(SVGA3DOP_FRC), temp, negate(src0)))
+      return FALSE;
+
+   /* ADD DST, SRC, TMP */
+   if (!submit_op2(emit, inst_token(SVGA3DOP_ADD), dst, src0, src(temp)))
+      return FALSE;
+
+   return TRUE;
+}
+
+
 /* Translate the following TGSI CMP instruction.
  *    CMP  DST, SRC0, SRC1, SRC2
  * To the following SVGA3D instruction sequence.
@@ -2435,6 +2460,9 @@ static boolean svga_emit_instruction( struct svga_shader_emitter *emit,
    case TGSI_OPCODE_TRUNC:        /* should be TRUNC, not FLR */
       return emit_floor( emit, insn );
 
+   case TGSI_OPCODE_CEIL:
+      return emit_ceil( emit, insn );
+
    case TGSI_OPCODE_CMP:
       return emit_cmp( emit, insn );