Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5564 serge 1
/**************************************************************************
2
 *
3
 * Copyright 2007 VMware, Inc.
4
 * All Rights Reserved.
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a
7
 * copy of this software and associated documentation files (the
8
 * "Software"), to deal in the Software without restriction, including
9
 * without limitation the rights to use, copy, modify, merge, publish,
10
 * distribute, sub license, and/or sell copies of the Software, and to
11
 * permit persons to whom the Software is furnished to do so, subject to
12
 * the following conditions:
13
 *
14
 * The above copyright notice and this permission notice (including the
15
 * next paragraph) shall be included in all copies or substantial portions
16
 * of the Software.
17
 *
18
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21
 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22
 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
 *
26
 **************************************************************************/
27
 
28
#ifndef LP_TEXTURE_H
29
#define LP_TEXTURE_H
30
 
31
 
32
#include "pipe/p_state.h"
33
#include "util/u_debug.h"
34
#include "lp_limits.h"
35
 
36
 
37
enum lp_texture_usage
38
{
39
   LP_TEX_USAGE_READ = 100,
40
   LP_TEX_USAGE_READ_WRITE,
41
   LP_TEX_USAGE_WRITE_ALL
42
};
43
 
44
 
45
struct pipe_context;
46
struct pipe_screen;
47
struct llvmpipe_context;
48
 
49
struct sw_displaytarget;
50
 
51
 
52
/**
53
 * llvmpipe subclass of pipe_resource.  A texture, drawing surface,
54
 * vertex buffer, const buffer, etc.
55
 * Textures are stored differently than other types of objects such as
56
 * vertex buffers and const buffers.
57
 * The latter are simple malloc'd blocks of memory.
58
 */
59
struct llvmpipe_resource
60
{
61
   struct pipe_resource base;
62
 
63
   /** Row stride in bytes */
64
   unsigned row_stride[LP_MAX_TEXTURE_LEVELS];
65
   /** Image stride (for cube maps, array or 3D textures) in bytes */
66
   unsigned img_stride[LP_MAX_TEXTURE_LEVELS];
67
   /** Offset to start of mipmap level, in bytes */
68
   unsigned mip_offsets[LP_MAX_TEXTURE_LEVELS];
69
   /** allocated total size (for non-display target texture resources only) */
70
   unsigned total_alloc_size;
71
 
72
   /**
73
    * Display target, for textures with the PIPE_BIND_DISPLAY_TARGET
74
    * usage.
75
    */
76
   struct sw_displaytarget *dt;
77
 
78
   /**
79
    * Malloc'ed data for regular textures, or a mapping to dt above.
80
    */
81
   void *tex_data;
82
 
83
   /**
84
    * Data for non-texture resources.
85
    */
86
   void *data;
87
 
88
   boolean userBuffer;  /** Is this a user-space buffer? */
89
   unsigned timestamp;
90
 
91
   unsigned id;  /**< temporary, for debugging */
92
 
93
#ifdef DEBUG
94
   /** for linked list */
95
   struct llvmpipe_resource *prev, *next;
96
#endif
97
};
98
 
99
 
100
struct llvmpipe_transfer
101
{
102
   struct pipe_transfer base;
103
 
104
   unsigned long offset;
105
};
106
 
107
 
108
/** cast wrappers */
109
static INLINE struct llvmpipe_resource *
110
llvmpipe_resource(struct pipe_resource *pt)
111
{
112
   return (struct llvmpipe_resource *) pt;
113
}
114
 
115
 
116
static INLINE const struct llvmpipe_resource *
117
llvmpipe_resource_const(const struct pipe_resource *pt)
118
{
119
   return (const struct llvmpipe_resource *) pt;
120
}
121
 
122
 
123
static INLINE struct llvmpipe_transfer *
124
llvmpipe_transfer(struct pipe_transfer *pt)
125
{
126
   return (struct llvmpipe_transfer *) pt;
127
}
128
 
