X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fsvga%2Fsvga_screen_cache.c;h=86a04136e6457a5e35d8bcf6dc1ef67a3be8d44f;hb=4750c4e5439f5c2689051ac072003cc3a2ff5c1b;hp=321c564e7f551152c6612ce5d2edce36c2bb72cd;hpb=903afc370fb925ce637c90d694ef1e4052a1a80f;p=mesa.git diff --git a/src/gallium/drivers/svga/svga_screen_cache.c b/src/gallium/drivers/svga/svga_screen_cache.c index 321c564e7f5..86a04136e64 100644 --- a/src/gallium/drivers/svga/svga_screen_cache.c +++ b/src/gallium/drivers/svga/svga_screen_cache.c @@ -320,19 +320,19 @@ svga_screen_cache_flush(struct svga_screen *svgascreen, pipe_mutex_lock(cache->mutex); - /* Loop over entries in the validated list */ - curr = cache->validated.next; + /* Loop over entries in the invalidated list */ + curr = cache->invalidated.next; next = curr->next; - while (curr != &cache->validated) { + while (curr != &cache->invalidated) { entry = LIST_ENTRY(struct svga_host_surface_cache_entry, curr, head); assert(entry->handle); if (sws->surface_is_flushed(sws, entry->handle)) { - /* remove entry from LRU list */ + /* remove entry from the invalidated list */ LIST_DEL(&entry->head); - svgascreen->sws->fence_reference(svgascreen->sws, &entry->fence, fence); + sws->fence_reference(sws, &entry->fence, fence); /* Add entry to the unused list */ LIST_ADD(&entry->head, &cache->unused); @@ -346,6 +346,28 @@ svga_screen_cache_flush(struct svga_screen *svgascreen, next = curr->next; } + curr = cache->validated.next; + next = curr->next; + while (curr != &cache->validated) { + entry = LIST_ENTRY(struct svga_host_surface_cache_entry, curr, head); + + assert(entry->handle); + + if (sws->surface_is_flushed(sws, entry->handle)) { + /* remove entry from the validated list */ + LIST_DEL(&entry->head); + + /* it is now safe to invalidate the surface content. */ + sws->surface_invalidate(sws, entry->handle); + + /* add the entry to the invalidated list */ + LIST_ADD(&entry->head, &cache->invalidated); + } + + curr = next; + next = curr->next; + } + pipe_mutex_unlock(cache->mutex); } @@ -371,8 +393,7 @@ svga_screen_cache_cleanup(struct svga_screen *svgascreen) } if (cache->entries[i].fence) - svgascreen->sws->fence_reference(svgascreen->sws, - &cache->entries[i].fence, NULL); + sws->fence_reference(sws, &cache->entries[i].fence, NULL); } pipe_mutex_destroy(cache->mutex); @@ -396,6 +417,8 @@ svga_screen_cache_init(struct svga_screen *svgascreen) LIST_INITHEAD(&cache->validated); + LIST_INITHEAD(&cache->invalidated); + LIST_INITHEAD(&cache->empty); for (i = 0; i < SVGA_HOST_SURFACE_CACHE_SIZE; ++i) LIST_ADDTAIL(&cache->entries[i].head, &cache->empty); @@ -413,7 +436,7 @@ svga_screen_cache_init(struct svga_screen *svgascreen) */ struct svga_winsys_surface * svga_screen_surface_create(struct svga_screen *svgascreen, - unsigned bind_flags, unsigned usage, + unsigned bind_flags, enum pipe_resource_usage usage, struct svga_host_surface_cache_key *key) { struct svga_winsys_screen *sws = svgascreen->sws;