gallium/auxiliary: add dynamically sized buffer/array/vector
[mesa.git] / progs / gallium / python / samples / tri.py
1 #!/usr/bin/env python
2 ##########################################################################
3 #
4 # Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
5 # All Rights Reserved.
6 #
7 # Permission is hereby granted, free of charge, to any person obtaining a
8 # copy of this software and associated documentation files (the
9 # "Software"), to deal in the Software without restriction, including
10 # without limitation the rights to use, copy, modify, merge, publish,
11 # distribute, sub license, and/or sell copies of the Software, and to
12 # permit persons to whom the Software is furnished to do so, subject to
13 # the following conditions:
14 #
15 # The above copyright notice and this permission notice (including the
16 # next paragraph) shall be included in all copies or substantial portions
17 # of the Software.
18 #
19 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22 # IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23 # ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24 # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25 # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #
27 ##########################################################################
28
29
30 from gallium import *
31
32
33 def make_image(ctx, surface):
34 data = ctx.surface_read_rgba8(surface, 0, 0, surface.width, surface.height)
35
36 import Image
37 outimage = Image.fromstring('RGBA', (surface.width, surface.height), data, "raw", 'RGBA', 0, 1)
38 return outimage
39
40 def save_image(ctx, surface, filename):
41 outimage = make_image(ctx, surface)
42 outimage.save(filename, "PNG")
43
44 def show_image(ctx, surface):
45 outimage = make_image(ctx, surface)
46
47 import Tkinter as tk
48 from PIL import Image, ImageTk
49 root = tk.Tk()
50
51 root.title('background image')
52
53 image1 = ImageTk.PhotoImage(outimage)
54 w = image1.width()
55 h = image1.height()
56 x = 100
57 y = 100
58 root.geometry("%dx%d+%d+%d" % (w, h, x, y))
59 panel1 = tk.Label(root, image=image1)
60 panel1.pack(side='top', fill='both', expand='yes')
61 panel1.image = image1
62 root.mainloop()
63
64
65 def test(dev):
66 ctx = dev.context_create()
67
68 width = 255
69 height = 255
70 minz = 0.0
71 maxz = 1.0
72
73 # disabled blending/masking
74 blend = Blend()
75 blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE
76 blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE
77 blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO
78 blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO
79 blend.rt[0].colormask = PIPE_MASK_RGBA
80 ctx.set_blend(blend)
81
82 # depth/stencil/alpha
83 depth_stencil_alpha = DepthStencilAlpha()
84 depth_stencil_alpha.depth.enabled = 1
85 depth_stencil_alpha.depth.writemask = 1
86 depth_stencil_alpha.depth.func = PIPE_FUNC_LESS
87 ctx.set_depth_stencil_alpha(depth_stencil_alpha)
88
89 # rasterizer
90 rasterizer = Rasterizer()
91 rasterizer.front_winding = PIPE_WINDING_CW
92 rasterizer.cull_mode = PIPE_WINDING_NONE
93 rasterizer.scissor = 1
94 ctx.set_rasterizer(rasterizer)
95
96 # viewport
97 viewport = Viewport()
98 scale = FloatArray(4)
99 scale[0] = width / 2.0
100 scale[1] = -height / 2.0
101 scale[2] = (maxz - minz) / 2.0
102 scale[3] = 1.0
103 viewport.scale = scale
104 translate = FloatArray(4)
105 translate[0] = width / 2.0
106 translate[1] = height / 2.0
107 translate[2] = (maxz - minz) / 2.0
108 translate[3] = 0.0
109 viewport.translate = translate
110 ctx.set_viewport(viewport)
111
112 # samplers
113 sampler = Sampler()
114 sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE
115 sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE
116 sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE
117 sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE
118 sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST
119 sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST
120 sampler.normalized_coords = 1
121 ctx.set_fragment_sampler(0, sampler)
122
123 # scissor
124 scissor = Scissor()
125 scissor.minx = 0
126 scissor.miny = 0
127 scissor.maxx = width
128 scissor.maxy = height
129 ctx.set_scissor(scissor)
130
131 # clip
132 clip = Clip()
133 clip.nr = 0
134 ctx.set_clip(clip)
135
136 # framebuffer
137 cbuf = dev.resource_create(
138 PIPE_FORMAT_B8G8R8X8_UNORM,
139 width, height,
140 bind=PIPE_BIND_RENDER_TARGET,
141 ).get_surface()
142 zbuf = dev.resource_create(
143 PIPE_FORMAT_Z32_UNORM,
144 width, height,
145 bind=PIPE_BIND_DEPTH_STENCIL,
146 ).get_surface()
147 fb = Framebuffer()
148 fb.width = width
149 fb.height = height
150 fb.nr_cbufs = 1
151 fb.set_cbuf(0, cbuf)
152 fb.set_zsbuf(zbuf)
153 ctx.set_framebuffer(fb)
154 rgba = FloatArray(4);
155 rgba[0] = 0.0
156 rgba[1] = 0.0
157 rgba[2] = 0.0
158 rgba[3] = 0.0
159 ctx.clear(PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL, rgba, 1.0, 0xff)
160
161 # vertex shader
162 vs = Shader('''
163 VERT
164 DCL IN[0], POSITION, CONSTANT
165 DCL IN[1], COLOR, CONSTANT
166 DCL OUT[0], POSITION, CONSTANT
167 DCL OUT[1], COLOR, CONSTANT
168 0:MOV OUT[0], IN[0]
169 1:MOV OUT[1], IN[1]
170 2:END
171 ''')
172 ctx.set_vertex_shader(vs)
173
174 # fragment shader
175 fs = Shader('''
176 FRAG
177 DCL IN[0], COLOR, LINEAR
178 DCL OUT[0], COLOR, CONSTANT
179 0:MOV OUT[0], IN[0]
180 1:END
181 ''')
182 ctx.set_fragment_shader(fs)
183
184 nverts = 3
185 nattrs = 2
186 verts = FloatArray(nverts * nattrs * 4)
187
188 verts[ 0] = 0.0 # x1
189 verts[ 1] = 0.8 # y1
190 verts[ 2] = 0.2 # z1
191 verts[ 3] = 1.0 # w1
192 verts[ 4] = 1.0 # r1
193 verts[ 5] = 0.0 # g1
194 verts[ 6] = 0.0 # b1
195 verts[ 7] = 1.0 # a1
196 verts[ 8] = -0.8 # x2
197 verts[ 9] = -0.8 # y2
198 verts[10] = 0.5 # z2
199 verts[11] = 1.0 # w2
200 verts[12] = 0.0 # r2
201 verts[13] = 1.0 # g2
202 verts[14] = 0.0 # b2
203 verts[15] = 1.0 # a2
204 verts[16] = 0.8 # x3
205 verts[17] = -0.8 # y3
206 verts[18] = 0.8 # z3
207 verts[19] = 1.0 # w3
208 verts[20] = 0.0 # r3
209 verts[21] = 0.0 # g3
210 verts[22] = 1.0 # b3
211 verts[23] = 1.0 # a3
212
213 ctx.draw_vertices(PIPE_PRIM_TRIANGLES,
214 nverts,
215 nattrs,
216 verts)
217
218 ctx.flush()
219
220 show_image(ctx, cbuf)
221 show_image(ctx, zbuf)
222 save_image(ctx, cbuf, 'cbuf.png')
223 save_image(ctx, zbuf, 'zbuf.png')
224
225
226
227 def main():
228 dev = Device()
229 test(dev)
230
231
232 if __name__ == '__main__':
233 main()