From 26d17fe04cb3e9824435aefcd38748fe8697d101 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Thu, 18 Jun 2009 18:10:15 +0200 Subject: [PATCH] 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 32af2be58c5..29e55c65eae 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 d1c8a4bb0a6..dc7cd5bddfb 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 b7c5592d09e..3bbddd8a771 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;