mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-24 00:40:36 +02:00
nv40: static attribs -> stateobj
This commit is contained in:
parent
7e9b83ac0a
commit
6fbc50e013
3 changed files with 38 additions and 30 deletions
|
|
@ -56,7 +56,8 @@ enum nv40_state_index {
|
|||
NV40_STATE_VERTTEX3 = 30,
|
||||
NV40_STATE_VTXBUF = 31,
|
||||
NV40_STATE_VTXFMT = 32,
|
||||
NV40_STATE_MAX = 33
|
||||
NV40_STATE_VTXATTR = 33,
|
||||
NV40_STATE_MAX = 34
|
||||
};
|
||||
|
||||
#include "nv40_screen.h"
|
||||
|
|
|
|||
|
|
@ -82,7 +82,8 @@ nv40_state_emit(struct nv40_context *nv40)
|
|||
if (!(states & (1ULL << i)))
|
||||
continue;
|
||||
so_ref (state->hw[i], &nv40->screen->state[i]);
|
||||
so_emit(nv40->nvws, nv40->screen->state[i]);
|
||||
if (state->hw[i])
|
||||
so_emit(nv40->nvws, nv40->screen->state[i]);
|
||||
states &= ~(1ULL << i);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -109,11 +109,12 @@ nv40_vbo_set_idxbuf(struct nv40_context *nv40, struct pipe_buffer *ib,
|
|||
}
|
||||
|
||||
static boolean
|
||||
nv40_vbo_static_attrib(struct nv40_context *nv40, int attrib,
|
||||
struct pipe_vertex_element *ve,
|
||||
nv40_vbo_static_attrib(struct nv40_context *nv40, struct nouveau_stateobj *so,
|
||||
int attrib, struct pipe_vertex_element *ve,
|
||||
struct pipe_vertex_buffer *vb)
|
||||
{
|
||||
struct pipe_winsys *ws = nv40->pipe.winsys;
|
||||
struct nouveau_grobj *curie = nv40->screen->curie;
|
||||
unsigned type, ncomp;
|
||||
void *map;
|
||||
|
||||
|
|
@ -128,31 +129,28 @@ nv40_vbo_static_attrib(struct nv40_context *nv40, int attrib,
|
|||
{
|
||||
float *v = map;
|
||||
|
||||
BEGIN_RING(curie, NV40TCL_VTX_ATTR_4F_X(attrib), 4);
|
||||
switch (ncomp) {
|
||||
case 4:
|
||||
OUT_RINGf(v[0]);
|
||||
OUT_RINGf(v[1]);
|
||||
OUT_RINGf(v[2]);
|
||||
OUT_RINGf(v[3]);
|
||||
so_method(so, curie, NV40TCL_VTX_ATTR_4F_X(attrib), 4);
|
||||
so_data (so, fui(v[0]));
|
||||
so_data (so, fui(v[1]));
|
||||
so_data (so, fui(v[2]));
|
||||
so_data (so, fui(v[3]));
|
||||
break;
|
||||
case 3:
|
||||
OUT_RINGf(v[0]);
|
||||
OUT_RINGf(v[1]);
|
||||
OUT_RINGf(v[2]);
|
||||
OUT_RINGf(1.0);
|
||||
so_method(so, curie, NV40TCL_VTX_ATTR_3F_X(attrib), 3);
|
||||
so_data (so, fui(v[0]));
|
||||
so_data (so, fui(v[1]));
|
||||
so_data (so, fui(v[2]));
|
||||
break;
|
||||
case 2:
|
||||
OUT_RINGf(v[0]);
|
||||
OUT_RINGf(v[1]);
|
||||
OUT_RINGf(0.0);
|
||||
OUT_RINGf(1.0);
|
||||
so_method(so, curie, NV40TCL_VTX_ATTR_2F_X(attrib), 2);
|
||||
so_data (so, fui(v[0]));
|
||||
so_data (so, fui(v[1]));
|
||||
break;
|
||||
case 1:
|
||||
OUT_RINGf(v[0]);
|
||||
OUT_RINGf(0.0);
|
||||
OUT_RINGf(0.0);
|
||||
OUT_RINGf(1.0);
|
||||
so_method(so, curie, 0x1e40 + (attrib * 4), 1);
|
||||
so_data (so, fui(v[0]));
|
||||
break;
|
||||
default:
|
||||
ws->buffer_unmap(ws, vb->buffer);
|
||||
|
|
@ -487,7 +485,8 @@ static boolean
|
|||
nv40_vbo_validate(struct nv40_context *nv40)
|
||||
{
|
||||
struct nv40_vertex_program *vp = nv40->vertprog;
|
||||
struct nouveau_stateobj *vtxbuf, *vtxfmt;
|
||||
struct nouveau_stateobj *vtxbuf, *vtxfmt, *sattr = NULL;
|
||||
struct nouveau_grobj *curie = nv40->screen->curie;
|
||||
struct pipe_buffer *ib = nv40->idxbuf;
|
||||
unsigned ib_format = nv40->idxbuf_format;
|
||||
unsigned inputs, hw, num_hw;
|
||||
|
|
@ -503,9 +502,9 @@ nv40_vbo_validate(struct nv40_context *nv40)
|
|||
num_hw++;
|
||||
|
||||
vtxbuf = so_new(20, 18);
|
||||
so_method(vtxbuf, nv40->screen->curie, NV40TCL_VTXBUF_ADDRESS(0), num_hw);
|
||||
so_method(vtxbuf, curie, NV40TCL_VTXBUF_ADDRESS(0), num_hw);
|
||||
vtxfmt = so_new(17, 0);
|
||||
so_method(vtxfmt, nv40->screen->curie, NV40TCL_VTXFMT(0), num_hw);
|
||||
so_method(vtxfmt, curie, NV40TCL_VTXFMT(0), num_hw);
|
||||
|
||||
inputs = vp->ir;
|
||||
for (hw = 0; hw < num_hw; hw++) {
|
||||
|
|
@ -522,10 +521,15 @@ nv40_vbo_validate(struct nv40_context *nv40)
|
|||
ve = &nv40->vtxelt[hw];
|
||||
vb = &nv40->vtxbuf[ve->vertex_buffer_index];
|
||||
|
||||
if (!vb->pitch && nv40_vbo_static_attrib(nv40, hw, ve, vb)) {
|
||||
so_data(vtxbuf, 0);
|
||||
so_data(vtxfmt, NV40TCL_VTXFMT_TYPE_FLOAT);
|
||||
continue;
|
||||
if (!vb->pitch) {
|
||||
if (!sattr)
|
||||
sattr = so_new(16 * 5, 0);
|
||||
|
||||
if (nv40_vbo_static_attrib(nv40, sattr, hw, ve, vb)) {
|
||||
so_data(vtxbuf, 0);
|
||||
so_data(vtxfmt, NV40TCL_VTXFMT_TYPE_FLOAT);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (nv40_vbo_format_to_hw(ve->src_format, &type, &ncomp)) {
|
||||
|
|
@ -543,19 +547,21 @@ nv40_vbo_validate(struct nv40_context *nv40)
|
|||
}
|
||||
|
||||
if (ib) {
|
||||
so_method(vtxbuf, nv40->screen->curie, NV40TCL_IDXBUF_ADDRESS, 2);
|
||||
so_method(vtxbuf, curie, NV40TCL_IDXBUF_ADDRESS, 2);
|
||||
so_reloc (vtxbuf, ib, 0, vb_flags | NOUVEAU_BO_LOW, 0, 0);
|
||||
so_reloc (vtxbuf, ib, ib_format, vb_flags | NOUVEAU_BO_OR,
|
||||
0, NV40TCL_IDXBUF_FORMAT_DMA1);
|
||||
}
|
||||
|
||||
so_method(vtxbuf, nv40->screen->curie, 0x1710, 1);
|
||||
so_method(vtxbuf, curie, 0x1710, 1);
|
||||
so_data (vtxbuf, 0);
|
||||
|
||||
so_ref(vtxbuf, &nv40->state.hw[NV40_STATE_VTXBUF]);
|
||||
nv40->state.dirty |= (1ULL << NV40_STATE_VTXBUF);
|
||||
so_ref(vtxfmt, &nv40->state.hw[NV40_STATE_VTXFMT]);
|
||||
nv40->state.dirty |= (1ULL << NV40_STATE_VTXFMT);
|
||||
so_ref(sattr, &nv40->state.hw[NV40_STATE_VTXATTR]);
|
||||
nv40->state.dirty |= (1ULL << NV40_STATE_VTXATTR);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue