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