1 /**************************************************************************
3 * Copyright
2008 Tungsten Graphics
, Inc.
, Cedar Park
, Texas.
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
:
14 * The above copyright notice and this permission notice
(including the
15 * next paragraph
) shall be included in all copies or substantial portions
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 TUNGSTEN GRAPHICS
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.
26 **************************************************************************/
30 * SWIG interface definion for Gallium types.
32 * @author Jose Fonseca
<jrfonseca@tungstengraphics.com
>
36 %nodefaultctor pipe_texture
;
37 %nodefaultctor st_surface
;
38 %nodefaultctor pipe_buffer
;
40 %nodefaultdtor pipe_texture
;
41 %nodefaultdtor st_surface
;
42 %nodefaultdtor pipe_buffer
;
44 %ignore pipe_texture
::screen
;
46 %immutable st_surface
::texture
;
47 %immutable st_surface
::face
;
48 %immutable st_surface
::level
;
49 %immutable st_surface
::zslice
;
51 %newobject pipe_texture
::get_surface
;
54 %extend pipe_texture
{
57 struct pipe_texture
*ptr
= $self
;
58 pipe_texture_reference
(&ptr, NULL);
61 unsigned get_width
(unsigned level
=0) {
62 return u_minify
($self-
>width0
, level
);
65 unsigned get_height
(unsigned level
=0) {
66 return u_minify
($self-
>height0
, level
);
69 unsigned get_depth
(unsigned level
=0) {
70 return u_minify
($self-
>depth0
, level
);
73 /** Get a surface which is a
"view" into a texture
*/
75 get_surface
(unsigned face
=0, unsigned level
=0, unsigned zslice
=0)
77 struct st_surface
*surface
;
79 if
(face
>= ($self-
>target
== PIPE_TEXTURE_CUBE ?
6U : 1U))
80 SWIG_exception
(SWIG_ValueError
, "face out of bounds");
81 if
(level
> $self-
>last_level
)
82 SWIG_exception
(SWIG_ValueError
, "level out of bounds");
83 if
(zslice
>= u_minify
($self-
>depth0
, level
))
84 SWIG_exception
(SWIG_ValueError
, "zslice out of bounds");
86 surface
= CALLOC_STRUCT
(st_surface
);
90 pipe_texture_reference
(&surface->texture, $self);
92 surface-
>level
= level
;
93 surface-
>zslice
= zslice
;
107 struct pipe_texture
*texture
;
123 pipe_texture_reference
(&$self->texture, NULL);
127 %cstring_output_allocate_size
(char
**STRING, int
*LENGTH, free
(*$
1));
128 void get_tile_raw
(unsigned x
, unsigned y
, unsigned w
, unsigned h
, char
**STRING, int
*LENGTH)
130 struct pipe_texture
*texture
= $self-
>texture
;
131 struct pipe_screen
*screen
= texture-
>screen
;
132 struct pipe_transfer
*transfer
;
135 stride
= util_format_get_stride
(texture-
>format
, w
);
136 *LENGTH = util_format_get_nblocksy
(texture-
>format
, h
) * stride
;
137 *STRING = (char
*) malloc
(*LENGTH);
141 transfer
= screen-
>get_tex_transfer
(screen
,
149 pipe_get_tile_raw
(transfer
, 0, 0, w
, h
, *STRING, stride
);
150 screen-
>tex_transfer_destroy
(transfer
);
154 %cstring_input_binary
(const char
*STRING, unsigned
LENGTH);
155 void put_tile_raw
(unsigned x
, unsigned y
, unsigned w
, unsigned h
, const char
*STRING, unsigned
LENGTH, unsigned stride
= 0)
157 struct pipe_texture
*texture
= $self-
>texture
;
158 struct pipe_screen
*screen
= texture-
>screen
;
159 struct pipe_transfer
*transfer
;
162 stride
= util_format_get_stride
(texture-
>format
, w
);
164 if
(LENGTH < util_format_get_nblocksy
(texture-
>format
, h
) * stride
)
165 SWIG_exception
(SWIG_ValueError
, "offset must be smaller than buffer size");
167 transfer
= screen-
>get_tex_transfer
(screen
,
175 SWIG_exception
(SWIG_MemoryError
, "couldn't initiate transfer");
177 pipe_put_tile_raw
(transfer
, 0, 0, w
, h
, STRING, stride
);
178 screen-
>tex_transfer_destroy
(transfer
);
185 get_tile_rgba
(unsigned x
, unsigned y
, unsigned w
, unsigned h
, float
*rgba
)
187 struct pipe_screen
*screen
= $self-
>texture-
>screen
;
188 struct pipe_transfer
*transfer
;
189 transfer
= screen-
>get_tex_transfer
(screen
,
197 pipe_get_tile_rgba
(transfer
, 0, 0, w
, h
, rgba
);
198 screen-
>tex_transfer_destroy
(transfer
);
203 put_tile_rgba
(unsigned x
, unsigned y
, unsigned w
, unsigned h
, const float
*rgba
)
205 struct pipe_screen
*screen
= $self-
>texture-
>screen
;
206 struct pipe_transfer
*transfer
;
207 transfer
= screen-
>get_tex_transfer
(screen
,
215 pipe_put_tile_rgba
(transfer
, 0, 0, w
, h
, rgba
);
216 screen-
>tex_transfer_destroy
(transfer
);
220 %cstring_output_allocate_size
(char
**STRING, int
*LENGTH, free
(*$
1));
222 get_tile_rgba8
(unsigned x
, unsigned y
, unsigned w
, unsigned h
, char
**STRING, int
*LENGTH)
224 struct pipe_screen
*screen
= $self-
>texture-
>screen
;
225 struct pipe_transfer
*transfer
;
227 unsigned char
*rgba8
;
237 *STRING = (char
*) malloc
(*LENGTH);
241 rgba
= malloc
(h
*w
*4*sizeof
(float
));
245 rgba8
= (unsigned char
*) *STRING;
247 transfer
= screen-
>get_tex_transfer
(screen
,
256 pipe_get_tile_rgba
(transfer
, 0, 0, w
, h
, rgba
);
257 for
(j
= 0; j
< h
; ++j
) {
258 for
(i
= 0; i
< w
; ++i
)
259 for
(k
= 0; k
<4; ++k
)
260 rgba8
[j
*w
*4 + i
*4 + k
] = float_to_ubyte
(rgba
[j
*w
*4 + i
*4 + k
]);
262 screen-
>tex_transfer_destroy
(transfer
);
269 get_tile_z
(unsigned x
, unsigned y
, unsigned w
, unsigned h
, unsigned
*z
)
271 struct pipe_screen
*screen
= $self-
>texture-
>screen
;
272 struct pipe_transfer
*transfer
;
273 transfer
= screen-
>get_tex_transfer
(screen
,
281 pipe_get_tile_z
(transfer
, 0, 0, w
, h
, z
);
282 screen-
>tex_transfer_destroy
(transfer
);
287 put_tile_z
(unsigned x
, unsigned y
, unsigned w
, unsigned h
, const unsigned
*z
)
289 struct pipe_screen
*screen
= $self-
>texture-
>screen
;
290 struct pipe_transfer
*transfer
;
291 transfer
= screen-
>get_tex_transfer
(screen
,
299 pipe_put_tile_z
(transfer
, 0, 0, w
, h
, z
);
300 screen-
>tex_transfer_destroy
(transfer
);
305 sample_rgba
(float
*rgba
) {
306 st_sample_surface
($self
, rgba
);
310 compare_tile_rgba
(unsigned x
, unsigned y
, unsigned w
, unsigned h
, const float
*rgba
, float tol
= 0.0)
312 struct pipe_screen
*screen
= $self-
>texture-
>screen
;
313 struct pipe_transfer
*transfer
;
319 rgba2
= MALLOC
(h
*w
*4*sizeof
(float
));
323 transfer
= screen-
>get_tex_transfer
(screen
,
335 pipe_get_tile_rgba
(transfer
, 0, 0, w
, h
, rgba2
);
336 screen-
>tex_transfer_destroy
(transfer
);
341 for
(i
= h
*w
; i
; --i
) {
342 unsigned differs
= 0;
344 float delta
= *p2
++ - *p1
++;
345 if
(delta
< -tol || delta
> tol
)
359 static enum pipe_format
360 st_surface_format_get
(struct st_surface
*surface
)
362 return surface-
>texture-
>format
;
366 st_surface_width_get
(struct st_surface
*surface
)
368 return u_minify
(surface-
>texture-
>width0
, surface-
>level
);
372 st_surface_height_get
(struct st_surface
*surface
)
374 return u_minify
(surface-
>texture-
>height0
, surface-
>level
);
378 /* Avoid naming conflict with p_inlines.h's pipe_buffer_read
/write
*/
380 %rename
(write
) write_
;
382 %extend pipe_buffer
{
385 struct pipe_buffer
*ptr
= $self
;
386 pipe_buffer_reference
(&ptr, NULL);
389 unsigned __len__
(void
)
391 assert
(p_atomic_read
(&$self->reference.count) > 0);
395 %cstring_output_allocate_size
(char
**STRING, int
*LENGTH, free
(*$
1));
396 void read_
(char
**STRING, int
*LENGTH)
398 struct pipe_screen
*screen
= $self-
>screen
;
400 assert
(p_atomic_read
(&$self->reference.count) > 0);
402 *LENGTH = $self-
>size
;
403 *STRING = (char
*) malloc
($self-
>size
);
407 pipe_buffer_read
(screen
, $self
, 0, $self-
>size
, *STRING);
410 %cstring_input_binary
(const char
*STRING, unsigned
LENGTH);
411 void write_
(const char
*STRING, unsigned
LENGTH, unsigned offset
= 0)
413 struct pipe_screen
*screen
= $self-
>screen
;
415 assert
(p_atomic_read
(&$self->reference.count) > 0);
417 if
(offset
> $self-
>size
)
418 SWIG_exception
(SWIG_ValueError
, "offset must be smaller than buffer size");
420 if
(offset
+ LENGTH > $self-
>size
)
421 SWIG_exception
(SWIG_ValueError
, "data length must fit inside the buffer");
423 pipe_buffer_write
(screen
, $self
, offset
, LENGTH, STRING);