Stefan Dösinger : wined3d: Implement MRTs in ARB.

Alexandre Julliard julliard at winehq.org
Mon Jun 22 09:04:11 CDT 2009


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Thu Jun 18 18:10:15 2009 +0200

wined3d: Implement MRTs in ARB.

---

 dlls/wined3d/arb_program_shader.c |   22 +++++++++++++---------
 dlls/wined3d/baseshader.c         |    4 ++++
 dlls/wined3d/wined3d_private.h    |    1 +
 3 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 32af2be..29e55c6 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -880,23 +880,22 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction
             break;
 
         case WINED3DSPR_COLOROUT:
-            if (reg->idx == 0)
+            if(ctx->cur_ps_args->super.srgb_correction && reg->idx == 0)
             {
-                if(ctx->cur_ps_args->super.srgb_correction)
+                strcpy(register_name, "TMP_COLOR");
+            }
+            else
+            {
+                if(ctx->cur_ps_args->super.srgb_correction) FIXME("sRGB correction on higher render targets\n");
+                if(This->baseShader.reg_maps.highest_render_target > 0)
                 {
-                    strcpy(register_name, "TMP_COLOR");
+                    sprintf(register_name, "result.color[%u]", reg->idx);
                 }
                 else
                 {
                     strcpy(register_name, "result.color");
                 }
             }
-            else
-            {
-                /* TODO: See GL_ARB_draw_buffers */
-                FIXME("Unsupported write to render target %u\n", reg->idx);
-                sprintf(register_name, "unsupported_register");
-            }
             break;
 
         case WINED3DSPR_RASTOUT:
@@ -2957,6 +2956,11 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This,
         priv_ctx.target_version = ARB;
     }
 
+    if(This->baseShader.reg_maps.highest_render_target > 0)
+    {
+        shader_addline(buffer, "OPTION ARB_draw_buffers;\n");
+    }
+
     if (reg_maps->shader_version.major < 3)
     {
         switch(args->super.fog) {
diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c
index d1c8a4b..dc7cd5b 100644
--- a/dlls/wined3d/baseshader.c
+++ b/dlls/wined3d/baseshader.c
@@ -316,6 +316,10 @@ static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct sh
             reg_maps->boolean_constants |= (1 << reg->idx);
             break;
 
+        case WINED3DSPR_COLOROUT:
+            reg_maps->highest_render_target = max(reg_maps->highest_render_target, reg->idx);
+            break;
+
         default:
             TRACE("Not recording register of type %#x and idx %u\n", reg->type, reg->idx);
             break;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b7c5592..3bbddd8 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -644,6 +644,7 @@ typedef struct shader_reg_maps
 
     /* Whether or not loops are used in this shader, and nesting depth */
     unsigned loop_depth;
+    unsigned highest_render_target;
 
 } shader_reg_maps;
 




More information about the wine-cvs mailing list