Stefan Dösinger : wined3d: Simplify shader_hw_map2gl.
Alexandre Julliard
julliard at winehq.org
Mon May 11 09:10:47 CDT 2009
Module: wine
Branch: master
Commit: da47f685220cd238a5ada6afb996a9fa752f9dac
URL: http://source.winehq.org/git/wine.git/?a=commit;h=da47f685220cd238a5ada6afb996a9fa752f9dac
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Thu May 7 18:20:59 2009 +0200
wined3d: Simplify shader_hw_map2gl.
Most of the extra work done in the pixel shader code was not needed or
redundant. This patch unifies the two paths.
---
dlls/wined3d/arb_program_shader.c | 101 ++++++++----------------------------
1 files changed, 23 insertions(+), 78 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 67987ba..ec4bea7 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -915,8 +915,10 @@ static void shader_hw_map2gl(const struct wined3d_shader_instruction *ins)
{
SHADER_BUFFER *buffer = ins->ctx->buffer;
const char *instruction;
- char arguments[256];
+ char arguments[256], dst_str[50];
unsigned int i;
+ const struct wined3d_shader_dst_param *dst = &ins->dst[0];
+ const char *modifier;
switch (ins->handler_idx)
{
@@ -938,7 +940,6 @@ static void shader_hw_map2gl(const struct wined3d_shader_instruction *ins)
case WINED3DSIH_MIN: instruction = "MIN"; break;
case WINED3DSIH_MOV: instruction = "MOV"; break;
case WINED3DSIH_MUL: instruction = "MUL"; break;
- case WINED3DSIH_NOP: instruction = "NOP"; break;
case WINED3DSIH_POW: instruction = "POW"; break;
case WINED3DSIH_SGE: instruction = "SGE"; break;
case WINED3DSIH_SLT: instruction = "SLT"; break;
@@ -948,83 +949,27 @@ static void shader_hw_map2gl(const struct wined3d_shader_instruction *ins)
break;
}
- if (shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type))
- {
- /* Output token related */
- const struct wined3d_shader_dst_param *dst;
- char output_rname[256];
- char output_wmask[20];
- char operands[4][100];
- BOOL saturate = FALSE;
- BOOL centroid = FALSE;
- BOOL partialprecision = FALSE;
- const char *modifier;
- BOOL is_color;
- DWORD shift;
-
- if (!(ins->dst_count + ins->src_count))
- {
- ERR("Opcode \"%#x\" has no parameters\n", ins->handler_idx);
- return;
- }
- dst = &ins->dst[0];
-
- /* Process modifiers */
- if (dst->modifiers)
- {
- DWORD mask = dst->modifiers;
-
- saturate = mask & WINED3DSPDM_SATURATE;
- centroid = mask & WINED3DSPDM_MSAMPCENTROID;
- partialprecision = mask & WINED3DSPDM_PARTIALPRECISION;
- mask &= ~(WINED3DSPDM_MSAMPCENTROID | WINED3DSPDM_PARTIALPRECISION | WINED3DSPDM_SATURATE);
- if (mask)
- FIXME("Unrecognized modifier(%#x)\n", mask);
-
- if (centroid)
- FIXME("Unhandled modifier(%#x)\n", mask);
- }
- shift = dst->shift;
- modifier = (saturate && !shift) ? "_SAT" : "";
-
- /* Generate input register names (with modifiers) */
- for (i = 0; i < ins->src_count; ++i)
- {
- shader_arb_get_src_param(ins, &ins->src[i], i, operands[i + 1]);
- }
+ /* All instructions handled by this function have a destination parameter */
+ if(dst->modifiers & WINED3DSPDM_SATURATE) modifier = "_SAT";
+ else modifier = "";
- /* Handle output register */
- shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
- dst->reg.idx, !!dst->reg.rel_addr, output_rname, &is_color);
- strcpy(operands[0], output_rname);
- shader_arb_get_write_mask(ins, dst, output_wmask);
- strcat(operands[0], output_wmask);
-
- arguments[0] = '\0';
- strcat(arguments, operands[0]);
- for (i = 0; i < ins->src_count; ++i)
- {
- strcat(arguments, ", ");
- strcat(arguments, operands[i + 1]);
- }
- shader_addline(buffer, "%s%s %s;\n", instruction, modifier, arguments);
- } else {
- arguments[0] = '\0';
- if (ins->dst_count)
- {
- char operand[100];
- shader_arb_get_dst_param(ins, &ins->dst[0], operand);
- strcat(arguments, " ");
- strcat(arguments, operand);
- for (i = 0; i < ins->src_count; ++i)
- {
- strcat(arguments, ", ");
- shader_arb_get_src_param(ins, &ins->src[i], i, operand);
- strcat(arguments, operand);
- }
- }
- shader_addline(buffer, "%s%s;\n", instruction, arguments);
+ /* Note that shader_arb_add_dst_param() adds spaces. */
+ arguments[0] = '\0';
+ shader_arb_get_dst_param(ins, dst, dst_str);
+ for (i = 0; i < ins->src_count; ++i)
+ {
+ char operand[100];
+ strcat(arguments, ", ");
+ shader_arb_get_src_param(ins, &ins->src[i], i, operand);
+ strcat(arguments, operand);
}
+ shader_addline(buffer, "%s%s %s%s;\n", instruction, modifier, dst_str, arguments);
+}
+
+static void shader_hw_nop(const struct wined3d_shader_instruction *ins)
+{
+ SHADER_BUFFER *buffer = ins->ctx->buffer;
+ shader_addline(buffer, "NOP;\n");
}
static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
@@ -2275,7 +2220,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
/* WINED3DSIH_MOV */ shader_hw_mov,
/* WINED3DSIH_MOVA */ shader_hw_mov,
/* WINED3DSIH_MUL */ shader_hw_map2gl,
- /* WINED3DSIH_NOP */ shader_hw_map2gl,
+ /* WINED3DSIH_NOP */ shader_hw_nop,
/* WINED3DSIH_NRM */ shader_hw_nrm,
/* WINED3DSIH_PHASE */ NULL,
/* WINED3DSIH_POW */ shader_hw_map2gl,
More information about the wine-cvs
mailing list