nv50: depth_stencil_alpha stateobj

This commit is contained in:
Ben Skeggs 2008-03-12 03:41:05 +11:00
parent 9911ca2226
commit 06bd7d78b9
3 changed files with 80 additions and 2 deletions

View file

@ -22,13 +22,19 @@
#define NOUVEAU_MSG(fmt, args...) \
fprintf(stderr, "nouveau: "fmt, ##args);
#define NV50_NEW_BLEND (1 << 0)
#define NV50_NEW_BLEND (1 << 0)
#define NV50_NEW_ZSA (1 << 1)
struct nv50_blend_stateobj {
struct pipe_blend_state pipe;
struct nouveau_stateobj *so;
};
struct nv50_zsa_stateobj {
struct pipe_depth_stencil_alpha_state pipe;
struct nouveau_stateobj *so;
};
struct nv50_context {
struct pipe_context pipe;
@ -39,6 +45,7 @@ struct nv50_context {
unsigned dirty;
struct nv50_blend_stateobj *blend;
struct nv50_zsa_stateobj *zsa;
};
static INLINE struct nv50_context *

View file

@ -127,17 +127,85 @@ static void *
nv50_depth_stencil_alpha_state_create(struct pipe_context *pipe,
const struct pipe_depth_stencil_alpha_state *cso)
{
return NULL;
struct nouveau_grobj *tesla = nv50_context(pipe)->screen->tesla;
struct nv50_zsa_stateobj *zsa = CALLOC_STRUCT(nv50_zsa_stateobj);
struct nouveau_stateobj *so = so_new(64, 0);
so_method(so, tesla, NV50TCL_DEPTH_WRITE_ENABLE, 1);
so_data (so, cso->depth.writemask ? 1 : 0);
if (cso->depth.enabled) {
so_method(so, tesla, NV50TCL_DEPTH_TEST_ENABLE, 1);
so_data (so, 1);
so_method(so, tesla, NV50TCL_DEPTH_TEST_FUNC, 1);
so_data (so, nvgl_comparison_op(cso->depth.func));
} else {
so_method(so, tesla, NV50TCL_DEPTH_TEST_ENABLE, 1);
so_data (so, 0);
}
if (cso->stencil[0].enabled) {
so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 5);
so_data (so, 1);
so_data (so, nvgl_stencil_op(cso->stencil[0].fail_op));
so_data (so, nvgl_stencil_op(cso->stencil[0].zfail_op));
so_data (so, nvgl_stencil_op(cso->stencil[0].zpass_op));
so_data (so, nvgl_comparison_op(cso->stencil[0].func));
so_method(so, tesla, NV50TCL_STENCIL_FRONT_FUNC_REF, 3);
so_data (so, cso->stencil[0].ref_value);
so_data (so, cso->stencil[0].write_mask);
so_data (so, cso->stencil[0].value_mask);
} else {
so_method(so, tesla, NV50TCL_STENCIL_FRONT_ENABLE, 1);
so_data (so, 0);
}
if (cso->stencil[1].enabled) {
so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 8);
so_data (so, 1);
so_data (so, nvgl_stencil_op(cso->stencil[1].fail_op));
so_data (so, nvgl_stencil_op(cso->stencil[1].zfail_op));
so_data (so, nvgl_stencil_op(cso->stencil[1].zpass_op));
so_data (so, nvgl_comparison_op(cso->stencil[1].func));
so_data (so, cso->stencil[1].ref_value);
so_data (so, cso->stencil[1].write_mask);
so_data (so, cso->stencil[1].value_mask);
} else {
so_method(so, tesla, NV50TCL_STENCIL_BACK_ENABLE, 1);
so_data (so, 0);
}
if (cso->alpha.enabled) {
so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
so_data (so, 1);
so_method(so, tesla, NV50TCL_ALPHA_TEST_REF, 2);
so_data (so, fui(cso->alpha.ref));
so_data (so, nvgl_comparison_op(cso->alpha.func));
} else {
so_method(so, tesla, NV50TCL_ALPHA_TEST_ENABLE, 1);
so_data (so, 0);
}
zsa->pipe = *cso;
so_ref(so, &zsa->so);
return (void *)zsa;
}
static void
nv50_depth_stencil_alpha_state_bind(struct pipe_context *pipe, void *hwcso)
{
struct nv50_context *nv50 = nv50_context(pipe);
nv50->zsa = hwcso;
nv50->dirty |= NV50_NEW_ZSA;
}
static void
nv50_depth_stencil_alpha_state_delete(struct pipe_context *pipe, void *hwcso)
{
struct nv50_zsa_stateobj *zsa = hwcso;
so_ref(NULL, &zsa->so);
FREE(zsa);
}
static void *

View file

@ -8,7 +8,10 @@ nv50_state_validate(struct nv50_context *nv50)
if (nv50->dirty & NV50_NEW_BLEND)
so_emit(nvws, nv50->blend->so);
if (nv50->dirty & NV50_NEW_ZSA)
so_emit(nvws, nv50->zsa->so);
nv50->dirty = 0;
return TRUE;
}