1fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri/**************************************************************************
2fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri *
3fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * Copyright 2010 Luca Barbieri
4fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri *
5fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * Permission is hereby granted, free of charge, to any person obtaining
6fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * a copy of this software and associated documentation files (the
7fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * "Software"), to deal in the Software without restriction, including
8fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * without limitation the rights to use, copy, modify, merge, publish,
9fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * distribute, sublicense, and/or sell copies of the Software, and to
10fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * permit persons to whom the Software is furnished to do so, subject to
11fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * the following conditions:
12fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri *
13fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * The above copyright notice and this permission notice (including the
14fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * next paragraph) shall be included in all copies or substantial
15fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * portions of the Software.
16fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri *
17fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri *
25fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri **************************************************************************/
26fa32fde26cbb770c6ffa0a0ead529d511eab1eb1Luca Barbieri
27f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri#ifndef U_DIRTY_SURFACES_H_
28f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri#define U_DIRTY_SURFACES_H_
29f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
30d2dd23e85890d697ea6d848f0a3a03fe283edb0aVinson Lee#include "pipe/p_state.h"
31d2dd23e85890d697ea6d848f0a3a03fe283edb0aVinson Lee
32f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri#include "util/u_double_list.h"
33f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri#include "util/u_math.h"
34f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
35d2dd23e85890d697ea6d848f0a3a03fe283edb0aVinson Leestruct pipe_context;
36d2dd23e85890d697ea6d848f0a3a03fe283edb0aVinson Lee
37f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieritypedef void (*util_dirty_surface_flush_t) (struct pipe_context *, struct pipe_surface *);
38f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
39f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieristruct util_dirty_surfaces
40f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri{
41f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   struct list_head dirty_list;
42f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri};
43f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
44f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieristruct util_dirty_surface
45f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri{
46f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   struct pipe_surface base;
47f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   struct list_head dirty_list;
48f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri};
49f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
50f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieristatic INLINE void
51f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieriutil_dirty_surfaces_init(struct util_dirty_surfaces *ds)
52f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri{
53f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   LIST_INITHEAD(&ds->dirty_list);
54f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri}
55f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
56f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieristatic INLINE void
57f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieriutil_dirty_surfaces_use_for_sampling(struct pipe_context *pipe, struct util_dirty_surfaces *dss, util_dirty_surface_flush_t flush)
58f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri{
59f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   struct list_head *p, *next;
60f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   for(p = dss->dirty_list.next; p != &dss->dirty_list; p = next)
61f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   {
62f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri      struct util_dirty_surface *ds = LIST_ENTRY(struct util_dirty_surface, p, dirty_list);
63f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri      next = p->next;
64f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
65f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri      flush(pipe, &ds->base);
66f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   }
67f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri}
68f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
69f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieristatic INLINE void
70f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieriutil_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)
71f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri{
72f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   struct list_head *p, *next;
73f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   if(first > last)
74f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri      return;
75f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   for(p = dss->dirty_list.next; p != &dss->dirty_list; p = next)
76f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   {
77f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri      struct util_dirty_surface *ds = LIST_ENTRY(struct util_dirty_surface, p, dirty_list);
78f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri      next = p->next;
79f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
804c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      if(ds->base.u.tex.level >= first && ds->base.u.tex.level <= last)
81f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri	 flush(pipe, &ds->base);
82f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   }
83f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri}
84f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
85f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieristatic INLINE void
86f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieriutil_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)
87f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri{
88f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   if(!LIST_IS_EMPTY(&dss->dirty_list))
894c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      util_dirty_surfaces_use_levels_for_sampling(pipe, dss, (unsigned)pss->min_lod + psv->u.tex.first_level,
904c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger						  MIN2((unsigned)ceilf(pss->max_lod) + psv->u.tex.first_level, psv->u.tex.last_level), flush);
91f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri}
92f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
93f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieristatic INLINE void
94f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieriutil_dirty_surface_init(struct util_dirty_surface *ds)
95f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri{
96f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   LIST_INITHEAD(&ds->dirty_list);
97f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri}
98f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
99f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieristatic INLINE boolean
100f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieriutil_dirty_surface_is_dirty(struct util_dirty_surface *ds)
101f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri{
102f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   return !LIST_IS_EMPTY(&ds->dirty_list);
103f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri}
104f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
105f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieristatic INLINE void
106f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieriutil_dirty_surface_set_dirty(struct util_dirty_surfaces *dss, struct util_dirty_surface *ds)
107f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri{
108f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   if(LIST_IS_EMPTY(&ds->dirty_list))
109f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri      LIST_ADDTAIL(&ds->dirty_list, &dss->dirty_list);
110f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri}
111f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
112f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieristatic INLINE void
113f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieriutil_dirty_surface_set_clean(struct util_dirty_surfaces *dss, struct util_dirty_surface *ds)
114f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri{
115f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri   if(!LIST_IS_EMPTY(&ds->dirty_list))
116f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri      LIST_DELINIT(&ds->dirty_list);
117f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri}
118f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri
119f9ea7a2ea94275a3783dbc24ce8e6fec2930f493Luca Barbieri#endif
120