129
 
130
void llvmpipe_init_screen_resource_funcs(struct pipe_screen *screen);
131
void llvmpipe_init_context_resource_funcs(struct pipe_context *pipe);
132
 
133
 
134
static INLINE boolean
135
llvmpipe_resource_is_texture(const struct pipe_resource *resource)
136
{
137
   switch (resource->target) {
138
   case PIPE_BUFFER:
139
      return FALSE;
140
   case PIPE_TEXTURE_1D:
141
   case PIPE_TEXTURE_1D_ARRAY:
142
   case PIPE_TEXTURE_2D:
143
   case PIPE_TEXTURE_2D_ARRAY:
144
   case PIPE_TEXTURE_RECT:
145
   case PIPE_TEXTURE_3D:
146
   case PIPE_TEXTURE_CUBE:
147
   case PIPE_TEXTURE_CUBE_ARRAY:
148
      return TRUE;
149
   default:
150
      assert(0);
151
      return FALSE;
152
   }
153
}
154
 
155
 
156
static INLINE boolean
157
llvmpipe_resource_is_1d(const struct pipe_resource *resource)
158
{
159
   switch (resource->target) {
160
   case PIPE_BUFFER:
161
   case PIPE_TEXTURE_1D:
162
   case PIPE_TEXTURE_1D_ARRAY:
163
      return TRUE;
164
   case PIPE_TEXTURE_2D:
165
   case PIPE_TEXTURE_2D_ARRAY:
166
   case PIPE_TEXTURE_RECT:
167
   case PIPE_TEXTURE_3D:
168
   case PIPE_TEXTURE_CUBE:
169
   case PIPE_TEXTURE_CUBE_ARRAY:
170
      return FALSE;
171
   default:
172
      assert(0);
173
      return FALSE;
174
   }
175
}
176
 
177
 
178
static INLINE unsigned
179
llvmpipe_layer_stride(struct pipe_resource *resource,
180
                      unsigned level)
181
{
182
   struct llvmpipe_resource *lpr = llvmpipe_resource(resource);
183
   assert(level < LP_MAX_TEXTURE_2D_LEVELS);
184
   return lpr->img_stride[level];
185
}
186
 
187
 
188
static INLINE unsigned
189
llvmpipe_resource_stride(struct pipe_resource *resource,
190
                         unsigned level)
191
{
192
   struct llvmpipe_resource *lpr = llvmpipe_resource(resource);
193
   assert(level < LP_MAX_TEXTURE_2D_LEVELS);
194
   return lpr->row_stride[level];
195
}
196
 
197
 
198
void *
199
llvmpipe_resource_map(struct pipe_resource *resource,
200
                      unsigned level,
201
                      unsigned layer,
202
                      enum lp_texture_usage tex_usage);
203
 
204
void
205
llvmpipe_resource_unmap(struct pipe_resource *resource,
206
                        unsigned level,
207
                        unsigned layer);
208
 
209
 
210
void *
211
llvmpipe_resource_data(struct pipe_resource *resource);
212
 
213
 
214
unsigned
215
llvmpipe_resource_size(const struct pipe_resource *resource);
216
 
217
 
218
ubyte *
219
llvmpipe_get_texture_image_address(struct llvmpipe_resource *lpr,
220
                                   unsigned face_slice, unsigned level);
221
 
222
 
223
extern void
224
llvmpipe_print_resources(void);
225
 
226
 
227
#define LP_UNREFERENCED         0
228
#define LP_REFERENCED_FOR_READ  (1 << 0)
229
#define LP_REFERENCED_FOR_WRITE (1 << 1)
230
 
231
unsigned int
232
llvmpipe_is_resource_referenced( struct pipe_context *pipe,
233
                                 struct pipe_resource *presource,
234
                                 unsigned level);
235
 
236
unsigned
237
llvmpipe_get_format_alignment(enum pipe_format format);
238
 
239
#endif /* LP_TEXTURE_H */