1848b8605Smrg/* Display a cleared blue window. This demo has no dependencies on 2848b8605Smrg * any utility code, just the graw interface and gallium. 3848b8605Smrg */ 4848b8605Smrg 5848b8605Smrg#include <stdio.h> 6848b8605Smrg#include "state_tracker/graw.h" 7848b8605Smrg#include "pipe/p_screen.h" 8848b8605Smrg#include "pipe/p_context.h" 9848b8605Smrg#include "pipe/p_state.h" 10848b8605Smrg#include "pipe/p_defines.h" 11848b8605Smrg 12848b8605Smrg#include "util/u_memory.h" /* Offset() */ 13848b8605Smrg#include "util/u_draw_quad.h" 14848b8605Smrg#include "util/u_inlines.h" 15848b8605Smrg 16848b8605Smrgenum pipe_format formats[] = { 17848b8605Smrg PIPE_FORMAT_RGBA8888_UNORM, 18848b8605Smrg PIPE_FORMAT_BGRA8888_UNORM, 19848b8605Smrg PIPE_FORMAT_NONE 20848b8605Smrg}; 21848b8605Smrg 22848b8605Smrgstatic const int WIDTH = 300; 23848b8605Smrgstatic const int HEIGHT = 300; 24848b8605Smrg 25848b8605Smrgstatic struct pipe_screen *screen = NULL; 26848b8605Smrgstatic struct pipe_context *ctx = NULL; 27848b8605Smrgstatic struct pipe_surface *surf = NULL; 28848b8605Smrgstatic struct pipe_resource *tex = NULL; 29848b8605Smrgstatic void *window = NULL; 30848b8605Smrg 31848b8605Smrgstruct vertex { 32848b8605Smrg float position[4]; 33848b8605Smrg float color[4]; 34848b8605Smrg}; 35848b8605Smrg 36848b8605Smrgstatic struct vertex vertices[4] = 37848b8605Smrg{ 38848b8605Smrg { { 0.0f, -0.9f, 0.0f, 1.0f }, 39848b8605Smrg { 1.0f, 0.0f, 0.0f, 1.0f } 40848b8605Smrg }, 41848b8605Smrg { { -0.9f, 0.9f, 0.0f, 1.0f }, 42848b8605Smrg { 0.0f, 1.0f, 0.0f, 1.0f } 43848b8605Smrg }, 44848b8605Smrg { { 0.9f, 0.9f, 0.0f, 1.0f }, 45848b8605Smrg { 0.0f, 0.0f, 1.0f, 1.0f } 46848b8605Smrg } 47848b8605Smrg}; 48848b8605Smrg 49848b8605Smrg 50848b8605Smrg 51848b8605Smrg 52848b8605Smrgstatic void set_viewport( float x, float y, 53848b8605Smrg float width, float height, 54b8e80941Smrg float zNear, float zFar) 55848b8605Smrg{ 56b8e80941Smrg float z = zFar; 57848b8605Smrg float half_width = (float)width / 2.0f; 58848b8605Smrg float half_height = (float)height / 2.0f; 59b8e80941Smrg float half_depth = ((float)zFar - (float)zNear) / 2.0f; 60848b8605Smrg struct pipe_viewport_state vp; 61848b8605Smrg 62848b8605Smrg vp.scale[0] = half_width; 63848b8605Smrg vp.scale[1] = half_height; 64848b8605Smrg vp.scale[2] = half_depth; 65848b8605Smrg 66848b8605Smrg vp.translate[0] = half_width + x; 67848b8605Smrg vp.translate[1] = half_height + y; 68848b8605Smrg vp.translate[2] = half_depth + z; 69848b8605Smrg 70848b8605Smrg ctx->set_viewport_states( ctx, 0, 1, &vp ); 71848b8605Smrg} 72848b8605Smrg 73848b8605Smrgstatic void set_vertices( void ) 74848b8605Smrg{ 75848b8605Smrg struct pipe_vertex_element ve[2]; 76848b8605Smrg struct pipe_vertex_buffer vbuf; 77848b8605Smrg void *handle; 78848b8605Smrg 79848b8605Smrg memset(ve, 0, sizeof ve); 80848b8605Smrg 81848b8605Smrg ve[0].src_offset = Offset(struct vertex, position); 82848b8605Smrg ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 83848b8605Smrg ve[1].src_offset = Offset(struct vertex, color); 84848b8605Smrg ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 85848b8605Smrg 86848b8605Smrg handle = ctx->create_vertex_elements_state(ctx, 2, ve); 87848b8605Smrg ctx->bind_vertex_elements_state(ctx, handle); 88848b8605Smrg 89848b8605Smrg memset(&vbuf, 0, sizeof vbuf); 90848b8605Smrg 91848b8605Smrg vbuf.stride = sizeof( struct vertex ); 92848b8605Smrg vbuf.buffer_offset = 0; 93b8e80941Smrg vbuf.buffer.resource = pipe_buffer_create_with_data(ctx, 94848b8605Smrg PIPE_BIND_VERTEX_BUFFER, 95848b8605Smrg PIPE_USAGE_DEFAULT, 96848b8605Smrg sizeof(vertices), 97848b8605Smrg vertices); 98848b8605Smrg 99848b8605Smrg ctx->set_vertex_buffers(ctx, 0, 1, &vbuf); 100848b8605Smrg} 101848b8605Smrg 102848b8605Smrgstatic void set_vertex_shader( void ) 103848b8605Smrg{ 104848b8605Smrg void *handle; 105848b8605Smrg const char *text = 106848b8605Smrg "VERT\n" 107848b8605Smrg "DCL IN[0]\n" 108848b8605Smrg "DCL IN[1]\n" 109848b8605Smrg "DCL OUT[0], POSITION\n" 110848b8605Smrg "DCL OUT[1], COLOR\n" 111848b8605Smrg " 0: MOV OUT[1], IN[1]\n" 112848b8605Smrg " 1: MOV OUT[0], IN[0]\n" 113848b8605Smrg " 2: END\n"; 114848b8605Smrg 115848b8605Smrg handle = graw_parse_vertex_shader(ctx, text); 116848b8605Smrg ctx->bind_vs_state(ctx, handle); 117848b8605Smrg} 118848b8605Smrg 119848b8605Smrgstatic void set_fragment_shader( void ) 120848b8605Smrg{ 121848b8605Smrg void *handle; 122848b8605Smrg const char *text = 123848b8605Smrg "FRAG\n" 124848b8605Smrg "DCL IN[0], COLOR, LINEAR\n" 125848b8605Smrg "DCL OUT[0], COLOR\n" 126848b8605Smrg " 0: MOV OUT[0], IN[0]\n" 127848b8605Smrg " 1: END\n"; 128848b8605Smrg 129848b8605Smrg handle = graw_parse_fragment_shader(ctx, text); 130848b8605Smrg ctx->bind_fs_state(ctx, handle); 131848b8605Smrg} 132848b8605Smrg 133848b8605Smrg 134848b8605Smrgstatic void set_geometry_shader( void ) 135848b8605Smrg{ 136848b8605Smrg void *handle; 137848b8605Smrg const char *text = 138848b8605Smrg "GEOM\n" 139848b8605Smrg "PROPERTY GS_INPUT_PRIMITIVE TRIANGLES\n" 140848b8605Smrg "PROPERTY GS_OUTPUT_PRIMITIVE TRIANGLE_STRIP\n" 141848b8605Smrg "DCL IN[][0], POSITION, CONSTANT\n" 142848b8605Smrg "DCL IN[][1], COLOR, CONSTANT\n" 143848b8605Smrg "DCL OUT[0], POSITION, CONSTANT\n" 144848b8605Smrg "DCL OUT[1], COLOR, CONSTANT\n" 145848b8605Smrg "0:MOV OUT[0], IN[0][0]\n" 146848b8605Smrg "1:MOV OUT[1], IN[0][1]\n" 147848b8605Smrg "2:EMIT\n" 148848b8605Smrg "3:MOV OUT[0], IN[1][0]\n" 149848b8605Smrg "4:MOV OUT[1], IN[0][1]\n" /* copy color from input vertex 0 */ 150848b8605Smrg "5:EMIT\n" 151848b8605Smrg "6:MOV OUT[0], IN[2][0]\n" 152848b8605Smrg "7:MOV OUT[1], IN[2][1]\n" 153848b8605Smrg "8:EMIT\n" 154848b8605Smrg "9:ENDPRIM\n" 155848b8605Smrg "10:END\n"; 156848b8605Smrg 157848b8605Smrg handle = graw_parse_geometry_shader(ctx, text); 158848b8605Smrg ctx->bind_gs_state(ctx, handle); 159848b8605Smrg} 160848b8605Smrg 161848b8605Smrgstatic void draw( void ) 162848b8605Smrg{ 163848b8605Smrg union pipe_color_union clear_color = { {1,0,1,1} }; 164848b8605Smrg 165848b8605Smrg ctx->clear(ctx, PIPE_CLEAR_COLOR, &clear_color, 0, 0); 166848b8605Smrg util_draw_arrays(ctx, PIPE_PRIM_TRIANGLES, 0, 3); 167848b8605Smrg ctx->flush(ctx, NULL, 0); 168848b8605Smrg 169848b8605Smrg screen->flush_frontbuffer(screen, tex, 0, 0, window, NULL); 170848b8605Smrg} 171848b8605Smrg 172848b8605Smrg 173848b8605Smrgstatic void init( void ) 174848b8605Smrg{ 175848b8605Smrg struct pipe_framebuffer_state fb; 176848b8605Smrg struct pipe_resource templat; 177848b8605Smrg struct pipe_surface surf_tmpl; 178848b8605Smrg int i; 179848b8605Smrg 180848b8605Smrg /* It's hard to say whether window or screen should be created 181848b8605Smrg * first. Different environments would prefer one or the other. 182848b8605Smrg * 183848b8605Smrg * Also, no easy way of querying supported formats if the screen 184848b8605Smrg * cannot be created first. 185848b8605Smrg */ 186848b8605Smrg for (i = 0; formats[i] != PIPE_FORMAT_NONE; i++) { 187848b8605Smrg screen = graw_create_window_and_screen(0, 0, 300, 300, 188848b8605Smrg formats[i], 189848b8605Smrg &window); 190848b8605Smrg if (window && screen) 191848b8605Smrg break; 192848b8605Smrg } 193848b8605Smrg if (!screen || !window) { 194848b8605Smrg fprintf(stderr, "Unable to create window\n"); 195848b8605Smrg exit(1); 196848b8605Smrg } 197848b8605Smrg 198b8e80941Smrg ctx = screen->context_create(screen, NULL, 0); 199848b8605Smrg if (ctx == NULL) 200848b8605Smrg exit(3); 201848b8605Smrg 202b8e80941Smrg memset(&templat, 0, sizeof(templat)); 203848b8605Smrg templat.target = PIPE_TEXTURE_2D; 204848b8605Smrg templat.format = formats[i]; 205848b8605Smrg templat.width0 = WIDTH; 206848b8605Smrg templat.height0 = HEIGHT; 207848b8605Smrg templat.depth0 = 1; 208848b8605Smrg templat.array_size = 1; 209848b8605Smrg templat.last_level = 0; 210848b8605Smrg templat.bind = (PIPE_BIND_RENDER_TARGET | 211848b8605Smrg PIPE_BIND_DISPLAY_TARGET); 212848b8605Smrg 213848b8605Smrg tex = screen->resource_create(screen, 214848b8605Smrg &templat); 215848b8605Smrg if (tex == NULL) 216848b8605Smrg exit(4); 217848b8605Smrg 218848b8605Smrg surf_tmpl.format = templat.format; 219848b8605Smrg surf_tmpl.u.tex.level = 0; 220848b8605Smrg surf_tmpl.u.tex.first_layer = 0; 221848b8605Smrg surf_tmpl.u.tex.last_layer = 0; 222848b8605Smrg surf = ctx->create_surface(ctx, tex, &surf_tmpl); 223848b8605Smrg if (surf == NULL) 224848b8605Smrg exit(5); 225848b8605Smrg 226848b8605Smrg memset(&fb, 0, sizeof fb); 227848b8605Smrg fb.nr_cbufs = 1; 228848b8605Smrg fb.width = WIDTH; 229848b8605Smrg fb.height = HEIGHT; 230848b8605Smrg fb.cbufs[0] = surf; 231848b8605Smrg 232848b8605Smrg ctx->set_framebuffer_state(ctx, &fb); 233848b8605Smrg 234848b8605Smrg { 235848b8605Smrg struct pipe_blend_state blend; 236848b8605Smrg void *handle; 237848b8605Smrg memset(&blend, 0, sizeof blend); 238848b8605Smrg blend.rt[0].colormask = PIPE_MASK_RGBA; 239848b8605Smrg handle = ctx->create_blend_state(ctx, &blend); 240848b8605Smrg ctx->bind_blend_state(ctx, handle); 241848b8605Smrg } 242848b8605Smrg 243848b8605Smrg { 244848b8605Smrg struct pipe_depth_stencil_alpha_state depthstencil; 245848b8605Smrg void *handle; 246848b8605Smrg memset(&depthstencil, 0, sizeof depthstencil); 247848b8605Smrg handle = ctx->create_depth_stencil_alpha_state(ctx, &depthstencil); 248848b8605Smrg ctx->bind_depth_stencil_alpha_state(ctx, handle); 249848b8605Smrg } 250848b8605Smrg 251848b8605Smrg { 252848b8605Smrg struct pipe_rasterizer_state rasterizer; 253848b8605Smrg void *handle; 254848b8605Smrg memset(&rasterizer, 0, sizeof rasterizer); 255848b8605Smrg rasterizer.cull_face = PIPE_FACE_NONE; 256848b8605Smrg rasterizer.half_pixel_center = 1; 257848b8605Smrg rasterizer.bottom_edge_rule = 1; 258b8e80941Smrg rasterizer.depth_clip_near = 1; 259b8e80941Smrg rasterizer.depth_clip_far = 1; 260848b8605Smrg handle = ctx->create_rasterizer_state(ctx, &rasterizer); 261848b8605Smrg ctx->bind_rasterizer_state(ctx, handle); 262848b8605Smrg } 263848b8605Smrg 264848b8605Smrg set_viewport(0, 0, WIDTH, HEIGHT, 30, 1000); 265848b8605Smrg set_vertices(); 266848b8605Smrg set_vertex_shader(); 267848b8605Smrg set_fragment_shader(); 268848b8605Smrg set_geometry_shader(); 269848b8605Smrg} 270848b8605Smrg 271848b8605Smrg 272848b8605Smrgint main( int argc, char *argv[] ) 273848b8605Smrg{ 274848b8605Smrg init(); 275848b8605Smrg 276848b8605Smrg graw_set_display_func( draw ); 277848b8605Smrg graw_main_loop(); 278848b8605Smrg return 0; 279848b8605Smrg} 280