[virglrenderer-devel] [PATCH 2/3] fix rewriting of non-alpha formats
Erik Faye-Lund
erik.faye-lund at collabora.com
Tue Jul 3 06:04:49 UTC 2018
When we use independent blending, we need to check every rendertarget
indevidually, not just once for all, otherwise we end up using the
wrong blend-mode for some render-targets.
Fixes these test-cases:
dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.0
dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.6
dEQP-GLES31.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.14
Signed-off-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
---
src/vrend_renderer.c | 52 ++++++++++++++++----------------------------
1 file changed, 19 insertions(+), 33 deletions(-)
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 3b3982b..c19ab45 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -3631,46 +3631,32 @@ static void vrend_patch_blend_state(struct vrend_context *ctx)
{
struct pipe_blend_state new_state = ctx->sub->blend_state;
struct pipe_blend_state *state = &ctx->sub->blend_state;
- bool dest_alpha_only = false, dest_has_no_alpha = false;
int i;
if (ctx->sub->nr_cbufs == 0)
return;
- for (i = 0; i < ctx->sub->nr_cbufs; i++) {
- if (!ctx->sub->surf[i])
- continue;
-
- if (vrend_format_is_emulated_alpha(ctx->sub->surf[i]->format)) {
- dest_alpha_only = true;
- }
-
- if (!util_format_has_alpha(ctx->sub->surf[i]->format)) {
- dest_has_no_alpha = true;
- }
- }
-
- if (dest_alpha_only) {
- for (i = 0; i < (state->independent_blend_enable ? PIPE_MAX_COLOR_BUFS : 1); i++) {
- if (state->rt[i].blend_enable) {
- new_state.rt[i].rgb_src_factor = conv_a8_blend(state->rt[i].alpha_src_factor);
- new_state.rt[i].rgb_dst_factor = conv_a8_blend(state->rt[i].alpha_dst_factor);
- new_state.rt[i].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
- new_state.rt[i].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
+ for (i = 0; i < (state->independent_blend_enable ? PIPE_MAX_COLOR_BUFS : 1); i++) {
+ if (i < ctx->sub->nr_cbufs && ctx->sub->surf[i]) {
+ if (vrend_format_is_emulated_alpha(ctx->sub->surf[i]->format)) {
+ if (state->rt[i].blend_enable) {
+ new_state.rt[i].rgb_src_factor = conv_a8_blend(state->rt[i].alpha_src_factor);
+ new_state.rt[i].rgb_dst_factor = conv_a8_blend(state->rt[i].alpha_dst_factor);
+ new_state.rt[i].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
+ new_state.rt[i].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
+ }
+ } else if (!util_format_has_alpha(ctx->sub->surf[i]->format)) {
+ if (!(is_dst_blend(state->rt[i].rgb_src_factor) ||
+ is_dst_blend(state->rt[i].rgb_dst_factor) ||
+ is_dst_blend(state->rt[i].alpha_src_factor) ||
+ is_dst_blend(state->rt[i].alpha_dst_factor)))
+ continue;
+ new_state.rt[i].rgb_src_factor = conv_dst_blend(state->rt[i].rgb_src_factor);
+ new_state.rt[i].rgb_dst_factor = conv_dst_blend(state->rt[i].rgb_dst_factor);
+ new_state.rt[i].alpha_src_factor = conv_dst_blend(state->rt[i].alpha_src_factor);
+ new_state.rt[i].alpha_dst_factor = conv_dst_blend(state->rt[i].alpha_dst_factor);
}
}
- } else if (dest_has_no_alpha) {
- for (i = 0; i < (state->independent_blend_enable ? PIPE_MAX_COLOR_BUFS : 1); i++) {
- if (!(is_dst_blend(state->rt[i].rgb_src_factor) ||
- is_dst_blend(state->rt[i].rgb_dst_factor) ||
- is_dst_blend(state->rt[i].alpha_src_factor) ||
- is_dst_blend(state->rt[i].alpha_dst_factor)))
- continue;
- new_state.rt[i].rgb_src_factor = conv_dst_blend(state->rt[i].rgb_src_factor);
- new_state.rt[i].rgb_dst_factor = conv_dst_blend(state->rt[i].rgb_dst_factor);
- new_state.rt[i].alpha_src_factor = conv_dst_blend(state->rt[i].alpha_src_factor);
- new_state.rt[i].alpha_dst_factor = conv_dst_blend(state->rt[i].alpha_dst_factor);
- }
}
vrend_hw_emit_blend(ctx, &new_state);
--
2.18.0.rc2
More information about the virglrenderer-devel
mailing list