Stefan Dösinger : wined3d: Prepare for vec4 address registers in ARB.

Alexandre Julliard julliard at winehq.org
Wed May 20 08:29:33 CDT 2009


Module: wine
Branch: master
Commit: 72e9e80f6e79f7daf6a60cdddd133aa46344c76e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=72e9e80f6e79f7daf6a60cdddd133aa46344c76e

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Fri May 15 13:55:00 2009 +0200

wined3d: Prepare for vec4 address registers in ARB.

---

 dlls/wined3d/arb_program_shader.c |   34 ++++++++++++++++++++--------------
 1 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index ecb6f0b..87a1d4c 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -457,14 +457,8 @@ static void shader_arb_get_write_mask(const struct wined3d_shader_instruction *i
         const struct wined3d_shader_dst_param *dst, char *write_mask)
 {
     char *ptr = write_mask;
-    char vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type);
 
-    if (vshader && dst->reg.type == WINED3DSPR_ADDR)
-    {
-        *ptr++ = '.';
-        *ptr++ = 'x';
-    }
-    else if (dst->write_mask != WINED3DSP_WRITEMASK_ALL)
+    if (dst->write_mask != WINED3DSP_WRITEMASK_ALL)
     {
         *ptr++ = '.';
         if (dst->write_mask & WINED3DSP_WRITEMASK_0) *ptr++ = 'x';
@@ -509,12 +503,15 @@ static void shader_arb_get_swizzle(const struct wined3d_shader_src_param *param,
     *ptr = '\0';
 }
 
-static void shader_arb_get_register_name(IWineD3DBaseShader *iface,
+static void shader_arb_get_src_param(const struct wined3d_shader_instruction *ins,
+        const struct wined3d_shader_src_param *src, unsigned int tmpreg, char *outregstr);
+
+static void shader_arb_get_register_name(const struct wined3d_shader_instruction *ins,
         const struct wined3d_shader_register *reg, char *register_name, BOOL *is_color)
 {
     /* oPos, oFog and oPts in D3D */
     static const char * const rastout_reg_names[] = {"TMP_OUT", "result.fogcoord", "result.pointsize"};
-    IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)iface;
+    IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
     BOOL pshader = shader_is_pshader_version(This->baseShader.reg_maps.shader_version.type);
 
     *is_color = FALSE;
@@ -541,11 +538,18 @@ static void shader_arb_get_register_name(IWineD3DBaseShader *iface,
         case WINED3DSPR_CONST:
             if (!pshader && reg->rel_addr)
             {
+                char rel_reg[50];
                 UINT rel_offset = ((IWineD3DVertexShaderImpl *)This)->rel_offset;
+                if(This->baseShader.reg_maps.shader_version.major < 2) {
+                    sprintf(rel_reg, "A0.x");
+                } else {
+                    /* FIXME: GL_NV_vertex_progam2_option */
+                    sprintf(rel_reg, "A0.x");
+                }
                 if (reg->idx >= rel_offset)
-                    sprintf(register_name, "C[A0.x + %u]", reg->idx - rel_offset);
+                    sprintf(register_name, "C[%s + %u]", rel_reg, reg->idx - rel_offset);
                 else
-                    sprintf(register_name, "C[A0.x - %u]", -reg->idx + rel_offset);
+                    sprintf(register_name, "C[%s - %u]", rel_reg, -reg->idx + rel_offset);
             }
             else
             {
@@ -626,7 +630,7 @@ static void shader_arb_get_dst_param(const struct wined3d_shader_instruction *in
     char write_mask[6];
     BOOL is_color;
 
-    shader_arb_get_register_name(ins->ctx->shader, &wined3d_dst->reg, register_name, &is_color);
+    shader_arb_get_register_name(ins, &wined3d_dst->reg, register_name, &is_color);
     strcpy(str, register_name);
 
     shader_arb_get_write_mask(ins, wined3d_dst, write_mask);
@@ -777,7 +781,7 @@ static void shader_arb_get_src_param(const struct wined3d_shader_instruction *in
     insert_line = 1;
 
     /* Get register name */
-    shader_arb_get_register_name(ins->ctx->shader, &src->reg, regstr, &is_color);
+    shader_arb_get_register_name(ins, &src->reg, regstr, &is_color);
     shader_arb_get_swizzle(src, is_color, swzstr);
 
     switch (src->modifiers)
@@ -1012,6 +1016,7 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
 
     if(ins->handler_idx == WINED3DSIH_MOVA) {
         struct wined3d_shader_src_param tmp_src = ins->src[0];
+
         tmp_src.swizzle = (tmp_src.swizzle & 0x3) * 0x55;
         shader_arb_get_src_param(ins, &tmp_src, 0, src0_param);
 
@@ -2034,6 +2039,7 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShader *iface,
 
     /*  Create the hw ARB shader */
     shader_addline(buffer, "!!ARBvp1.0\n");
+
     if(need_helper_const(gl_info)) {
         shader_addline(buffer, "PARAM helper_const = { 2.0, -1.0, %d.0, 0.0 };\n", This->rel_offset);
     }
@@ -2206,7 +2212,7 @@ static void shader_arb_add_instruction_modifiers(const struct wined3d_shader_ins
     if(shift == 0) return; /* Saturate alone is handled by the instructions */
 
     shader_arb_get_write_mask(ins, dst, write_mask);
-    shader_arb_get_register_name(ins->ctx->shader, &dst->reg, regstr, &is_color);
+    shader_arb_get_register_name(ins, &dst->reg, regstr, &is_color);
 
     /* Generate a line that does the output modifier computation
      * FIXME: _SAT vs shift? _SAT alone is already handled in the instructions, if this




More information about the wine-cvs mailing list