[Mesa-dev] [PATCH] graw: add a test rendering a huge triangle
Jose Fonseca
jfonseca at vmware.com
Fri Oct 25 15:20:06 CEST 2013
Looks good.
A future improvement could be querying PIPE_CAP_MAX_TEXTURE_2D_LEVELS instead of using a constant width/height.
Jose
----- Original Message -----
> Used to test rasterization, because we often breakdown on
> subdivision of triangles with long edges.
>
> Signed-off-by: Zack Rusin <zackr at vmware.com>
> ---
> src/gallium/tests/graw/SConscript | 1 +
> src/gallium/tests/graw/tri-large.c | 173
> +++++++++++++++++++++++++++++++++++++
> 2 files changed, 174 insertions(+)
> create mode 100644 src/gallium/tests/graw/tri-large.c
>
> diff --git a/src/gallium/tests/graw/SConscript
> b/src/gallium/tests/graw/SConscript
> index 8740ff3..8723807 100644
> --- a/src/gallium/tests/graw/SConscript
> +++ b/src/gallium/tests/graw/SConscript
> @@ -29,6 +29,7 @@ progs = [
> 'tex-srgb',
> 'tex-swizzle',
> 'tri',
> + 'tri-large',
> 'tri-gs',
> 'tri-instanced',
> 'vs-test',
> diff --git a/src/gallium/tests/graw/tri-large.c
> b/src/gallium/tests/graw/tri-large.c
> new file mode 100644
> index 0000000..3fbbfb3
> --- /dev/null
> +++ b/src/gallium/tests/graw/tri-large.c
> @@ -0,0 +1,173 @@
> +/* Display a cleared blue window. This demo has no dependencies on
> + * any utility code, just the graw interface and gallium.
> + */
> +
> +#include "graw_util.h"
> +#include "util/u_debug.h"
> +
> +#include <stdio.h>
> +
> +static struct graw_info info;
> +
> +static const int WIDTH = 4*2048;
> +static const int HEIGHT = 4*2048;
> +
> +
> +struct vertex {
> + float position[4];
> + float color[4];
> +};
> +
> +static boolean FlatShade = FALSE;
> +
> +
> +static struct vertex vertices[3] =
> +{
> + {
> + { -1.0f, -1.0f, 0.0f, 1.0f },
> + { 1.0f, 0.0f, 0.0f, 1.0f }
> + },
> + {
> + { -1.0f, 1.0f, 0.0f, 1.0f },
> + { 0.0f, 1.0f, 0.0f, 1.0f }
> + },
> + {
> + { 1.0f, 1.0f, 0.0f, 1.0f },
> + { 0.0f, 0.0f, 1.0f, 1.0f }
> + }
> +};
> +
> +
> +static void set_vertices( void )
> +{
> + struct pipe_vertex_element ve[2];
> + struct pipe_vertex_buffer vbuf;
> + void *handle;
> +
> + memset(ve, 0, sizeof ve);
> +
> + ve[0].src_offset = Offset(struct vertex, position);
> + ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
> + ve[1].src_offset = Offset(struct vertex, color);
> + ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
> +
> + handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve);
> + info.ctx->bind_vertex_elements_state(info.ctx, handle);
> +
> + memset(&vbuf, 0, sizeof vbuf);
> +
> + vbuf.stride = sizeof( struct vertex );
> + vbuf.buffer_offset = 0;
> + vbuf.buffer = pipe_buffer_create_with_data(info.ctx,
> + PIPE_BIND_VERTEX_BUFFER,
> + PIPE_USAGE_STATIC,
> + sizeof(vertices),
> + vertices);
> +
> + info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf);
> +}
> +
> +
> +static void set_vertex_shader( void )
> +{
> + void *handle;
> + const char *text =
> + "VERT\n"
> + "DCL IN[0]\n"
> + "DCL IN[1]\n"
> + "DCL OUT[0], POSITION\n"
> + "DCL OUT[1], COLOR\n"
> + " 0: MOV OUT[1], IN[1]\n"
> + " 1: MOV OUT[0], IN[0]\n"
> + " 2: END\n";
> +
> + handle = graw_parse_vertex_shader(info.ctx, text);
> + info.ctx->bind_vs_state(info.ctx, handle);
> +}
> +
> +
> +static void set_fragment_shader( void )
> +{
> + void *handle;
> + const char *text =
> + "FRAG\n"
> + "DCL IN[0], COLOR, LINEAR\n"
> + "DCL OUT[0], COLOR\n"
> + " 0: MOV OUT[0], IN[0]\n"
> + " 1: END\n";
> +
> + handle = graw_parse_fragment_shader(info.ctx, text);
> + info.ctx->bind_fs_state(info.ctx, handle);
> +}
> +
> +
> +static void draw( void )
> +{
> + union pipe_color_union clear_color = { {1,0,1,1} };
> +
> + info.ctx->clear(info.ctx, PIPE_CLEAR_COLOR, &clear_color, 0, 0);
> + util_draw_arrays(info.ctx, PIPE_PRIM_TRIANGLES, 0, 3);
> + info.ctx->flush(info.ctx, NULL, 0);
> +
> + graw_save_surface_to_file(info.ctx, info.color_surf[0], NULL);
> +
> + graw_util_flush_front(&info);
> +}
> +
> +
> +static void init( void )
> +{
> + if (!graw_util_create_window(&info, WIDTH, HEIGHT, 1, FALSE))
> + exit(1);
> +
> + graw_util_default_state(&info, FALSE);
> +
> + {
> + struct pipe_rasterizer_state rasterizer;
> + void *handle;
> + memset(&rasterizer, 0, sizeof rasterizer);
> + rasterizer.cull_face = PIPE_FACE_NONE;
> + rasterizer.half_pixel_center = 1;
> + rasterizer.bottom_edge_rule = 1;
> + rasterizer.flatshade = FlatShade;
> + rasterizer.depth_clip = 1;
> + handle = info.ctx->create_rasterizer_state(info.ctx, &rasterizer);
> + info.ctx->bind_rasterizer_state(info.ctx, handle);
> + }
> +
> +
> + graw_util_viewport(&info, 0, 0, WIDTH, HEIGHT, 30, 1000);
> +
> + set_vertices();
> + set_vertex_shader();
> + set_fragment_shader();
> +}
> +
> +static void args(int argc, char *argv[])
> +{
> + int i;
> +
> + for (i = 1; i < argc; ) {
> + if (graw_parse_args(&i, argc, argv)) {
> + /* ok */
> + }
> + else if (strcmp(argv[i], "-f") == 0) {
> + FlatShade = TRUE;
> + i++;
> + }
> + else {
> + printf("Invalid arg %s\n", argv[i]);
> + exit(1);
> + }
> + }
> +}
> +
> +int main( int argc, char *argv[] )
> +{
> + args(argc, argv);
> + init();
> +
> + graw_set_display_func( draw );
> + graw_main_loop();
> + return 0;
> +}
> --
> 1.8.3.2
>
More information about the mesa-dev
mailing list