static void si_set_sampler_views(struct pipe_context *ctx, unsigned shader, unsigned start, unsigned count, struct pipe_sampler_view **views) { struct si_context *sctx = (struct si_context *)ctx; struct si_textures_info *samplers = &sctx->samplers[shader]; int i; if (!count || shader >= SI_NUM_SHADERS) return; for (i = 0; i < count; i++) { unsigned slot = start + i; if (!views || !views[i]) { samplers->depth_texture_mask &= ~(1u << slot); samplers->compressed_colortex_mask &= ~(1u << slot); si_set_sampler_view(sctx, &samplers->views, slot, NULL); continue; } si_set_sampler_view(sctx, &samplers->views, slot, views[i]); if (views[i]->texture && views[i]->texture->target != PIPE_BUFFER) { struct r600_texture *rtex = (struct r600_texture*)views[i]->texture; if (rtex->is_depth && !rtex->is_flushing_texture) { samplers->depth_texture_mask |= 1u << slot; } else { samplers->depth_texture_mask &= ~(1u << slot); } if (is_compressed_colortex(rtex)) { samplers->compressed_colortex_mask |= 1u << slot; } else { samplers->compressed_colortex_mask &= ~(1u << slot); } } else { samplers->depth_texture_mask &= ~(1u << slot); samplers->compressed_colortex_mask &= ~(1u << slot); } } }
static void si_set_sampler_views(struct pipe_context *ctx, unsigned shader, unsigned start, unsigned count, struct pipe_sampler_view **views) { struct si_context *sctx = (struct si_context *)ctx; struct si_textures_info *samplers = &sctx->samplers[shader]; struct si_sampler_view **rviews = (struct si_sampler_view **)views; int i; if (!count || shader >= SI_NUM_SHADERS) return; for (i = 0; i < count; i++) { unsigned slot = start + i; if (!views || !views[i]) { samplers->depth_texture_mask &= ~(1 << slot); samplers->compressed_colortex_mask &= ~(1 << slot); si_set_sampler_view(sctx, shader, slot, NULL, NULL); si_set_sampler_view(sctx, shader, SI_FMASK_TEX_OFFSET + slot, NULL, NULL); continue; } si_set_sampler_view(sctx, shader, slot, views[i], rviews[i]->state); if (views[i]->texture && views[i]->texture->target != PIPE_BUFFER) { struct r600_texture *rtex = (struct r600_texture*)views[i]->texture; if (rtex->is_depth && !rtex->is_flushing_texture) { samplers->depth_texture_mask |= 1 << slot; } else { samplers->depth_texture_mask &= ~(1 << slot); } if (rtex->cmask.size || rtex->fmask.size || (rtex->dcc_buffer && rtex->dirty_level_mask)) { samplers->compressed_colortex_mask |= 1 << slot; } else { samplers->compressed_colortex_mask &= ~(1 << slot); } if (rtex->fmask.size) { si_set_sampler_view(sctx, shader, SI_FMASK_TEX_OFFSET + slot, views[i], rviews[i]->fmask_state); } else { si_set_sampler_view(sctx, shader, SI_FMASK_TEX_OFFSET + slot, NULL, NULL); } } else { samplers->depth_texture_mask &= ~(1 << slot); samplers->compressed_colortex_mask &= ~(1 << slot); si_set_sampler_view(sctx, shader, SI_FMASK_TEX_OFFSET + slot, NULL, NULL); } } }