Stefan Dösinger : wined3d: Support vec4 A0 with NV_vertex_program2_option.

Alexandre Julliard julliard at winehq.org
Thu May 21 09:35:52 CDT 2009


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Fri May  8 18:14:34 2009 +0200

wined3d: Support vec4 A0 with NV_vertex_program2_option.

---

 dlls/wined3d/arb_program_shader.c |   21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 63dd81e..79c3b95 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -45,8 +45,7 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d);
 static BOOL need_mova_const(IWineD3DBaseShader *shader, const WineD3D_GL_Info *gl_info) {
     IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *) shader;
     if(!This->baseShader.reg_maps.usesmova) return FALSE;
-    /* TODO: ARR from GL_NV_vertex_program2_option */
-    return TRUE;
+    return !GL_SUPPORT(NV_VERTEX_PROGRAM2_OPTION);
 }
 
 static BOOL need_helper_const(const WineD3D_GL_Info *gl_info) {
@@ -536,6 +535,7 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction
     static const char * const rastout_reg_names[] = {"TMP_OUT", "result.fogcoord", "result.pointsize"};
     IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
     BOOL pshader = shader_is_pshader_version(This->baseShader.reg_maps.shader_version.type);
+    struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
 
     *is_color = FALSE;
 
@@ -567,9 +567,10 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction
                     sprintf(rel_reg, "A0.x");
                 } else {
                     shader_arb_get_src_param(ins, reg->rel_addr, 0, rel_reg);
-                    /* FIXME: GL_NV_vertex_progam2_option */
-                    shader_arb_request_a0(ins, rel_reg);
-                    sprintf(rel_reg, "A0.x");
+                    if(ctx->target_version == ARB) {
+                        shader_arb_request_a0(ins, rel_reg);
+                        sprintf(rel_reg, "A0.x");
+                    }
                 }
                 if (reg->idx >= rel_offset)
                     sprintf(register_name, "C[%s + %u]", rel_reg, reg->idx - rel_offset);
@@ -601,7 +602,7 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction
             }
             else
             {
-                if(This->baseShader.reg_maps.shader_version.major == 1)
+                if(This->baseShader.reg_maps.shader_version.major == 1 || ctx->target_version >= NV2)
                 {
                     sprintf(register_name, "A%u", reg->idx);
                 }
@@ -1036,6 +1037,7 @@ static void shader_hw_map2gl(const struct wined3d_shader_instruction *ins)
         case WINED3DSIH_SGE: instruction = "SGE"; break;
         case WINED3DSIH_SLT: instruction = "SLT"; break;
         case WINED3DSIH_SUB: instruction = "SUB"; break;
+        case WINED3DSIH_MOVA:instruction = "ARR"; break;
         default: instruction = "";
             FIXME("Unhandled opcode %#x\n", ins->handler_idx);
             break;
@@ -1068,9 +1070,14 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
     char src0_param[256];
 
     if(ins->handler_idx == WINED3DSIH_MOVA) {
+        struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
         struct wined3d_shader_src_param tmp_src = ins->src[0];
         char write_mask[6];
 
+        if(ctx->target_version >= NV2) {
+            shader_hw_map2gl(ins);
+            return;
+        }
         tmp_src.swizzle = (tmp_src.swizzle & 0x3) * 0x55;
         shader_arb_get_src_param(ins, &tmp_src, 0, src0_param);
         shader_arb_get_write_mask(ins, &ins->dst[0], write_mask);
@@ -1084,8 +1091,6 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
          *
          * The ARL is performed when A0 is used - the requested component is read from A0_SHADOW into
          * A0.x. We can use the overwritten component of A0_shadow as temporary storage for the sign.
-         *
-         * TODO: ARR from GL_NV_vertex_program2_option
          */
         shader_addline(buffer, "SGE A0_SHADOW%s, %s, mova_const.y;\n", write_mask, src0_param);
         shader_addline(buffer, "MAD A0_SHADOW%s, A0_SHADOW, mova_const.z, -mova_const.w;\n", write_mask);




More information about the wine-cvs mailing list