static inline void nvc0_stage_sampler_states_bind(struct nvc0_context *nvc0, int s, unsigned nr, void **hwcso) { unsigned i; for (i = 0; i < nr; ++i) { struct nv50_tsc_entry *old = nvc0->samplers[s][i]; if (hwcso[i] == old) continue; nvc0->samplers_dirty[s] |= 1 << i; nvc0->samplers[s][i] = nv50_tsc_entry(hwcso[i]); if (old) nvc0_screen_tsc_unlock(nvc0->screen, old); } for (; i < nvc0->num_samplers[s]; ++i) { if (nvc0->samplers[s][i]) { nvc0_screen_tsc_unlock(nvc0->screen, nvc0->samplers[s][i]); nvc0->samplers[s][i] = NULL; } } nvc0->num_samplers[s] = nr; nvc0->dirty_3d |= NVC0_NEW_3D_SAMPLERS; }
static inline void nvc0_stage_sampler_states_bind(struct nvc0_context *nvc0, unsigned s, unsigned nr, void **hwcso) { unsigned highest_found = 0; unsigned i; for (i = 0; i < nr; ++i) { struct nv50_tsc_entry *old = nvc0->samplers[s][i]; if (hwcso[i]) highest_found = i; if (hwcso[i] == old) continue; nvc0->samplers_dirty[s] |= 1 << i; nvc0->samplers[s][i] = nv50_tsc_entry(hwcso[i]); if (old) nvc0_screen_tsc_unlock(nvc0->screen, old); } if (nr >= nvc0->num_samplers[s]) nvc0->num_samplers[s] = highest_found + 1; }
static void nvc0_stage_sampler_states_bind_range(struct nvc0_context *nvc0, const unsigned s, unsigned start, unsigned nr, void **cso) { const unsigned end = start + nr; int last_valid = -1; unsigned i; if (cso) { for (i = start; i < end; ++i) { const unsigned p = i - start; if (cso[p]) last_valid = i; if (cso[p] == nvc0->samplers[s][i]) continue; nvc0->samplers_dirty[s] |= 1 << i; if (nvc0->samplers[s][i]) nvc0_screen_tsc_unlock(nvc0->screen, nvc0->samplers[s][i]); nvc0->samplers[s][i] = cso[p]; } } else { for (i = start; i < end; ++i) { if (nvc0->samplers[s][i]) { nvc0_screen_tsc_unlock(nvc0->screen, nvc0->samplers[s][i]); nvc0->samplers[s][i] = NULL; nvc0->samplers_dirty[s] |= 1 << i; } } } if (nvc0->num_samplers[s] <= end) { if (last_valid < 0) { for (i = start; i && !nvc0->samplers[s][i - 1]; --i); nvc0->num_samplers[s] = i; } else { nvc0->num_samplers[s] = last_valid + 1; } } }
static INLINE void nvc0_stage_sampler_states_bind(struct nvc0_context *nvc0, int s, unsigned nr, void **hwcso) { unsigned i; for (i = 0; i < nr; ++i) { struct nv50_tsc_entry *old = nvc0->samplers[s][i]; nvc0->samplers[s][i] = nv50_tsc_entry(hwcso[i]); if (old) nvc0_screen_tsc_unlock(nvc0->screen, old); } for (; i < nvc0->num_samplers[s]; ++i) if (nvc0->samplers[s][i]) nvc0_screen_tsc_unlock(nvc0->screen, nvc0->samplers[s][i]); nvc0->num_samplers[s] = nr; nvc0->dirty |= NVC0_NEW_SAMPLERS; }