1/* Display a cleared blue window. This demo has no dependencies on 2 * any utility code, just the graw interface and gallium. 3 */ 4 5#include <stdio.h> 6#include "frontend/graw.h" 7#include "pipe/p_screen.h" 8#include "pipe/p_context.h" 9#include "pipe/p_state.h" 10#include "pipe/p_defines.h" 11 12enum pipe_format formats[] = { 13 PIPE_FORMAT_RGBA8888_UNORM, 14 PIPE_FORMAT_BGRA8888_UNORM, 15 PIPE_FORMAT_NONE 16}; 17 18static const int WIDTH = 300; 19static const int HEIGHT = 300; 20 21struct pipe_screen *screen; 22struct pipe_context *ctx; 23struct pipe_surface *surf; 24struct pipe_resource *tex; 25static void *window = NULL; 26 27static void draw( void ) 28{ 29 union pipe_color_union clear_color = { {1, 0, 1, 1} }; 30 31 ctx->clear(ctx, PIPE_CLEAR_COLOR, NULL, &clear_color, 0, 0); 32 ctx->flush(ctx, NULL, 0); 33 34 graw_save_surface_to_file(ctx, surf, NULL); 35 36 screen->flush_frontbuffer(screen, ctx, tex, 0, 0, window, NULL); 37} 38 39static void init( void ) 40{ 41 struct pipe_framebuffer_state fb; 42 struct pipe_resource templat; 43 struct pipe_surface surf_tmpl; 44 int i; 45 46 /* It's hard to say whether window or screen should be created 47 * first. Different environments would prefer one or the other. 48 * 49 * Also, no easy way of querying supported formats if the screen 50 * cannot be created first. 51 */ 52 for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) { 53 screen = graw_create_window_and_screen(0, 0, 300, 300, 54 formats[i], 55 &window); 56 if (window && screen) 57 break; 58 } 59 if (!screen || !window) { 60 fprintf(stderr, "Unable to create window\n"); 61 exit(1); 62 } 63 64 ctx = screen->context_create(screen, NULL, 0); 65 if (ctx == NULL) 66 exit(3); 67 68 memset(&templat, 0, sizeof(templat)); 69 templat.target = PIPE_TEXTURE_2D; 70 templat.format = formats[i]; 71 templat.width0 = WIDTH; 72 templat.height0 = HEIGHT; 73 templat.depth0 = 1; 74 templat.array_size = 1; 75 templat.last_level = 0; 76 templat.bind = (PIPE_BIND_RENDER_TARGET | 77 PIPE_BIND_DISPLAY_TARGET); 78 79 tex = screen->resource_create(screen, 80 &templat); 81 if (tex == NULL) 82 exit(4); 83 84 surf_tmpl.format = templat.format; 85 surf_tmpl.u.tex.level = 0; 86 surf_tmpl.u.tex.first_layer = 0; 87 surf_tmpl.u.tex.last_layer = 0; 88 surf = ctx->create_surface(ctx, tex, &surf_tmpl); 89 if (surf == NULL) 90 exit(5); 91 92 memset(&fb, 0, sizeof fb); 93 fb.nr_cbufs = 1; 94 fb.width = WIDTH; 95 fb.height = HEIGHT; 96 fb.cbufs[0] = surf; 97 98 ctx->set_framebuffer_state(ctx, &fb); 99} 100 101static void args(int argc, char *argv[]) 102{ 103 int i; 104 105 for (i = 1; i < argc;) { 106 if (graw_parse_args(&i, argc, argv)) { 107 continue; 108 } 109 exit(1); 110 } 111} 112 113int main( int argc, char *argv[] ) 114{ 115 args(argc, argv); 116 init(); 117 118 graw_set_display_func( draw ); 119 graw_main_loop(); 120 return 0; 121} 122