nvc0: implement the color buffer 0 is integer rule for alpha-to-one/cov

The hardware checks for multisampling being enabled, but does not have
the rule about cbuf0 being an integer format. Only enable
alpha-to-one/alpha-to-coverage if cbuf0 is not an integer format.

Fixes piglits
  ext_framebuffer_multisample-int-draw-buffers-alpha-to-one
  ext_framebuffer_multisample-int-draw-buffers-alpha-to-coverage

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
Ilia Mirkin 2015-08-17 04:08:01 -04:00
parent 19a5a91ea4
commit 1af0641db3
3 changed files with 22 additions and 11 deletions

View file

@ -90,7 +90,6 @@ nvc0_blend_state_create(struct pipe_context *pipe,
struct nvc0_blend_stateobj *so = CALLOC_STRUCT(nvc0_blend_stateobj);
int i;
int r; /* reference */
uint32_t ms;
uint8_t blend_en = 0;
bool indep_masks = false;
bool indep_funcs = false;
@ -176,15 +175,6 @@ nvc0_blend_state_create(struct pipe_context *pipe,
}
}
ms = 0;
if (cso->alpha_to_coverage)
ms |= NVC0_3D_MULTISAMPLE_CTRL_ALPHA_TO_COVERAGE;
if (cso->alpha_to_one)
ms |= NVC0_3D_MULTISAMPLE_CTRL_ALPHA_TO_ONE;
SB_BEGIN_3D(so, MULTISAMPLE_CTRL, 1);
SB_DATA (so, ms);
assert(so->size <= (sizeof(so->state) / sizeof(so->state[0])));
return so;
}

View file

@ -1,4 +1,5 @@
#include "util/u_format.h"
#include "util/u_math.h"
#include "nvc0/nvc0_context.h"
@ -554,6 +555,25 @@ nvc0_validate_derived_2(struct nvc0_context *nvc0)
}
}
static void
nvc0_validate_derived_3(struct nvc0_context *nvc0)
{
struct nouveau_pushbuf *push = nvc0->base.pushbuf;
struct pipe_framebuffer_state *fb = &nvc0->framebuffer;
uint32_t ms = 0;
if ((!fb->nr_cbufs || !fb->cbufs[0] ||
!util_format_is_pure_integer(fb->cbufs[0]->format)) && nvc0->blend) {
if (nvc0->blend->pipe.alpha_to_coverage)
ms |= NVC0_3D_MULTISAMPLE_CTRL_ALPHA_TO_COVERAGE;
if (nvc0->blend->pipe.alpha_to_one)
ms |= NVC0_3D_MULTISAMPLE_CTRL_ALPHA_TO_ONE;
}
BEGIN_NVC0(push, NVC0_3D(MULTISAMPLE_CTRL), 1);
PUSH_DATA (push, ms);
}
static void
nvc0_validate_tess_state(struct nvc0_context *nvc0)
{
@ -628,6 +648,7 @@ static struct state_validate {
{ nvc0_validate_derived_1, NVC0_NEW_FRAGPROG | NVC0_NEW_ZSA |
NVC0_NEW_RASTERIZER },
{ nvc0_validate_derived_2, NVC0_NEW_ZSA | NVC0_NEW_FRAMEBUFFER },
{ nvc0_validate_derived_3, NVC0_NEW_BLEND | NVC0_NEW_FRAMEBUFFER },
{ nvc0_validate_clip, NVC0_NEW_CLIP | NVC0_NEW_RASTERIZER |
NVC0_NEW_VERTPROG |
NVC0_NEW_TEVLPROG |

View file

@ -17,7 +17,7 @@
struct nvc0_blend_stateobj {
struct pipe_blend_state pipe;
int size;
uint32_t state[72];
uint32_t state[70];
};
struct nvc0_rasterizer_stateobj {