Provide explicit argument for asset cache ID.

This will allow assets to cache compiled results with different parameters. For example, we could cache both an RGB version of a texture and a Mono version.

PiperOrigin-RevId: 811341377
Change-Id: Ifd6a4ff88661a2b38be47c02d6a666de2c202885
This commit is contained in:
Sam Haves
2025-09-25 07:23:11 -07:00
committed by Copybara-Service
parent 0baac58999
commit 922aebbeed
5 changed files with 79 additions and 77 deletions
+6 -6
View File
@@ -64,17 +64,17 @@ const std::string* mjCCache::HasAsset(const std::string& id) {
// inserts an asset into the cache, if asset is already in the cache, its data
// is updated only if the timestamps disagree
bool mjCCache::Insert(const std::string& modelname, const mjResource *resource,
bool mjCCache::Insert(const std::string& modelname, const std::string& id, const mjResource *resource,
std::shared_ptr<const void> data, std::size_t size) {
std::lock_guard<std::mutex> lock(mutex_);
// check if asset is too large to fit in the cache
if ((size_ + size > capacity_) &&
lookup_.find(resource->name) == lookup_.end()) {
lookup_.find(id) == lookup_.end()) {
return false;
}
mjCAsset asset(modelname, resource, data, size);
auto [it, inserted] = lookup_.insert({resource->name, asset});
mjCAsset asset(modelname, id, resource, data, size);
auto [it, inserted] = lookup_.insert({id, asset});
mjCAsset* asset_ptr = &(it->second);
if (!inserted) {
@@ -104,9 +104,9 @@ bool mjCCache::Insert(const std::string& modelname, const mjResource *resource,
// populate data from the cache into the given function, return true if data was
// copied
bool mjCCache::PopulateData(const mjResource* resource, mjCDataFunc fn) {
bool mjCCache::PopulateData(const std::string& id, const mjResource* resource, mjCDataFunc fn) {
std::lock_guard<std::mutex> lock(mutex_);
auto it = lookup_.find(resource->name);
auto it = lookup_.find(id);
if (it == lookup_.end()) {
return false;
}
+4 -4
View File
@@ -39,9 +39,9 @@ typedef void (*mjCDeallocFunc)(const void*);
class mjCAsset {
friend class mjCCache;
public:
mjCAsset(std::string modelname, const mjResource* resource,
mjCAsset(std::string modelname, std::string id, const mjResource* resource,
std::shared_ptr<const void> data, std::size_t size) :
id_(resource->name), timestamp_(resource->timestamp),
id_(id), timestamp_(resource->timestamp),
size_(size), data_(std::move(data)) {
AddReference(modelname);
}
@@ -136,11 +136,11 @@ class mjCCache {
// inserts an asset into the cache, if asset is already in the cache, its data
// is updated only if the timestamps disagree
bool Insert(const std::string& modelname, const mjResource *resource,
bool Insert(const std::string& modelname, const std::string& id, const mjResource *resource,
std::shared_ptr<const void> data, std::size_t size);
// populate data from the cache into the given function
bool PopulateData(const mjResource* resource, mjCDataFunc fn);
bool PopulateData(const std::string& id, const mjResource* resource, mjCDataFunc fn);
// deletes the asset from the cache with the given id
void DeleteAsset(const std::string& id);
+2 -2
View File
@@ -513,7 +513,7 @@ void mjCMesh::CacheMesh(mjCCache* cache, const mjResource* resource) {
const mjCMesh* mesh = static_cast<const mjCMesh*>(data);
delete mesh;
});
cache->Insert("", resource, cached_data, size);
cache->Insert("", resource->name, resource, cached_data, size);
}
namespace {
@@ -1231,7 +1231,7 @@ bool mjCMesh::LoadCachedMesh(mjCCache *cache, const mjResource* resource) {
};
// check that cached asset has all data
return cache->PopulateData(resource, process_mesh);
return cache->PopulateData(resource->name, resource, process_mesh);
}
+2 -2
View File
@@ -91,7 +91,7 @@ PNGImage PNGImage::Load(const mjCBase* obj, mjResource* resource,
};
// try loading from cache
if (cache && cache->PopulateData(resource, callback)) {
if (cache && cache->PopulateData(resource->name, resource, callback)) {
return image;
}
@@ -139,7 +139,7 @@ PNGImage PNGImage::Load(const mjCBase* obj, mjResource* resource,
std::shared_ptr<const void> cached_data(cached_image, +[] (const void* data) {
delete static_cast<const PNGImage*>(data);
});
cache->Insert("", resource, cached_data, size);
cache->Insert("", resource->name, resource, cached_data, size);
}
return image;