1 #ifndef U_DIRTY_SURFACES_H_
2 #define U_DIRTY_SURFACES_H_
4 #include "util/u_double_list.h"
5 #include "util/u_math.h"
7 typedef void (*util_dirty_surface_flush_t
) (struct pipe_context
*, struct pipe_surface
*);
9 struct util_dirty_surfaces
11 struct list_head dirty_list
;
14 struct util_dirty_surface
16 struct pipe_surface base
;
17 struct list_head dirty_list
;
21 util_dirty_surfaces_init(struct util_dirty_surfaces
*ds
)
23 LIST_INITHEAD(&ds
->dirty_list
);
27 util_dirty_surfaces_use_for_sampling(struct pipe_context
*pipe
, struct util_dirty_surfaces
*dss
, util_dirty_surface_flush_t flush
)
29 struct list_head
*p
, *next
;
30 for(p
= dss
->dirty_list
.next
; p
!= &dss
->dirty_list
; p
= next
)
32 struct util_dirty_surface
*ds
= LIST_ENTRY(struct util_dirty_surface
, p
, dirty_list
);
35 flush(pipe
, &ds
->base
);
40 util_dirty_surfaces_use_levels_for_sampling(struct pipe_context
*pipe
, struct util_dirty_surfaces
*dss
, unsigned first
, unsigned last
, util_dirty_surface_flush_t flush
)
42 struct list_head
*p
, *next
;
45 for(p
= dss
->dirty_list
.next
; p
!= &dss
->dirty_list
; p
= next
)
47 struct util_dirty_surface
*ds
= LIST_ENTRY(struct util_dirty_surface
, p
, dirty_list
);
50 if(ds
->base
.level
>= first
&& ds
->base
.level
<= last
)
51 flush(pipe
, &ds
->base
);
56 util_dirty_surfaces_use_for_sampling_with(struct pipe_context
*pipe
, struct util_dirty_surfaces
*dss
, struct pipe_sampler_view
*psv
, struct pipe_sampler_state
*pss
, util_dirty_surface_flush_t flush
)
58 if(!LIST_IS_EMPTY(&dss
->dirty_list
))
59 util_dirty_surfaces_use_levels_for_sampling(pipe
, dss
, (unsigned)pss
->min_lod
+ psv
->first_level
, MIN2((unsigned)ceilf(pss
->max_lod
) + psv
->first_level
, psv
->last_level
), flush
);
63 util_dirty_surface_init(struct util_dirty_surface
*ds
)
65 LIST_INITHEAD(&ds
->dirty_list
);
69 util_dirty_surface_is_dirty(struct util_dirty_surface
*ds
)
71 return !LIST_IS_EMPTY(&ds
->dirty_list
);
75 util_dirty_surface_set_dirty(struct util_dirty_surfaces
*dss
, struct util_dirty_surface
*ds
)
77 if(LIST_IS_EMPTY(&ds
->dirty_list
))
78 LIST_ADDTAIL(&ds
->dirty_list
, &dss
->dirty_list
);
82 util_dirty_surface_set_clean(struct util_dirty_surfaces
*dss
, struct util_dirty_surface
*ds
)
84 if(!LIST_IS_EMPTY(&ds
->dirty_list
))
85 LIST_DELINIT(&ds
->dirty_list
);