Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
      }
   }
}
Beispiel #4
0
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;
}