static cg_sampler_cache_entry_t * _cg_sampler_cache_get_entry_cg(cg_sampler_cache_t *cache, const cg_sampler_cache_entry_t *key) { cg_sampler_cache_entry_t *entry; entry = c_hash_table_lookup(cache->hash_table_cg, key); if (entry == NULL) { cg_sampler_cache_entry_t canonical_key; cg_sampler_cache_entry_t *gl_entry; entry = c_slice_dup(cg_sampler_cache_entry_t, key); /* Get the sampler object number from the canonical GL version of the sampler state cache */ canonical_key = *key; canonicalize_key(&canonical_key); gl_entry = _cg_sampler_cache_get_entry_gl(cache, &canonical_key); entry->sampler_object = gl_entry->sampler_object; c_hash_table_insert(cache->hash_table_cg, entry, entry); } return entry; }
static void register_edit_object_cb(void *object, uint64_t edit_mode_id, void *user_data) { rig_slave_t *slave = user_data; uint64_t *id_chunk; if (lookup_object(slave, edit_mode_id)) { c_critical("Tried to re-register object"); return; } /* XXX: We need a mechanism for hooking into frontend edits that * happen as a result of UI logic so we can make sure to unregister * objects that might be deleted by UI logic. */ id_chunk = rut_magazine_chunk_alloc(_rig_slave_object_id_magazine); *id_chunk = edit_mode_id; c_hash_table_insert(slave->edit_id_to_play_object_map, id_chunk, object); c_hash_table_insert(slave->play_object_to_edit_id_map, object, id_chunk); }
static cg_sampler_cache_entry_t * _cg_sampler_cache_get_entry_gl(cg_sampler_cache_t *cache, const cg_sampler_cache_entry_t *key) { cg_sampler_cache_entry_t *entry; entry = c_hash_table_lookup(cache->hash_table_gl, key); if (entry == NULL) { cg_device_t *dev = cache->dev; entry = c_slice_dup(cg_sampler_cache_entry_t, key); if (_cg_has_private_feature(dev, CG_PRIVATE_FEATURE_SAMPLER_OBJECTS)) { GE(dev, glGenSamplers(1, &entry->sampler_object)); GE(dev, glSamplerParameteri(entry->sampler_object, GL_TEXTURE_MIN_FILTER, entry->min_filter)); GE(dev, glSamplerParameteri(entry->sampler_object, GL_TEXTURE_MAG_FILTER, entry->mag_filter)); set_wrap_mode(dev, entry->sampler_object, GL_TEXTURE_WRAP_S, entry->wrap_mode_s); set_wrap_mode(dev, entry->sampler_object, GL_TEXTURE_WRAP_T, entry->wrap_mode_t); set_wrap_mode(dev, entry->sampler_object, GL_TEXTURE_WRAP_R, entry->wrap_mode_p); } else { /* If sampler objects aren't supported then we'll invent a unique number so that pipelines can still compare the unique state just by comparing the sampler object numbers */ entry->sampler_object = cache->next_fake_sampler_object_number++; } c_hash_table_insert(cache->hash_table_gl, entry, entry); } return entry; }
c_quark_t c_quark_from_string(const char *string) { void *quark_ptr; ensure_quark_hash_table(); quark_ptr = c_hash_table_lookup(_quark_hash_table, string); if (!quark_ptr) { c_quark_t new_quark = _next_quark++; c_hash_table_insert(_quark_hash_table, (void *)c_strdup(string), C_UINT_TO_POINTER(new_quark)); return new_quark; } else return C_POINTER_TO_UINT(quark_ptr); }
const char * c_intern_string(const char *string) { void *quark_key; void *quark_ptr; bool found; ensure_quark_hash_table(); found = c_hash_table_lookup_extended(_quark_hash_table, string, &quark_key, &quark_ptr); if (!found) { c_quark_t new_quark = _next_quark++; quark_key = c_strdup(string); c_hash_table_insert(_quark_hash_table, quark_key, C_UINT_TO_POINTER(new_quark)); } return quark_key; }