From 8b2955b736086103ac0d184a4b3f89d8ab8baab1 Mon Sep 17 00:00:00 2001 From: Brian Date: Wed, 25 Jul 2007 14:28:24 -0600 Subject: implement DDX, DDY instructions --- src/mesa/pipe/tgsi/core/tgsi_exec.c | 34 ++++++++++++++++++++++++++++++++-- src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c | 6 ++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/mesa/pipe/tgsi/core/tgsi_exec.c b/src/mesa/pipe/tgsi/core/tgsi_exec.c index db965ccbec..6aaaef98a8 100644 --- a/src/mesa/pipe/tgsi/core/tgsi_exec.c +++ b/src/mesa/pipe/tgsi/core/tgsi_exec.c @@ -228,6 +228,28 @@ micro_cos( dst->f[3] = (GLfloat) cos( (GLdouble) src->f[3] ); } +static void +micro_ddx( + union tgsi_exec_channel *dst, + const union tgsi_exec_channel *src ) +{ + dst->f[0] = + dst->f[1] = + dst->f[2] = + dst->f[3] = src->f[TILE_BOTTOM_RIGHT] - src->f[TILE_BOTTOM_LEFT]; +} + +static void +micro_ddy( + union tgsi_exec_channel *dst, + const union tgsi_exec_channel *src ) +{ + dst->f[0] = + dst->f[1] = + dst->f[2] = + dst->f[3] = src->f[TILE_TOP_LEFT] - src->f[TILE_BOTTOM_LEFT]; +} + static void micro_div( union tgsi_exec_channel *dst, @@ -1715,11 +1737,19 @@ exec_instruction( break; case TGSI_OPCODE_DDX: - assert (0); + FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { + FETCH( &r[0], 0, chan_index ); + micro_ddx( &r[0], &r[0] ); + STORE( &r[0], 0, chan_index ); + } break; case TGSI_OPCODE_DDY: - assert (0); + FOR_EACH_ENABLED_CHANNEL( *inst, chan_index ) { + FETCH( &r[0], 0, chan_index ); + micro_ddy( &r[0], &r[0] ); + STORE( &r[0], 0, chan_index ); + } break; case TGSI_OPCODE_KIL: diff --git a/src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c b/src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c index 21b488c98f..a9415ac15b 100644 --- a/src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c +++ b/src/mesa/pipe/tgsi/mesa/mesa_to_tgsi.c @@ -261,6 +261,12 @@ compile_instruction( case OPCODE_DP3: fullinst->Instruction.Opcode = TGSI_OPCODE_DP3; break; + case OPCODE_DDX: + fullinst->Instruction.Opcode = TGSI_OPCODE_DDX; + break; + case OPCODE_DDY: + fullinst->Instruction.Opcode = TGSI_OPCODE_DDY; + break; case OPCODE_DP4: fullinst->Instruction.Opcode = TGSI_OPCODE_DP4; break; -- cgit v1.2.3