Hi,
so basically instead of add double in exec_channel it would be?
diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c
b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index f43233b..3c90677 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -380,6 +380,33 @@ micro_trunc(union tgsi_exec_channel *dst,
dst->f[3] = (float)(int)src->f[3];
}
+static void
+micro_movd(union tgsi_exec_channel *dst,
+ const union tgsi_exec_channel *src)
+{
+ union tgsi_double dsrc, ddst;
+
+ TGSI_CREATE_DOUBLE(dsrc, src);
+
+ ddst = dsrc; /* we do not need it */
+ TGSI_DOUBLE_TO_EXECCHANELL(dst, ddst);
+}
+
+static void
+micro_ddiv(union tgsi_exec_channel *dst,
+ const union tgsi_exec_channel *src0,
+ const union tgsi_exec_channel *src1)
+{
+ union tgsi_double dsrc0, dsrc1, ddst;
+
+ TGSI_CREATE_DOUBLE(dsrc0, src0);
+ TGSI_CREATE_DOUBLE(dsrc1, src1);
+
+ if (dsrc1.reg != 0) {
+ ddst.reg = dsrc0.reg/dsrc1.reg;
+ TGSI_DOUBLE_TO_EXECCHANELL(dst, ddst);
+ }
+}
#define CHAN_X 0
#define CHAN_Y 1
@@ -3491,6 +3518,14 @@ exec_instruction(
exec_vector_binary(mach, inst, micro_usne, TGSI_EXEC_DATA_UINT,
TGSI_EXEC_DATA_UINT);
break;
+ case TGSI_OPCODE_MOVD:
+ exec_vector_unary(mach, inst, micro_movd,
TGSI_EXEC_DATA_DOUBLE, TGSI_EXEC_DATA_DOUBLE);
+ break;
+
+ case TGSI_OPCODE_DDIV:
+ exec_vector_binary(mach, inst, micro_ddiv,
TGSI_EXEC_DATA_DOUBLE, TGSI_EXEC_DATA_DOUBLE);
+ break;
+
case TGSI_OPCODE_SWITCH:
exec_switch(mach, inst);
break;
@@ -3503,7 +3538,8 @@ exec_instruction(
exec_default(mach);
break;
- case TGSI_OPCODE_ENDSWITCH:
+
+ case TGSI_OPCODE_ENDSWITCH:
exec_endswitch(mach);
break;
diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h
b/src/gallium/auxiliary/tgsi/tgsi_exec.h
index aa3a98d..7da44d9 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
@@ -50,6 +50,18 @@ union tgsi_exec_channel
unsigned u[QUAD_SIZE];
};
+union tgsi_double
+{
+ float lsb;
+ float msb;
+ double reg;
+};
+
+#define TGSI_CREATE_DOUBLE(dsrc, src) dsrc.lsb = src->f[0], \
+ dsrc.msb = src->f[1]
+
+#define TGSI_DOUBLE_TO_EXECCHANELL(channel, dvalue) channel->f[0] =
dvalue.lsb, \
+ channel->f[1] = dvalue.msb
/**
* A vector[RGBA] of channels[4 pixels]
*/
diff --git a/src/gallium/auxiliary/tgsi/tgsi_info.c
b/src/gallium/auxiliary/tgsi/tgsi_info.c
index de0e09c..acbd7dc 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_info.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_info.c
@@ -171,6 +171,8 @@ static const struct tgsi_opcode_info
opcode_info[TGSI_OPCODE_LAST] =
{ 1, 2, 0, 0, 0, 0, "USGE", TGSI_OPCODE_USGE },
{ 1, 2, 0, 0, 0, 0, "USHR", TGSI_OPCODE_USHR },
{ 1, 2, 0, 0, 0, 0, "USLT", TGSI_OPCODE_USLT },
+ { 1, 1, 0, 0, 0, 0, "MOVD", TGSI_OPCODE_MOVD },
+ { 1, 2, 0, 0, 0, 0, "DDIV", TGSI_OPCODE_DDIV },
{ 1, 2, 0, 0, 0, 0, "USNE", TGSI_OPCODE_USNE },
{ 0, 1, 0, 0, 0, 0, "SWITCH", TGSI_OPCODE_SWITCH },
{ 0, 1, 0, 0, 0, 0, "CASE", TGSI_OPCODE_CASE },
diff --git a/src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h
b/src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h
index e4af15c..f441636 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h
@@ -167,6 +167,8 @@ OP12(USGE)
OP12(USHR)
OP12(USLT)
OP12(USNE)
+OP11(MOVD)
+OP12(DDIV)
#undef OP00
diff --git a/src/gallium/include/pipe/p_shader_tokens.h
b/src/gallium/include/pipe/p_shader_tokens.h
index 550e2ab..939d02f 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -319,7 +319,10 @@ struct tgsi_property_data {
#define TGSI_OPCODE_CASE 142
#define TGSI_OPCODE_DEFAULT 143
#define TGSI_OPCODE_ENDSWITCH 144
-#define TGSI_OPCODE_LAST 145
+
+#define TGSI_OPCODE_MOVD 145
+#define TGSI_OPCODE_DDIV 146
+#define TGSI_OPCODE_LAST 147
#define TGSI_SAT_NONE 0 /* do not saturate */
#define TGSI_SAT_ZERO_ONE 1 /* clamp to [0,1] */
On Wed, Jan 6, 2010 at 7:56 PM, Zack Rusin <[email protected]> wrote:
> On Wednesday 06 January 2010 14:56:35 Igor Oliveira wrote:
>> Hi,
>>
>> the patches add support to double opcodes in gallium/tgsi.
>> It just implement some opcodes i like to know if someone has
>> suggestion about the patches.
>
> Hi Igor, first of all this should probably go into a feature branch because
> it'll be a bit of work before it's usable.
> The patches that you've proposed are unlikely what we'll want for double's.
> Keith, Michal and I discussed this on the phone a few days back and the
> biggest issue with doubles is that unlike the switch between the integers and
> floats they actually need bigger registers to accomodate them. Given that the
> registers in TGSI are untyped and its up to instructions to define the type it
> becomes hard for drivers to figure out the size of the registers beforehand.
> The solution that I personally like and what seems to becoming the facto
> standard when dealing with double support is having double precision values
> represented by a pair of registers. Outputs are
> either the pair yx or to the pair wz, where the msb is stored in y/w. For
> example:
> Idata 3.0 => (0x4008000000000000) in register r looks like:
> r.w = 0x40080000 ;high dword
> r.z = 0x00000000 ;low dword
> Or:
> r.y = 0x40080000 ;high dword
> r.x = 0x00000000 ;low dword
> All source double inputs must be in xy (after swizzle operations). For
> example:
> d_add r1.xy, r2.xy, r2.xy
> Or
> d_add r1.zw, r2.xy, r2.xy
> Each computes twice the value in r2.xy, and places the result in either xy or
> zw.
> This assures that the register size stays constant. Of course the instruction
> semantics are different to the typical 4-component wide TGSI instructions, but
> that, I think, is a lot less of an issue.
>
> z
>
------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev
_______________________________________________
Mesa3d-dev mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mesa3d-dev