1848b8605Smrg/* Test texture swizzles */ 2848b8605Smrg 3848b8605Smrg#include <stdio.h> 4848b8605Smrg 5848b8605Smrg#include "graw_util.h" 6848b8605Smrg 7848b8605Smrg 8848b8605Smrgstatic struct graw_info info; 9848b8605Smrg 10848b8605Smrgstatic struct pipe_resource *texture = NULL; 11848b8605Smrgstatic struct pipe_sampler_view *sv = NULL; 12848b8605Smrgstatic void *sampler = NULL; 13848b8605Smrg 14848b8605Smrgstatic const int WIDTH = 300; 15848b8605Smrgstatic const int HEIGHT = 300; 16848b8605Smrg 17848b8605Smrgstruct vertex { 18848b8605Smrg float position[4]; 19848b8605Smrg float color[4]; 20848b8605Smrg}; 21848b8605Smrg 22848b8605Smrgstatic struct vertex vertices[] = 23848b8605Smrg{ 24848b8605Smrg { { 0.9, -0.9, 0.0, 1.0 }, 25848b8605Smrg { 1, 0, 0, 1 } }, 26848b8605Smrg 27848b8605Smrg { { 0.9, 0.9, 0.0, 1.0 }, 28848b8605Smrg { 1, 1, 0, 1 } }, 29848b8605Smrg 30848b8605Smrg { {-0.9, 0.9, 0.0, 1.0 }, 31848b8605Smrg { 0, 1, 0, 1 } }, 32848b8605Smrg 33848b8605Smrg { {-0.9, -0.9, 0.0, 1.0 }, 34848b8605Smrg { 0, 0, 0, 1 } }, 35848b8605Smrg}; 36848b8605Smrg 37848b8605Smrg 38848b8605Smrgstatic void set_vertices(void) 39848b8605Smrg{ 40848b8605Smrg struct pipe_vertex_element ve[2]; 41848b8605Smrg struct pipe_vertex_buffer vbuf; 42848b8605Smrg void *handle; 43848b8605Smrg 44848b8605Smrg memset(ve, 0, sizeof ve); 45848b8605Smrg 46848b8605Smrg ve[0].src_offset = Offset(struct vertex, position); 47848b8605Smrg ve[0].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 48848b8605Smrg ve[1].src_offset = Offset(struct vertex, color); 49848b8605Smrg ve[1].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT; 50848b8605Smrg 51848b8605Smrg handle = info.ctx->create_vertex_elements_state(info.ctx, 2, ve); 52848b8605Smrg info.ctx->bind_vertex_elements_state(info.ctx, handle); 53848b8605Smrg 54848b8605Smrg memset(&vbuf, 0, sizeof vbuf); 55848b8605Smrg 56848b8605Smrg vbuf.stride = sizeof(struct vertex); 57848b8605Smrg vbuf.buffer_offset = 0; 58b8e80941Smrg vbuf.buffer.resource = pipe_buffer_create_with_data(info.ctx, 59848b8605Smrg PIPE_BIND_VERTEX_BUFFER, 60848b8605Smrg PIPE_USAGE_DEFAULT, 61848b8605Smrg sizeof(vertices), 62848b8605Smrg vertices); 63848b8605Smrg 64848b8605Smrg info.ctx->set_vertex_buffers(info.ctx, 0, 1, &vbuf); 65848b8605Smrg} 66848b8605Smrg 67848b8605Smrgstatic void set_vertex_shader(void) 68848b8605Smrg{ 69848b8605Smrg void *handle; 70848b8605Smrg const char *text = 71848b8605Smrg "VERT\n" 72848b8605Smrg "DCL IN[0]\n" 73848b8605Smrg "DCL IN[1]\n" 74848b8605Smrg "DCL OUT[0], POSITION\n" 75848b8605Smrg "DCL OUT[1], GENERIC[0]\n" 76848b8605Smrg " 0: MOV OUT[1], IN[1]\n" 77848b8605Smrg " 1: MOV OUT[0], IN[0]\n" 78848b8605Smrg " 2: END\n"; 79848b8605Smrg 80848b8605Smrg handle = graw_parse_vertex_shader(info.ctx, text); 81848b8605Smrg info.ctx->bind_vs_state(info.ctx, handle); 82848b8605Smrg} 83848b8605Smrg 84848b8605Smrgstatic void set_fragment_shader(void) 85848b8605Smrg{ 86848b8605Smrg void *handle; 87848b8605Smrg const char *text = 88848b8605Smrg "FRAG\n" 89848b8605Smrg "DCL IN[0], GENERIC[0], PERSPECTIVE\n" 90848b8605Smrg "DCL OUT[0], COLOR\n" 91848b8605Smrg "DCL SAMP[0]\n" 92b8e80941Smrg "DCL SVIEW[0], 2D, FLOAT\n" 93848b8605Smrg " 0: TXP OUT[0], IN[0], SAMP[0], 2D\n" 94848b8605Smrg " 2: END\n"; 95848b8605Smrg 96848b8605Smrg handle = graw_parse_fragment_shader(info.ctx, text); 97848b8605Smrg info.ctx->bind_fs_state(info.ctx, handle); 98848b8605Smrg} 99848b8605Smrg 100848b8605Smrg 101848b8605Smrgstatic void draw(void) 102848b8605Smrg{ 103848b8605Smrg union pipe_color_union clear_color; 104848b8605Smrg 105848b8605Smrg clear_color.f[0] = 0.5; 106848b8605Smrg clear_color.f[1] = 0.5; 107848b8605Smrg clear_color.f[2] = 0.5; 108848b8605Smrg clear_color.f[3] = 1.0; 109848b8605Smrg 110848b8605Smrg info.ctx->clear(info.ctx, PIPE_CLEAR_COLOR, &clear_color, 0, 0); 111848b8605Smrg util_draw_arrays(info.ctx, PIPE_PRIM_QUADS, 0, 4); 112848b8605Smrg info.ctx->flush(info.ctx, NULL, 0); 113848b8605Smrg 114848b8605Smrg graw_util_flush_front(&info); 115848b8605Smrg} 116848b8605Smrg 117848b8605Smrg 118848b8605Smrg 119848b8605Smrgstatic void 120848b8605Smrginit_tex(const unsigned swizzle[4]) 121848b8605Smrg{ 122848b8605Smrg#define SIZE 256 123848b8605Smrg struct pipe_sampler_view sv_template; 124848b8605Smrg ubyte tex2d[SIZE][SIZE][4]; 125848b8605Smrg int s, t; 126848b8605Smrg 127848b8605Smrg for (s = 0; s < SIZE; s++) { 128848b8605Smrg for (t = 0; t < SIZE; t++) { 129848b8605Smrg tex2d[t][s][0] = 0; /*B*/ 130848b8605Smrg tex2d[t][s][1] = t; /*G*/ 131848b8605Smrg tex2d[t][s][2] = s; /*R*/ 132848b8605Smrg tex2d[t][s][3] = 1; /*A*/ 133848b8605Smrg } 134848b8605Smrg } 135848b8605Smrg 136848b8605Smrg texture = graw_util_create_tex2d(&info, SIZE, SIZE, 137848b8605Smrg PIPE_FORMAT_B8G8R8A8_UNORM, tex2d); 138848b8605Smrg 139848b8605Smrg memset(&sv_template, 0, sizeof sv_template); 140848b8605Smrg sv_template.format = texture->format; 141848b8605Smrg sv_template.texture = texture; 142848b8605Smrg sv_template.swizzle_r = swizzle[0]; 143848b8605Smrg sv_template.swizzle_g = swizzle[1]; 144848b8605Smrg sv_template.swizzle_b = swizzle[2]; 145848b8605Smrg sv_template.swizzle_a = swizzle[3]; 146848b8605Smrg sv = info.ctx->create_sampler_view(info.ctx, texture, &sv_template); 147848b8605Smrg if (sv == NULL) 148848b8605Smrg exit(5); 149848b8605Smrg 150848b8605Smrg info.ctx->set_sampler_views(info.ctx, PIPE_SHADER_FRAGMENT, 0, 1, &sv); 151848b8605Smrg 152848b8605Smrg sampler = graw_util_create_simple_sampler(&info, 153848b8605Smrg PIPE_TEX_WRAP_REPEAT, 154848b8605Smrg PIPE_TEX_FILTER_NEAREST); 155848b8605Smrg 156848b8605Smrg info.ctx->bind_sampler_states(info.ctx, PIPE_SHADER_FRAGMENT, 157848b8605Smrg 0, 1, &sampler); 158848b8605Smrg#undef SIZE 159848b8605Smrg} 160848b8605Smrg 161848b8605Smrg 162848b8605Smrgstatic void 163848b8605Smrginit(const unsigned swizzle[4]) 164848b8605Smrg{ 165848b8605Smrg if (!graw_util_create_window(&info, WIDTH, HEIGHT, 1, FALSE)) 166848b8605Smrg exit(1); 167848b8605Smrg 168848b8605Smrg graw_util_default_state(&info, FALSE); 169848b8605Smrg 170848b8605Smrg graw_util_viewport(&info, 0, 0, WIDTH, HEIGHT, 30, 10000); 171848b8605Smrg 172848b8605Smrg init_tex(swizzle); 173848b8605Smrg 174848b8605Smrg set_vertices(); 175848b8605Smrg set_vertex_shader(); 176848b8605Smrg set_fragment_shader(); 177848b8605Smrg} 178848b8605Smrg 179848b8605Smrg 180848b8605Smrgstatic unsigned 181848b8605Smrgchar_to_swizzle(char c) 182848b8605Smrg{ 183848b8605Smrg switch (c) { 184848b8605Smrg case 'r': 185b8e80941Smrg return PIPE_SWIZZLE_X; 186848b8605Smrg case 'g': 187b8e80941Smrg return PIPE_SWIZZLE_Y; 188848b8605Smrg case 'b': 189b8e80941Smrg return PIPE_SWIZZLE_Z; 190848b8605Smrg case 'a': 191b8e80941Smrg return PIPE_SWIZZLE_W; 192848b8605Smrg case '0': 193b8e80941Smrg return PIPE_SWIZZLE_0; 194848b8605Smrg case '1': 195b8e80941Smrg return PIPE_SWIZZLE_1; 196848b8605Smrg default: 197b8e80941Smrg return PIPE_SWIZZLE_X; 198848b8605Smrg } 199848b8605Smrg} 200848b8605Smrg 201848b8605Smrg 202848b8605Smrgint main(int argc, char *argv[]) 203848b8605Smrg{ 204848b8605Smrg const char swizzle_names[] = "rgba01"; 205848b8605Smrg uint swizzle[4]; 206848b8605Smrg int i; 207848b8605Smrg 208b8e80941Smrg swizzle[0] = PIPE_SWIZZLE_X; 209b8e80941Smrg swizzle[1] = PIPE_SWIZZLE_Y; 210b8e80941Smrg swizzle[2] = PIPE_SWIZZLE_Z; 211b8e80941Smrg swizzle[3] = PIPE_SWIZZLE_W; 212848b8605Smrg 213848b8605Smrg for (i = 1; i < argc; i++) { 214848b8605Smrg swizzle[i-1] = char_to_swizzle(argv[i][0]); 215848b8605Smrg } 216848b8605Smrg 217848b8605Smrg printf("Example:\n"); 218848b8605Smrg printf(" tex-swizzle r 0 g 1\n"); 219848b8605Smrg printf("Current swizzle = "); 220848b8605Smrg for (i = 0; i < 4; i++) { 221848b8605Smrg printf("%c", swizzle_names[swizzle[i]]); 222848b8605Smrg } 223848b8605Smrg printf("\n"); 224848b8605Smrg 225848b8605Smrg init(swizzle); 226848b8605Smrg 227848b8605Smrg graw_set_display_func(draw); 228848b8605Smrg graw_main_loop(); 229848b8605Smrg return 0; 230848b8605Smrg} 231