webrender/
image_source.rs1use crate::api::ExternalImageType;
13use crate::api::units::*;
14use crate::gpu_cache::GpuCache;
15use crate::prim_store::DeferredResolve;
16use crate::renderer::BLOCKS_PER_UV_RECT;
17use crate::render_task_cache::RenderTaskCacheEntryHandle;
18use crate::resource_cache::{ResourceCache, ImageRequest, CacheItem};
19use crate::internal_types::{TextureSource, TextureSourceExternal, DeferredResolveIndex, FrameVec};
20
21pub fn resolve_image(
23 request: ImageRequest,
24 resource_cache: &ResourceCache,
25 gpu_cache: &mut GpuCache,
26 deferred_resolves: &mut FrameVec<DeferredResolve>,
27 is_composited: bool,
28) -> CacheItem {
29 match resource_cache.get_image_properties(request.key) {
30 Some(image_properties) => {
31 match image_properties.external_image {
34 Some(external_image) => {
35 let cache_handle = gpu_cache.push_deferred_per_frame_blocks(BLOCKS_PER_UV_RECT);
39
40 let deferred_resolve_index = DeferredResolveIndex(deferred_resolves.len() as u32);
41
42 let image_buffer_kind = match external_image.image_type {
43 ExternalImageType::TextureHandle(target) => {
44 target
45 }
46 ExternalImageType::Buffer => {
47 panic!("Unexpected non-texture handle type");
50 }
51 };
52
53 let cache_item = CacheItem {
54 texture_id: TextureSource::External(TextureSourceExternal {
55 index: deferred_resolve_index,
56 kind: image_buffer_kind,
57 normalized_uvs: external_image.normalized_uvs,
58 }),
59 uv_rect_handle: cache_handle,
60 uv_rect: DeviceIntRect::from_size(
61 image_properties.descriptor.size,
62 ),
63 user_data: [0.0; 4],
64 };
65
66 deferred_resolves.push(DeferredResolve {
67 image_properties,
68 address: gpu_cache.get_address(&cache_handle),
69 rendering: request.rendering,
70 is_composited,
71 });
72
73 cache_item
74 }
75 None => {
76 if let Ok(cache_item) = resource_cache.get_cached_image(request) {
77 cache_item
78 } else {
79 CacheItem::invalid()
81 }
82 }
83 }
84 }
85 None => {
86 CacheItem::invalid()
87 }
88 }
89}
90
91pub fn resolve_cached_render_task(
92 handle: &RenderTaskCacheEntryHandle,
93 resource_cache: &ResourceCache,
94) -> CacheItem {
95 let rt_cache_entry = resource_cache
96 .get_cached_render_task(&handle);
97
98 resource_cache.get_texture_cache_item(&rt_cache_entry.handle).unwrap()
99}