{
struct pipe_winsys *ws = nv40->pipe.winsys;
uint32_t fp_control;
+ int i;
if (!fp->translated) {
- NOUVEAU_ERR("fragprog invalid, using passthrough shader\n");
- fp = &passthrough_fp;
+ nv40_fragprog_translate(nv40, fp);
+ if (!fp->translated) {
+ NOUVEAU_ERR("invalid, using passthrough shader\n");
+ fp = &passthrough_fp;
+ }
+ }
+
+ if (fp->num_consts) {
+ float *map = ws->buffer_map(ws, nv40->fragprog.constant_buf,
+ PIPE_BUFFER_FLAG_READ);
+ for (i = 0; i < fp->num_consts; i++) {
+ uint pid = fp->consts[i].pipe_id;
+
+ if (pid == -1)
+ continue;
+
+ if (!memcmp(&fp->insn[fp->consts[i].hw_id], &map[pid*4],
+ 4 * sizeof(float)))
+ continue;
+
+ memcpy(&fp->insn[fp->consts[i].hw_id], &map[pid*4],
+ 4 * sizeof(float));
+ fp->on_hw = 0;
+ }
+ ws->buffer_unmap(ws, nv40->fragprog.constant_buf);
}
if (!fp->on_hw) {
fp->buffer = ws->buffer_create(ws, 0x100, 0, 0);
#if 0
- int i;
for (i = 0; i < fp->insn_len; i++)
NOUVEAU_ERR("%d 0x%08x\n", i, fp->insn[i]);
#endif
#include "nv40_dma.h"
#include "nv40_state.h"
-static INLINE void
-nv40_state_update_fragprog(struct nv40_context *nv40)
-{
- struct pipe_context *pipe = (struct pipe_context *)nv40;
- struct nv40_fragment_program *fp = nv40->fragprog.current;
- float *map;
- int i;
-
- if (!fp->translated)
- nv40_fragprog_translate(nv40, fp);
-
- if (fp->num_consts) {
- map = pipe->winsys->buffer_map(pipe->winsys,
- nv40->fragprog.constant_buf,
- PIPE_BUFFER_FLAG_READ);
- for (i = 0; i < fp->num_consts; i++) {
- uint pid = fp->consts[i].pipe_id;
-
- if (pid == -1)
- continue;
-
- if (!memcmp(&fp->insn[fp->consts[i].hw_id], &map[pid*4],
- 4 * sizeof(float)))
- continue;
-
- memcpy(&fp->insn[fp->consts[i].hw_id], &map[pid*4],
- 4 * sizeof(float));
- fp->on_hw = 0;
- }
- pipe->winsys->buffer_unmap(pipe->winsys,
- nv40->fragprog.constant_buf);
- }
-}
-
void
nv40_emit_hw_state(struct nv40_context *nv40)
{
if (nv40->dirty & NV40_NEW_FRAGPROG) {
- struct nv40_fragment_program *cur = nv40->fragprog.current;
-
- nv40_state_update_fragprog(nv40);
-
- if (cur->on_hw)
- nv40->dirty &= ~NV40_NEW_FRAGPROG;
-
- if (!cur->on_hw || cur != nv40->fragprog.active)
- nv40_fragprog_bind(nv40, cur);
+ nv40_fragprog_bind(nv40, nv40->fragprog.current);
+ /*XXX: clear NV40_NEW_FRAGPROG if no now program uploaded */
}
if (nv40->dirty & NV40_NEW_TEXTURE)
nv40->dirty &= ~(NV40_NEW_TEXTURE | NV40_NEW_FRAGPROG);
}
- if (nv40->dirty & NV40_NEW_VERTPROG)
+ if (nv40->dirty & NV40_NEW_VERTPROG) {
nv40_vertprog_bind(nv40, nv40->vertprog.current);
+ nv40->dirty &= ~NV40_NEW_VERTPROG;
+ }
if (nv40->dirty & NV40_NEW_ARRAYS) {
nv40_vbo_arrays_update(nv40);