diff options
| author | José Fonseca <jrfonseca@tungstengraphics.com> | 2008-07-13 23:36:59 +0900 | 
|---|---|---|
| committer | José Fonseca <jrfonseca@tungstengraphics.com> | 2008-07-13 23:37:40 +0900 | 
| commit | 6410e94b966148dde81b5121e53a250d7b530d91 (patch) | |
| tree | f31e0c0f9a75419546a8bf7d28ab309da3eeb02c /src/gallium/state_trackers/python/samples | |
| parent | 36dd89c8a7f2a911e8f7f18d1edcaf982a75a438 (diff) | |
python: New state tracker which exposes the pipe driver to python scripts.
Still under development. Just barely works.
Diffstat (limited to 'src/gallium/state_trackers/python/samples')
| -rw-r--r-- | src/gallium/state_trackers/python/samples/simple.py | 158 | 
1 files changed, 158 insertions, 0 deletions
| diff --git a/src/gallium/state_trackers/python/samples/simple.py b/src/gallium/state_trackers/python/samples/simple.py new file mode 100644 index 0000000000..77e182b644 --- /dev/null +++ b/src/gallium/state_trackers/python/samples/simple.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python +########################################################################## +#  +# Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas. +# All Rights Reserved. +#  +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sub license, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +#  +# The above copyright notice and this permission notice (including the +# next paragraph) shall be included in all copies or substantial portions +# of the Software. +#  +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +# IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR +# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +#  +########################################################################## + + +from gallium import * + + +def save_image(filename, surface): +    pixels = FloatArray(surface.height*surface.width*4) +    surface.get_tile_rgba(0, 0, surface.width, surface.height, pixels) + +    import Image +    outimage = Image.new( +        mode='RGB', +        size=(surface.width, surface.height), +        color=(0,0,0)) +    outpixels = outimage.load() +    for y in range(0, surface.height): +        for x in range(0, surface.width): +            offset = (y*surface.width + x)*4 +            r, g, b, a = [int(pixels[offset + ch]*255) for ch in range(4)] +            outpixels[x, y] = r, g, b +    outimage.save(filename, "PNG") + + +def test(dev): +    ctx = dev.context_create() + +    width = 256 +    height = 256 + +    # disabled blending/masking +    blend = Blend() +    blend.rgb_src_factor = PIPE_BLENDFACTOR_ONE +    blend.alpha_src_factor = PIPE_BLENDFACTOR_ONE +    blend.rgb_dst_factor = PIPE_BLENDFACTOR_ZERO +    blend.alpha_dst_factor = PIPE_BLENDFACTOR_ZERO +    blend.colormask = PIPE_MASK_RGBA +    ctx.set_blend(blend) + +    # no-op depth/stencil/alpha +    depth_stencil_alpha = DepthStencilAlpha() +    ctx.set_depth_stencil_alpha(depth_stencil_alpha) + +    # rasterizer +    rasterizer = Rasterizer() +    rasterizer.front_winding = PIPE_WINDING_CW +    rasterizer.cull_mode = PIPE_WINDING_NONE +    rasterizer.bypass_clipping = 1 +    #rasterizer.bypass_vs = 1 +    ctx.set_rasterizer(rasterizer) + +    # viewport (identity, we setup vertices in wincoords) +    viewport = Viewport() +    scale = FloatArray(4) +    scale[0] = 1.0 +    scale[1] = 1.0 +    scale[2] = 1.0 +    scale[3] = 1.0 +    viewport.scale = scale +    translate = FloatArray(4) +    translate[0] = 0.0 +    translate[1] = 0.0 +    translate[2] = 0.0 +    translate[3] = 0.0 +    viewport.translate = translate +    ctx.set_viewport(viewport) + +    # samplers +    sampler = Sampler() +    sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE +    sampler.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE +    sampler.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE +    sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NONE +    sampler.min_img_filter = PIPE_TEX_MIPFILTER_NEAREST +    sampler.mag_img_filter = PIPE_TEX_MIPFILTER_NEAREST +    sampler.normalized_coords = 1 +    ctx.set_sampler(0, sampler) + +    #  texture  +    texture = dev.texture_create(PIPE_FORMAT_A8R8G8B8_UNORM, width, height, usage=PIPE_TEXTURE_USAGE_RENDER_TARGET) +    ctx.set_sampler_texture(0, texture) + +    #  drawing dest  +    surface = texture.get_surface(usage = PIPE_BUFFER_USAGE_GPU_WRITE) +    fb = Framebuffer() +    fb.width = surface.width +    fb.height = surface.height +    fb.num_cbufs = 1 +    fb.set_cbuf(0, surface) +    ctx.set_framebuffer(fb) + +    # vertex shader +    # vs = Shader() +    #ctx.set_vertex_shader(vs) + +    # fragment shader +    #fs = Shader() +    #ctx.set_fragment_shader(fs) + +    if 0: +        nverts = 4 +        nattrs = 1 +        vertices = FloatArray(n_verts * nattrs * 4) + +        # init vertex data that doesn't change +        for i in range(nverts): +            for j in range(nattrs): +                vertices[(i*nattrs +j)*4 + 0] = 0.0 +                vertices[(i*nattrs +j)*4 + 1] = 0.0 +                vertices[(i*nattrs +j)*4 + 2] = 0.0 +                vertices[(i*nattrs +j)*4 + 3] = 0.0 + +        ctx.draw_vertices(PIPE_PRIM_TRIANGLE_FAN, +                          4,  #  verts  +                          2, #  attribs/vert  +                          vertices) +    else: +        ctx.draw_quad(32.0, 32.0, 224.0, 224.0) + +    ctx.flush() + +    save_image("simple.png", surface) + + + +def main(): +    dev = Device(0) +    test(dev) + + +if __name__ == '__main__': +    main() | 
