From b6ac2403aca240c72c8622ddbc3a4e123d5aa37f Mon Sep 17 00:00:00 2001 From: Corbin Simpson Date: Sat, 30 Jan 2010 12:33:44 -0800 Subject: r300g: Independent blend enables only work on r500. --- src/gallium/drivers/r300/r300_screen.c | 6 +++++- src/gallium/drivers/r300/r300_state.c | 15 +++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c index ae3155c0ed..fa8ed581da 100644 --- a/src/gallium/drivers/r300/r300_screen.c +++ b/src/gallium/drivers/r300/r300_screen.c @@ -152,7 +152,11 @@ static int r300_get_param(struct pipe_screen* pscreen, int param) return 0; } case PIPE_CAP_INDEP_BLEND_ENABLE: - return 1; + if (r300screen->caps->is_r500) { + return 1; + } else { + return 0; + } case PIPE_CAP_INDEP_BLEND_FUNC: return 0; case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT: diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index 8295799553..a5c0869066 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -161,6 +161,7 @@ static boolean blend_discard_if_src_alpha_color_1(unsigned srcRGB, unsigned srcA static void* r300_create_blend_state(struct pipe_context* pipe, const struct pipe_blend_state* state) { + struct r300_screen* r300screen = r300_screen(pipe->screen); struct r300_blend_state* blend = CALLOC_STRUCT(r300_blend_state); if (state->rt[0].blend_enable) @@ -290,10 +291,16 @@ static void* r300_create_blend_state(struct pipe_context* pipe, /* Color channel masks for all MRTs. */ blend->color_channel_mask = state->rt[0].colormask; - if (state->independent_blend_enable) { - blend->color_channel_mask |= (state->rt[1].colormask << 4); - blend->color_channel_mask |= (state->rt[2].colormask << 8); - blend->color_channel_mask |= (state->rt[3].colormask << 12); + if (r300screen->caps->is_r500 && state->independent_blend_enable) { + if (state->rt[1].blend_enable) { + blend->color_channel_mask |= (state->rt[1].colormask << 4); + } + if (state->rt[2].blend_enable) { + blend->color_channel_mask |= (state->rt[2].colormask << 8); + } + if (state->rt[3].blend_enable) { + blend->color_channel_mask |= (state->rt[3].colormask << 12); + } } if (state->dither) { -- cgit v1.2.3