python: Get the sample app to draw triangle like trivial/tri exanple.
[mesa.git] / src / gallium / state_trackers / 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 save_image(filename, surface):
34 pixels = FloatArray(surface.height*surface.width*4)
35 surface.get_tile_rgba(0, 0, surface.width, surface.height, pixels)
36
37 import Image
38 outimage = Image.new(
39 mode='RGB',
40 size=(surface.width, surface.height),
41 color=(0,0,0))
42 outpixels = outimage.load()
43 for y in range(0, surface.height):
44 for x in range(0, surface.width):
45 offset = (y*surface.width + x)*4
46 r, g, b, a = [int(pixels[offset + ch]*255) for ch in range(4)]
47 outpixels[x, y] = r, g, b
48 outimage.save(filename, "PNG")
49
50
51 def test(dev):
52 ctx = dev.context_create()
53
54 width = 256
55 height = 256
56
57 # disabled blending/masking
58 blend = Blend()
59 blend.rgb_src_factor = PIPE_BLENDFACTOR_ONE
60 blend.alpha_src_factor = PIPE_BLENDFACTOR_ONE
61 blend.rgb_dst_factor = PIPE_BLENDFACTOR_ZERO
62 blend.alpha_dst_factor = PIPE_BLENDFACTOR_ZERO
63 blend.colormask = PIPE_MASK_RGBA
64 ctx.set_blend(blend)
65
66 # no-op depth/stencil/alpha
67 depth_stencil_alpha = DepthStencilAlpha()
68 ctx.set_depth_stencil_alpha(depth_stencil_alpha)
69
70 # rasterizer
71 rasterizer = Rasterizer()
72 rasterizer.front_winding = PIPE_WINDING_CW
73 rasterizer.cull_mode = PIPE_WINDING_NONE
74 rasterizer.bypass_clipping = 1
75 #rasterizer.bypass_vs = 1
76 ctx.set_rasterizer(rasterizer)
77
78 # viewport (identity, we setup vertices in wincoords)
79 viewport = Viewport()
80 scale = FloatArray(4)
81 scale[0] = 1.0
82 scale[1] = 1.0
83 scale[2] = 1.0
84 scale[3] = 1.0
85 viewport.scale = scale
86 translate = FloatArray(4)
87 translate[0] = 0.0
88 translate[1] = 0.0
89 translate[2] = 0.0
90 translate[3] = 0.0
91 viewport.translate = translate
92 ctx.set_viewport(viewport)
93
94 # samplers
95 sampler = Sampler()
96 sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE
97 sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE
98 sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE
99 sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE
100 sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST
101 sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST
102 sampler.normalized_coords = 1
103 ctx.set_sampler(0, sampler)
104
105 # texture
106 texture = dev.texture_create(PIPE_FORMAT_A8R8G8B8_UNORM,
107 width, height,
108 usage=PIPE_TEXTURE_USAGE_RENDER_TARGET)
109 ctx.set_sampler_texture(0, texture)
110
111 # drawing dest
112 surface = texture.get_surface(usage = PIPE_BUFFER_USAGE_GPU_WRITE)
113 fb = Framebuffer()
114 fb.width = surface.width
115 fb.height = surface.height
116 fb.num_cbufs = 1
117 fb.set_cbuf(0, surface)
118 ctx.set_framebuffer(fb)
119
120 # vertex shader
121 vs = Shader('''
122 VERT1.1
123 DCL IN[0], POSITION, CONSTANT
124 DCL IN[1], COLOR, CONSTANT
125 DCL OUT[0], POSITION, CONSTANT
126 DCL OUT[1], COLOR, CONSTANT
127 0:MOV OUT[0], IN[0]
128 1:MOV OUT[1], IN[1]
129 2:END
130 ''')
131 #vs.dump()
132 ctx.set_vertex_shader(vs)
133
134 # fragment shader
135 fs = Shader('''
136 FRAG1.1
137 DCL IN[0], COLOR, LINEAR
138 DCL OUT[0], COLOR, CONSTANT
139 0:MOV OUT[0], IN[0]
140 1:END
141 ''')
142 #fs.dump()
143 ctx.set_fragment_shader(fs)
144
145 nverts = 3
146 nattrs = 2
147 verts = FloatArray(nverts * nattrs * 4)
148
149 verts[ 0] = 128.0 # x1
150 verts[ 1] = 32.0 # y1
151 verts[ 2] = 0.0 # z1
152 verts[ 3] = 1.0 # w1
153 verts[ 4] = 1.0 # r1
154 verts[ 5] = 0.0 # g1
155 verts[ 6] = 0.0 # b1
156 verts[ 7] = 1.0 # a1
157 verts[ 8] = 32.0 # x2
158 verts[ 9] = 224.0 # y2
159 verts[10] = 0.0 # z2
160 verts[11] = 1.0 # w2
161 verts[12] = 0.0 # r2
162 verts[13] = 1.0 # g2
163 verts[14] = 0.0 # b2
164 verts[15] = 1.0 # a2
165 verts[16] = 224.0 # x3
166 verts[17] = 224.0 # y3
167 verts[18] = 0.0 # z3
168 verts[19] = 1.0 # w3
169 verts[20] = 0.0 # r3
170 verts[21] = 0.0 # g3
171 verts[22] = 1.0 # b3
172 verts[23] = 1.0 # a3
173
174 ctx.surface_clear(surface, 0x00000000)
175
176 ctx.draw_vertices(PIPE_PRIM_TRIANGLES,
177 nverts,
178 nattrs,
179 verts)
180
181 ctx.flush()
182
183 save_image("tri.png", surface)
184
185
186
187 def main():
188 dev = Device(hardware = False)
189 test(dev)
190
191
192 if __name__ == '__main__':
193 main()