static void gen7_upload_sampler_state_table(struct brw_context *brw, struct gl_program *prog, uint32_t sampler_count, uint32_t *sst_offset, uint32_t *sdc_offset) { struct gl_context *ctx = &brw->ctx; struct gen7_sampler_state *samplers; GLbitfield SamplersUsed = prog->SamplersUsed; if (sampler_count == 0) return; samplers = brw_state_batch(brw, AUB_TRACE_SAMPLER_STATE, sampler_count * sizeof(*samplers), 32, sst_offset); memset(samplers, 0, sampler_count * sizeof(*samplers)); for (unsigned s = 0; s < sampler_count; s++) { if (SamplersUsed & (1 << s)) { const unsigned unit = prog->SamplerUnits[s]; if (ctx->Texture.Unit[unit]._ReallyEnabled) gen7_update_sampler_state(brw, unit, s, &samplers[s], &sdc_offset[s]); } } brw->state.dirty.cache |= CACHE_NEW_SAMPLER; }
/* All samplers must be uploaded in a single contiguous array, which * complicates various things. However, this is still too confusing - * FIXME: simplify all the different new texture state flags. */ static void gen7_prepare_samplers(struct brw_context *brw) { struct gl_context *ctx = &brw->intel.ctx; struct gen7_sampler_state *samplers; int i; brw->wm.sampler_count = 0; for (i = 0; i < BRW_MAX_TEX_UNIT; i++) { if (ctx->Texture.Unit[i]._ReallyEnabled) brw->wm.sampler_count = i + 1; } if (brw->wm.sampler_count == 0) return; samplers = brw_state_batch(brw, AUB_TRACE_SAMPLER_STATE, brw->wm.sampler_count * sizeof(*samplers), 32, &brw->wm.sampler_offset); memset(samplers, 0, brw->wm.sampler_count * sizeof(*samplers)); for (i = 0; i < brw->wm.sampler_count; i++) { if (ctx->Texture.Unit[i]._ReallyEnabled) gen7_update_sampler_state(brw, i, &samplers[i]); } brw->state.dirty.cache |= CACHE_NEW_SAMPLER; }
static void gen7_upload_samplers(struct brw_context *brw) { struct gl_context *ctx = &brw->intel.ctx; struct gen7_sampler_state *samplers; /* BRW_NEW_VERTEX_PROGRAM and BRW_NEW_FRAGMENT_PROGRAM */ struct gl_program *vs = (struct gl_program *) brw->vertex_program; struct gl_program *fs = (struct gl_program *) brw->fragment_program; GLbitfield SamplersUsed = vs->SamplersUsed | fs->SamplersUsed; brw->sampler.count = _mesa_fls(SamplersUsed); if (brw->sampler.count == 0) return; samplers = brw_state_batch(brw, AUB_TRACE_SAMPLER_STATE, brw->sampler.count * sizeof(*samplers), 32, &brw->sampler.offset); memset(samplers, 0, brw->sampler.count * sizeof(*samplers)); for (unsigned s = 0; s < brw->sampler.count; s++) { if (SamplersUsed & (1 << s)) { const unsigned unit = (fs->SamplersUsed & (1 << s)) ? fs->SamplerUnits[s] : vs->SamplerUnits[s]; if (ctx->Texture.Unit[unit]._ReallyEnabled) gen7_update_sampler_state(brw, unit, s, &samplers[s]); } } brw->state.dirty.cache |= CACHE_NEW_SAMPLER; }