Stefan Dösinger : wined3d: Use NRM from GL_NV_fragment_program2 if available.

Alexandre Julliard julliard at winehq.org
Fri May 29 09:15:50 CDT 2009


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Thu May 28 17:36:52 2009 +0200

wined3d: Use NRM from GL_NV_fragment_program2 if available.

---

 dlls/wined3d/arb_program_shader.c |   25 +++++++++++++++++++------
 1 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 0b6bb35..918f676 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -1792,14 +1792,24 @@ static void shader_hw_nrm(const struct wined3d_shader_instruction *ins)
     SHADER_BUFFER *buffer = ins->ctx->buffer;
     char dst_name[50];
     char src_name[50];
+    struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+    BOOL pshader = shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type);
 
     shader_arb_get_dst_param(ins, &ins->dst[0], dst_name);
     shader_arb_get_src_param(ins, &ins->src[0], 1 /* Use TB */, src_name);
-    shader_addline(buffer, "DP3 TA, %s, %s;\n", src_name, src_name);
-    shader_addline(buffer, "RSQ TA, TA.x;\n");
-    /* dst.w = src[0].w * 1 / (src.x^2 + src.y^2 + src.z^2)^(1/2) according to msdn*/
-    shader_addline(buffer, "MUL%s %s, %s, TA;\n", shader_arb_get_modifier(ins), dst_name,
-                   src_name);
+
+    if(pshader && priv->target_version >= NV3)
+    {
+        shader_addline(buffer, "NRM%s %s, %s;\n", shader_arb_get_modifier(ins), dst_name, src_name);
+    }
+    else
+    {
+        shader_addline(buffer, "DP3 TA, %s, %s;\n", src_name, src_name);
+        shader_addline(buffer, "RSQ TA, TA.x;\n");
+        /* dst.w = src[0].w * 1 / (src.x^2 + src.y^2 + src.z^2)^(1/2) according to msdn*/
+        shader_addline(buffer, "MUL%s %s, %s, TA;\n", shader_arb_get_modifier(ins), dst_name,
+                    src_name);
+    }
 }
 
 static void shader_hw_sincos(const struct wined3d_shader_instruction *ins)
@@ -2043,7 +2053,10 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This,
     list_init(&priv_ctx.if_frames);
 
     shader_addline(buffer, "!!ARBfp1.0\n");
-    if(GL_SUPPORT(NV_FRAGMENT_PROGRAM_OPTION)) {
+    if(GL_SUPPORT(NV_FRAGMENT_PROGRAM2)) {
+        shader_addline(buffer, "OPTION NV_fragment_program2;\n");
+        priv_ctx.target_version = NV3;
+    } else if(GL_SUPPORT(NV_FRAGMENT_PROGRAM_OPTION)) {
         shader_addline(buffer, "OPTION NV_fragment_program;\n");
         priv_ctx.target_version = NV2;
     } else {




More information about the wine-cvs mailing list